From 98cab1c6388ba7e37a309d534b58bada26d5db00 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 20 Jun 2023 00:53:04 +0800 Subject: [PATCH 001/155] Merge branch 'local-dev' --- .gitignore | 1 + CHANGELOG.md | 2 +- CONTRIBUTING.md | 2 +- README.md | 56 +- config-template.js | 5 + docs/changelog.md | 24 + manifest.json | 12 +- package-lock.json | 6217 +++++++++++++++++++++++++++ package.json | 13 +- rollup.config.js | 38 + src/algorithms.ts | 16 + src/algorithms/anki.ts | 215 + src/algorithms/supermemo.ts | 86 + src/commands.ts | 189 + src/data.ts | 1633 +++++++ src/flashcard-modal.tsx | 78 +- src/lang/locale/ar.ts | 23 + src/lang/locale/cz.ts | 23 + src/lang/locale/de.ts | 23 + src/lang/locale/en.ts | 23 + src/lang/locale/es.ts | 23 + src/lang/locale/ja.ts | 23 + src/lang/locale/ko.ts | 23 + src/lang/locale/pt-br.ts | 23 + src/lang/locale/ru.ts | 23 + src/lang/locale/zh-cn.ts | 19 + src/lang/locale/zh-tw.ts | 19 + src/main.ts | 401 +- src/modals/confirm.ts | 36 + src/modals/reviewresponse-modal.tsx | 184 + src/settings.ts | 250 ++ src/sidebar.ts | 52 +- src/suggesters/FolderSuggester.ts | 33 + src/suggesters/suggest.ts | 183 + src/utils_recall.ts | 71 + styles.css | 148 +- 36 files changed, 10098 insertions(+), 92 deletions(-) create mode 100644 config-template.js create mode 100644 package-lock.json create mode 100644 rollup.config.js create mode 100644 src/algorithms.ts create mode 100644 src/algorithms/anki.ts create mode 100644 src/algorithms/supermemo.ts create mode 100644 src/commands.ts create mode 100644 src/data.ts create mode 100644 src/modals/confirm.ts create mode 100644 src/modals/reviewresponse-modal.tsx create mode 100644 src/suggesters/FolderSuggester.ts create mode 100644 src/suggesters/suggest.ts create mode 100644 src/utils_recall.ts diff --git a/.gitignore b/.gitignore index ddfd9dd8..ab06dab0 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ yarn-error.log # build build +config.js # testing coverage diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bed66b3..1cc39a66 120000 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1 @@ -docs/changelog.md \ No newline at end of file +docs/changelog.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 651dc17d..9815d5bd 120000 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1 @@ -docs/en/contributing.md \ No newline at end of file +docs/en/contributing.md diff --git a/README.md b/README.md index 3d8441df..c61ccd80 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,36 @@ -# Flashcard-Based and Note-Based Spaced Repetition Plugin - - - -Fight the forgetting curve & note aging by reviewing flashcards & notes using spaced repetition on Obsidian.md +This is a modified version of [obsidian-spaced-repetition](https://github.com/st3v3nmw/obsidian-spaced-repetition) and merging [recall plugin](https://github.com/martin-jw/obsidian-recall) to use seperate json data file, and add some interesting features. +就是 SR 的复习时间信息可以单独保存,不修改原笔记文件内容,以及添加其他功能。 -- Check the documentation [here](https://www.stephenmwangi.com/obsidian-spaced-repetition/). -- Check the [roadmap](https://github.com/st3v3nmw/obsidian-spaced-repetition/projects/2/) for upcoming features & fixes. -- Raise an issue [here](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/) if you have a feature request or a bug report. -- Visit the [discussions](https://github.com/st3v3nmw/obsidian-spaced-repetition/discussions/) section for Q&A help, feedback, and general discussion. -- The plugin has been translated into _Arabic / العربية, Chinese (Simplified) / 简体中文, Chinese (Traditional) / 繁體中文, Czech / čeština, German / Deutsch, Korean / 한국어, Japanese / 日本語, Portuguese (Brazil) / Português do Brasil, Spanish / Español, and Russian / русский_ by the Obsidian community 😄. - - To help translate this plugin to your language, check the [translation guide here](https://www.stephenmwangi.com/obsidian-spaced-repetition/contributing/#translating_1). +# Flashcard-Based and Note-Based Spaced Repetition Plugin ## Features -- Flashcards - - [Decks](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#decks) (Using Obsidian's hierarchical tags or folder structure) - - [Single-line style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#single-line-basic-remnote-style) (`Question::Answer`) - - [Single-line reversed style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#single-line-reversed) (`Question:::Answer`) - - [Multi-line style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#multi-line-basic) (Separated by `?`) - - [Multi-line reversed style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#multi-line-reversed) (Separated by `??`) - - [Cloze cards](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#cloze-cards) (`==highlight==` your cloze deletions!, `**bolded text**`, or `{{text in curly braces}}`) - - [Card context - automatic titles based on headings](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#context) (i.e. `Note title > Heading 1 > Subheading`) - - Rich text support in flashcards (inherited from Obsidian) - - Images, Audio, & Video - - LaTeX - - Code syntax highlighting - - Footnotes -- Notes - - [Reviewing entire notes](https://www.stephenmwangi.com/obsidian-spaced-repetition/notes/) - - Possible use case: [Incremental writing](https://www.stephenmwangi.com/obsidian-spaced-repetition/notes/#incremental-writing) -- [Statistics](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#statistics) +- [@st3v3nmw's ReadMe](https://github.com/Newdea/obsidian-spaced-repetition#readme) +- merge [recall plugin](https://github.com/martin-jw/obsidian-recall) to use seperate file + - setting where to save schedule info by Data Location + - save on note file, just as used do. + - save on seperate tracked_files.json. + - it still have problems about saving cards shedule info, because when we change note content, the lineNumber and texthash will changes. I add a eventListener, but note work well in some cases. Is there any good idea? + - setting new per day, repeat items for review notes. + - setting convert tracked note to decks + - setting Algorithm ( not work yet) + - file menu to tracknote/untracknote +- show floatbar for reviewing response when reviewing note by click statusbar or review command or sidebar +- add a setting option to Reviewing a Notes directly [#635] + +## How to install the plugin + +1. Download main.js, manifest.json, styles.css from the latest release (see [releases](https://github.com/Newdea/obsidian-spaced-repetition/releases/)) +2. Create a new folder in `Vault-name/.obsidian/plugins` and put the downloaded files in there +3. Reload your plugins and enable the plugin ## Usage Check the [docs](https://www.stephenmwangi.com/obsidian-spaced-repetition/) for more details. -Buy Me a Coffee at ko-fi.com +## Thanks + +Thank you to everyone who has created a plugin that inspired me and I took code from. + +- first, thanks to [@st3v3nmw's obsidian-spaced-repetition](https://github.com/st3v3nmw/obsidian-spaced-repetition) and [@martin-jw recall plugin](https://github.com/martin-jw/obsidian-recall) +- floatbar(thanks to [@chetachi's cMenu](https://github.com/chetachiezikeuzor/cMenu-Plugin)) diff --git a/config-template.js b/config-template.js new file mode 100644 index 00000000..b58e4a2e --- /dev/null +++ b/config-template.js @@ -0,0 +1,5 @@ +export default { + // copy this file and rename it to 'config.js' + // modify '/PATH/TO/VAULT' to your obsidian vault path + "vault-path": "/PATH/TO/VAULT/.obsidian/plugins/obsidian-spaced-repetition", +}; diff --git a/docs/changelog.md b/docs/changelog.md index ff7e5aef..51b91814 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,30 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.10.1m1] + +### Added + +- [@Newdea](https://github.com/Newdea) merge [recall plugin](https://github.com/martin-jw/obsidian-recall) to use seperate file [#162] + - setting where to save schedule info by `Data Location` + - save on note file, just as used do. + - save on seperate `tracked_files.json` which storing on vault or sr plugin folder. If select this, this plugin will convert shedule info to seperate file, and delete shedule info in note file. + - it still have problems about saving cards shedule info, because when we change note content, the lineNumber and texthash will changes. I add a eventListener, but note work well in some cases. Is there any good idea? + - setting `new per day`, `repeat items` for review notes. + - setting `convert tracked note to decks` + - setting Algorithm ( not work yet) + - file menu to tracknote/untracknote +- [@Newdea](https://github.com/Newdea) show floatbar(thanks to [@chetachi's cMenu](https://github.com/chetachiezikeuzor/cMenu-Plugin)) for reviewing response when reviewing note by click statusbar or review command or sidebar + +### Changed + +- [@Newdea](https://github.com/Newdea) add a setting option to Reviewing a Notes directly [#635](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/635) + +### Fixed + +- [@Newdea](https://github.com/Newdea) fixed open the next note automatically after reviewing another [#582](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/582) +- [@Newdea](https://github.com/Newdea) fixed sidebar doesn't show/update some files. [#393](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/393) + #### [1.10.1](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.0...1.10.1) - style: Fix formatting [`#678`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/678) diff --git a/manifest.json b/manifest.json index 4495e555..c572d772 100644 --- a/manifest.json +++ b/manifest.json @@ -1,11 +1,11 @@ { - "id": "obsidian-spaced-repetition", - "name": "Spaced Repetition", - "version": "1.10.1", + "id": "obsidian-spaced-repetition-recall", + "name": "Spaced Repetition Recall", + "version": "1.10.1m1", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", - "author": "Stephen Mwangi", - "authorUrl": "https://github.com/st3v3nmw", + "author": "Newdea", + "authorUrl": "https://github.com/Newdea", "isDesktopOnly": false, - "fundingUrl": "https://ko-fi.com/M4M44DEN6" + "fundingUrl": "" } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..02b1d1a2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6217 @@ +{ + "name": "obsidian-spaced-repetition", + "version": "1.10.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "obsidian-spaced-repetition", + "version": "1.10.0", + "license": "MIT", + "dependencies": { + "chart.js": "^4.0.1", + "pagerank.js": "^1.0.2" + }, + "devDependencies": { + "@popperjs/core": "^2.11.6", + "@rollup/plugin-commonjs": "^15.1.0", + "@rollup/plugin-node-resolve": "^9.0.0", + "@rollup/plugin-typescript": "^6.0.0", + "@types/jest": "^29.2.4", + "@types/node": "^18.11.13", + "@types/vhtml": "^2.2.4", + "@typescript-eslint/eslint-plugin": "^5.46.0", + "@typescript-eslint/parser": "^5.46.0", + "builtin-modules": "^3.3.0", + "esbuild": "~0.16.4", + "esbuild-plugin-copy": "^2.0.2", + "eslint": "^8.29.0", + "jest": "^29.3.1", + "jest-environment-jsdom": "^29.3.1", + "jest-expect-message": "^1.1.3", + "moment": "^2.29.4", + "obsidian": "^0.16.3", + "prettier": "^2.8.1", + "rollup": "^2.45.2", + "rollup-plugin-copy": "^3.4.0", + "ts-jest": "^29.0.3", + "tslib": "2.4.1", + "typescript": "4.9.4", + "vhtml": "^2.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", + "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.0", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", + "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/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/@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.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", + "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.0", + "@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/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "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/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "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/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-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-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.0.tgz", + "integrity": "sha512-eD/JQ21IG2i1FraJnTMbUarAUkA7G988ofehG5MDCRXaUU91rEBJuCeSoou2Sk1y4RbLYXzqEg1QLwEmRU4qcQ==", + "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.0", + "@babel/types": "^7.21.0" + }, + "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-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-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/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.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz", + "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.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-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "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-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "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-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "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-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-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-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "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/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.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.0.tgz", + "integrity": "sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.0", + "@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.0", + "@babel/types": "^7.21.0", + "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.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.0.tgz", + "integrity": "sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==", + "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/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@codemirror/state": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.0.tgz", + "integrity": "sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA==", + "dev": true, + "peer": true + }, + "node_modules/@codemirror/view": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.9.1.tgz", + "integrity": "sha512-bzfSjJn9dAADVpabLKWKNmMG4ibyTV2e3eOGowjElNPTdTkSbi6ixPYHm2u0ADcETfKsi2/R84Rkmi91dH9yEg==", + "dev": true, + "peer": true, + "dependencies": { + "@codemirror/state": "^6.1.4", + "style-mod": "^4.0.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "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/@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/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.4.3.tgz", + "integrity": "sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.4.3", + "jest-util": "^29.4.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.4.3.tgz", + "integrity": "sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.4.3", + "@jest/reporters": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/transform": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.4.3", + "jest-config": "^29.4.3", + "jest-haste-map": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.4.3", + "jest-resolve-dependencies": "^29.4.3", + "jest-runner": "^29.4.3", + "jest-runtime": "^29.4.3", + "jest-snapshot": "^29.4.3", + "jest-util": "^29.4.3", + "jest-validate": "^29.4.3", + "jest-watcher": "^29.4.3", + "micromatch": "^4.0.4", + "pretty-format": "^29.4.3", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.4.3.tgz", + "integrity": "sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "jest-mock": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.4.3.tgz", + "integrity": "sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ==", + "dev": true, + "dependencies": { + "expect": "^29.4.3", + "jest-snapshot": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.4.3.tgz", + "integrity": "sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.4.3.tgz", + "integrity": "sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.4.3", + "jest-mock": "^29.4.3", + "jest-util": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.4.3.tgz", + "integrity": "sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.3", + "@jest/expect": "^29.4.3", + "@jest/types": "^29.4.3", + "jest-mock": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.4.3.tgz", + "integrity": "sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/transform": "^29.4.3", + "@jest/types": "^29.4.3", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.4.3", + "jest-util": "^29.4.3", + "jest-worker": "^29.4.3", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.4.3.tgz", + "integrity": "sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.4.3.tgz", + "integrity": "sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.4.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", + "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.4.3", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.4.3", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", + "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "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/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/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "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/@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz", + "integrity": "sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^2.22.0" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz", + "integrity": "sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==", + "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.17.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-6.1.0.tgz", + "integrity": "sha512-hJxaiE6WyNOsK+fZpbFh9CUijZYqPQuAOWO5khaGTUkM8DYNNyA2TDlgamecE+qLOG1G1+CwbWMAx3rbqpp6xQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0", + "tslib": "*", + "typescript": ">=3.4.0" + } + }, + "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/@rollup/pluginutils/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/@rollup/pluginutils/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/@sinclair/typebox": { + "version": "0.25.23", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.23.tgz", + "integrity": "sha512-VEB8ygeP42CFLWyAJhN5OklpxUliqdNEUcXb4xZ/CINqtYGTjL5ukluKdKzQ0iWdUxyQ7B0539PAUhHKrCNWSQ==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/codemirror": { + "version": "0.0.108", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz", + "integrity": "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==", + "dev": true, + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", + "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.4.0.tgz", + "integrity": "sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "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/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", + "integrity": "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "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/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/tern": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", + "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true + }, + "node_modules/@types/vhtml": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@types/vhtml/-/vhtml-2.2.4.tgz", + "integrity": "sha512-H7/C7RZuaoc45JRPKNTsyVwgCMNY9u20QKs1fz4pKKjwpnQe5Jo+YhFq5UQI+h5orsHg+3OZ2tJlUkxkIHUa2w==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", + "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", + "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/type-utils": "5.53.0", + "@typescript-eslint/utils": "5.53.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.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.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", + "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.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.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", + "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.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.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", + "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/utils": "5.53.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.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", + "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", + "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.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", + "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.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.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", + "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "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.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", + "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.53.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/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": 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-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "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/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "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/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/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/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "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/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/babel-jest": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.4.3.tgz", + "integrity": "sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.4.3", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.4.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.3.tgz", + "integrity": "sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.4.3.tgz", + "integrity": "sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.4.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.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/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/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "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/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/caniuse-lite": { + "version": "1.0.30001457", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz", + "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chart.js": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.2.1.tgz", + "integrity": "sha512-6YbpQ0nt3NovAgOzbkSSeeAQu/3za1319dPUQTXn9WcOpywM8rGKxJHrhS8V8xEkAlk8YhEfjbuAPfUyp6jIsw==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": "^7.0.0" + } + }, + "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/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "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/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "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": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "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/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "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/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/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/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.305", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.305.tgz", + "integrity": "sha512-WETy6tG0CT5gm1O+xCbyapWNsCcmIvrn4NHViIGYo2AT8FV2qUCXdaB+WqYxSv/vS5mFqhBYnfZAAkVArjBmUg==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "node_modules/esbuild-plugin-copy": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esbuild-plugin-copy/-/esbuild-plugin-copy-2.0.2.tgz", + "integrity": "sha512-HlDgkHXagBCwaoB8tlQFeH08/i5a2ey6Pc26annV1YcG5CkAHzzRzmCwp3wdi5KHI//HVUgipS+Zsy2tQmn9gQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^10.0.1", + "globby": "^11.0.3" + }, + "peerDependencies": { + "esbuild": ">= 0.14.0" + } + }, + "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/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/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/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.4.1", + "@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.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "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", + "regexpp": "^3.2.0", + "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-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.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "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/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", + "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "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==", + "dev": true + }, + "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/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/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.4.3.tgz", + "integrity": "sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.4.3", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-util": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "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/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/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/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/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-extra/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/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/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-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "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/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/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/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/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/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "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/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-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/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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/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, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/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-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": "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/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-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-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-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-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/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/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.4.3.tgz", + "integrity": "sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA==", + "dev": true, + "dependencies": { + "@jest/core": "^29.4.3", + "@jest/types": "^29.4.3", + "import-local": "^3.0.2", + "jest-cli": "^29.4.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.4.3.tgz", + "integrity": "sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.4.3.tgz", + "integrity": "sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.3", + "@jest/expect": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.4.3", + "jest-matcher-utils": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-runtime": "^29.4.3", + "jest-snapshot": "^29.4.3", + "jest-util": "^29.4.3", + "p-limit": "^3.1.0", + "pretty-format": "^29.4.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.4.3.tgz", + "integrity": "sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/types": "^29.4.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.4.3", + "jest-util": "^29.4.3", + "jest-validate": "^29.4.3", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.4.3.tgz", + "integrity": "sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.4.3", + "@jest/types": "^29.4.3", + "babel-jest": "^29.4.3", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.4.3", + "jest-environment-node": "^29.4.3", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.4.3", + "jest-runner": "^29.4.3", + "jest-util": "^29.4.3", + "jest-validate": "^29.4.3", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.4.3", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.3.tgz", + "integrity": "sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.4.3.tgz", + "integrity": "sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.4.3", + "pretty-format": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.4.3.tgz", + "integrity": "sha512-rFjf8JXrw3OjUzzmSE5l0XjMj0/MSVEUMCSXBGPDkfwb1T03HZI7iJSL0cGctZApPSyJxbjyKDVxkZuyhHkuTw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.3", + "@jest/fake-timers": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.4.3", + "jest-util": "^29.4.3", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.4.3.tgz", + "integrity": "sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.3", + "@jest/fake-timers": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "jest-mock": "^29.4.3", + "jest-util": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-expect-message": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/jest-expect-message/-/jest-expect-message-1.1.3.tgz", + "integrity": "sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==", + "dev": true + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", + "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.4.3", + "jest-worker": "^29.4.3", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.4.3.tgz", + "integrity": "sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.4.3.tgz", + "integrity": "sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.4.3.tgz", + "integrity": "sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.4.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.4.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.4.3.tgz", + "integrity": "sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "@types/node": "*", + "jest-util": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.4.3.tgz", + "integrity": "sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.3", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.4.3", + "jest-validate": "^29.4.3", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.3.tgz", + "integrity": "sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.4.3.tgz", + "integrity": "sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.4.3", + "@jest/environment": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/transform": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.4.3", + "jest-haste-map": "^29.4.3", + "jest-leak-detector": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-resolve": "^29.4.3", + "jest-runtime": "^29.4.3", + "jest-util": "^29.4.3", + "jest-watcher": "^29.4.3", + "jest-worker": "^29.4.3", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.4.3.tgz", + "integrity": "sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.4.3", + "@jest/fake-timers": "^29.4.3", + "@jest/globals": "^29.4.3", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.4.3", + "@jest/transform": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-mock": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.4.3", + "jest-snapshot": "^29.4.3", + "jest-util": "^29.4.3", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.4.3.tgz", + "integrity": "sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.4.3", + "@jest/transform": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.4.3", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.4.3", + "jest-get-type": "^29.4.3", + "jest-haste-map": "^29.4.3", + "jest-matcher-utils": "^29.4.3", + "jest-message-util": "^29.4.3", + "jest-util": "^29.4.3", + "natural-compare": "^1.4.0", + "pretty-format": "^29.4.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", + "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.4.3.tgz", + "integrity": "sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.4.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.4.3.tgz", + "integrity": "sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.4.3", + "@jest/types": "^29.4.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.4.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", + "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.4.3", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "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/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "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/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-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/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": "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/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/jsonfile/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/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/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/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.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "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/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/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/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/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/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/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "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/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-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/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/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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/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/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "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-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/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/nwsapi": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", + "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", + "dev": true + }, + "node_modules/obsidian": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-0.16.3.tgz", + "integrity": "sha512-hal9qk1A0GMhHSeLr2/+o3OpLmImiP+Y+sx2ewP13ds76KXsziG96n+IPFT0mSkup1zSwhEu+DeRhmbcyCCXWw==", + "dev": true, + "dependencies": { + "@types/codemirror": "0.0.108", + "moment": "2.29.4" + }, + "peerDependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "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-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/pagerank.js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pagerank.js/-/pagerank.js-1.0.2.tgz", + "integrity": "sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw==" + }, + "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-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/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "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-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==", + "dev": true + }, + "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/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/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/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/prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.3.tgz", + "integrity": "sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": 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/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "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/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "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/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/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/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-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/resolve.exports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz", + "integrity": "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/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/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/rollup-plugin-copy": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz", + "integrity": "sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.1", + "colorette": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "10.0.1", + "is-plain-object": "^3.0.0" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/rollup-plugin-copy/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/rollup-plugin-copy/node_modules/globby": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-copy/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/rollup-plugin-copy/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "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/semver/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/semver/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/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/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/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "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/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "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", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/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": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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-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/style-mod": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", + "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==", + "dev": true, + "peer": true + }, + "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/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "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/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "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/tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-jest": { + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "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-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "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/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/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/vhtml": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vhtml/-/vhtml-2.2.0.tgz", + "integrity": "sha512-TPXrXrxBOslRUVnlVkiAqhoXneiertIg86bdvzionrUYhEuiROvyPZNiiP6GIIJ2Q7oPNVyEtIx8gMAZZE9lCQ==", + "dev": true + }, + "node_modules/w3c-keyname": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", + "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==", + "dev": true, + "peer": true + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/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/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/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/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": 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/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "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": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "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": "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/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" + } + } + } +} diff --git a/package.json b/package.json index b6f6d2c0..a077cc9b 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,9 @@ "lint": "npx prettier --check . && npx eslint src/", "test": "jest", "changelog": "auto-changelog --template=compact --package && npx prettier --write CHANGELOG.md", - "e2e": "make setup_e2e && wdio run ./wdio.conf.js" + "e2e": "make setup_e2e && wdio run ./wdio.conf.js", + "devr": "rollup --config rollup.config.js -w", + "buildr": "rollup --config rollup.config.js" }, "keywords": [ "obsidian", @@ -31,9 +33,15 @@ "@wdio/selenium-standalone-service": "^8.10.2", "@wdio/spec-reporter": "^8.10.2", "auto-changelog": "^2.4.0", + "rollup": "^2.45.2", + "@rollup/plugin-commonjs": "^15.1.0", + "@rollup/plugin-node-resolve": "^9.0.0", + "@rollup/plugin-typescript": "^6.0.0", + "rollup-plugin-copy": "^3.4.0", "builtin-modules": "^3.3.0", "chai": "^4.3.7", "esbuild": "~0.17.18", + "esbuild-plugin-copy": "^2.0.2", "eslint": "^8.40.0", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", @@ -45,7 +53,8 @@ "tslib": "2.5.0", "typescript": "5.0.4", "vhtml": "^2.2.0", - "wdio-chromedriver-service": "^8.1.1" + "wdio-chromedriver-service": "^8.1.1", + "@popperjs/core": "^2.11.6" }, "dependencies": { "chart.js": "^4.3.0", diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 00000000..56110fd2 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,38 @@ +import typescript from "@rollup/plugin-typescript"; +import { nodeResolve } from "@rollup/plugin-node-resolve"; +import commonjs from "@rollup/plugin-commonjs"; +import copy from "rollup-plugin-copy"; + +import config from "./config"; + +export default { + input: "src/main.ts", + output: { + dir: "./build/", + sourcemap: "inline", + format: "cjs", + exports: "default", + }, + external: ["obsidian"], + plugins: [ + typescript(), + nodeResolve({ browser: true }), + commonjs(), + copy({ + targets: [ + { + src: ["manifest.json", "styles.css", "./build/main.js"], + dest: config["vault-path"], + }, + // { + // src: "styles.css", + // dest: config['vault-path'], + // }, + // { + // src: "main.js", + // dest: config['vault-path'], + // }, + ], + }), + ], +}; diff --git a/src/algorithms.ts b/src/algorithms.ts new file mode 100644 index 00000000..87ef9231 --- /dev/null +++ b/src/algorithms.ts @@ -0,0 +1,16 @@ +import { RepetitionItem, ReviewResult } from "./data"; +import { MiscUtils } from "./utils_recall"; + +export default abstract class SrsAlgorithm { + settings: any; + + updateSettings(settings: any) { + this.settings = MiscUtils.assignOnly(this.defaultSettings(), settings); + } + + abstract defaultSettings(): any; + abstract defaultData(): any; + abstract onSelection(item: RepetitionItem, option: string, repeat: boolean): ReviewResult; + abstract srsOptions(): string[]; + abstract displaySettings(containerEl: HTMLElement, update: (settings: any) => void): void; +} diff --git a/src/algorithms/anki.ts b/src/algorithms/anki.ts new file mode 100644 index 00000000..8503facc --- /dev/null +++ b/src/algorithms/anki.ts @@ -0,0 +1,215 @@ +import { Setting, Notice } from "obsidian"; +import { DateUtils } from "src/utils_recall"; +import SrsAlgorithm from "./../algorithms"; +import { RepetitionItem, ReviewResult } from "./../data"; + +interface AnkiData { + ease: number; + lastInterval: number; + iteration: number; +} + +interface AnkiSettings { + easyBonus: number; + startingEase: number; + lapseInterval: number; + graduatingInterval: number; + easyInterval: number; +} + +const AnkiOptions: string[] = ["Again", "Hard", "Good", "Easy"]; + +/** + * This is an implementation of the Anki algorithm as described in + * https://faqs.ankiweb.net/what-spaced-repetition-algorithm.html + */ +export class AnkiAlgorithm extends SrsAlgorithm { + defaultSettings(): AnkiSettings { + return { + easyBonus: 1.3, + startingEase: 2.5, + lapseInterval: 0.5, + graduatingInterval: 1, + easyInterval: 4, + }; + } + + defaultData(): AnkiData { + return { + ease: this.settings.startingEase, + lastInterval: 1, + iteration: 1, + }; + } + + srsOptions(): string[] { + return AnkiOptions; + } + + onSelection(item: RepetitionItem, optionStr: string, repeat: boolean): ReviewResult { + const data = item.data as AnkiData; + const response = AnkiOptions.indexOf(optionStr); + + let correct = true; + let nextInterval = 0; + if (repeat) { + if (response == 0) { + correct = false; + } + + return { + correct, + nextReview: -1, + }; + } + + if (response == 0) { + // Again + data.ease = Math.max(1.3, data.ease - 0.2); + nextInterval = data.lastInterval * this.settings.lapseInterval; + correct = false; + } else if (response == 1) { + // Hard + data.ease = Math.max(1.3, data.ease - 0.15); + nextInterval = data.lastInterval * 1.2; + if (nextInterval - data.lastInterval < 1) nextInterval = data.lastInterval + 1; + } else if (response == 2) { + // Good + if (data.iteration == 1) { + // Graduation! + nextInterval = this.settings.graduatingInterval; + } else { + nextInterval = data.lastInterval * data.ease; + if (nextInterval - data.lastInterval < 1) nextInterval = data.lastInterval + 1; + } + } else if (response == 3) { + data.ease += 0.15; + if (data.iteration == 1) { + // Graduation! + nextInterval = this.settings.easyInterval; + } else { + nextInterval = data.lastInterval * data.ease * this.settings.easyBonus; + } + } + + data.iteration += 1; + data.lastInterval = nextInterval; + + return { + correct, + nextReview: nextInterval * DateUtils.DAYS_TO_MILLIS, + }; + } + + displaySettings(containerEl: HTMLElement, update: (settings: any) => void) { + new Setting(containerEl) + .setName("Starting Ease") + .setDesc("The initial ease given to an item.") + .addText((text) => + text + .setPlaceholder("Starting Ease") + .setValue(this.settings.startingEase.toString()) + .onChange((newValue) => { + const ease = Number(newValue); + + if (isNaN(ease) || ease < 0) { + new Notice("Starting ease must be a positive number."); + return; + } + + if (ease < 1.3) { + new Notice("Starting ease lower than 1.3 is not recommended."); + } + + this.settings.startingEase = ease; + update(this.settings); + }) + ); + + new Setting(containerEl) + .setName("Easy Bonus") + .setDesc("A bonus multiplier for items reviewed as easy.") + .addText((text) => + text + .setPlaceholder("Easy Bonus") + .setValue(this.settings.easyBonus.toString()) + .onChange((newValue) => { + const bonus = Number(newValue); + + if (isNaN(bonus) || bonus < 1) { + new Notice("Easy bonus must be a number greater than or equal to 1."); + return; + } + + this.settings.easyBonus = bonus; + update(this.settings); + }) + ); + + new Setting(containerEl) + .setName("Lapse Interval Modifier") + .setDesc( + "A factor to modify the review interval with when an item is reviewed as wrong." + ) + .addText((text) => + text + .setPlaceholder("Lapse Interval") + .setValue(this.settings.lapseInterval.toString()) + .onChange((newValue) => { + const lapse = Number(newValue); + + if (isNaN(lapse) || lapse <= 0) { + new Notice("Lapse interval must be a positive number."); + return; + } + + this.settings.lapseInterval = lapse; + update(this.settings); + }) + ); + + new Setting(containerEl) + .setName("Graduating Interval") + .setDesc( + "The interval (in days) to the next review after reviewing a new item as 'Good'." + ) + .addText((text) => + text + .setPlaceholder("Graduating Interval") + .setValue(this.settings.graduatingInterval.toString()) + .onChange((newValue) => { + const interval = Number(newValue); + + if (isNaN(interval) || interval <= 0) { + new Notice("Interval must be a positive number."); + return; + } + + this.settings.graduatingInterval = interval; + update(this.settings); + }) + ); + + new Setting(containerEl) + .setName("Easy Interval") + .setDesc( + "The interval (in days) to the next review after reviewing a new item as 'Easy'." + ) + .addText((text) => + text + .setPlaceholder("Easy Interval") + .setValue(this.settings.easyInterval.toString()) + .onChange((newValue) => { + const interval = Number(newValue); + + if (isNaN(interval) || interval <= 0) { + new Notice("Interval must be a positive number."); + return; + } + + this.settings.easyInterval = interval; + update(this.settings); + }) + ); + } +} diff --git a/src/algorithms/supermemo.ts b/src/algorithms/supermemo.ts new file mode 100644 index 00000000..fb39bb09 --- /dev/null +++ b/src/algorithms/supermemo.ts @@ -0,0 +1,86 @@ +import { DateUtils } from "src/utils_recall"; +import SrsAlgorithm from "./../algorithms"; +import { RepetitionItem, ReviewResult } from "./../data"; + +interface Sm2Data { + ease: number; + lastInterval: number; + iteration: number; +} + +const Sm2Options: string[] = ["Blackout", "Incorrect", "Incorrect (Easy)", "Hard", "Good", "Easy"]; + +/** + * Implementation of the SM2 algorithm as described at + * https://www.supermemo.com/en/archives1990-2015/english/ol/sm2 + */ +export class Sm2Algorithm extends SrsAlgorithm { + defaultSettings(): any { + return {}; + } + + defaultData(): Sm2Data { + return { + ease: 2.5, + lastInterval: 0, + iteration: 1, + }; + } + + srsOptions(): string[] { + return Sm2Options; + } + + onSelection(item: RepetitionItem, optionStr: string, repeat: boolean): ReviewResult { + const data = item.data as Sm2Data; + console.log("item.data:", item.data); + const interval = function (n: number): number { + if (n === 1) { + return 1; + } else if (n === 2) { + return 6; + } else { + return Math.round(data.lastInterval * data.ease); + } + }; + + const q = Sm2Options.indexOf(optionStr); + + if (repeat) { + if (q < 3) { + return { correct: false, nextReview: -1 }; + } else { + return { correct: true, nextReview: -1 }; + } + } + + if (q < 3) { + data.iteration = 1; + const nextReview = interval(data.iteration); + data.lastInterval = nextReview; + return { + correct: false, + nextReview: nextReview * DateUtils.DAYS_TO_MILLIS, + }; + } else { + const nextReview = interval(data.iteration); + data.iteration += 1; + data.ease = data.ease + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02)); + if (data.ease < 1.3) { + data.ease = 1.3; + } + + data.lastInterval = nextReview; + console.log("item.data:", item.data); + console.log("smdata:", data); + return { + correct: true, + nextReview: nextReview * DateUtils.DAYS_TO_MILLIS, + }; + } + } + + displaySettings(containerEl: HTMLElement, update: (settings: any) => void): void { + return; + } +} diff --git a/src/commands.ts b/src/commands.ts new file mode 100644 index 00000000..9c4874d2 --- /dev/null +++ b/src/commands.ts @@ -0,0 +1,189 @@ +import ObsidianSrsPlugin from "./main"; +// import { ItemInfoModal } from "./modals/info"; + +export default class Commands { + plugin: ObsidianSrsPlugin; + + constructor(plugin: ObsidianSrsPlugin) { + this.plugin = plugin; + } + + addCommands() { + const plugin = this.plugin; + + plugin.addCommand({ + id: "track-file", + name: "Track Note", + checkCallback: (checking: boolean) => { + const file = plugin.app.workspace.getActiveFile(); + if (file != null) { + if (!plugin.store.isTracked(file.path)) { + if (!checking) { + plugin.store.trackFile(file.path, "default"); + // plugin.updateStatusBar(); + } + return true; + } + } + return false; + }, + }); + + plugin.addCommand({ + id: "untrack-file", + name: "Untrack Note", + checkCallback: (checking: boolean) => { + const file = plugin.app.workspace.getActiveFile(); + if (file != null) { + if (plugin.store.isTracked(file.path)) { + if (!checking) { + plugin.store.untrackFile(file.path); + // plugin.updateStatusBar(); + } + return true; + } + } + return false; + }, + }); + + plugin.addCommand({ + id: "update-file", + name: "Update Note", + checkCallback: (checking: boolean) => { + const file = plugin.app.workspace.getActiveFile(); + if (file != null) { + if (plugin.store.isTracked(file.path)) { + if (!checking) { + plugin.store.updateItems(file.path); + // plugin.updateStatusBar(); + } + return true; + } + } + return false; + }, + }); + + plugin.addCommand({ + id: "build-queue", + name: "Build Queue", + callback: () => { + plugin.store.buildQueue(); + }, + }); + + plugin.addCommand({ + id: "review-view", + name: "Review", + callback: () => { + this.recallReviewNote(); + }, + }); + } + + recallReviewNote() { + this.plugin.store.buildQueue(); + const item = this.plugin.store.getNext(); + const state: any = { mode: "empty" }; + if (item != null) { + const path = this.plugin.store.getFilePath(item); + if (path != null) { + state.file = path; + state.item = this.plugin.store.getNextId(); + // state.mode = "note"; + // state.mode = "question"; + } + } + const leaf = this.plugin.app.workspace.getLeaf(); + leaf.setViewState({ + type: "markdown", + state: state, + }); + // leaf.setPinned(true); + + this.plugin.app.workspace.setActiveLeaf(leaf); + } + + addDebugCommands() { + console.log("Injecting debug commands..."); + const plugin = this.plugin; + + plugin.addCommand({ + id: "debug-print-view-state", + name: "Print View State", + callback: () => { + console.log(plugin.app.workspace.activeLeaf.getViewState()); + }, + }); + + plugin.addCommand({ + id: "debug-print-eph-state", + name: "Print Ephemeral State", + callback: () => { + console.log(plugin.app.workspace.activeLeaf.getEphemeralState()); + }, + }); + + plugin.addCommand({ + id: "debug-print-queue", + name: "Print Queue", + callback: () => { + console.log(plugin.store.data.queue); + console.log("There are " + plugin.store.data.queue.length + " items in queue."); + console.log(plugin.store.data.newAdded + " new where added to today."); + }, + }); + + plugin.addCommand({ + id: "debug-clear-queue", + name: "Clear Queue", + callback: () => { + plugin.store.data.queue = []; + plugin.store.data.cardQueue = []; + }, + }); + + plugin.addCommand({ + id: "debug-queue-all", + name: "Queue All", + callback: () => { + plugin.store.data.queue = []; + for (let i = 0; i < plugin.store.data.items.length; i++) { + if (plugin.store.data.items[i] != null) { + plugin.store.data.queue.push(i); + } + } + console.log("Queue Size: " + plugin.store.queueSize()); + }, + }); + + plugin.addCommand({ + id: "debug-print-data", + name: "Print Data", + callback: () => { + console.log(plugin.store.data); + }, + }); + + plugin.addCommand({ + id: "debug-reset-data", + name: "Reset Data", + callback: () => { + console.log("Resetting data..."); + plugin.store.resetData(); + console.log(plugin.store.data); + }, + }); + + plugin.addCommand({ + id: "debug-prune-data", + name: "Prune Data", + callback: () => { + console.log("Pruning data..."); + plugin.store.pruneData(); + console.log(plugin.store.data); + }, + }); + } +} diff --git a/src/data.ts b/src/data.ts new file mode 100644 index 00000000..a6468d90 --- /dev/null +++ b/src/data.ts @@ -0,0 +1,1633 @@ +import SRPlugin from "./main"; +import { DateUtils } from "./utils_recall"; +import { DataLocation, SRSettings } from "./settings"; + +import { TFile, TFolder, Notice, getAllTags } from "obsidian"; + +import { ReviewDeck, ReviewDeckSelectionModal } from "src/review-deck"; +import { CardType, ReviewResponse } from "./scheduling"; +import { parse } from "./parser"; +import { cyrb53 } from "./utils"; + +const ROOT_DATA_PATH = "./tracked_files.json"; +const PLUGIN_DATA_PATH = "./.obsidian/plugins/obsidian-spaced-repetition/tracked_files.json"; + +/** + * SrsData. + */ +interface SrsData { + /** + * @type {number[]} + */ + queue: number[]; + /** + * @type {number[]} + */ + repeatQueue: number[]; + /** + * @type {number[]} + */ + cardQueue: number[]; + /** + * @type {number[]} + */ + cardRepeatQueue: number[]; + /** + * @type {RepetitionItem[]} + */ + items: RepetitionItem[]; + /** + * @type {TrackedFile[]} + */ + trackedFiles: TrackedFile[]; + /** + * @type {number} + */ + lastQueue: number; + /** + * @type {0} + */ + newAdded: 0; +} + +/** + * RepetitionItem. + */ +export interface RepetitionItem { + /** + * @type {number} + */ + nextReview: number; + /** + * @type {number} + */ + fileIndex: number; + /** + * @type {number} + */ + timesReviewed: number; + /** + * @type {number} + */ + timesCorrect: number; + /** + * @type {number} + */ + errorStreak: number; // Needed to calculate leeches later on. + /** + * @type {any} + */ + data: any; // Additional data, determined by the selected algorithm. +} + +/** + * TrackedFile. + */ +interface TrackedFile { + /** + * @type {string} + */ + path: string; + /** + * @type {Record} + */ + items: Record; + /** + * @type {CardInfo[]} + */ + cardItems?: CardInfo[]; + /** + * @type {string[]} + */ + tags?: string[]; +} + +/** + * CardInfo + */ +interface CardInfo { + /** + * @type {number} + */ + lineNo: number; + /** + * @type {string} + */ + cardTextHash: string; + /** + * @type {number[]} + */ + itemIds: number[]; +} + +/** + * ReviewResult. + */ +export interface ReviewResult { + /** + * @type {boolean} + */ + correct: boolean; + /** + * @type {number} + */ + nextReview: number; +} + +const DEFAULT_SRS_DATA: SrsData = { + queue: [], + repeatQueue: [], + cardQueue: [], + cardRepeatQueue: [], + items: [], + trackedFiles: [], + lastQueue: 0, + newAdded: 0, +}; + +const NEW_ITEM: RepetitionItem = { + nextReview: 0, + fileIndex: -1, + timesReviewed: 0, + timesCorrect: 0, + errorStreak: 0, + data: {}, +}; + +const NEW_CARDINFO: CardInfo = { + lineNo: 0, + cardTextHash: "", + itemIds: [], +}; + +/** + * DataStore. + */ +export class DataStore { + /** + * @type {SrsData} + */ + data: SrsData; + /** + * @type {SRPlugin} + */ + plugin: SRPlugin; + /** + * @type {string} + */ + dataPath: string; + + /** + * @type {string} + */ + private defaultDeckname = "default"; + + /** + * constructor. + * + * @param {SRPlugin} plugin + */ + constructor(plugin: SRPlugin) { + this.plugin = plugin; + this.dataPath = this.getStorePath(); + } + + /** + * getStorePath. + * + * @returns {string} + */ + getStorePath(): string { + const dataLocation = this.plugin.data.settings.dataLocation; + if (dataLocation == DataLocation.PluginFolder) { + return PLUGIN_DATA_PATH; + } else if (dataLocation == DataLocation.RootFolder) { + return ROOT_DATA_PATH; + } else if (dataLocation == DataLocation.SpecifiedFolder) { + return this.plugin.data.settings.customFolder; + } else if (dataLocation == DataLocation.SaveOnNoteFile) { + return PLUGIN_DATA_PATH; + } + } + + getDefaultDackName() { + return this.defaultDeckname; + } + + /** + * moveStoreLocation. + * + * @returns {boolean} + */ + moveStoreLocation(): boolean { + const adapter = this.plugin.app.vault.adapter; + + const newPath = this.getStorePath(); + if (newPath === this.dataPath) { + return false; + } + + try { + this.save(); + adapter.remove(this.dataPath).then( + () => { + this.dataPath = newPath; + new Notice("Successfully moved data file!"); + return true; + }, + (e) => { + this.dataPath = newPath; + new Notice("Unable to delete old data file, please delete it manually."); + console.log(e); + return true; + } + ); + } catch (e) { + new Notice("Unable to move data file!"); + console.log(e); + return false; + } + } + + /** + * load. + */ + async load() { + const adapter = this.plugin.app.vault.adapter; + if (this.plugin.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { + if (await adapter.exists(this.dataPath)) { + const data = await adapter.read(this.dataPath); + if (data == null) { + console.log("Unable to read SRS data!"); + this.data = Object.assign({}, DEFAULT_SRS_DATA); + } else { + console.log("Reading tracked files..."); + this.data = Object.assign( + Object.assign({}, DEFAULT_SRS_DATA), + JSON.parse(data) + ); + } + } else { + console.log("Tracked files not found! Creating new file..."); + this.data = Object.assign({}, DEFAULT_SRS_DATA); + await this.save(); + } + } + } + + /** + * save. + */ + async save() { + await this.plugin.app.vault.adapter + .write(this.dataPath, JSON.stringify(this.data)) + .catch((e) => { + new Notice("Unable to save data file!"); + console.log(e); + }); + } + + /** + * Returns total number of items tracked by the SRS. + */ + /** + * items. + * + * @returns {number} + */ + items(): number { + return this.data.items.length; + } + + /** + * Returns the size of the current queue. + */ + /** + * queueSize. + * + * @returns {number} + */ + queueSize(): number { + return this.data.queue.length; + } + + /** + * repeatQueueSize. + * + * @returns {number} + */ + repeatQueueSize(): number { + return this.data.repeatQueue.length; + } + + /** + * getFileIndex. + * + * @param {string} path + * @returns {number} + */ + getFileIndex(path: string): number { + return this.data.trackedFiles.findIndex((val, _ind, _obj) => { + return val != null && val.path == path; + }); + } + + getFileId(path: string): number { + if (this.getFileIndex(path) == -1) { + return -1; + } + const fileInd = this.getFileIndex(path); + const fileId = this.data.trackedFiles[fileInd].items["file"]; + return fileId; + } + + getTrackedFile(path: string): TrackedFile { + const ind = this.getFileIndex(path); + if (ind < 0) { + return null; + } + return this.data.trackedFiles[ind]; + } + + /** + * getAndSyncCardInfoIndex + * @param note: TFile + * @param lineNo + * @param cardTextHash + * @returns {CardInfo} cardinfo | null: didn't have cardInfo + */ + getAndSyncCardInfo(note: TFile, lineNo: number, cardTextHash?: string): CardInfo { + let cardind = -2; + const trackedFile = this.getTrackedFile(note.path); + if (trackedFile != null && Object.prototype.hasOwnProperty.call(trackedFile, "cardItems")) { + cardind = trackedFile.cardItems.findIndex((cinfo: CardInfo, _ind, _obj) => { + let res = false; + if (cardTextHash != null && cinfo.cardTextHash === cardTextHash) { + cinfo.lineNo = lineNo; + res = true; + } else if (cinfo.lineNo === lineNo) { + cinfo.cardTextHash = cardTextHash; + res = true; + } + return res; + }); + } + return cardind >= 0 ? trackedFile.cardItems[cardind] : null; + } + + /** + * Returns whether or not the given file path is tracked by the SRS. + * @param {string} path + * @returns {boolean} + */ + isTracked(path: string): boolean { + const ind = this.getFileIndex(path); + const fid = this.getFileId(path); + + return ind >= 0 && fid >= 0; + } + + /** + * Returns whether or not the given file path is tracked by the SRS. + * work for cards query. + * @param {string} path + * @returns {boolean} + */ + isTrackedCardfile(path: string): boolean { + return this.getFileIndex(path) >= 0; + } + + /** + * isQueued. + * + * @param {number} item + * @returns {boolean} + */ + isQueued(item: number): boolean { + return this.data.queue.includes(item); + } + + /** + * isQueued. + * + * @param {number} item + * @returns {boolean} + */ + isCardQueued(item: number): boolean { + return this.data.cardQueue.includes(item); + } + + /** + * isInRepeatQueue. + * + * @param {number} item + * @returns {boolean} + */ + isInRepeatQueue(item: number): boolean { + return this.data.repeatQueue.includes(item) || this.data.cardRepeatQueue.includes(item); + } + + /** + * check if file id is just new add. + * @param id Item id, can get by: + * findex = this.store.getFileIndex(note.path); + * id = this.data.trackedFiles[findex].items["file"] + * @returns true| false| -1 + */ + isNewAdd(id: number) { + if (id < 0) { + console.log("[wrong file ID]: file %d not tracked. ", id); + return -1; + } + if (this.data.items[id] == null) { + console.log("[wrong file ID]: file %d had been untracked. ", id); + return -2; + } + // console.debug("isnewadd: ",id); + if (this.data.items[id]["nextReview"] == 0) { + // This is a new item. + return true; + } + return false; + } + + /** + * Returns when the given item is reviewed next (in hours). + */ + /** + * nextReview. + * + * @param {number} itemId + * @returns {number} + */ + nextReview(itemId: number): number { + const item = this.data.items[itemId]; + if (item == null) { + return -1; + } + + const now: Date = new Date(); + return (item.nextReview - now.getTime()) / (1000 * 60 * 60); + } + + /** + * getItemsOfFile. + * + * @param {string} path + * @returns {RepetitionItem[]} + */ + getItemsOfFile(path: string): RepetitionItem[] { + const result: RepetitionItem[] = []; + const file = this.data.trackedFiles[this.getFileIndex(path)]; + Object.values(file.items).forEach((item) => { + result.push(this.data.items[item]); + }); + return result; + } + + getFileForItem(item: RepetitionItem): TrackedFile { + if (item != null) { + return this.data.trackedFiles[item.fileIndex]; + } + return null; + } + + /** + * getNext. RepetitionItem + * + * @returns {RepetitionItem | null} + */ + getNext(): RepetitionItem | null { + const id = this.getNextId(); + if (id != null) { + return this.data.items[id]; + } + + return null; + } + + /** + * getNextId. + * + * @returns {number | null} + */ + getNextId(): number | null { + if (this.queueSize() > 0) { + return this.data.queue[0]; + } else if (this.data.repeatQueue.length > 0) { + return this.data.repeatQueue[0]; + } else { + return null; + } + } + + /** + * getFilePath. + * + * @param {RepetitionItem} item + * @returns {string | null} + */ + getFilePath(item: RepetitionItem): string | null { + const trackedFile = this.data.trackedFiles[item.fileIndex]; + if (trackedFile != null) { + return trackedFile.path; + } + return null; + } + + /** + * reviewId. + * update data according to response opt + * @param {number} itemId + * @param {string} option + */ + reviewId(itemId: number, option: string) { + const item = this.data.items[itemId]; + if (item == null) { + return -1; + } + + if (this.isInRepeatQueue(itemId)) { + const result = this.plugin.algorithm.onSelection(item, option, true); + + this.data.repeatQueue.remove(itemId); + if (!result.correct) { + this.data.repeatQueue.push(itemId); // Re-add until correct. + } + } else { + const result = this.plugin.algorithm.onSelection(item, option, false); + + item.nextReview = DateUtils.fromNow(result.nextReview).getTime(); + item.timesReviewed += 1; + this.data.queue.remove(itemId); + if (result.correct) { + item.timesCorrect += 1; + item.errorStreak = 0; + } else { + item.errorStreak += 1; + + if (this.plugin.data.settings.repeatItems) { + this.data.repeatQueue.push(itemId); + } + } + } + } + + /** + * untrackFilesInFolderPath. + * + * @param {string} path + * @param {boolean} recursive + */ + untrackFilesInFolderPath(path: string, recursive?: boolean) { + const folder: TFolder = this.plugin.app.vault.getAbstractFileByPath(path) as TFolder; + + if (folder != null) { + this.untrackFilesInFolder(folder, recursive); + } + } + + /** + * untrackFilesInFolder. + * + * @param {TFolder} folder + * @param {boolean} recursive + */ + untrackFilesInFolder(folder: TFolder, recursive?: boolean) { + if (recursive == null) recursive = true; + + let totalRemoved = 0; + folder.children.forEach((child) => { + if (child instanceof TFolder) { + if (recursive) { + this.untrackFilesInFolder(child, recursive); + } + } else if (child instanceof TFile) { + if (this.isTracked(child.path)) { + const removed = this.untrackFile(child.path, false); + totalRemoved += removed; + } + } + }); + } + + /** + * trackFilesInFolderPath. + * + * @param {string} path + * @param {boolean} recursive + */ + trackFilesInFolderPath(path: string, recursive?: boolean) { + const folder: TFolder = this.plugin.app.vault.getAbstractFileByPath(path) as TFolder; + + if (folder != null) { + this.trackFilesInFolder(folder, recursive); + } + } + + /** + * trackFilesInFolder. + * + * @param {TFolder} folder + * @param {boolean} recursive + */ + trackFilesInFolder(folder: TFolder, recursive?: boolean) { + if (recursive == null) recursive = true; + + let totalAdded = 0; + let totalRemoved = 0; + folder.children.forEach((child) => { + if (child instanceof TFolder) { + if (recursive) { + this.trackFilesInFolder(child, recursive); + } + } else if (child instanceof TFile && child.extension === "md") { + if (!this.isTracked(child.path)) { + const { added, removed } = this.trackFile( + child.path, + this.getDefaultDackName(), + false + ); + totalAdded += added; + totalRemoved += removed; + } + } + }); + + new Notice("Added " + totalAdded + " new items, removed " + totalRemoved + " items."); + } + + /** + * trackFile. + * + * @param {string} path + * @param {string} tag? "default" , "card" + * @param {boolean} notice + * @returns {{ added: number; removed: number } | null} + */ + trackFile( + path: string, + tag?: string, + notice?: boolean + ): { added: number; removed: number } | null { + const trackedFile: TrackedFile = { + path: path, + items: {}, + tags: [], + }; + if (tag != null) { + trackedFile.tags = [tag]; + if (tag === "card") { + trackedFile.cardItems = []; + } + } + this.data.trackedFiles.push(trackedFile); + const data = this.updateItems(path, notice); + console.log("Tracked: " + path); + // this.plugin.updateStatusBar(); + return data; + } + + /** + * trackFileCard + * 添加笔记中特定行的卡片(组) + * @param note + * @param lineNo + * @param cardTextHash + * @param count + * @param notice + * @returns {CardInfo} cardInfo of new add. + */ + trackFileCard( + note: TFile, + lineNo: number, + cardTextHash: string, + count: number, + notice?: boolean + ): CardInfo { + // console.debug("trackFileCard", note.name, lineNo, count); + if (!this.isTrackedCardfile(note.path)) { + console.log("Attempt to add card in untracked file: " + note.path); + this.trackFile(note.path, "card", false); + } + const trackedFile = this.getTrackedFile(note.path); + + const newcardItem: CardInfo = { lineNo: lineNo, cardTextHash: cardTextHash, itemIds: [] }; + + if (!Object.prototype.hasOwnProperty.call(trackedFile, "cardItems")) { + // didn't have cardItems + trackedFile.cardItems = []; + } + + const cind = trackedFile.cardItems.push(newcardItem) - 1; + const data = this.updateCardItems(note, trackedFile.cardItems[cind], count, notice); + trackedFile.cardItems.sort((a, b) => { + return a.lineNo - b.lineNo; + }); + this.save(); + + console.log( + "Tracked: " + note.path + "lineNo:" + lineNo + " Added " + data.added + " new items" + ); + + return newcardItem; + } + + /** + * untrackFile. + * + * @param {string} path + * @param {boolean} notice + * @returns {number} + */ + untrackFile(path: string, notice?: boolean): number { + if (notice == null) notice = true; + + const index = this.getFileIndex(path); + + if (index == -1) { + return; + } + + const trackedFile = this.data.trackedFiles[index]; + const file = this.plugin.app.vault.getAbstractFileByPath(path) as TFile; + + if ( + file != null && + "tags" in trackedFile && + trackedFile.tags.length > 0 && + trackedFile.tags.last() !== this.getDefaultDackName() + ) { + // it's taged file, can't untrack by this. + console.log(path + " is taged file, can't untrack by this."); + new Notice( + "it is taged file, can't untrack by this. You can delete the #review tag in note file." + ); + return; + } + + const numItems = Object.keys(trackedFile.items).length; + + for (const key in trackedFile.items) { + const ind = trackedFile.items[key]; + if (this.isQueued(ind)) { + this.data.queue.remove(ind); + } + if (this.isInRepeatQueue(ind)) { + this.data.repeatQueue.remove(ind); + } + this.data.items[ind] = null; + } + + if (notice) { + new Notice("Untracked " + numItems + " items!"); + } + + // when file not exist, or doesn't have carditems, del it. + let nulrstr: string; + if (!file || !Object.prototype.hasOwnProperty.call(trackedFile, "cardItems")) { + this.data.trackedFiles[index] = null; + nulrstr = file == null ? ", because it not exist." : ""; + } else { + this.data.trackedFiles[index].items.file = -1; + } + this.save(); + // this.plugin.updateStatusBar(); + console.log("Untracked: " + path + nulrstr); + } + + /** + * updateItems. + * + * @param {string} path + * @param {boolean} notice + * @returns {{ added: number; removed: number } | null} + */ + updateItems(path: string, notice?: boolean): { added: number; removed: number } | null { + if (notice == null) notice = true; + + const ind = this.getFileIndex(path); + if (ind == -1) { + console.log("Attempt to update untracked file: " + path); + return; + } + const trackedFile = this.data.trackedFiles[ind]; + + const file = this.plugin.app.vault.getAbstractFileByPath(path) as TFile; + if (!file) { + console.log("Could not find file: " + path); + return; + } + + let added = 0; + let removed = 0; + + const newItems: Record = {}; + if ("file" in trackedFile.items) { + newItems["file"] = trackedFile.items["file"]; + } else { + const newItem: RepetitionItem = Object.assign({}, NEW_ITEM); + newItem.data = Object.assign(this.plugin.algorithm.defaultData()); + // newItem.data = Object.assign(this.algorithmdefaultData()); + newItem.fileIndex = ind; + newItems["file"] = this.data.items.push(newItem) - 1; + added += 1; + } + + for (const key in trackedFile.items) { + if (!(key in newItems)) { + const itemInd = trackedFile.items[key]; + if (this.isQueued(itemInd)) { + this.data.queue.remove(itemInd); + } + if (this.isInRepeatQueue(itemInd)) { + this.data.repeatQueue.remove(itemInd); + } + this.data.items[itemInd] = null; + removed += 1; + } + } + trackedFile.items = newItems; + this.save(); + + if (notice) { + new Notice("Added " + added + " new items, removed " + removed + " items."); + } + return { added, removed }; + } + + updateCardItems( + note: TFile, + cardinfo: CardInfo, + count: number, + notice?: boolean + ): { added: number; removed: number } | null { + if (notice == null) notice = false; + let len = cardinfo.itemIds.length; + if (len === count) { + return; + } + + if (!this.isTrackedCardfile(note.path)) { + console.log("Attempt to update cards in untracked file: " + note.path); + return; + } + const ind = this.getFileIndex(note.path); + const trackedFile = this.getTrackedFile(note.path); + let added = 0; + let removed = 0; + + const newitemIds: number[] = cardinfo.itemIds.slice(); + + //delete extra items data + if (count < len) { + newitemIds.slice(count).forEach((id) => { + this.data.items[id] = null; + removed++; + }); + console.debug("delete %d ids:", removed, newitemIds.slice(count)); + newitemIds.splice(count, len - count); + len = newitemIds.length; + } + + if (count - len > 0) { + // add new card data + for (let i = 0; i < count - len; i++) { + const newItem: RepetitionItem = Object.assign({}, NEW_ITEM); + newItem.data = Object.assign(this.plugin.algorithm.defaultData()); + newItem.fileIndex = ind; + const cardId = this.data.items.push(newItem) - 1; + newitemIds.push(cardId); + added += 1; + } + console.debug("add %d ids:", added, newitemIds); + } + + // delete unused iid items. + for (const iid of cardinfo.itemIds) { + if (!newitemIds.includes(iid)) { + if (this.isCardQueued(iid)) { + this.data.cardQueue.remove(iid); + } + if (this.isInRepeatQueue(iid)) { + this.data.cardRepeatQueue.remove(iid); + } + this.data.items[iid] = null; + console.debug("removed", iid); + removed += 1; + } + } + cardinfo.itemIds = newitemIds; + this.save(); + + console.log( + trackedFile.path + + " update - lineNo:" + + cardinfo.lineNo + + "\n Added: " + + added + + " new card items, removed " + + removed + + " card items." + ); + if (notice) { + new Notice( + trackedFile.path + + " update - lineNo:" + + cardinfo.lineNo + + "\n Added: " + + added + + " new card items, removed " + + removed + + " card items." + ); + } + return { added, removed }; + } + + /** + * updateItemById + * @param id + * @param fileIndex + * @returns + */ + updateItemById(id: number, fileIndex?: number): void { + if (id < 0) return; + const item = this.data.items[id]; + if (item == null && fileIndex != null) { + const newItem: RepetitionItem = Object.assign({}, NEW_ITEM); + newItem.data = Object.assign(this.plugin.algorithm.defaultData()); + newItem.fileIndex = fileIndex; + + this.data.items[id] = newItem; + this.save(); + console.debug("update item[%d]:", id, item); + return; + } + if (item == null) { + console.debug("update item[${id}] lack fileIndex"); + } + } + + /** + * renameTrackedFile. + * + * @param {string} old + * @param {string} newPath + */ + renameTrackedFile(old: string, newPath: string) { + const index = this.getFileIndex(old); + // Sanity check + if (index == -1) { + console.log("Renamed file is not tracked!"); + return; + } + + const fileData = this.data.trackedFiles[index]; + fileData.path = newPath; + this.data.trackedFiles[index] = fileData; + + console.log("Updated tracking: " + old + " -> " + newPath); + } + + /** + * buildQueue. indexlist of items + */ + async buildQueue() { + // console.log("Building queue..."); + const data = this.data; + const maxNew = this.plugin.data.settings.maxNewPerDay; + const now: Date = new Date(); + + if (now.getDate() != new Date(this.data.lastQueue).getDate()) { + this.data.newAdded = 0; + } + data.cardQueue = []; + + let oldAdd = 0; + let newAdd = 0; + + let untrackedFiles = 0; + let removedItems = 0; + + await Promise.all( + this.data.items.map(async (item, id) => { + if (item != null) { + const file = this.getFileForItem(item); + return this.verify(file).then((exists) => { + if (!exists) { + if (file != null) { + removedItems += this.untrackFile(file.path, false); + item = null; + untrackedFiles += 1; + } + } else if (file.items.file !== id) { + if (item.nextReview == 0) { + // This is a new item. + if (maxNew == -1 || data.newAdded < maxNew) { + // item.nextReview = now.getTime(); + data.newAdded += 1; + data.cardQueue.push(id); + newAdd += 1; + } + } else if (item.nextReview <= now.getTime()) { + if (this.isInRepeatQueue(id)) { + data.cardRepeatQueue.remove(id); + } + if (!this.isCardQueued(id)) { + data.cardQueue.push(id); + oldAdd += 1; + } + } + } else { + if (item.nextReview == 0) { + // This is a new item. + if (maxNew == -1 || data.newAdded < maxNew) { + item.nextReview = now.getTime(); + data.newAdded += 1; + data.queue.push(id); + newAdd += 1; + } + } else if (item.nextReview <= now.getTime()) { + if (this.isInRepeatQueue(id)) { + data.repeatQueue.remove(id); + } + if (!this.isQueued(id)) { + data.queue.push(id); + oldAdd += 1; + } + } + } + }); + } + }) + ); + + this.data.lastQueue = now.getTime(); + // if (this.plugin.data.settings.shuffleQueue && oldAdd + newAdd > 0) { + // MiscUtils.shuffle(data.queue); + // } + + console.log( + "Added " + (oldAdd + newAdd) + " files to review queue, with " + newAdd + " new!" + ); + + if (untrackedFiles > 0) { + new Notice( + "Recall: Untracked " + + untrackedFiles + + " files with a total of " + + removedItems + + " items while building queue!" + ); + } + } + + /** + * Verify that the file of this item still exists. + * + * @param {TrackedFile} file + */ + async verify(file: TrackedFile): Promise { + const adapter = this.plugin.app.vault.adapter; + if (file != null) { + return adapter.exists(file.path).catch((reason) => { + console.error("Unable to verify file: ", file.path); + return false; + }); + } + return false; + } + + /** + * resetData. + */ + resetData() { + this.data = Object.assign({}, DEFAULT_SRS_DATA); + } + + /** + * pruneData: delete unused storedata + * NulltFiles/NullItems + * @returns + */ + async pruneData() { + const items = this.data.items; + const tracked_files = this.data.trackedFiles; + let removedNulltFiles = 0; + let removedNullItems = 0; + const nullFileList: number[] = []; + const nullFileList_del: number[] = []; + const nullItemList: number[] = []; + const nullItemList_del: number[] = []; + + // console.debug("before delete nullTrackedFiles:", tracked_files); + tracked_files.map((tf, ind) => { + if (tf == null) { + nullFileList.push(ind); + nullFileList_del.push(ind - nullFileList_del.length); + removedNulltFiles++; + } + }); + for (let i = 0; i < nullFileList_del.length; i++) { + tracked_files.splice(nullFileList_del[i], 1); + } + const nflMin = Math.min(...nullFileList); + items.map((item, id) => { + if (item != null && item.fileIndex >= nflMin) { + const ifind = item.fileIndex; + for (let nli = nullFileList.length - 1; nli >= 0; nli--) { + if (ifind > nullFileList[nli]) { + item.fileIndex -= nli + 1; + // console.debug("change item:%s .ind%d to .ind%d", item, ifind, item.fileIndex); + break; + } else if (ifind === nullFileList[nli]) { + item = null; + // console.debug("set item:%s to null", item); + break; + } + } + } + if (item == null) { + nullItemList.push(id); + nullItemList_del.push(id - nullItemList_del.length); + removedNullItems++; + } + }); + // console.debug("after delete nullTrackedFiles:", tracked_files); + + // console.debug("before delete nullitems:", items); + for (let i = 0; i < nullItemList_del.length; i++) { + items.splice(nullItemList_del[i], 1); + } + + const nlMin = Math.min(...nullItemList); + for (const trackedFile of tracked_files) { + if (trackedFile == null) continue; + const oldId = trackedFile.items.file; + let newId = -1; + if (oldId >= nlMin) { + for (let nli = nullItemList.length - 1; nli >= 0; nli--) { + if (oldId >= nullItemList[nli]) { + newId = oldId > nullItemList[nli] ? oldId - (nli + 1) : -1; + trackedFile.items.file = newId; + // console.debug("change file: id%d to id%d", oldId, newId, trackedFile); + break; + } + } + } + + // loop itemIds, if has some id point to null, change it. + if (!Object.prototype.hasOwnProperty.call(trackedFile, "cardItems")) { + continue; + } + for (const carditem of trackedFile.cardItems) { + if (Math.max(...carditem.itemIds) >= nlMin) { + console.debug("change card:%s to", carditem.itemIds); + for (let idi = 0; idi < carditem.itemIds.length; idi++) { + const oldId = carditem.itemIds[idi]; + let newId = -1; + if (oldId >= nlMin) { + nlfor: for (let nli = nullItemList.length - 1; nli >= 0; nli--) { + if (oldId >= nullItemList[nli]) { + newId = oldId > nullItemList[nli] ? oldId - (nli + 1) : newId; + carditem.itemIds.splice(idi, 1, newId); + // trackedFile.cardItems[cardind].itemIds.splice(idi,1, newId); + // console.debug("null%d change card:%s id[%d]:%d to id%d", nullItemList[nli], carditem.itemIds, idi, oldId, newId); + break nlfor; + } + } + } + } + console.debug("changed card:%s by %s", carditem.itemIds, nullFileList); + } + } + } + + // console.debug("after delete nullitems:", items); + + this.save(); + + console.log( + "removed " + + removedNulltFiles + + " nullTrackedfile(s), removed " + + removedNullItems + + " nullitem(s)." + ); + return; + } + + /** + * sync RCsrsDataTo SRreviewDecks + * + * @param rdeck + * @returns + */ + syncRCsrsDataToSRreviewDecks(rdeck: ReviewDeck) { + // graph.reset(); + this.buildQueue(); + const now = new Date().getTime(); + for (let i = 0; i < this.data.queue.length; i++) { + const item = this.data.items[this.data.queue[i]]; + if (item == null) { + console.log("syncRCsrsDataToSRreviewDecks: null item"); + continue; + } + const path = this.getFilePath(item); + const trackedFile = this.getFileForItem(item); + const file = this.plugin.app.vault.getAbstractFileByPath(path) as TFile; + if (!file) { + console.log("Could not find file: ", path); + continue; + } + + let shouldIgnore = false; + if (!Object.prototype.hasOwnProperty.call(trackedFile, "tags")) { + trackedFile["tags"] = [this.getDefaultDackName()]; + this.save(); + } + for (const tag of trackedFile.tags) { + if ( + this.plugin.data.settings.tagsToReview.some( + (tagToReview) => tag === tagToReview || tag.startsWith(tagToReview + "/") + ) + ) { + shouldIgnore = true; + break; + } + } + if ( + trackedFile.tags.length > 0 && + trackedFile.tags.last() !== this.getDefaultDackName() + ) { + // had other tags that user currently doesn't want to review. + shouldIgnore = true; + } + if (shouldIgnore) { + continue; + } // already add to other tagDeck. + + if (this.isNewAdd(this.data.queue[i])) { + rdeck.newNotes.push(file); + this.plugin.newNotesCount++; + continue; + } else { + rdeck.scheduledNotes.push({ note: file, dueUnix: item.nextReview }); + if (item.nextReview <= now.valueOf()) { + rdeck.dueNotesCount++; + this.plugin.dueNotesCount++; + } + } + + const [, due, interval, ease] = this.getReviewNoteHeaderData(path); + if (Object.prototype.hasOwnProperty.call(this.plugin.easeByPath, path)) { + this.plugin.easeByPath[path] = (this.plugin.easeByPath[path] + ease) / 2; + } else { + this.plugin.easeByPath[path] = ease; + } + const nDays: number = Math.ceil((due - now.valueOf()) / (24 * 3600 * 1000)); + if (!Object.prototype.hasOwnProperty.call(this.plugin.dueDatesNotes, nDays)) { + this.plugin.dueDatesNotes[nDays] = 0; + } + this.plugin.dueDatesNotes[nDays]++; + } + return rdeck; + } + + /** + * syncRCDataToSR ReviewDeck , + * and update deckName to trackedfile.tags; + * @param rdeck + * @returns + */ + syncRCDataToSRrevDeck(rdeck: ReviewDeck, note: TFile, now?: number) { + const fileid = this.getFileId(note.path); + const item = this.data.items[fileid]; + const trackedFile = this.getTrackedFile(note.path); + const ind = this.getFileIndex(note.path); + let now_number: number = now; + if (now == null) { + //it's inside plugin.sync(); + const nowToday: number = Math.ceil(Date.now() / (24 * 3600 * 1000)) * 24 * 3600 * 1000; + now_number = nowToday; + } + + if (item == null) { + this.updateItemById(fileid, ind); + console.debug("syncRCDataToSRrevDeck update item:", item); + } + if (this.isNewAdd(fileid)) { + rdeck.newNotes.push(note); + this.plugin.newNotesCount++; + } else { + rdeck.scheduledNotes.push({ note: note, dueUnix: item.nextReview }); + if (item.nextReview <= now_number) { + rdeck.dueNotesCount++; + this.plugin.dueNotesCount++; + } + + // update pulgin data + const [, due, interval, ease] = this.getReviewNoteHeaderData(note.path); + if (now != null) { + // this.plugin.easeByPath just update in plugin.sync(), shouldn't update in pulgin.singNoteSyncQueue() + if (Object.prototype.hasOwnProperty.call(this.plugin.easeByPath, note.path)) { + this.plugin.easeByPath[note.path] = + (this.plugin.easeByPath[note.path] + ease) / 2; + } else { + this.plugin.easeByPath[note.path] = ease; + } + } + const nDays: number = Math.ceil((due - now_number) / (24 * 3600 * 1000)); + if (!Object.prototype.hasOwnProperty.call(this.plugin.dueDatesNotes, nDays)) { + this.plugin.dueDatesNotes[nDays] = 0; + } + this.plugin.dueDatesNotes[nDays]++; + } + // update this.trackFile + if (!Object.prototype.hasOwnProperty.call(trackedFile, "tags")) { + trackedFile["tags"] = [rdeck.deckName]; + this.save(); + } else { + if (!trackedFile.tags.includes(rdeck.deckName)) { + trackedFile.tags.push(rdeck.deckName); + this.save(); + } + } + + // console.debug("update rdeck:", rdeck); + return; + } + + /** + * syncheadertoDataItems + * @param note Tfile + * @param sched ["due-interval-ease00", dueString, interval, ease] + * @param response + */ + syncheadertoDataItems(note: TFile, sched: number[], response?: ReviewResponse) { + const fileId = this.getFileId(note.path); + let correct = null; + if (response != null) { + if (!(response == ReviewResponse.Easy || response == ReviewResponse.Good)) { + correct = false; + } else { + correct = true; + } + } + + this.setSchedbyId(fileId, sched, correct); + } + + /** + * get ReviewNote dataItems to HeaderData + * getSchedbyId + * @param path + * @returns number[] | [0, due, interval, ease]; + */ + getReviewNoteHeaderData(path: string): number[] { + const item: RepetitionItem = this.getItemsOfFile(path)[0]; + if (item == null) { + console.log("getReviewNoteHeaderData --> note: %s doesn't have item: ", path, item); + return; + } + const ease = item.data.ease * 100; + const interval = item.data.lastInterval; + // const interval = item.data.iteration; + const due = item.nextReview; + return [0, due, interval, ease]; + } + + /** + * @description: getSchedbyId , give returns to scheduling + * @param {number} id + * @return {[]} ["due-interval-ease00", due, interval, ease] | null for new + */ + getSchedbyId(id: number): RegExpMatchArray { + const item: RepetitionItem = this.data.items[id]; + if (item == null || item.nextReview === 0) return null; // new card doesn't need schedinfo + const ease = item.data.ease * 100; + const interval = item.data.lastInterval; + // const interval = item.data.iteration; + const due = window.moment(item.nextReview); + const dueString: string = due.format("YYYY-MM-DD"); + return ["due-interval-ease00", dueString, interval, ease] as RegExpMatchArray; + } + + setSchedbyId(id: number, sched: RegExpMatchArray | number[] | string[], correct?: boolean) { + const item: RepetitionItem = this.data.items[id]; + if (item == null) { + console.warn("setSchedbyId failed: item === null"); + // this.updateItemById(id); //not work well yet. + return; + } + item.nextReview = + typeof sched[1] == "number" + ? sched[1] + : window + .moment(sched[1], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) + .valueOf(); + item.data.lastInterval = sched[2] as number; + item.data.ease = (sched[3] as number) / 100; + + if (correct != null) { + item.timesReviewed += 1; + if (correct) { + item.timesCorrect += 1; + item.errorStreak = 0; + } else { + item.errorStreak += 1; + } + } + } + + /** + * syncNoteCardsIndex + * only check and sync index, not add/remove cardinfo/ids/items. + * @param note + * @returns + */ + async syncNoteCardsIndex(note: TFile): Promise { + if (!this.isTaged(note, "card") && !this.isTrackedCardfile(note.path)) { + return; + } + + const now: number = Date.now(); + const trackedFile = this.getTrackedFile(note.path); + const fileText: string = await this.plugin.app.vault.read(note); + const settings: SRSettings = this.plugin.data.settings; + let negIndFlag = false; + const lines: number[] = []; + const cardHashList: Record = {}; + + const parsedCards: [CardType, string, number][] = parse( + fileText, + settings.singleLineCardSeparator, + settings.singleLineReversedCardSeparator, + settings.multilineCardSeparator, + settings.multilineReversedCardSeparator, + settings.convertHighlightsToClozes, + settings.convertBoldTextToClozes, + settings.convertCurlyBracketsToClozes + ); + + for (const parsedCard of parsedCards) { + const cardType: CardType = parsedCard[0], + lineNo: number = parsedCard[2]; + let cardText: string = parsedCard[1]; + + if (cardText.includes(settings.editLaterTag)) { + continue; + } + + if (!settings.convertFoldersToDecks) { + const tagInCardRegEx = /^#[^\s#]+/gi; + const cardDeckPath = cardText + .match(tagInCardRegEx) + ?.slice(-1)[0] + .replace("#", "") + .split("/"); + if (cardDeckPath) { + cardText = cardText.replaceAll(tagInCardRegEx, ""); + } + } + + const cardTextHash: string = cyrb53(cardText); + + const cardinfo = this.getAndSyncCardInfo(note, lineNo, cardTextHash); + lines.push(lineNo); + cardHashList[lineNo] = cardTextHash; + if (cardinfo == null) { + negIndFlag = true; + continue; + } + } + console.debug("cardHashList: ", cardHashList); + + // sync by total parsedCards.length + const carditems = trackedFile.cardItems; + if (lines.length === carditems.length && negIndFlag) { + for (let i = 0; i < lines.length; i++) { + if (lines[i] !== carditems[i].lineNo) { + carditems[i].lineNo = lines[i]; + this.getAndSyncCardInfo(note, lines[i], cardHashList[lines[i]]); + } + } + // console.debug("after items:", carditems); + } + + // console.log("syncNoteCardsIndex-end,token time", {t: Date.now() - now.valueOf(),}); + return; + } + + /** + * check if note taged for sr. + * @param note + * @param tagtype "note", "card", "all" + * @returns boolean + */ + isTaged(note: TFile, tagtype?: string) { + if (tagtype == null) { + tagtype = "note"; + } + // on tracked notfile changed. + const fileCachedData = app.metadataCache.getFileCache(note) || {}; + let shouldIgnore = true; + + const tags = getAllTags(fileCachedData) || []; + if ( + this.plugin.data.settings.noteFoldersToIgnore.some((folder) => + note.path.startsWith(folder) + ) + ) { + return false; + } + + if (tagtype === "note") { + for (const tag of tags) { + if ( + this.plugin.data.settings.tagsToReview.some( + (tagToReview) => tag === tagToReview || tag.startsWith(tagToReview + "/") + ) + ) { + shouldIgnore = false; + break; + } + } + } else if (tagtype === "card") { + for (const tag of tags) { + if ( + this.plugin.data.settings.flashcardTags.some( + (flashcardTag) => tag === flashcardTag || tag.startsWith(flashcardTag + "/") + ) + ) { + shouldIgnore = false; + break; + } + } + } else if (tagtype === "all") { + for (const tag of tags) { + if ( + this.plugin.data.settings.tagsToReview.some( + (tagToReview) => tag === tagToReview || tag.startsWith(tagToReview + "/") + ) || + this.plugin.data.settings.flashcardTags.some( + (flashcardTag) => tag === flashcardTag || tag.startsWith(flashcardTag + "/") + ) + ) { + shouldIgnore = false; + break; + } + } + } + + if (shouldIgnore) { + return false; + } + + return true; + } + + /** + * syncTrackfileCardSched + * @param note + * @param lineNo + * @param cardTextHash + * @param count + * @param scheduling RegExpMatchArray[] + */ + syncTrackfileCardSched( + note: TFile, + lineNo: number, + cardTextHash: string, + count: number, + scheduling?: RegExpMatchArray[] + ): RegExpMatchArray[] | null { + if (scheduling == null) { + scheduling = []; + } + console.debug("syncTrackfileCardSched-note:", note.name, lineNo, count); + let carditem = this.getAndSyncCardInfo(note, lineNo, cardTextHash); + if (carditem == null) { + carditem = this.trackFileCard(note, lineNo, cardTextHash, count); + } + + if (scheduling.length) { + const schedLen = Math.min(scheduling.length, carditem.itemIds.length); + + for (let i = 0; i < schedLen; i++) { + this.setSchedbyId(carditem.itemIds[i], scheduling[i]); + } + } else { + this.updateCardItems(note, carditem, count); + carditem.itemIds.forEach((id) => { + const sched = this.getSchedbyId(id); + // ignore new add card + if (sched != null) { + scheduling.push(sched); + } + }); + } + return scheduling; + } +} diff --git a/src/flashcard-modal.tsx b/src/flashcard-modal.tsx index 1b7d53f6..598ce847 100644 --- a/src/flashcard-modal.tsx +++ b/src/flashcard-modal.tsx @@ -24,6 +24,7 @@ import { } from "src/constants"; import { escapeRegexString, cyrb53 } from "src/utils"; import { t } from "src/lang/helpers"; +import { DataLocation } from "./settings"; export enum FlashcardModalMode { DecksList, @@ -158,7 +159,7 @@ export class FlashcardModal extends Modal { public easyBtn: HTMLElement; public nextBtn: HTMLElement; public responseDiv: HTMLElement; - public resetButton: HTMLElement; + public resetButton: HTMLButtonElement; public editButton: HTMLElement; public contextView: HTMLElement; public currentCard: Card; @@ -180,11 +181,12 @@ export class FlashcardModal extends Modal { if (Platform.isMobile) { this.contentEl.style.display = "block"; } + this.modalEl.style.position = "relative"; this.modalEl.style.height = this.plugin.data.settings.flashcardHeightPercentage + "%"; this.modalEl.style.width = this.plugin.data.settings.flashcardWidthPercentage + "%"; this.contentEl.style.position = "relative"; - this.contentEl.style.height = "92%"; + // this.contentEl.style.height = "92%"; this.contentEl.addClass("sr-modal-content"); // TODO: refactor into event handler? @@ -511,35 +513,60 @@ export class FlashcardModal extends Modal { sep = "\n"; } - // check if we're adding scheduling information to the flashcard - // for the first time - if (this.currentCard.cardText.lastIndexOf("`; - } else { - let scheduling: (RegExpMatchArray | string[])[] = [ - ...this.currentCard.cardText.matchAll(MULTI_SCHEDULING_EXTRACTOR), - ]; - if (scheduling.length === 0) { - scheduling = [...this.currentCard.cardText.matchAll(LEGACY_SCHEDULING_EXTRACTOR)]; - } - - const currCardSched: string[] = ["0", dueString, interval.toString(), ease.toString()]; - if (this.currentCard.isDue) { - scheduling[this.currentCard.siblingIdx] = currCardSched; + if (this.plugin.data.settings.dataLocation === DataLocation.SaveOnNoteFile) { + // check if we're adding scheduling information to the flashcard + // for the first time + let scheduling: (RegExpMatchArray | string[])[]; + if (this.currentCard.cardText.lastIndexOf("`; } else { - scheduling.push(currCardSched); + scheduling = [...this.currentCard.cardText.matchAll(MULTI_SCHEDULING_EXTRACTOR)]; + if (scheduling.length === 0) { + scheduling = [ + ...this.currentCard.cardText.matchAll(LEGACY_SCHEDULING_EXTRACTOR), + ]; + } + + const currCardSched: string[] = [ + "0", + dueString, + interval.toString(), + ease.toString(), + ]; + if (this.currentCard.isDue) { + scheduling[this.currentCard.siblingIdx] = currCardSched; + } else { + scheduling.push(currCardSched); + } + + this.currentCard.cardText = this.currentCard.cardText.replace(//gm, ""); + this.currentCard.cardText += ""; } - this.currentCard.cardText = this.currentCard.cardText.replace(//gm, ""); - this.currentCard.cardText += ""; + store.setSchedbyId( + cardinfo.itemIds[this.currentCard.siblingIdx], + [0, due.valueOf(), interval, ease], + correct + ); } - fileText = fileText.replace(replacementRegex, () => this.currentCard.cardText); for (const sibling of this.currentCard.siblings) { sibling.cardText = this.currentCard.cardText; } @@ -547,7 +574,6 @@ export class FlashcardModal extends Modal { this.burySiblingCards(true); } - await this.app.vault.modify(this.currentCard.note, fileText); this.currentDeck.nextCard(this); } diff --git a/src/lang/locale/ar.ts b/src/lang/locale/ar.ts index 5d5257e8..2d78c0fd 100644 --- a/src/lang/locale/ar.ts +++ b/src/lang/locale/ar.ts @@ -131,6 +131,29 @@ export default { LOGGING: "تسجيل", DISPLAY_DEBUG_INFO: "عرض معلومات التصحيح على وحدة تحكم المطور؟", + DATA_LOC: "Data Location", + DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", + DATA_FOLDER: "Folder for `tracked_files.json`", + NEW_PER_DAY: "New Per Day", + NEW_PER_DAY_DESC: "Maximum number of new (unreviewed) notes to add to the queue each day.", + NEW_PER_DAY_NAN: "Timeout must be a number", + NEW_PER_DAY_NEG: "New per day must be -1 or greater.", + REPEAT_ITEMS: "Repeat Items", + REPEAT_ITEMS_DESC: "Should items marked as incorrect be repeated until correct?", + ALGORITHMS_CONFIRM: `Switching algorithms might reset or impact review timings on existing items. + This change is irreversible. Changing algorithms only takes effect after a restart + or a plugin reload. Are you sure you want to switch algorithms? + `, + ALGORITHMS_DESC: + 'The algorithm used for spaced repetition. For more information see algorithms.', + CONVERT_TRACKED_TO_DECK: "Convert Tracked Notes to decks?", + REVIEW_FLOATBAR: "Review Response FloatBar", + REVIEW_FLOATBAR_DESC: + "only working when autoNextNote is true. show it when reviewing note via click statusbar/sidebar/command.", + REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", + REVIEW_NOTE_DIRECTLY_DESC: + "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + // sidebar.ts NOTES_REVIEW_QUEUE: "ملاحظات قائمة المراجعة", CLOSE: "أغلق", diff --git a/src/lang/locale/cz.ts b/src/lang/locale/cz.ts index 028af54d..ebdd69b4 100644 --- a/src/lang/locale/cz.ts +++ b/src/lang/locale/cz.ts @@ -135,6 +135,29 @@ export default { LOGGING: "Zaznamenávám", DISPLAY_DEBUG_INFO: "Zobrazit informace pro ladění na vývojářské konzoli?", + DATA_LOC: "Data Location", + DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", + DATA_FOLDER: "Folder for `tracked_files.json`", + NEW_PER_DAY: "New Per Day", + NEW_PER_DAY_DESC: "Maximum number of new (unreviewed) notes to add to the queue each day.", + NEW_PER_DAY_NAN: "Timeout must be a number", + NEW_PER_DAY_NEG: "New per day must be -1 or greater.", + REPEAT_ITEMS: "Repeat Items", + REPEAT_ITEMS_DESC: "Should items marked as incorrect be repeated until correct?", + ALGORITHMS_CONFIRM: `Switching algorithms might reset or impact review timings on existing items. + This change is irreversible. Changing algorithms only takes effect after a restart + or a plugin reload. Are you sure you want to switch algorithms? + `, + ALGORITHMS_DESC: + 'The algorithm used for spaced repetition. For more information see algorithms.', + CONVERT_TRACKED_TO_DECK: "Convert Tracked Notes to decks?", + REVIEW_FLOATBAR: "Review Response FloatBar", + REVIEW_FLOATBAR_DESC: + "only working when autoNextNote is true. show it when reviewing note via click statusbar/sidebar/command.", + REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", + REVIEW_NOTE_DIRECTLY_DESC: + "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + // sidebar.ts NOTES_REVIEW_QUEUE: "Fronta poznámek k revizi", CLOSE: "Uzavřené", diff --git a/src/lang/locale/de.ts b/src/lang/locale/de.ts index a0642547..704083c3 100644 --- a/src/lang/locale/de.ts +++ b/src/lang/locale/de.ts @@ -146,6 +146,29 @@ export default { LOGGING: "Logging", DISPLAY_DEBUG_INFO: "Informationen zum Debugging in der Entwicklerkonsole anzeigen?", + DATA_LOC: "Data Location", + DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", + DATA_FOLDER: "Folder for `tracked_files.json`", + NEW_PER_DAY: "New Per Day", + NEW_PER_DAY_DESC: "Maximum number of new (unreviewed) notes to add to the queue each day.", + NEW_PER_DAY_NAN: "Timeout must be a number", + NEW_PER_DAY_NEG: "New per day must be -1 or greater.", + REPEAT_ITEMS: "Repeat Items", + REPEAT_ITEMS_DESC: "Should items marked as incorrect be repeated until correct?", + ALGORITHMS_CONFIRM: `Switching algorithms might reset or impact review timings on existing items. + This change is irreversible. Changing algorithms only takes effect after a restart + or a plugin reload. Are you sure you want to switch algorithms? + `, + ALGORITHMS_DESC: + 'The algorithm used for spaced repetition. For more information see algorithms.', + CONVERT_TRACKED_TO_DECK: "Convert Tracked Notes to decks?", + REVIEW_FLOATBAR: "Review Response FloatBar", + REVIEW_FLOATBAR_DESC: + "only working when autoNextNote is true. show it when reviewing note via click statusbar/sidebar/command.", + REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", + REVIEW_NOTE_DIRECTLY_DESC: + "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + // sidebar.ts NOTES_REVIEW_QUEUE: "Anstehende Notizen zur Wiederholung", CLOSE: "Schliessen", diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index b5a78781..05d90f2d 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -133,6 +133,29 @@ export default { LOGGING: "Logging", DISPLAY_DEBUG_INFO: "Display debugging information on the developer console?", + DATA_LOC: "Data Location", + DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", + DATA_FOLDER: "Folder for `tracked_files.json`", + NEW_PER_DAY: "New Per Day", + NEW_PER_DAY_DESC: "Maximum number of new (unreviewed) notes to add to the queue each day.", + NEW_PER_DAY_NAN: "Timeout must be a number", + NEW_PER_DAY_NEG: "New per day must be -1 or greater.", + REPEAT_ITEMS: "Repeat Items", + REPEAT_ITEMS_DESC: "Should items marked as incorrect be repeated until correct?", + ALGORITHMS_CONFIRM: `Switching algorithms might reset or impact review timings on existing items. + This change is irreversible. Changing algorithms only takes effect after a restart + or a plugin reload. Are you sure you want to switch algorithms? + `, + ALGORITHMS_DESC: + 'The algorithm used for spaced repetition. For more information see algorithms.', + CONVERT_TRACKED_TO_DECK: "Convert Tracked Notes to decks?", + REVIEW_FLOATBAR: "Review Response FloatBar", + REVIEW_FLOATBAR_DESC: + "only working when autoNextNote is true. show it when reviewing note via click statusbar/sidebar/command.", + REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", + REVIEW_NOTE_DIRECTLY_DESC: + "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + // sidebar.ts NOTES_REVIEW_QUEUE: "Notes Review Queue", CLOSE: "Close", diff --git a/src/lang/locale/es.ts b/src/lang/locale/es.ts index f6be7b3e..b3567574 100644 --- a/src/lang/locale/es.ts +++ b/src/lang/locale/es.ts @@ -140,6 +140,29 @@ export default { LOGGING: "Registro", DISPLAY_DEBUG_INFO: "¿Mostrar información de depuración en la consola de desarrollador?", + DATA_LOC: "Data Location", + DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", + DATA_FOLDER: "Folder for `tracked_files.json`", + NEW_PER_DAY: "New Per Day", + NEW_PER_DAY_DESC: "Maximum number of new (unreviewed) notes to add to the queue each day.", + NEW_PER_DAY_NAN: "Timeout must be a number", + NEW_PER_DAY_NEG: "New per day must be -1 or greater.", + REPEAT_ITEMS: "Repeat Items", + REPEAT_ITEMS_DESC: "Should items marked as incorrect be repeated until correct?", + ALGORITHMS_CONFIRM: `Switching algorithms might reset or impact review timings on existing items. + This change is irreversible. Changing algorithms only takes effect after a restart + or a plugin reload. Are you sure you want to switch algorithms? + `, + ALGORITHMS_DESC: + 'The algorithm used for spaced repetition. For more information see algorithms.', + CONVERT_TRACKED_TO_DECK: "Convert Tracked Notes to decks?", + REVIEW_FLOATBAR: "Review Response FloatBar", + REVIEW_FLOATBAR_DESC: + "only working when autoNextNote is true. show it when reviewing note via click statusbar/sidebar/command.", + REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", + REVIEW_NOTE_DIRECTLY_DESC: + "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + // sidebar.ts NOTES_REVIEW_QUEUE: "Cola de notas a revisar", CLOSE: "Cerrar", diff --git a/src/lang/locale/ja.ts b/src/lang/locale/ja.ts index 5dd15dad..6f67ec8a 100644 --- a/src/lang/locale/ja.ts +++ b/src/lang/locale/ja.ts @@ -139,6 +139,29 @@ export default { LOGGING: "ログ管理", DISPLAY_DEBUG_INFO: "デベロッパーコンソールにてデバッグ情報を表示しますか?", + DATA_LOC: "Data Location", + DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", + DATA_FOLDER: "Folder for `tracked_files.json`", + NEW_PER_DAY: "New Per Day", + NEW_PER_DAY_DESC: "Maximum number of new (unreviewed) notes to add to the queue each day.", + NEW_PER_DAY_NAN: "Timeout must be a number", + NEW_PER_DAY_NEG: "New per day must be -1 or greater.", + REPEAT_ITEMS: "Repeat Items", + REPEAT_ITEMS_DESC: "Should items marked as incorrect be repeated until correct?", + ALGORITHMS_CONFIRM: `Switching algorithms might reset or impact review timings on existing items. + This change is irreversible. Changing algorithms only takes effect after a restart + or a plugin reload. Are you sure you want to switch algorithms? + `, + ALGORITHMS_DESC: + 'The algorithm used for spaced repetition. For more information see algorithms.', + CONVERT_TRACKED_TO_DECK: "Convert Tracked Notes to decks?", + REVIEW_FLOATBAR: "Review Response FloatBar", + REVIEW_FLOATBAR_DESC: + "only working when autoNextNote is true. show it when reviewing note via click statusbar/sidebar/command.", + REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", + REVIEW_NOTE_DIRECTLY_DESC: + "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + // sidebar.ts NOTES_REVIEW_QUEUE: "ノートレビューのキュー", CLOSE: "閉じる", diff --git a/src/lang/locale/ko.ts b/src/lang/locale/ko.ts index 43e1dc84..e1ebfa29 100644 --- a/src/lang/locale/ko.ts +++ b/src/lang/locale/ko.ts @@ -136,6 +136,29 @@ export default { LOGGING: "로깅", DISPLAY_DEBUG_INFO: "디버깅 정보를 개발자 콘솔에 표시하시겠습니까?", + DATA_LOC: "Data Location", + DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", + DATA_FOLDER: "Folder for `tracked_files.json`", + NEW_PER_DAY: "New Per Day", + NEW_PER_DAY_DESC: "Maximum number of new (unreviewed) notes to add to the queue each day.", + NEW_PER_DAY_NAN: "Timeout must be a number", + NEW_PER_DAY_NEG: "New per day must be -1 or greater.", + REPEAT_ITEMS: "Repeat Items", + REPEAT_ITEMS_DESC: "Should items marked as incorrect be repeated until correct?", + ALGORITHMS_CONFIRM: `Switching algorithms might reset or impact review timings on existing items. + This change is irreversible. Changing algorithms only takes effect after a restart + or a plugin reload. Are you sure you want to switch algorithms? + `, + ALGORITHMS_DESC: + 'The algorithm used for spaced repetition. For more information see algorithms.', + CONVERT_TRACKED_TO_DECK: "Convert Tracked Notes to decks?", + REVIEW_FLOATBAR: "Review Response FloatBar", + REVIEW_FLOATBAR_DESC: + "only working when autoNextNote is true. show it when reviewing note via click statusbar/sidebar/command.", + REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", + REVIEW_NOTE_DIRECTLY_DESC: + "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + // sidebar.ts NOTES_REVIEW_QUEUE: "리뷰할 노트 대기열", CLOSE: "닫기", diff --git a/src/lang/locale/pt-br.ts b/src/lang/locale/pt-br.ts index bda89527..7109467c 100644 --- a/src/lang/locale/pt-br.ts +++ b/src/lang/locale/pt-br.ts @@ -142,6 +142,29 @@ export default { LOGGING: "Logging", DISPLAY_DEBUG_INFO: "Mostrar informação de debugging no console de desenvolvimento?", + DATA_LOC: "Data Location", + DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", + DATA_FOLDER: "Folder for `tracked_files.json`", + NEW_PER_DAY: "New Per Day", + NEW_PER_DAY_DESC: "Maximum number of new (unreviewed) notes to add to the queue each day.", + NEW_PER_DAY_NAN: "Timeout must be a number", + NEW_PER_DAY_NEG: "New per day must be -1 or greater.", + REPEAT_ITEMS: "Repeat Items", + REPEAT_ITEMS_DESC: "Should items marked as incorrect be repeated until correct?", + ALGORITHMS_CONFIRM: `Switching algorithms might reset or impact review timings on existing items. + This change is irreversible. Changing algorithms only takes effect after a restart + or a plugin reload. Are you sure you want to switch algorithms? + `, + ALGORITHMS_DESC: + 'The algorithm used for spaced repetition. For more information see algorithms.', + CONVERT_TRACKED_TO_DECK: "Convert Tracked Notes to decks?", + REVIEW_FLOATBAR: "Review Response FloatBar", + REVIEW_FLOATBAR_DESC: + "only working when autoNextNote is true. show it when reviewing note via click statusbar/sidebar/command.", + REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", + REVIEW_NOTE_DIRECTLY_DESC: + "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + // sidebar.ts NOTES_REVIEW_QUEUE: "Fila de Notas para Revisar", CLOSE: "Fechar", diff --git a/src/lang/locale/ru.ts b/src/lang/locale/ru.ts index b05b533e..09f5569c 100644 --- a/src/lang/locale/ru.ts +++ b/src/lang/locale/ru.ts @@ -146,6 +146,29 @@ export default { DISPLAY_DEBUG_INFO: "Отображать отладочную информацию в консоле разработчика (developer console)?", + DATA_LOC: "Data Location", + DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", + DATA_FOLDER: "Folder for `tracked_files.json`", + NEW_PER_DAY: "New Per Day", + NEW_PER_DAY_DESC: "Maximum number of new (unreviewed) notes to add to the queue each day.", + NEW_PER_DAY_NAN: "Timeout must be a number", + NEW_PER_DAY_NEG: "New per day must be -1 or greater.", + REPEAT_ITEMS: "Repeat Items", + REPEAT_ITEMS_DESC: "Should items marked as incorrect be repeated until correct?", + ALGORITHMS_CONFIRM: `Switching algorithms might reset or impact review timings on existing items. + This change is irreversible. Changing algorithms only takes effect after a restart + or a plugin reload. Are you sure you want to switch algorithms? + `, + ALGORITHMS_DESC: + 'The algorithm used for spaced repetition. For more information see algorithms.', + CONVERT_TRACKED_TO_DECK: "Convert Tracked Notes to decks?", + REVIEW_FLOATBAR: "Review Response FloatBar", + REVIEW_FLOATBAR_DESC: + "only working when autoNextNote is true. show it when reviewing note via click statusbar/sidebar/command.", + REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", + REVIEW_NOTE_DIRECTLY_DESC: + "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + // sidebar.ts NOTES_REVIEW_QUEUE: "Очередь заметок на повторение", CLOSE: "Закрыть", diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 1dd93952..bd277e14 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -123,6 +123,25 @@ export default { LOGGING: "记录中", DISPLAY_DEBUG_INFO: "在开发者控制台中显示调试信息?", + DATA_LOC: "数据位置", + DATA_LOC_DESC: "间隔重复数据项的文件的保存位置.", + DATA_FOLDER: "`tracked_files.json`的文件夹", + NEW_PER_DAY: "每天新增重复的数量", + NEW_PER_DAY_DESC: "每天要添加到队列中的新(未重复过的)笔记的最大数量。.", + NEW_PER_DAY_NAN: "必须是整数", + NEW_PER_DAY_NEG: "整数必须大于等于-1.", + REPEAT_ITEMS: "重复错误", + REPEAT_ITEMS_DESC: "错误项是否要一直重复复习,直到回答正确?", + ALGORITHMS_CONFIRM: `切换算法可能导致日期排程重置,这个修改不可撤销,当重启软件或重新加载插件切换算法才会生效。你确定要切换算法么?`, + ALGORITHMS_DESC: + '用于间隔重复的算法. 更多信息请查阅 算法.', + CONVERT_TRACKED_TO_DECK: "将复习笔记转换为卡牌组?", + REVIEW_FLOATBAR: "复习悬浮栏", + REVIEW_FLOATBAR_DESC: + "当设置项“复习后自动打开下一个笔记”启用时,这个设置项启用才生效. 通过点击状态栏/侧边栏/命令进行复习时就会显示出来.", + REVIEW_NOTE_DIRECTLY: "直接复习笔记?", + REVIEW_NOTE_DIRECTLY_DESC: "复习笔记时, 不必选择标签(多个复习标签的情况)就直接打开笔记", + // sidebar.ts NOTES_REVIEW_QUEUE: "笔记复习序列", CLOSE: "临近", diff --git a/src/lang/locale/zh-tw.ts b/src/lang/locale/zh-tw.ts index 35ba171d..95e034b0 100644 --- a/src/lang/locale/zh-tw.ts +++ b/src/lang/locale/zh-tw.ts @@ -122,6 +122,25 @@ export default { LOGGING: "記錄中", DISPLAY_DEBUG_INFO: "在開發者控制台中顯示除錯資訊?", + DATA_LOC: "數據位置", + DATA_LOC_DESC: "間隔重複資料項目的檔的保存位置.", + DATA_FOLDER: "`tracked_files.json`的檔夾", + NEW_PER_DAY: "每天新增重複的數量", + NEW_PER_DAY_DESC: "每天要添加到佇列中的新(未重複過的)筆記的最大數量。.", + NEW_PER_DAY_NAN: "必須是整數", + NEW_PER_DAY_NEG: "整數必須大於等於-1.", + REPEAT_ITEMS: "重複錯誤", + REPEAT_ITEMS_DESC: "錯誤項是否要一直重複復習,直到回答正確?", + ALGORITHMS_CONFIRM: `切換演算法可能導致日期排程重置,這個修改不可撤銷,當重啟軟體或重新加載插件切換演算法才會生效。你確定要切換演算法麼?`, + ALGORITHMS_DESC: + '用於間隔重複的演算法. 更多資訊請查閱 演算法.', + CONVERT_TRACKED_TO_DECK: "將復習筆記轉換為卡牌組?", + REVIEW_FLOATBAR: "復習懸浮欄", + REVIEW_FLOATBAR_DESC: + "當設置項“復習後自動打開下一個筆記”啟用時,這個設置項啟用才生效. 通過點擊狀態欄/側邊欄/命令進行復習時就會顯示出來.", + REVIEW_NOTE_DIRECTLY: "直接復習筆記?", + REVIEW_NOTE_DIRECTLY_DESC: "復習筆記時, 不必選擇標籤(多個復習標籤的情況)就直接打開筆記", + // sidebar.ts NOTES_REVIEW_QUEUE: "筆記復習序列", CLOSE: "臨近", diff --git a/src/main.ts b/src/main.ts index 5704b1d7..c0c0bcbe 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,6 +2,7 @@ import { Notice, Plugin, TAbstractFile, + TFolder, TFile, HeadingCache, getAllTags, @@ -9,7 +10,7 @@ import { } from "obsidian"; import * as graph from "pagerank.js"; -import { SRSettingTab, SRSettings, DEFAULT_SETTINGS } from "src/settings"; +import { SRSettingTab, SRSettings, DEFAULT_SETTINGS, DataLocation } from "src/settings"; import { FlashcardModal, Deck } from "src/flashcard-modal"; import { StatsModal, Stats } from "src/stats-modal"; import { ReviewQueueListView, REVIEW_QUEUE_VIEW_TYPE } from "src/sidebar"; @@ -26,6 +27,13 @@ import { t } from "src/lang/helpers"; import { parse } from "src/parser"; import { appIcon } from "src/icons/appicon"; +// https://github.com/martin-jw/obsidian-recall +import { DataStore } from "./data"; +import Commands from "./commands"; +import SrsAlgorithm from "./algorithms"; +import { algorithms } from "src/settings"; +import { reviewNoteResponseModal } from "./modals/reviewresponse-modal"; + interface PluginData { settings: SRSettings; buryDate: string; @@ -67,18 +75,46 @@ export default class SRPlugin extends Plugin { public easeByPath: Record = {}; private incomingLinks: Record = {}; private pageranks: Record = {}; - private dueNotesCount = 0; + public newNotesCount = 0; + public dueNotesCount = 0; public dueDatesNotes: Record = {}; // Record<# of days in future, due count> public deckTree: Deck = new Deck("root", null); public dueDatesFlashcards: Record = {}; // Record<# of days in future, due count> public cardStats: Stats; + // https://github.com/martin-jw/obsidian-recall/blob/main/src/main.ts + public store: DataStore; + public commands: Commands; + public algorithm: SrsAlgorithm; + public reviewNoteFloatBar: reviewNoteResponseModal; + async onload(): Promise { await this.loadPluginData(); appIcon(); + this.algorithm = algorithms[this.data.settings.algorithm]; + this.algorithm.updateSettings(this.data.settings.algorithmSettings); + + this.store = new DataStore(this); + await this.store.load(); + this.store.buildQueue(); + this.commands = new Commands(this); + this.commands.addCommands(); + if (this.data.settings.showDebugMessages) { + this.commands.addDebugCommands(); + } + + this.reviewNoteFloatBar = new reviewNoteResponseModal(this); + + this.registerTrackFileEvents(); + + if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { + // save tracked_files.json + this.registerInterval(window.setInterval(() => this.store.save(), 5 * 60 * 1000)); + } + this.statusBar = this.addStatusBarItem(); this.statusBar.classList.add("mod-clickable"); this.statusBar.setAttribute("aria-label", t("OPEN_NOTE_FOR_REVIEW")); @@ -125,6 +161,56 @@ export default class SRPlugin extends Plugin { }); }); } + + if (fileish instanceof TFolder) { + const folder = fileish as TFolder; + + menu.addItem((item) => { + item.setIcon("plus-with-circle"); + item.setTitle("Track All Notes"); + item.onClick((_evt) => { + this.store.trackFilesInFolder(folder); + }); + }); + + menu.addItem((item) => { + item.setIcon("minus-with-circle"); + item.setTitle("Untrack All Notes"); + item.onClick((_evt) => { + this.store.untrackFilesInFolder(folder); + }); + }); + } else if (fileish instanceof TFile) { + if (this.store.isTracked(fileish.path)) { + menu.addItem((item) => { + item.setIcon("minus-with-circle"); + item.setTitle("Untrack Note"); + item.onClick(async (_evt) => { + this.store.untrackFile(fileish.path); + if ( + this.reviewNoteFloatBar.isDisplay() && + this.data.settings.autoNextNote + ) { + if (!this.syncLock) { + await this.sync(); + } + this.reviewNextNote(this.lastSelectedReviewDeck); + } + }); + }); + } else { + menu.addItem((item) => { + item.setIcon("plus-with-circle"); + item.setTitle("Track Note"); + item.onClick((_evt) => { + this.store.trackFile( + fileish.path, + this.store.getDefaultDackName() + ); + }); + }); + } + } }) ); } @@ -245,6 +331,8 @@ export default class SRPlugin extends Plugin { } onunload(): void { + console.log("Unloading Obsidian Recall. Saving tracked files..."); + this.store.save(); this.app.workspace.getLeavesOfType(REVIEW_QUEUE_VIEW_TYPE).forEach((leaf) => leaf.detach()); } @@ -259,6 +347,7 @@ export default class SRPlugin extends Plugin { this.easeByPath = {}; this.incomingLinks = {}; this.pageranks = {}; + this.newNotesCount = 0; this.dueNotesCount = 0; this.dueDatesNotes = {}; this.reviewDecks = {}; @@ -349,6 +438,35 @@ export default class SRPlugin extends Plugin { continue; } + // update single note deck data, only tagged reviewnote + if (this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile) { + if (!this.store.isTracked(note.path)) { + this.store.trackFile(note.path, matchedNoteTags[0]); + } + if ( + Object.prototype.hasOwnProperty.call(frontmatter, "sr-due") && + Object.prototype.hasOwnProperty.call(frontmatter, "sr-interval") && + Object.prototype.hasOwnProperty.call(frontmatter, "sr-ease") + ) { + // file has scheduling information + const dueUnix: number = window + .moment(frontmatter["sr-due"], [ + "YYYY-MM-DD", + "DD-MM-YYYY", + "ddd MMM DD YYYY", + ]) + .valueOf(); + + const interval = frontmatter["sr-interval"] as number; + const ease = frontmatter["sr-ease"] as number; + const sched = [null, dueUnix, interval, ease]; + this.store.syncheadertoDataItems(note, sched); + // this.deleteNoteSchedulingHeader(note); + } + + this.store.syncRCDataToSRrevDeck(this.reviewDecks[matchedNoteTags[0]], note); + continue; + } // file has no scheduling information if ( !( @@ -359,10 +477,12 @@ export default class SRPlugin extends Plugin { ) { for (const matchedNoteTag of matchedNoteTags) { this.reviewDecks[matchedNoteTag].newNotes.push(note); + this.newNotesCount++; } continue; } + // file has scheduling information const dueUnix: number = window .moment(frontmatter["sr-due"], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) .valueOf(); @@ -396,11 +516,23 @@ export default class SRPlugin extends Plugin { this.pageranks[node] = rank * 10000; }); + // Add Recall reviewnote deck + if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { + const dkname = this.store.getDefaultDackName(); + if (!Object.prototype.hasOwnProperty.call(this.reviewDecks, dkname)) { + this.reviewDecks[dkname] = new ReviewDeck(dkname); + } + this.store.syncRCsrsDataToSRreviewDecks(this.reviewDecks[dkname]); + this.savePluginData(); + } + // sort the deck names this.deckTree.sortSubdecksList(); if (this.data.settings.showDebugMessages) { console.log(`SR: ${t("EASES")}`, this.easeByPath); console.log(`SR: ${t("DECKS")}`, this.deckTree); + console.log(`SR: NOTE ${t("DECKS")}`, this.reviewDecks); + console.log(`SR: this.dueDatesNotes`, this.dueDatesNotes); } for (const deckKey in this.reviewDecks) { @@ -439,18 +571,25 @@ export default class SRPlugin extends Plugin { } let shouldIgnore = true; + let matchedNoteTag: string; for (const tag of tags) { if ( this.data.settings.tagsToReview.some( - (tagToReview) => tag === tagToReview || tag.startsWith(tagToReview + "/") + (tagToReview) => + tag === (matchedNoteTag = tagToReview) || tag.startsWith(tagToReview + "/") ) ) { shouldIgnore = false; + // matchedNoteTag = tagToReview; break; } } - if (shouldIgnore) { + if ( + (shouldIgnore && this.data.settings.dataLocation === DataLocation.SaveOnNoteFile) || + (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile && + !this.store.isTracked(note.path)) + ) { new Notice(t("PLEASE_TAG_NOTE")); return; } @@ -459,13 +598,17 @@ export default class SRPlugin extends Plugin { let ease: number, interval: number, delayBeforeReview: number; const now: number = Date.now(); // new note + const fileId = this.store.getFileId(note.path); if ( !( Object.prototype.hasOwnProperty.call(frontmatter, "sr-due") && Object.prototype.hasOwnProperty.call(frontmatter, "sr-interval") && Object.prototype.hasOwnProperty.call(frontmatter, "sr-ease") - ) + ) || + (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile && + this.store.isNewAdd(fileId)) ) { + // 新笔记,没有复习过的 let linkTotal = 0, linkPGTotal = 0, totalLinkCount = 0; @@ -506,6 +649,7 @@ export default class SRPlugin extends Plugin { interval = 1.0; delayBeforeReview = 0; } else { + // reviewedNote update interval = frontmatter["sr-interval"]; ease = frontmatter["sr-ease"]; delayBeforeReview = @@ -515,6 +659,17 @@ export default class SRPlugin extends Plugin { .valueOf(); } + // reviewedNote update + if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { + if (!this.store.isNewAdd(this.store.getFileId(note.path))) { + let due: number; + [, due, interval, ease] = this.store.getReviewNoteHeaderData(note.path); + delayBeforeReview = due === 0 ? 0 : now - due; //just in case. + // console.debug(ease, interval, due, delayBeforeReview); + } + } + + //根据当前状态参数及反馈的选项,更新数据 const schedObj: Record = schedule( response, interval, @@ -528,9 +683,11 @@ export default class SRPlugin extends Plugin { const due = window.moment(now + interval * 24 * 3600 * 1000); const dueString: string = due.format("YYYY-MM-DD"); + let deleteheader = false; // check if scheduling info exists if (SCHEDULING_INFO_REGEX.test(fileText)) { + deleteheader = true; const schedulingInfo = SCHEDULING_INFO_REGEX.exec(fileText); fileText = fileText.replace( SCHEDULING_INFO_REGEX, @@ -556,11 +713,30 @@ export default class SRPlugin extends Plugin { await this.findFlashcardsInNote(note, [], true); // bury all cards in current note await this.savePluginData(); } - await this.app.vault.modify(note, fileText); + + // save changes + if (this.data.settings.dataLocation === DataLocation.SaveOnNoteFile) { + await this.app.vault.modify(note, fileText); + await this.sync(); + } else if (fileId > -1) { + this.deleteNoteSchedulingHeader(note, deleteheader); + //update data + const sched = [null, due.valueOf(), interval, ease]; + this.store.syncheadertoDataItems(note, sched, response); + // this.store.reviewId(fileId, response.toString()); + + //Sync update + this.singNoteSyncQueue(this, note, delayBeforeReview); + this.savePluginData(); + } + + if (!this.lastSelectedReviewDeck) { + this.lastSelectedReviewDeck = matchedNoteTag; + } new Notice(t("RESPONSE_RECEIVED")); - await this.sync(); + // console.debug("syncRCDataToSRrevDeck>", this.reviewDecks, matchedNoteTag); if (this.data.settings.autoNextNote) { this.reviewNextNote(this.lastSelectedReviewDeck); } @@ -568,9 +744,13 @@ export default class SRPlugin extends Plugin { async reviewNextNoteModal(): Promise { const reviewDeckNames: string[] = Object.keys(this.reviewDecks); - if (reviewDeckNames.length === 1) { + if (this.data.settings.reviewingNoteDirectly) { + const rdname = this.getDeckNameForReviewDirectly(); + this.reviewNextNote(rdname); + } else if (reviewDeckNames.length === 1) { this.reviewNextNote(reviewDeckNames[0]); } else { + //这里导致弹出选标签, 有浮栏可以评分然后下篇,这个就没有什么影响了 const deckSelectionModal = new ReviewDeckSelectionModal(this.app, reviewDeckNames); deckSelectionModal.submitCallback = (deckKey: string) => this.reviewNextNote(deckKey); deckSelectionModal.open(); @@ -585,13 +765,17 @@ export default class SRPlugin extends Plugin { this.lastSelectedReviewDeck = deckKey; const deck = this.reviewDecks[deckKey]; + let show = false; + let path = null; if (deck.dueNotesCount > 0) { const index = this.data.settings.openRandomNote ? Math.floor(Math.random() * deck.dueNotesCount) : 0; await this.app.workspace.getLeaf().openFile(deck.scheduledNotes[index].note); - return; + path = deck.scheduledNotes[index].note.path; + show = true; + // return; } if (deck.newNotes.length > 0) { @@ -599,9 +783,55 @@ export default class SRPlugin extends Plugin { ? Math.floor(Math.random() * deck.newNotes.length) : 0; this.app.workspace.getLeaf().openFile(deck.newNotes[index]); + path = deck.newNotes[index].path; + show = true; + // return; + } + if (show) { + // reviewedNote update interval + let responseInterval: number[] | null = null; + if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { + const now: number = Date.now(); + const [, due, interval, ease] = this.store.getReviewNoteHeaderData(path); + const delayBeforeReview = due === 0 ? 0 : now - due; //just in case. + const hardInterval: number = schedule( + ReviewResponse.Hard, + interval, + ease, + delayBeforeReview, + this.data.settings + ).interval; + const goodInterval: number = schedule( + ReviewResponse.Good, + interval, + ease, + delayBeforeReview, + this.data.settings + ).interval; + const easyInterval: number = schedule( + ReviewResponse.Easy, + interval, + ease, + delayBeforeReview, + this.data.settings + ).interval; + responseInterval = [null, hardInterval, goodInterval, easyInterval]; + console.debug("几个反馈结果的间隔:hge", hardInterval, goodInterval, easyInterval); + } + this.reviewNoteFloatBar.display(show, responseInterval); + return; + } + if ( + this.data.settings.reviewingNoteDirectly && + this.dueNotesCount + this.newNotesCount > 0 + ) { + const rdname: string = this.getDeckNameForReviewDirectly(); + this.reviewNextNote(rdname); return; } + this.reviewNoteFloatBar.display(show); + this.reviewQueueView.redraw(); new Notice(t("ALL_CAUGHT_UP")); } @@ -625,6 +855,18 @@ export default class SRPlugin extends Plugin { } } } + if ( + deckPath.length === 0 && + this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile && + this.data.settings.trackedNoteToDecks && + (this.store.isTaged(note, "note") || this.store.isTrackedCardfile(note.path)) + ) { + deckPath = note.path.split("/"); + deckPath.pop(); // remove filename + if (deckPath.length === 0) { + deckPath = ["/"]; + } + } } return deckPath; @@ -681,7 +923,7 @@ export default class SRPlugin extends Plugin { this.deckTree.createDeck([...deckPath]); - const cardTextHash: string = cyrb53(cardText); + let cardTextHash: string = cyrb53(cardText); if (buryOnly) { this.data.buryList.push(cardTextHash); @@ -784,8 +1026,30 @@ export default class SRPlugin extends Plugin { const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); fileText = fileText.replace(replacementRegex, () => newCardText); fileChanged = true; + scheduling.splice(siblingMatches.length, scheduling.length - siblingMatches.length); } + //update scheduling by recall + if (settings.dataLocation !== DataLocation.SaveOnNoteFile) { + if (scheduling.length) { + // console.debug("org card scheduling info", scheduling); + // delete scheduling infos in note file. + const idxSched: number = cardText.lastIndexOf("`; + } else { + scheduling = [...this.currentCard.cardText.matchAll(MULTI_SCHEDULING_EXTRACTOR)]; + if (scheduling.length === 0) { + scheduling = [ + ...this.currentCard.cardText.matchAll(LEGACY_SCHEDULING_EXTRACTOR), + ]; + } + + const currCardSched: string[] = [ + "0", + dueString, + interval.toString(), + ease.toString(), + ]; + if (this.currentCard.isDue) { + scheduling[this.currentCard.siblingIdx] = currCardSched; + } else { + scheduling.push(currCardSched); + } + + this.currentCard.cardText = this.currentCard.cardText.replace(//gm, ""); + this.currentCard.cardText += ""; + } + + fileText = fileText.replace(replacementRegex, () => this.currentCard.cardText); + + await this.app.vault.modify(this.currentCard.note, fileText); + } else { + const store = this.plugin.store; + const lineNo: number = this.currentCard.lineNo; + const hash: string = cyrb53(this.currentCard.cardText); + const cardinfo = store.getAndSyncCardInfo(this.currentCard.note, lineNo, hash); + if (this.plugin.data.settings.algorithm === algorithmNames.Default) { + const due = new Date(); + store.setSchedbyId(cardinfo.itemIds[this.currentCard.siblingIdx], [ + 0, + due.valueOf(), + currSchedintvl_ease_old[0], + currSchedintvl_ease_old[1], + ]); + } + store.reviewId(cardinfo.itemIds[this.currentCard.siblingIdx], opt); + } + + for (const sibling of this.currentCard.siblings) { + sibling.cardText = this.currentCard.cardText; + } + if (this.plugin.data.settings.burySiblingCards) { + this.burySiblingCards(true); + } + + this.currentDeck.nextCard(this); + } + + private async burySiblingCards(tillNextDay: boolean): Promise { + if (tillNextDay) { + this.plugin.data.buryList.push(cyrb53(this.currentCard.cardText)); + await this.plugin.savePluginData(); + } + + for (const sibling of this.currentCard.siblings) { + if (sibling === this.currentCard) { + // already delete at processReview + continue; + } + + const dueIdx = this.currentDeck.dueFlashcards.indexOf(sibling); + const newIdx = this.currentDeck.newFlashcards.indexOf(sibling); + + if (dueIdx !== -1) { + this.currentDeck.deleteFlashcardAtIndex( + dueIdx, + this.currentDeck.dueFlashcards[dueIdx].isDue + ); + } else if (newIdx !== -1) { + this.currentDeck.deleteFlashcardAtIndex( + newIdx, + this.currentDeck.newFlashcards[newIdx].isDue + ); + } + } + } + + private skipCurrentCard(): void { + this.currentDeck.deleteFlashcardAtIndex(this.currentCardIdx, this.currentCard.isDue); + this.burySiblingCards(false); + this.currentDeck.nextCard(this); + } + + // slightly modified version of the renderMarkdown function in + // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/KanbanView.tsx + async renderMarkdownWrapper( + markdownString: string, + containerEl: HTMLElement, + recursiveDepth = 0 + ): Promise { + if (recursiveDepth > 4) return; + + MarkdownRenderer.renderMarkdown( + markdownString, + containerEl, + this.currentCard.note.path, + this.plugin + ); + + containerEl.findAll(".internal-embed").forEach((el) => { + const link = this.parseLink(el.getAttribute("src")); + + // file does not exist, display dead link + if (!link.target) { + el.innerText = link.text; + } else if (link.target instanceof TFile) { + if (link.target.extension !== "md") { + this.embedMediaFile(el, link.target); + } else { + el.innerText = ""; + this.renderTransclude(el, link, recursiveDepth); + } + } + }); + } + + private parseLink(src: string) { + const linkComponentsRegex = + /^(?[^#^]+)?(?:#(?!\^)(?.+)|#\^(?.+)|#)?$/; + const matched = typeof src === "string" && src.match(linkComponentsRegex); + const file = matched.groups.file || this.currentCard.note.path; + const target = this.plugin.app.metadataCache.getFirstLinkpathDest( + file, + this.currentCard.note.path + ); + return { + text: matched[0], + file: matched.groups.file, + heading: matched.groups.heading, + blockId: matched.groups.blockId, + target: target, + }; + } + + private embedMediaFile(el: HTMLElement, target: TFile) { + el.innerText = ""; + if (IMAGE_FORMATS.includes(target.extension)) { + el.createEl( + "img", + { + attr: { + src: this.plugin.app.vault.getResourcePath(target), + }, + }, + (img) => { + if (el.hasAttribute("width")) + img.setAttribute("width", el.getAttribute("width")); + else img.setAttribute("width", "100%"); + if (el.hasAttribute("alt")) img.setAttribute("alt", el.getAttribute("alt")); + el.addEventListener( + "click", + (ev) => + ((ev.target as HTMLElement).style.minWidth = + (ev.target as HTMLElement).style.minWidth === "100%" + ? null + : "100%") + ); + } + ); + el.addClasses(["image-embed", "is-loaded"]); + } else if ( + AUDIO_FORMATS.includes(target.extension) || + VIDEO_FORMATS.includes(target.extension) + ) { + el.createEl( + AUDIO_FORMATS.includes(target.extension) ? "audio" : "video", + { + attr: { + controls: "", + src: this.plugin.app.vault.getResourcePath(target), + }, + }, + (audio) => { + if (el.hasAttribute("alt")) audio.setAttribute("alt", el.getAttribute("alt")); + } + ); + el.addClasses(["media-embed", "is-loaded"]); + } else { + el.innerText = target.path; + } + } + + private async renderTransclude( + el: HTMLElement, + link: { + text: string; + file: string; + heading: string; + blockId: string; + target: TFile; + }, + recursiveDepth: number + ) { + const cache = this.app.metadataCache.getCache(link.target.path); + const text = await this.app.vault.cachedRead(link.target); + let blockText; + if (link.heading) { + const clean = (s: string) => s.replace(/[\W\s]/g, ""); + const headingIndex = cache.headings?.findIndex( + (h) => clean(h.heading) === clean(link.heading) + ); + const heading = cache.headings[headingIndex]; + + const startAt = heading.position.start.offset; + const endAt = + cache.headings.slice(headingIndex + 1).find((h) => h.level <= heading.level) + ?.position?.start?.offset || text.length; + + blockText = text.substring(startAt, endAt); + } else if (link.blockId) { + const block = cache.blocks[link.blockId]; + const startAt = block.position.start.offset; + const endAt = block.position.end.offset; + blockText = text.substring(startAt, endAt); + } else { + blockText = text; + } + + this.renderMarkdownWrapper(blockText, el, recursiveDepth + 1); + } +} + +export class Deck { + public deckName: string; + public newFlashcards: Card[]; + public newFlashcardsCount = 0; // counts those in subdecks too + public dueFlashcards: Card[]; + public dueFlashcardsCount = 0; // counts those in subdecks too + public totalFlashcards = 0; // counts those in subdecks too + public subdecks: Deck[]; + public parent: Deck | null; + + constructor(deckName: string, parent: Deck | null) { + this.deckName = deckName; + this.newFlashcards = []; + this.newFlashcardsCount = 0; + this.dueFlashcards = []; + this.dueFlashcardsCount = 0; + this.totalFlashcards = 0; + this.subdecks = []; + this.parent = parent; + } + + createDeck(deckPath: string[]): void { + if (deckPath.length === 0) { + return; + } + + const deckName: string = deckPath.shift(); + for (const deck of this.subdecks) { + if (deckName === deck.deckName) { + deck.createDeck(deckPath); + return; + } + } + + const deck: Deck = new Deck(deckName, this); + this.subdecks.push(deck); + deck.createDeck(deckPath); + } + + insertFlashcard(deckPath: string[], cardObj: Card): void { + if (cardObj.isDue) { + this.dueFlashcardsCount++; + } else { + this.newFlashcardsCount++; + } + this.totalFlashcards++; + + if (deckPath.length === 0) { + if (cardObj.isDue) { + this.dueFlashcards.push(cardObj); + } else { + this.newFlashcards.push(cardObj); + } + return; + } + + const deckName: string = deckPath.shift(); + for (const deck of this.subdecks) { + if (deckName === deck.deckName) { + deck.insertFlashcard(deckPath, cardObj); + return; + } + } + } + + // count flashcards that have either been buried + // or aren't due yet + countFlashcard(deckPath: string[], n = 1): void { + this.totalFlashcards += n; + + const deckName: string = deckPath.shift(); + for (const deck of this.subdecks) { + if (deckName === deck.deckName) { + deck.countFlashcard(deckPath, n); + return; + } + } + } + + deleteFlashcardAtIndex(index: number, cardIsDue: boolean): void { + if (cardIsDue) { + this.dueFlashcards.splice(index, 1); + this.dueFlashcardsCount--; + } else { + this.newFlashcards.splice(index, 1); + this.newFlashcardsCount--; + } + + let deck: Deck = this.parent; + while (deck !== null) { + if (cardIsDue) { + deck.dueFlashcardsCount--; + } else { + deck.newFlashcardsCount--; + } + deck = deck.parent; + } + } + + sortSubdecksList(): void { + this.subdecks.sort((a, b) => { + if (a.deckName < b.deckName) { + return -1; + } else if (a.deckName > b.deckName) { + return 1; + } + return 0; + }); + + for (const deck of this.subdecks) { + deck.sortSubdecksList(); + } + } + + render(containerEl: HTMLElement, modal: FlashcardModal): void { + const deckView: HTMLElement = containerEl.createDiv("tree-item"); + + const deckViewSelf: HTMLElement = deckView.createDiv( + "tree-item-self tag-pane-tag is-clickable" + ); + const shouldBeInitiallyExpanded: boolean = + modal.plugin.data.settings.initiallyExpandAllSubdecksInTree; + let collapsed = !shouldBeInitiallyExpanded; + let collapseIconEl: HTMLElement | null = null; + if (this.subdecks.length > 0) { + collapseIconEl = deckViewSelf.createDiv("tree-item-icon collapse-icon"); + collapseIconEl.innerHTML = COLLAPSE_ICON; + (collapseIconEl.childNodes[0] as HTMLElement).style.transform = collapsed + ? "rotate(-90deg)" + : ""; + } + + const deckViewInner: HTMLElement = deckViewSelf.createDiv("tree-item-inner"); + deckViewInner.addEventListener("click", () => { + modal.plugin.data.historyDeck = this.deckName; + modal.currentDeck = this; + modal.checkDeck = this.parent; + modal.setupCardsView(); + this.nextCard(modal); + }); + const deckViewInnerText: HTMLElement = deckViewInner.createDiv("tag-pane-tag-text"); + deckViewInnerText.innerHTML += {this.deckName}; + const deckViewOuter: HTMLElement = deckViewSelf.createDiv("tree-item-flair-outer"); + deckViewOuter.innerHTML += ( + + + {this.dueFlashcardsCount.toString()} + + + {this.newFlashcardsCount.toString()} + + + {this.totalFlashcards.toString()} + + + ); + + const deckViewChildren: HTMLElement = deckView.createDiv("tree-item-children"); + deckViewChildren.style.display = collapsed ? "none" : "block"; + if (this.subdecks.length > 0) { + collapseIconEl.addEventListener("click", () => { + if (collapsed) { + (collapseIconEl.childNodes[0] as HTMLElement).style.transform = ""; + deckViewChildren.style.display = "block"; + } else { + (collapseIconEl.childNodes[0] as HTMLElement).style.transform = + "rotate(-90deg)"; + deckViewChildren.style.display = "none"; + } + collapsed = !collapsed; + }); + } + for (const deck of this.subdecks) { + deck.render(deckViewChildren, modal); + } + } + + nextCard(modal: FlashcardModal): void { + if (this.newFlashcards.length + this.dueFlashcards.length === 0) { + if (this.dueFlashcardsCount + this.newFlashcardsCount > 0) { + for (const deck of this.subdecks) { + if (deck.dueFlashcardsCount + deck.newFlashcardsCount > 0) { + modal.currentDeck = deck; + deck.nextCard(modal); + return; + } + } + } + + if (this.parent == modal.checkDeck) { + modal.plugin.data.historyDeck = ""; + modal.decksList(); + } else { + this.parent.nextCard(modal); + } + return; + } + + modal.responseDiv.style.display = "none"; + modal.resetButton.disabled = true; + modal.titleEl.setText( + `${this.deckName}: ${this.dueFlashcardsCount + this.newFlashcardsCount}` + ); + + modal.answerBtn.style.display = "initial"; + modal.flashcardView.empty(); + modal.mode = FlashcardModalMode.Front; + + let interval = 1.0, + ease: number = modal.plugin.data.settings.baseEase, + delayBeforeReview = 0; + if (this.dueFlashcards.length > 0) { + if (modal.plugin.data.settings.randomizeCardOrder) { + modal.currentCardIdx = Math.floor(Math.random() * this.dueFlashcards.length); + } else { + modal.currentCardIdx = 0; + } + modal.currentCard = this.dueFlashcards[modal.currentCardIdx]; + modal.renderMarkdownWrapper(modal.currentCard.front, modal.flashcardView); + + interval = modal.currentCard.interval; + ease = modal.currentCard.ease; + delayBeforeReview = modal.currentCard.delayBeforeReview; + } else if (this.newFlashcards.length > 0) { + if (modal.plugin.data.settings.randomizeCardOrder) { + const pickedCardIdx = Math.floor(Math.random() * this.newFlashcards.length); + modal.currentCardIdx = pickedCardIdx; + + // look for first unscheduled sibling + const pickedCard: Card = this.newFlashcards[pickedCardIdx]; + let idx = pickedCardIdx; + while (idx >= 0 && pickedCard.siblings.includes(this.newFlashcards[idx])) { + if (!this.newFlashcards[idx].isDue) { + modal.currentCardIdx = idx; + } + idx--; + } + } else { + modal.currentCardIdx = 0; + } + + modal.currentCard = this.newFlashcards[modal.currentCardIdx]; + modal.renderMarkdownWrapper(modal.currentCard.front, modal.flashcardView); + + if ( + Object.prototype.hasOwnProperty.call( + modal.plugin.easeByPath, + modal.currentCard.note.path + ) + ) { + ease = modal.plugin.easeByPath[modal.currentCard.note.path]; + } + } + + const store = modal.plugin.store; + const lineNo: number = modal.currentCard.lineNo; + const hash: string = cyrb53(modal.currentCard.cardText); + const cardinfo = store.getAndSyncCardInfo(modal.currentCard.note, lineNo, hash); + + const cardId = cardinfo.itemIds[modal.currentCard.siblingIdx]; + const cardItem = store.getItembyID(cardId); + const intervals = modal.plugin.algorithm.calcAllOptsIntervals(cardItem); + const algo = modal.plugin.data.settings.algorithm; + const btnTexts = modal.plugin.data.settings.responseOptionBtnsText[algo]; + if (modal.ignoreStats) { + // Same for mobile/desktop + modal.hardBtn.setText(`${btnTexts[1]}`); + modal.easyBtn.setText(`${btnTexts[btnTexts.length - 1]}`); + } else if (!modal.plugin.data.settings.intervalShowHide) { + for (let i = 1; i < modal.responseBtns.length; i++) { + modal.responseBtns[i].setText(`${btnTexts[i]}`); + } + } else if (Platform.isMobile) { + for (let i = 1; i < modal.responseBtns.length; i++) { + modal.responseBtns[i].setText( + textInterval(Math.round(intervals[i] * 100) / 100, true) + ); + } + // modal.hardBtn.setText(textInterval(hardInterval, true)); + // modal.goodBtn.setText(textInterval(goodInterval, true)); + // modal.easyBtn.setText(textInterval(easyInterval, true)); + } else { + for (let i = 1; i < modal.responseBtns.length; i++) { + modal.responseBtns[i].setText( + `${btnTexts[i]} - ${textInterval(Math.round(intervals[i] * 100) / 100, false)}` + ); + } + /* modal.hardBtn.setText( + `${modal.plugin.data.settings.flashcardHardText} - ${textInterval( + hardInterval, + false + )}` + ); + modal.goodBtn.setText( + `${modal.plugin.data.settings.flashcardGoodText} - ${textInterval( + goodInterval, + false + )}` + ); + modal.easyBtn.setText( + `${modal.plugin.data.settings.flashcardEasyText} - ${textInterval( + easyInterval, + false + )}` + ); */ + } + + if (modal.plugin.data.settings.showContextInCards) + modal.contextView.setText(modal.currentCard.context); + } +} diff --git a/src/lang/helpers.ts b/src/lang/helpers.ts index 02e7b43d..5076117f 100644 --- a/src/lang/helpers.ts +++ b/src/lang/helpers.ts @@ -83,7 +83,7 @@ export function t(str: keyof typeof en, params?: Record): strin console.error(`SRS error: Locale ${moment.locale()} not found.`); } - const result = (locale && locale[str]) || en[str]; + const result = (locale && locale[str]) || en[str] || str; if (params) { return interpolate(result, params); diff --git a/src/lang/locale/ar.ts b/src/lang/locale/ar.ts index 2d78c0fd..9cb7e657 100644 --- a/src/lang/locale/ar.ts +++ b/src/lang/locale/ar.ts @@ -153,6 +153,8 @@ export default { REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", REVIEW_NOTE_DIRECTLY_DESC: "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + INTERVAL_SHOWHIDE: "Display Next Review Interval", + INTERVAL_SHOWHIDE_DESC: "whether to display next revivew iterval on the response buttons.", // sidebar.ts NOTES_REVIEW_QUEUE: "ملاحظات قائمة المراجعة", diff --git a/src/lang/locale/cz.ts b/src/lang/locale/cz.ts index ebdd69b4..7a4d861c 100644 --- a/src/lang/locale/cz.ts +++ b/src/lang/locale/cz.ts @@ -157,6 +157,8 @@ export default { REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", REVIEW_NOTE_DIRECTLY_DESC: "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + INTERVAL_SHOWHIDE: "Display Next Review Interval", + INTERVAL_SHOWHIDE_DESC: "whether to display next revivew iterval on the response buttons.", // sidebar.ts NOTES_REVIEW_QUEUE: "Fronta poznámek k revizi", diff --git a/src/lang/locale/de.ts b/src/lang/locale/de.ts index 704083c3..b58849e6 100644 --- a/src/lang/locale/de.ts +++ b/src/lang/locale/de.ts @@ -168,6 +168,8 @@ export default { REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", REVIEW_NOTE_DIRECTLY_DESC: "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + INTERVAL_SHOWHIDE: "Display Next Review Interval", + INTERVAL_SHOWHIDE_DESC: "whether to display next revivew iterval on the response buttons.", // sidebar.ts NOTES_REVIEW_QUEUE: "Anstehende Notizen zur Wiederholung", diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 05d90f2d..72a2f33b 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -155,6 +155,8 @@ export default { REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", REVIEW_NOTE_DIRECTLY_DESC: "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + INTERVAL_SHOWHIDE: "Display Next Review Interval", + INTERVAL_SHOWHIDE_DESC: "whether to display next revivew iterval on the response buttons.", // sidebar.ts NOTES_REVIEW_QUEUE: "Notes Review Queue", diff --git a/src/lang/locale/es.ts b/src/lang/locale/es.ts index b3567574..e4f7fe73 100644 --- a/src/lang/locale/es.ts +++ b/src/lang/locale/es.ts @@ -162,6 +162,8 @@ export default { REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", REVIEW_NOTE_DIRECTLY_DESC: "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + INTERVAL_SHOWHIDE: "Display Next Review Interval", + INTERVAL_SHOWHIDE_DESC: "whether to display next revivew iterval on the response buttons.", // sidebar.ts NOTES_REVIEW_QUEUE: "Cola de notas a revisar", diff --git a/src/lang/locale/ja.ts b/src/lang/locale/ja.ts index 6f67ec8a..c65c1b97 100644 --- a/src/lang/locale/ja.ts +++ b/src/lang/locale/ja.ts @@ -161,6 +161,8 @@ export default { REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", REVIEW_NOTE_DIRECTLY_DESC: "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + INTERVAL_SHOWHIDE: "Display Next Review Interval", + INTERVAL_SHOWHIDE_DESC: "whether to display next revivew iterval on the response buttons.", // sidebar.ts NOTES_REVIEW_QUEUE: "ノートレビューのキュー", diff --git a/src/lang/locale/ko.ts b/src/lang/locale/ko.ts index e1ebfa29..c90633c7 100644 --- a/src/lang/locale/ko.ts +++ b/src/lang/locale/ko.ts @@ -158,6 +158,8 @@ export default { REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", REVIEW_NOTE_DIRECTLY_DESC: "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + INTERVAL_SHOWHIDE: "Display Next Review Interval", + INTERVAL_SHOWHIDE_DESC: "whether to display next revivew iterval on the response buttons.", // sidebar.ts NOTES_REVIEW_QUEUE: "리뷰할 노트 대기열", diff --git a/src/lang/locale/pt-br.ts b/src/lang/locale/pt-br.ts index 7109467c..87846148 100644 --- a/src/lang/locale/pt-br.ts +++ b/src/lang/locale/pt-br.ts @@ -164,6 +164,8 @@ export default { REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", REVIEW_NOTE_DIRECTLY_DESC: "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + INTERVAL_SHOWHIDE: "Display Next Review Interval", + INTERVAL_SHOWHIDE_DESC: "whether to display next revivew iterval on the response buttons.", // sidebar.ts NOTES_REVIEW_QUEUE: "Fila de Notas para Revisar", diff --git a/src/lang/locale/ru.ts b/src/lang/locale/ru.ts index 09f5569c..a01fd4b6 100644 --- a/src/lang/locale/ru.ts +++ b/src/lang/locale/ru.ts @@ -168,6 +168,8 @@ export default { REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", REVIEW_NOTE_DIRECTLY_DESC: "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + INTERVAL_SHOWHIDE: "Display Next Review Interval", + INTERVAL_SHOWHIDE_DESC: "whether to display next revivew iterval on the response buttons.", // sidebar.ts NOTES_REVIEW_QUEUE: "Очередь заметок на повторение", diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index bd277e14..5ce7bb48 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -42,7 +42,7 @@ export default { PLEASE_TAG_NOTE: "请将需要复习的笔记中加入正确的标签(检查设置选项)。", RESPONSE_RECEIVED: "反馈已收到", NO_DECK_EXISTS: "没有 ${deckName} 卡组", - ALL_CAUGHT_UP: "都复习完啦,你真棒!", + ALL_CAUGHT_UP: "都复习完啦,你真棒!\n去接触点新东西吧~", // scheduling.ts DAYS_STR_IVL: "${interval}天", @@ -132,7 +132,8 @@ export default { NEW_PER_DAY_NEG: "整数必须大于等于-1.", REPEAT_ITEMS: "重复错误", REPEAT_ITEMS_DESC: "错误项是否要一直重复复习,直到回答正确?", - ALGORITHMS_CONFIRM: `切换算法可能导致日期排程重置,这个修改不可撤销,当重启软件或重新加载插件切换算法才会生效。你确定要切换算法么?`, + ALGORITHMS_CONFIRM: + "切换算法可能导致日期排程重置,这个修改不可撤销,当重启软件或重新加载插件切换算法才会生效。你确定要切换算法么?", ALGORITHMS_DESC: '用于间隔重复的算法. 更多信息请查阅 算法.', CONVERT_TRACKED_TO_DECK: "将复习笔记转换为卡牌组?", @@ -141,6 +142,8 @@ export default { "当设置项“复习后自动打开下一个笔记”启用时,这个设置项启用才生效. 通过点击状态栏/侧边栏/命令进行复习时就会显示出来.", REVIEW_NOTE_DIRECTLY: "直接复习笔记?", REVIEW_NOTE_DIRECTLY_DESC: "复习笔记时, 不必选择标签(多个复习标签的情况)就直接打开笔记", + INTERVAL_SHOWHIDE: "显示复习间隔", + INTERVAL_SHOWHIDE_DESC: "是否在按键上显示复习间隔", // sidebar.ts NOTES_REVIEW_QUEUE: "笔记复习序列", diff --git a/src/lang/locale/zh-tw.ts b/src/lang/locale/zh-tw.ts index 95e034b0..2eb64560 100644 --- a/src/lang/locale/zh-tw.ts +++ b/src/lang/locale/zh-tw.ts @@ -140,6 +140,8 @@ export default { "當設置項“復習後自動打開下一個筆記”啟用時,這個設置項啟用才生效. 通過點擊狀態欄/側邊欄/命令進行復習時就會顯示出來.", REVIEW_NOTE_DIRECTLY: "直接復習筆記?", REVIEW_NOTE_DIRECTLY_DESC: "復習筆記時, 不必選擇標籤(多個復習標籤的情況)就直接打開筆記", + INTERVAL_SHOWHIDE: "顯示復習間隔", + INTERVAL_SHOWHIDE_DESC: "是否在按鍵上顯示復習間隔", // sidebar.ts NOTES_REVIEW_QUEUE: "筆記復習序列", diff --git a/src/main.ts b/src/main.ts index 39bc3126..0f2d3121 100644 --- a/src/main.ts +++ b/src/main.ts @@ -11,7 +11,7 @@ import { import * as graph from "pagerank.js"; import { SRSettingTab, SRSettings, DEFAULT_SETTINGS, DataLocation } from "src/settings"; -import { FlashcardModal, Deck } from "src/flashcard-modal"; +import { FlashcardModal, Deck } from "src/flashcard-modal-algo"; import { StatsModal, Stats } from "src/stats-modal"; import { ReviewQueueListView, REVIEW_QUEUE_VIEW_TYPE } from "src/sidebar"; import { Card, CardType, ReviewResponse, schedule } from "src/scheduling"; @@ -33,6 +33,7 @@ import Commands from "./commands"; import SrsAlgorithm from "./algorithms"; import { algorithms } from "src/settings"; import { reviewNoteResponseModal } from "./modals/reviewresponse-modal"; +import { DateUtils } from "./utils_recall"; interface PluginData { settings: SRSettings; @@ -77,6 +78,8 @@ export default class SRPlugin extends Plugin { private pageranks: Record = {}; public newNotesCount = 0; public dueNotesCount = 0; + public dueNotesCount_real = 0; + public shortestInterval = 0; public dueDatesNotes: Record = {}; // Record<# of days in future, due count> public deckTree: Deck = new Deck("root", null); @@ -95,10 +98,11 @@ export default class SRPlugin extends Plugin { appIcon(); this.algorithm = algorithms[this.data.settings.algorithm]; - this.algorithm.updateSettings(this.data.settings.algorithmSettings); + this.algorithm.updateSettings( + this, + this.data.settings.algorithmSettings[this.data.settings.algorithm] + ); - // this.store = new DataStore(this); - // await this.store.load(); this.store.buildQueue(); this.commands = new Commands(this); this.commands.addCommands(); @@ -112,7 +116,9 @@ export default class SRPlugin extends Plugin { if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { // save tracked_files.json - this.registerInterval(window.setInterval(() => this.store.save(), 5 * 60 * 1000)); + this.registerInterval( + window.setInterval(() => (this.sync(), this.store.save()), 5 * 60 * 1000) + ); } this.statusBar = this.addStatusBarItem(); @@ -334,6 +340,7 @@ export default class SRPlugin extends Plugin { console.log("Unloading Obsidian Recall. Saving tracked files..."); this.store.save(); this.app.workspace.getLeavesOfType(REVIEW_QUEUE_VIEW_TYPE).forEach((leaf) => leaf.detach()); + console.log("tracked files saved."); } async sync(ignoreStats = false): Promise { @@ -548,9 +555,10 @@ export default class SRPlugin extends Plugin { ); } + this.dueNotesCount_real = Object.keys(this.store.data.toDayAllQueue).length; this.statusBar.setText( t("STATUS_BAR", { - dueNotesCount: this.dueNotesCount, + dueNotesCount: this.dueNotesCount_real, dueFlashcardsCount: this.deckTree.dueFlashcardsCount, }) ); @@ -665,7 +673,6 @@ export default class SRPlugin extends Plugin { let due: number; [, due, interval, ease] = this.store.getReviewNoteHeaderData(note.path); delayBeforeReview = due === 0 ? 0 : now - due; //just in case. - // console.debug(ease, interval, due, delayBeforeReview); } } @@ -720,14 +727,176 @@ export default class SRPlugin extends Plugin { await this.sync(); } else if (fileId > -1) { this.deleteNoteSchedulingHeader(note, deleteheader); - //update data - const sched = [null, due.valueOf(), interval, ease]; - this.store.syncheadertoDataItems(note, sched, response); - // this.store.reviewId(fileId, response.toString()); + this.store.reviewId(fileId, response.toString()); + await this.store.save(); //Sync update - this.singNoteSyncQueue(this, note, delayBeforeReview); + this.singleNoteSyncQueue(this, note, delayBeforeReview); + } + + if (!this.lastSelectedReviewDeck) { + this.lastSelectedReviewDeck = matchedNoteTag; + } + + new Notice(t("RESPONSE_RECEIVED")); + + if (this.data.settings.autoNextNote) { + this.reviewNextNote(this.lastSelectedReviewDeck); + } + } + + async saveReviewResponsebyAlgo(note: TFile, response: string): Promise { + const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; + const frontmatter: FrontMatterCache | Record = + fileCachedData.frontmatter || {}; + + const tags = getAllTags(fileCachedData) || []; + if (this.data.settings.noteFoldersToIgnore.some((folder) => note.path.startsWith(folder))) { + new Notice(t("NOTE_IN_IGNORED_FOLDER")); + return; + } + + let shouldIgnore = true; + let matchedNoteTag: string; + for (const tag of tags) { + if ( + this.data.settings.tagsToReview.some( + (tagToReview) => + tag === (matchedNoteTag = tagToReview) || tag.startsWith(tagToReview + "/") + ) + ) { + shouldIgnore = false; + // matchedNoteTag = tagToReview; + break; + } + } + + if ( + (shouldIgnore && this.data.settings.dataLocation === DataLocation.SaveOnNoteFile) || + (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile && + !this.store.isTracked(note.path)) + ) { + new Notice(t("PLEASE_TAG_NOTE")); + return; + } + + const fileText: string = await this.app.vault.read(note); + let ease: number, interval: number, delayBeforeReview: number; + const now: number = Date.now(); + // new note + const fileId = this.store.getFileId(note.path); + if ( + !( + Object.prototype.hasOwnProperty.call(frontmatter, "sr-due") && + Object.prototype.hasOwnProperty.call(frontmatter, "sr-interval") && + Object.prototype.hasOwnProperty.call(frontmatter, "sr-ease") + ) || + (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile && + this.store.isNewAdd(fileId) >= 0) + ) { + // 新笔记,没有复习过的 + let linkTotal = 0, + linkPGTotal = 0, + totalLinkCount = 0; + + for (const statObj of this.incomingLinks[note.path] || []) { + const ease: number = this.easeByPath[statObj.sourcePath]; + if (ease) { + linkTotal += statObj.linkCount * this.pageranks[statObj.sourcePath] * ease; + linkPGTotal += this.pageranks[statObj.sourcePath] * statObj.linkCount; + totalLinkCount += statObj.linkCount; + } + } + + const outgoingLinks = this.app.metadataCache.resolvedLinks[note.path] || {}; + for (const linkedFilePath in outgoingLinks) { + const ease: number = this.easeByPath[linkedFilePath]; + if (ease) { + linkTotal += + outgoingLinks[linkedFilePath] * this.pageranks[linkedFilePath] * ease; + linkPGTotal += this.pageranks[linkedFilePath] * outgoingLinks[linkedFilePath]; + totalLinkCount += outgoingLinks[linkedFilePath]; + } + } + + const linkContribution: number = + this.data.settings.maxLinkFactor * + Math.min(1.0, Math.log(totalLinkCount + 0.5) / Math.log(64)); + ease = + (1.0 - linkContribution) * this.data.settings.baseEase + + (totalLinkCount > 0 + ? (linkContribution * linkTotal) / linkPGTotal + : linkContribution * this.data.settings.baseEase); + // add note's average flashcard ease if available + if (Object.prototype.hasOwnProperty.call(this.easeByPath, note.path)) { + ease = (ease + this.easeByPath[note.path]) / 2; + } + ease = Math.round(ease); + interval = 1.0; + delayBeforeReview = 0; + } else { + // reviewedNote update + interval = frontmatter["sr-interval"]; + ease = frontmatter["sr-ease"]; + delayBeforeReview = + now - + window + .moment(frontmatter["sr-due"], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) + .valueOf(); + } + + // reviewedNote update + if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { + if (this.store.isNewAdd(this.store.getFileId(note.path)) < 0) { + const [, due, ,] = this.store.getReviewNoteHeaderData(note.path); + delayBeforeReview = due === 0 ? 0 : now - due; //just in case. + } + } + + //根据当前状态参数及反馈的选项,更新数据 + this.store.reviewId(fileId, response); + let deleteheader = false; + + // check if scheduling info exists + if (SCHEDULING_INFO_REGEX.test(fileText)) { + deleteheader = true; + } + if (this.data.settings.burySiblingCards) { + await this.findFlashcardsInNote(note, [], true); // bury all cards in current note + await this.savePluginData(); + } + + // save changes + if (this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile) { + this.deleteNoteSchedulingHeader(note, deleteheader); + + const [, due, ,] = this.store.getReviewNoteHeaderData(note.path); + + //Sync update + this.singleNoteSyncQueue(this, note, delayBeforeReview); + } + + const nowToday: number = + Math.ceil(Date.now() / DateUtils.DAYS_TO_MILLIS) * DateUtils.DAYS_TO_MILLIS; + const item = this.store.getItembyID(fileId); + if ( + Object.keys(this.store.data.toDayLatterQueue).length > 0 && + item.nextReview <= nowToday + ) { + if ( + this.shortestInterval === 0 || + this.shortestInterval < now || + this.shortestInterval > item.nextReview + ) { + console.debug( + "interval diff:should be - (", + this.shortestInterval - item.nextReview + ); + this.shortestInterval = item.nextReview; + } + } else { + this.shortestInterval = 0; } if (!this.lastSelectedReviewDeck) { @@ -736,7 +905,6 @@ export default class SRPlugin extends Plugin { new Notice(t("RESPONSE_RECEIVED")); - // console.debug("syncRCDataToSRrevDeck>", this.reviewDecks, matchedNoteTag); if (this.data.settings.autoNextNote) { this.reviewNextNote(this.lastSelectedReviewDeck); } @@ -767,18 +935,17 @@ export default class SRPlugin extends Plugin { const deck = this.reviewDecks[deckKey]; let show = false; let path = null; + let index = -1; if (deck.dueNotesCount > 0) { - const index = this.data.settings.openRandomNote - ? Math.floor(Math.random() * deck.dueNotesCount) - : 0; + index = this.getNextDueNoteIndex(deck, deck.dueNotesCount); + } + if (index >= 0) { await this.app.workspace.getLeaf().openFile(deck.scheduledNotes[index].note); path = deck.scheduledNotes[index].note.path; show = true; // return; - } - - if (deck.newNotes.length > 0) { + } else if (deck.newNotes.length > 0) { const index = this.data.settings.openRandomNote ? Math.floor(Math.random() * deck.newNotes.length) : 0; @@ -789,48 +956,39 @@ export default class SRPlugin extends Plugin { } if (show) { // reviewedNote update interval - let responseInterval: number[] | null = null; - if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { - const now: number = Date.now(); - const [, due, interval, ease] = this.store.getReviewNoteHeaderData(path); - const delayBeforeReview = due === 0 ? 0 : now - due; //just in case. - const hardInterval: number = schedule( - ReviewResponse.Hard, - interval, - ease, - delayBeforeReview, - this.data.settings - ).interval; - const goodInterval: number = schedule( - ReviewResponse.Good, - interval, - ease, - delayBeforeReview, - this.data.settings - ).interval; - const easyInterval: number = schedule( - ReviewResponse.Easy, - interval, - ease, - delayBeforeReview, - this.data.settings - ).interval; - responseInterval = [null, hardInterval, goodInterval, easyInterval]; - console.debug("几个反馈结果的间隔:hge", hardInterval, goodInterval, easyInterval); - } - this.reviewNoteFloatBar.display(show, responseInterval); + const fid = this.store.getFileId(path); + const item = this.store.data.items[fid]; + // this.reviewNoteFloatBar.algoDisplay(show, this.store.calcReviewInterval(fid)); + this.reviewNoteFloatBar.algoDisplay(show, this.algorithm.calcAllOptsIntervals(item)); + return; } + const queue = this.store.data.toDayAllQueue; + const len = Object.keys(queue).length; + this.dueNotesCount_real = len; if ( this.data.settings.reviewingNoteDirectly && - this.dueNotesCount + this.newNotesCount > 0 + this.dueNotesCount_real + this.newNotesCount > 0 ) { const rdname: string = this.getDeckNameForReviewDirectly(); this.reviewNextNote(rdname); return; } - this.reviewNoteFloatBar.display(show); + if (Object.keys(this.store.data.toDayLatterQueue).length > 0 && this.shortestInterval > 0) { + const now = Date.now(); + const interval = Math.round((this.shortestInterval - now) / 1000 / 60); + new Notice("可以在" + interval + "分钟后来复习"); + } + + this.statusBar.setText( + t("STATUS_BAR", { + dueNotesCount: this.dueNotesCount_real, + dueFlashcardsCount: this.deckTree.dueFlashcardsCount, + }) + ); + + this.reviewNoteFloatBar.selfDestruct(); this.reviewQueueView.redraw(); new Notice(t("ALL_CAUGHT_UP")); } @@ -1032,7 +1190,6 @@ export default class SRPlugin extends Plugin { //update scheduling by recall if (settings.dataLocation !== DataLocation.SaveOnNoteFile) { if (scheduling.length) { - // console.debug("org card scheduling info", scheduling); // delete scheduling infos in note file. const idxSched: number = cardText.lastIndexOf("")) i++; + } else if (currentLine.startsWith("")) i++; i++; continue; } @@ -44,11 +45,11 @@ export function parse( if (cardText.length > 0) { cardText += "\n"; } - cardText += lines[i]; + cardText += currentLine.trimEnd(); if ( - lines[i].includes(singlelineReversedCardSeparator) || - lines[i].includes(singlelineCardSeparator) + currentLine.includes(singlelineReversedCardSeparator) || + currentLine.includes(singlelineCardSeparator) ) { cardType = lines[i].includes(singlelineReversedCardSeparator) ? CardType.SingleLineReversed @@ -64,20 +65,20 @@ export function parse( cardText = ""; } else if ( cardType === null && - ((convertHighlightsToClozes && /==.*?==/gm.test(lines[i])) || - (convertBoldTextToClozes && /\*\*.*?\*\*/gm.test(lines[i])) || - (convertCurlyBracketsToClozes && /{{.*?}}/gm.test(lines[i]))) + ((convertHighlightsToClozes && /==.*?==/gm.test(currentLine)) || + (convertBoldTextToClozes && /\*\*.*?\*\*/gm.test(currentLine)) || + (convertCurlyBracketsToClozes && /{{.*?}}/gm.test(currentLine))) ) { cardType = CardType.Cloze; lineNo = i; - } else if (lines[i] === multilineCardSeparator) { + } else if (currentLine.trim() === multilineCardSeparator) { cardType = CardType.MultiLineBasic; lineNo = i; - } else if (lines[i] === multilineReversedCardSeparator) { + } else if (currentLine.trim() === multilineReversedCardSeparator) { cardType = CardType.MultiLineReversed; lineNo = i; - } else if (lines[i].startsWith("```") || lines[i].startsWith("~~~")) { - const codeBlockClose = lines[i].match(/`+|~+/)[0]; + } else if (currentLine.startsWith("```") || currentLine.startsWith("~~~")) { + const codeBlockClose = currentLine.match(/`+|~+/)[0]; while (i + 1 < lines.length && !lines[i + 1].startsWith(codeBlockClose)) { i++; cardText += "\n" + lines[i]; diff --git a/src/review-deck.ts b/src/review-deck.ts index c84249ba..b35fbb29 100644 --- a/src/review-deck.ts +++ b/src/review-deck.ts @@ -18,7 +18,7 @@ export class ReviewDeck { public sortNotes(pageranks: Record): void { // sort new notes by importance this.newNotes = this.newNotes.sort( - (a: TFile, b: TFile) => (pageranks[b.path] || 0) - (pageranks[a.path] || 0) + (a: TFile, b: TFile) => (pageranks[b.path] || 0) - (pageranks[a.path] || 0), ); // sort scheduled notes by date & within those days, sort them by importance diff --git a/src/scheduling.ts b/src/scheduling.ts index 8fdf2562..2701884a 100644 --- a/src/scheduling.ts +++ b/src/scheduling.ts @@ -48,7 +48,7 @@ export function schedule( ease: number, delayBeforeReview: number, settingsObj: SRSettings, - dueDates?: Record + dueDates?: Record, ): Record { delayBeforeReview = Math.max(0, Math.floor(delayBeforeReview / (24 * 3600 * 1000))); @@ -62,7 +62,7 @@ export function schedule( ease = Math.max(130, ease - 20); interval = Math.max( 1, - (interval + delayBeforeReview / 4) * settingsObj.lapsesIntervalChange + (interval + delayBeforeReview / 4) * settingsObj.lapsesIntervalChange, ); } diff --git a/src/settings.ts b/src/settings.ts index 0c7420c4..1d2596f6 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -209,7 +209,7 @@ export class SRSettingTab extends PluginSettingTab { .filter((v) => v); await this.plugin.savePluginData(); }); - }) + }), ); containerEl.createEl("h3", { text: `${t("FLASHCARDS")}` }); @@ -225,7 +225,7 @@ export class SRSettingTab extends PluginSettingTab { this.plugin.data.settings.flashcardTags = value.split(/\s+/); await this.plugin.savePluginData(); }); - }) + }), ); new Setting(containerEl) @@ -237,7 +237,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.convertFoldersToDecks = value; await this.plugin.savePluginData(); - }) + }), ); new Setting(containerEl) @@ -249,7 +249,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.cardCommentOnSameLine = value; await this.plugin.savePluginData(); - }) + }), ); new Setting(containerEl) @@ -261,7 +261,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.burySiblingCards = value; await this.plugin.savePluginData(); - }) + }), ); new Setting(containerEl) @@ -273,7 +273,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.showContextInCards = value; await this.plugin.savePluginData(); - }) + }), ); new Setting(containerEl) @@ -287,7 +287,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.flashcardHeightPercentage = value; await this.plugin.savePluginData(); - }) + }), ) .addExtraButton((button) => { button @@ -312,7 +312,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.flashcardWidthPercentage = value; await this.plugin.savePluginData(); - }) + }), ) .addExtraButton((button) => { button @@ -332,7 +332,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.randomizeCardOrder = value; await this.plugin.savePluginData(); - }) + }), ); new Setting(containerEl).setName(t("CONVERT_HIGHLIGHTS_TO_CLOZES")).addToggle((toggle) => @@ -341,7 +341,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.convertHighlightsToClozes = value; await this.plugin.savePluginData(); - }) + }), ); new Setting(containerEl).setName(t("CONVERT_BOLD_TEXT_TO_CLOZES")).addToggle((toggle) => @@ -350,7 +350,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.convertBoldTextToClozes = value; await this.plugin.savePluginData(); - }) + }), ); new Setting(containerEl) @@ -361,7 +361,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.convertCurlyBracketsToClozes = value; await this.plugin.savePluginData(); - }) + }), ); new Setting(containerEl) @@ -375,7 +375,7 @@ export class SRSettingTab extends PluginSettingTab { this.plugin.data.settings.singleLineCardSeparator = value; await this.plugin.savePluginData(); }); - }) + }), ) .addExtraButton((button) => { button @@ -400,7 +400,7 @@ export class SRSettingTab extends PluginSettingTab { this.plugin.data.settings.singleLineReversedCardSeparator = value; await this.plugin.savePluginData(); }); - }) + }), ) .addExtraButton((button) => { button @@ -425,7 +425,7 @@ export class SRSettingTab extends PluginSettingTab { this.plugin.data.settings.multilineCardSeparator = value; await this.plugin.savePluginData(); }); - }) + }), ) .addExtraButton((button) => { button @@ -450,7 +450,7 @@ export class SRSettingTab extends PluginSettingTab { this.plugin.data.settings.multilineReversedCardSeparator = value; await this.plugin.savePluginData(); }); - }) + }), ) .addExtraButton((button) => { button @@ -474,7 +474,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.enableNoteReviewPaneOnStartup = value; await this.plugin.savePluginData(); - }) + }), ); new Setting(containerEl) @@ -488,7 +488,7 @@ export class SRSettingTab extends PluginSettingTab { this.plugin.data.settings.tagsToReview = value.split(/\s+/); await this.plugin.savePluginData(); }); - }) + }), ); new Setting(containerEl) @@ -500,14 +500,14 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.openRandomNote = value; await this.plugin.savePluginData(); - }) + }), ); new Setting(containerEl).setName(t("AUTO_NEXT_NOTE")).addToggle((toggle) => toggle.setValue(this.plugin.data.settings.autoNextNote).onChange(async (value) => { this.plugin.data.settings.autoNextNote = value; await this.plugin.savePluginData(); - }) + }), ); this.addReviewNoteDirectlySetting(containerEl); @@ -521,7 +521,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.disableFileMenuReviewOptions = value; await this.plugin.savePluginData(); - }) + }), ); new Setting(containerEl) @@ -536,7 +536,7 @@ export class SRSettingTab extends PluginSettingTab { if (numValue < 1) { new Notice(t("MIN_ONE_DAY")); text.setValue( - this.plugin.data.settings.maxNDaysNotesReviewQueue.toString() + this.plugin.data.settings.maxNDaysNotesReviewQueue.toString(), ); return; } @@ -547,7 +547,7 @@ export class SRSettingTab extends PluginSettingTab { new Notice(t("VALID_NUMBER_WARNING")); } }); - }) + }), ) .addExtraButton((button) => { button @@ -572,7 +572,7 @@ export class SRSettingTab extends PluginSettingTab { .onChange(async (value) => { this.plugin.data.settings.initiallyExpandAllSubdecksInTree = value; await this.plugin.savePluginData(); - }) + }), ); this.addResponseButtonTextSetting(containerEl); @@ -586,7 +586,7 @@ export class SRSettingTab extends PluginSettingTab { toggle.setValue(this.plugin.data.settings.showDebugMessages).onChange(async (value) => { this.plugin.data.settings.showDebugMessages = value; await this.plugin.savePluginData(); - }) + }), ); } diff --git a/src/sidebar.ts b/src/sidebar.ts index ade8ee80..218da595 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -57,7 +57,7 @@ export class ReviewQueueListView extends ItemView { deckKey, deckCollapsed, false, - deck + deck, ).getElementsByClassName("nav-folder-children")[0] as HTMLElement; if (deck.newNotes.length > 0) { @@ -66,7 +66,7 @@ export class ReviewQueueListView extends ItemView { t("NEW"), !deck.activeFolders.has(t("NEW")), deckCollapsed, - deck + deck, ); for (const newFile of deck.newNotes) { @@ -86,7 +86,7 @@ export class ReviewQueueListView extends ItemView { fileIsOpen, !deck.activeFolders.has(t("NEW")), deck, - this.plugin + this.plugin, ); } } @@ -155,7 +155,7 @@ export class ReviewQueueListView extends ItemView { fileIsOpen, !deck.activeFolders.has(folderTitle), deck, - this.plugin + this.plugin, ); } } @@ -171,13 +171,13 @@ export class ReviewQueueListView extends ItemView { folderTitle: string, collapsed: boolean, hidden: boolean, - deck: ReviewDeck + deck: ReviewDeck, ): HTMLElement { const folderEl: HTMLDivElement = parentEl.createDiv("nav-folder"); const folderTitleEl: HTMLDivElement = folderEl.createDiv("nav-folder-title"); const childrenEl: HTMLDivElement = folderEl.createDiv("nav-folder-children"); const collapseIconEl: HTMLDivElement = folderTitleEl.createDiv( - "nav-folder-collapse-indicator collapse-icon" + "nav-folder-collapse-indicator collapse-icon", ); collapseIconEl.innerHTML = COLLAPSE_ICON; @@ -215,7 +215,7 @@ export class ReviewQueueListView extends ItemView { fileElActive: boolean, hidden: boolean, deck: ReviewDeck, - plugin: SRPlugin + plugin: SRPlugin, ): void { const navFileEl: HTMLElement = folderEl .getElementsByClassName("nav-folder-children")[0] @@ -245,7 +245,7 @@ export class ReviewQueueListView extends ItemView { return false; }, - false + false, ); navFileTitle.addEventListener( @@ -260,7 +260,7 @@ export class ReviewQueueListView extends ItemView { }); return false; }, - false + false, ); } diff --git a/src/stats-modal.tsx b/src/stats-modal.tsx index 2f5d1be4..b635a26c 100644 --- a/src/stats-modal.tsx +++ b/src/stats-modal.tsx @@ -31,7 +31,7 @@ Chart.register( CategoryScale, LinearScale, PieController, - ArcElement + ArcElement, ); export interface Stats { @@ -126,7 +126,7 @@ export class StatsModal extends Modal { t("REVIEWS_PER_DAY", { avg: (scheduledCount / maxN).toFixed(1) }), t("SCHEDULED"), t("DAYS"), - t("NUMBER_OF_CARDS") + t("NUMBER_OF_CARDS"), ); maxN = Math.max(...getKeysPreserveType(cardStats.intervals)); @@ -143,13 +143,13 @@ export class StatsModal extends Modal { .map(([interval, count]) => interval * count) .reduce((a, b) => a + b, 0) / scheduledCount) * - 10 + 10, ) / 10 || 0, - false + false, ), longest_interval: string = textInterval( Math.max(...getKeysPreserveType(cardStats.intervals)) || 0, - false + false, ); createStatsChart( @@ -162,7 +162,7 @@ export class StatsModal extends Modal { t("INTERVALS_SUMMARY", { avg: average_interval, longest: longest_interval }), t("COUNT"), t("DAYS"), - t("NUMBER_OF_CARDS") + t("NUMBER_OF_CARDS"), ); // Add eases @@ -176,7 +176,7 @@ export class StatsModal extends Modal { Math.round( getTypedObjectEntries(cardStats.eases) .map(([ease, count]) => ease * count) - .reduce((a, b) => a + b, 0) / scheduledCount + .reduce((a, b) => a + b, 0) / scheduledCount, ) || 0; createStatsChart( @@ -189,7 +189,7 @@ export class StatsModal extends Modal { t("EASES_SUMMARY", { avgEase: average_ease }), t("COUNT"), t("EASES"), - t("NUMBER_OF_CARDS") + t("NUMBER_OF_CARDS"), ); // Add card types @@ -201,17 +201,17 @@ export class StatsModal extends Modal { t("CARD_TYPES_DESC"), [ `${t("CARD_TYPE_NEW")} - ${Math.round( - (cardStats.newCount / totalCardsCount) * 100 + (cardStats.newCount / totalCardsCount) * 100, )}%`, `${t("CARD_TYPE_YOUNG")} - ${Math.round( - (cardStats.youngCount / totalCardsCount) * 100 + (cardStats.youngCount / totalCardsCount) * 100, )}%`, `${t("CARD_TYPE_MATURE")} - ${Math.round( - (cardStats.matureCount / totalCardsCount) * 100 + (cardStats.matureCount / totalCardsCount) * 100, )}%`, ], [cardStats.newCount, cardStats.youngCount, cardStats.matureCount], - t("CARD_TYPES_SUMMARY", { totalCardsCount }) + t("CARD_TYPES_SUMMARY", { totalCardsCount }), ); } @@ -231,7 +231,7 @@ function createStatsChart( summary: string, seriesTitle = "", xAxisTitle = "", - yAxisTitle = "" + yAxisTitle = "", ) { const style = getComputedStyle(document.body); const textColor = style.getPropertyValue("--text-normal"); diff --git a/src/utils.ts b/src/utils.ts index 757ea4a5..3d465d2d 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -19,7 +19,7 @@ export function getTypedObjectEntries(obj: OBJ_T): Obj * @returns An array of the keys of `obj` with type `(keyof T)[]` */ export const getKeysPreserveType = Object.keys as >( - obj: T + obj: T, ) => Array; /** diff --git a/tests/e2e/utils.js b/tests/e2e/utils.js index 2d68ab75..d7ea07b6 100644 --- a/tests/e2e/utils.js +++ b/tests/e2e/utils.js @@ -17,13 +17,13 @@ module.exports = { // Open the vault await browser.execute( - "require('electron').ipcRenderer.sendSync('vault-open', 'tests/e2e/vault', false)" + "require('electron').ipcRenderer.sendSync('vault-open', 'tests/e2e/vault', false)", ); await module.exports.sleep(2); // Disable safemode and enable the plugin await browser.execute( - "app.plugins.setEnable(true);app.plugins.enablePlugin('obsidian-spaced-repetition')" + "app.plugins.setEnable(true);app.plugins.enablePlugin('obsidian-spaced-repetition')", ); // Trust the vault diff --git a/tests/unit/lang/helpers.test.ts b/tests/unit/lang/helpers.test.ts index 574c8c09..3673eeb1 100644 --- a/tests/unit/lang/helpers.test.ts +++ b/tests/unit/lang/helpers.test.ts @@ -10,12 +10,12 @@ test("Check that localization entries are consistent across all files", () => { const unmapped_keys = expected_keys.filter((x) => !locale_keys.includes(x)); expect( unmapped_keys.length, - `The ${language_code} locale does not include translations for: ${unmapped_keys}.` + `The ${language_code} locale does not include translations for: ${unmapped_keys}.`, ).toBe(0); const extra_keys = locale_keys.filter((x) => !expected_keys.includes(x)); expect( extra_keys.length, - `The ${language_code} locale includes the following deprecated translations: ${extra_keys}.` + `The ${language_code} locale includes the following deprecated translations: ${extra_keys}.`, ).toBe(0); } }); @@ -69,7 +69,7 @@ test("Test translation with interpolation in English", () => { // eslint-disable-next-line @typescript-eslint/no-var-requires const { t } = require("src/lang/helpers"); expect(t("STATUS_BAR", { dueNotesCount: 1, dueFlashcardsCount: 2 })).toEqual( - "Review: 1 note(s), 2 card(s) due" + "Review: 1 note(s), 2 card(s) due", ); }); }); @@ -83,7 +83,7 @@ test("Test translation with interpolation in German", () => { // eslint-disable-next-line @typescript-eslint/no-var-requires const { t } = require("src/lang/helpers"); expect(t("STATUS_BAR", { dueNotesCount: 1, dueFlashcardsCount: 2 })).toEqual( - "Wiederholung: 1 Notiz(en), 2 Karte(n) anstehend" + "Wiederholung: 1 Notiz(en), 2 Karte(n) anstehend", ); }); }); diff --git a/tests/unit/parser.test.ts b/tests/unit/parser.test.ts index e0948e5f..7e687398 100644 --- a/tests/unit/parser.test.ts +++ b/tests/unit/parser.test.ts @@ -47,6 +47,9 @@ test("Test parsing of multi line basic cards", () => { expect(parse("Question\n?\nAnswer", ...defaultArgs)).toEqual([ [CardType.MultiLineBasic, "Question\n?\nAnswer", 1], ]); + expect(parse("Question\n? \nAnswer", ...defaultArgs)).toEqual([ + [CardType.MultiLineBasic, "Question\n?\nAnswer", 1], + ]); expect(parse("Question\n?\nAnswer ", ...defaultArgs)).toEqual([ [CardType.MultiLineBasic, "Question\n?\nAnswer ", 1], ]); @@ -79,7 +82,7 @@ test("Test parsing of multi line reversed cards", () => { [ [CardType.MultiLineReversed, "Line0\nQ1\n??\nA1\nAnswerExtra", 4], [CardType.MultiLineReversed, "Q2\n??\nA2", 9], - ] + ], ); }); @@ -101,8 +104,8 @@ test("Test parsing of cloze cards", () => { parse( "some text before\n\na deletion on\nsuch ==wow==\n\n" + "many text\nsuch surprise ==wow== more ==text==\nsome text after\n\nHmm", - ...defaultArgs - ) + ...defaultArgs, + ), ).toEqual([ [CardType.Cloze, "a deletion on\nsuch ==wow==", 3], [CardType.Cloze, "many text\nsuch surprise ==wow== more ==text==\nsome text after", 6], @@ -112,7 +115,7 @@ test("Test parsing of cloze cards", () => { expect(parse("lorem ipsum ==dolor won=", ...defaultArgs)).toEqual([]); // ==highlights== turned off expect(parse("cloze ==deletion== test", "::", ":::", "?", "??", false, true, false)).toEqual( - [] + [], ); // **bolded** @@ -132,8 +135,8 @@ test("Test parsing of cloze cards", () => { parse( "some text before\n\na deletion on\nsuch **wow**\n\n" + "many text\nsuch surprise **wow** more **text**\nsome text after\n\nHmm", - ...defaultArgs - ) + ...defaultArgs, + ), ).toEqual([ [CardType.Cloze, "a deletion on\nsuch **wow**", 3], [CardType.Cloze, "many text\nsuch surprise **wow** more **text**\nsome text after", 6], @@ -143,7 +146,7 @@ test("Test parsing of cloze cards", () => { expect(parse("lorem ipsum **dolor won*", ...defaultArgs)).toEqual([]); // **bolded** turned off expect(parse("cloze **deletion** test", "::", ":::", "?", "??", true, false, false)).toEqual( - [] + [], ); // both @@ -159,8 +162,8 @@ test("Test parsing of a mix of card types", () => { "Duis magna arcu, eleifend rhoncus ==euismod non,==\nlaoreet vitae enim.\n\n" + "Fusce placerat::velit in pharetra gravida\n\n" + "Donec dapibus ullamcorper aliquam.\n??\nDonec dapibus ullamcorper aliquam.\n", - ...defaultArgs - ) + ...defaultArgs, + ), ).toEqual([ [ CardType.Cloze, @@ -184,8 +187,8 @@ test("Test codeblocks", () => { parse( "How do you ... Python?\n?\n" + "```\nprint('Hello World!')\nprint('Howdy?')\nlambda x: x[0]\n```", - ...defaultArgs - ) + ...defaultArgs, + ), ).toEqual([ [ CardType.MultiLineBasic, @@ -200,8 +203,8 @@ test("Test codeblocks", () => { parse( "How do you ... Python?\n?\n" + "```\nprint('Hello World!')\n\n\nprint('Howdy?')\n\nlambda x: x[0]\n```", - ...defaultArgs - ) + ...defaultArgs, + ), ).toEqual([ [ CardType.MultiLineBasic, @@ -224,8 +227,8 @@ test("Test codeblocks", () => { "print('hello world')\n" + "~~~\n" + "````", - ...defaultArgs - ) + ...defaultArgs, + ), ).toEqual([ [ CardType.MultiLineBasic, @@ -246,13 +249,13 @@ test("Test codeblocks", () => { test("Test not parsing cards in HTML comments", () => { expect( - parse("\n-->", ...defaultArgs) + parse("\n-->", ...defaultArgs), ).toEqual([]); expect( parse( "\n\n-->", - ...defaultArgs - ) + ...defaultArgs, + ), ).toEqual([]); expect(parse("", ...defaultArgs)).toEqual([]); expect(parse("", ...defaultArgs)).toEqual([]); diff --git a/tests/unit/scheduling.test.ts b/tests/unit/scheduling.test.ts index 171cbaee..36152e3e 100644 --- a/tests/unit/scheduling.test.ts +++ b/tests/unit/scheduling.test.ts @@ -3,21 +3,21 @@ import { DEFAULT_SETTINGS } from "src/settings"; test("Test reviewing with default settings", () => { expect( - schedule(ReviewResponse.Easy, 1, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, {}) + schedule(ReviewResponse.Easy, 1, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, {}), ).toEqual({ ease: DEFAULT_SETTINGS.baseEase + 20, interval: 4, }); expect( - schedule(ReviewResponse.Good, 1, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, {}) + schedule(ReviewResponse.Good, 1, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, {}), ).toEqual({ ease: DEFAULT_SETTINGS.baseEase, interval: 3, }); expect( - schedule(ReviewResponse.Hard, 1, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, {}) + schedule(ReviewResponse.Hard, 1, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, {}), ).toEqual({ ease: DEFAULT_SETTINGS.baseEase - 20, interval: 1, @@ -27,21 +27,21 @@ test("Test reviewing with default settings", () => { test("Test reviewing with default settings & delay", () => { const delay = 2 * 24 * 3600 * 1000; // two day delay expect( - schedule(ReviewResponse.Easy, 10, DEFAULT_SETTINGS.baseEase, delay, DEFAULT_SETTINGS, {}) + schedule(ReviewResponse.Easy, 10, DEFAULT_SETTINGS.baseEase, delay, DEFAULT_SETTINGS, {}), ).toEqual({ ease: DEFAULT_SETTINGS.baseEase + 20, interval: 42, }); expect( - schedule(ReviewResponse.Good, 10, DEFAULT_SETTINGS.baseEase, delay, DEFAULT_SETTINGS, {}) + schedule(ReviewResponse.Good, 10, DEFAULT_SETTINGS.baseEase, delay, DEFAULT_SETTINGS, {}), ).toEqual({ ease: DEFAULT_SETTINGS.baseEase, interval: 28, }); expect( - schedule(ReviewResponse.Hard, 10, DEFAULT_SETTINGS.baseEase, delay, DEFAULT_SETTINGS, {}) + schedule(ReviewResponse.Hard, 10, DEFAULT_SETTINGS.baseEase, delay, DEFAULT_SETTINGS, {}), ).toEqual({ ease: DEFAULT_SETTINGS.baseEase - 20, interval: 5, @@ -56,7 +56,7 @@ test("Test load balancing, small interval (load balancing disabled)", () => { 3: 4, }; expect( - schedule(ReviewResponse.Good, 1, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, dueDates) + schedule(ReviewResponse.Good, 1, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, dueDates), ).toEqual({ ease: DEFAULT_SETTINGS.baseEase, interval: 3, @@ -75,7 +75,7 @@ test("Test load balancing", () => { 5: 2, }; expect( - schedule(ReviewResponse.Good, 2, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, dueDates) + schedule(ReviewResponse.Good, 2, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, dueDates), ).toEqual({ ease: DEFAULT_SETTINGS.baseEase, interval: 4, @@ -90,7 +90,7 @@ test("Test load balancing", () => { 25: 2, }; expect( - schedule(ReviewResponse.Good, 10, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, dueDates) + schedule(ReviewResponse.Good, 10, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, dueDates), ).toEqual({ ease: DEFAULT_SETTINGS.baseEase, interval: 24, @@ -114,7 +114,7 @@ test("Test load balancing", () => { 67: 10, }; expect( - schedule(ReviewResponse.Good, 25, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, dueDates) + schedule(ReviewResponse.Good, 25, DEFAULT_SETTINGS.baseEase, 0, DEFAULT_SETTINGS, dueDates), ).toEqual({ ease: DEFAULT_SETTINGS.baseEase, interval: 66, From 972a77cf51e63f1c87c78bcc2388a2d80b641c48 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 14 Aug 2023 16:43:56 +0800 Subject: [PATCH 039/155] trailingComma: all --- .prettierrc.json | 2 +- src/algorithms/anki.ts | 16 +++++----- src/algorithms/fsrs.ts | 10 +++--- src/algorithms/scheduling_default.ts | 18 +++++------ src/commands.ts | 2 +- src/data.ts | 40 +++++++++++------------ src/flashcard-modal-algo.tsx | 48 ++++++++++++++-------------- src/flashcard-modal.tsx | 2 +- src/main.ts | 28 ++++++++-------- src/modals/reviewresponse-modal.tsx | 18 +++++------ src/settings.ts | 12 +++---- src/sidebar.ts | 4 +-- 12 files changed, 100 insertions(+), 100 deletions(-) diff --git a/.prettierrc.json b/.prettierrc.json index d1054439..3bc4c033 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -2,5 +2,5 @@ "printWidth": 100, "tabWidth": 4, "semi": true, - "trailingComma": "es5" + "trailingComma": "all" } diff --git a/src/algorithms/anki.ts b/src/algorithms/anki.ts index f3ce476b..5a4b6c7a 100644 --- a/src/algorithms/anki.ts +++ b/src/algorithms/anki.ts @@ -138,7 +138,7 @@ export class AnkiAlgorithm extends SrsAlgorithm { this.settings.startingEase = ease; update(this.settings); - }) + }), ); new Setting(containerEl) @@ -158,13 +158,13 @@ export class AnkiAlgorithm extends SrsAlgorithm { this.settings.easyBonus = bonus; update(this.settings); - }) + }), ); new Setting(containerEl) .setName("Lapse Interval Modifier") .setDesc( - "A factor to modify the review interval with when an item is reviewed as wrong." + "A factor to modify the review interval with when an item is reviewed as wrong.", ) .addText((text) => text @@ -180,13 +180,13 @@ export class AnkiAlgorithm extends SrsAlgorithm { this.settings.lapseInterval = lapse; update(this.settings); - }) + }), ); new Setting(containerEl) .setName("Graduating Interval") .setDesc( - "The interval (in days) to the next review after reviewing a new item as 'Good'." + "The interval (in days) to the next review after reviewing a new item as 'Good'.", ) .addText((text) => text @@ -202,13 +202,13 @@ export class AnkiAlgorithm extends SrsAlgorithm { this.settings.graduatingInterval = interval; update(this.settings); - }) + }), ); new Setting(containerEl) .setName("Easy Interval") .setDesc( - "The interval (in days) to the next review after reviewing a new item as 'Easy'." + "The interval (in days) to the next review after reviewing a new item as 'Easy'.", ) .addText((text) => text @@ -224,7 +224,7 @@ export class AnkiAlgorithm extends SrsAlgorithm { this.settings.easyInterval = interval; update(this.settings); - }) + }), ); } } diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index 632d454a..2addf822 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -185,7 +185,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { if ( !this.settings.revlog_tags.some( (tag: string) => - item.deckName === tag || item.deckName.startsWith(tag + "/") + item.deckName === tag || item.deckName.startsWith(tag + "/"), ) ) { return; @@ -265,7 +265,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { update(this.settings); // await this.plugin.savePluginData(); }); - }) + }), ); new Setting(containerEl) @@ -280,7 +280,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { this.settings.request_retention = this.fsrs.p.request_retention = value / 100; update(this.settings); - }) + }), ) .addExtraButton((button) => { button @@ -316,7 +316,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { new Notice(t("VALID_NUMBER_WARNING")); } }); - }) + }), ) .addExtraButton((button) => { button @@ -351,7 +351,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { new Notice(t("VALID_NUMBER_WARNING")); text.setValue(this.settings.w.toString()); }); - }) + }), ) .addExtraButton((button) => { button diff --git a/src/algorithms/scheduling_default.ts b/src/algorithms/scheduling_default.ts index ad829029..debe6872 100644 --- a/src/algorithms/scheduling_default.ts +++ b/src/algorithms/scheduling_default.ts @@ -36,7 +36,7 @@ export function schedule( ease: number, delayBeforeReview: number, settingsObj: SRSettings, - dueDates?: Record + dueDates?: Record, ): Record { delayBeforeReview = Math.max(0, Math.floor(delayBeforeReview / (24 * 3600 * 1000))); @@ -50,7 +50,7 @@ export function schedule( ease = Math.max(130, ease - 20); interval = Math.max( 1, - (interval + delayBeforeReview / 4) * settingsObj.lapsesIntervalChange + (interval + delayBeforeReview / 4) * settingsObj.lapsesIntervalChange, ); } @@ -135,7 +135,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { dataCopy.ease * 100, delayBeforeReview, this.settings, - dueDates + dueDates, ); const nextInterval = schedObj.interval; intvls.push(nextInterval); @@ -166,7 +166,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { data.ease * 100, delayBeforeReview, this.settings, - this.plugin.dueDatesNotes + this.plugin.dueDatesNotes, ); const nextReview = schedObj.interval; @@ -216,7 +216,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { new Notice(t("VALID_NUMBER_WARNING")); } }); - }) + }), ) .addExtraButton((button) => { button @@ -240,7 +240,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { .onChange(async (value: number) => { this.settings.lapsesIntervalChange = value / 100; update(this.settings); - }) + }), ) .addExtraButton((button) => { button @@ -273,7 +273,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { new Notice(t("VALID_NUMBER_WARNING")); } }); - }) + }), ) .addExtraButton((button) => { button @@ -306,7 +306,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { new Notice(t("VALID_NUMBER_WARNING")); } }); - }) + }), ) .addExtraButton((button) => { button @@ -330,7 +330,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { .onChange(async (value: number) => { this.settings.maxLinkFactor = value / 100; update(this.settings); - }) + }), ) .addExtraButton((button) => { button diff --git a/src/commands.ts b/src/commands.ts index 494beeba..ad0d130f 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -98,7 +98,7 @@ export default class Commands { const item = plugin.store.data.items[fid]; plugin.reviewNoteFloatBar.algoDisplay( true, - plugin.algorithm.calcAllOptsIntervals(item) + plugin.algorithm.calcAllOptsIntervals(item), ); // plugin.reviewNoteFloatBar.algoDisplay(true, plugin.store.calcReviewInterval(fid)); } diff --git a/src/data.ts b/src/data.ts index 3291a3af..e110715d 100644 --- a/src/data.ts +++ b/src/data.ts @@ -268,7 +268,7 @@ export class DataStore { new Notice("Unable to delete old data file, please delete it manually."); console.log(e); return true; - } + }, ); } catch (e) { new Notice("Unable to move data file!"); @@ -292,7 +292,7 @@ export class DataStore { console.log("Reading tracked files..."); this.data = Object.assign( Object.assign({}, DEFAULT_SRS_DATA), - JSON.parse(data) + JSON.parse(data), ); } } else { @@ -739,7 +739,7 @@ export class DataStore { trackFile( path: string, type?: RPITEMTYPE | string, - notice?: boolean + notice?: boolean, ): { added: number; removed: number } | null { const trackedFile: TrackedFile = { path: path, @@ -829,7 +829,7 @@ export class DataStore { // it's taged file, can't untrack by this. console.log(path + " is taged file, can't untrack by this."); new Notice( - "it is taged file, can't untrack by this. You can delete the #review tag in note file." + "it is taged file, can't untrack by this. You can delete the #review tag in note file.", ); return; } @@ -878,7 +878,7 @@ export class DataStore { path: string, type?: RPITEMTYPE, dname?: string, - notice?: boolean + notice?: boolean, ): { added: number; removed: number } | null { if (notice == null) notice = true; if (type == null) type = RPITEMTYPE.NOTE; @@ -945,7 +945,7 @@ export class DataStore { cardinfo: CardInfo, count: number, deckName: string = this.getDefaultDackName(), - notice?: boolean + notice?: boolean, ): { added: number; removed: number } | null { if (notice == null) notice = false; const len = cardinfo.itemIds.length; @@ -1020,7 +1020,7 @@ export class DataStore { added + " new card items, removed " + removed + - " card items." + " card items.", ); if (notice) { new Notice( @@ -1031,7 +1031,7 @@ export class DataStore { added + " new card items, removed " + removed + - " card items." + " card items.", ); } return { added, removed }; @@ -1175,7 +1175,7 @@ export class DataStore { } }); } - }) + }), ); this.data.lastQueue = now.getTime(); @@ -1184,14 +1184,14 @@ export class DataStore { // } console.log( - "Added " + (oldAdd + newAdd) + " notes to review queue, with " + newAdd + " new!" + "Added " + (oldAdd + newAdd) + " notes to review queue, with " + newAdd + " new!", ); console.log( "Added " + (oldAdd_card + newAdd_card) + " cards to review queue, with " + newAdd_card + - " new!" + " new!", ); if (untrackedFiles > 0) { @@ -1200,7 +1200,7 @@ export class DataStore { untrackedFiles + " files with a total of " + removedItems + - " items while building queue!" + " items while building queue!", ); } } @@ -1380,7 +1380,7 @@ export class DataStore { removedNulltFiles + " nullTrackedfile(s), removed " + removedNullItems + - " nullitem(s)." + " nullitem(s).", ); return; } @@ -1417,7 +1417,7 @@ export class DataStore { for (const tag of trackedFile.tags) { if ( this.plugin.data.settings.tagsToReview.some( - (tagToReview) => tag === tagToReview || tag.startsWith(tagToReview + "/") + (tagToReview) => tag === tagToReview || tag.startsWith(tagToReview + "/"), ) ) { shouldIgnore = true; @@ -1675,7 +1675,7 @@ export class DataStore { settings.multilineReversedCardSeparator, settings.convertHighlightsToClozes, settings.convertBoldTextToClozes, - settings.convertCurlyBracketsToClozes + settings.convertCurlyBracketsToClozes, ); for (const parsedCard of parsedCards) { @@ -1741,7 +1741,7 @@ export class DataStore { const tags = getAllTags(fileCachedData) || []; if ( this.plugin.data.settings.noteFoldersToIgnore.some((folder) => - note.path.startsWith(folder) + note.path.startsWith(folder), ) ) { return false; @@ -1777,7 +1777,7 @@ export class DataStore { let isTaged = false; if ( this.plugin.data.settings.tagsToReview.some( - (tagToReview) => deckName === tagToReview || deckName.startsWith(tagToReview + "/") + (tagToReview) => deckName === tagToReview || deckName.startsWith(tagToReview + "/"), ) ) { isTaged = true; @@ -1790,7 +1790,7 @@ export class DataStore { if ( this.plugin.data.settings.flashcardTags.some( (flashcardTag) => - deckName === flashcardTag || deckName.startsWith(flashcardTag + "/") + deckName === flashcardTag || deckName.startsWith(flashcardTag + "/"), ) ) { isTaged = true; @@ -1802,7 +1802,7 @@ export class DataStore { for (const tag of tags) { if ( this.plugin.data.settings.tagsToReview.some( - (tagToReview) => tag === tagToReview || tag.startsWith(tagToReview + "/") + (tagToReview) => tag === tagToReview || tag.startsWith(tagToReview + "/"), ) ) { return tag; @@ -1826,7 +1826,7 @@ export class DataStore { lineNo: number, cardTextHash: string, count: number, - scheduling?: RegExpMatchArray[] + scheduling?: RegExpMatchArray[], ): RegExpMatchArray[] | null { if (scheduling == null) { scheduling = []; diff --git a/src/flashcard-modal-algo.tsx b/src/flashcard-modal-algo.tsx index cbbaa59e..c14e872c 100644 --- a/src/flashcard-modal-algo.tsx +++ b/src/flashcard-modal-algo.tsx @@ -82,7 +82,7 @@ export class FlashcardEditModal extends Modal { private createButton( container: HTMLElement, text: string, - callback: (evt: MouseEvent) => void + callback: (evt: MouseEvent) => void, ) { const btn = new ButtonComponent(container); btn.setButtonText(text).onClick(callback); @@ -95,7 +95,7 @@ export class FlashcardEditModal extends Modal { this.createButton( buttonBarContainer, t("SAVE"), - this.submitClickCallback + this.submitClickCallback, ).setCta().buttonEl.style.marginRight = "0"; this.createButton(buttonBarContainer, t("CANCEL"), this.cancelClickCallback); } @@ -245,7 +245,7 @@ export class FlashcardModal extends Modal { decksList(): void { const aimDeck = this.plugin.deckTree.subdecks.filter( - (deck) => deck.deckName === this.plugin.data.historyDeck + (deck) => deck.deckName === this.plugin.data.historyDeck, ); if (this.plugin.data.historyDeck && aimDeck.length > 0) { const deck = aimDeck[0]; @@ -408,7 +408,7 @@ export class FlashcardModal extends Modal { } this.responseDiv.setAttribute( "style", - `grid-template-columns: ${"1fr ".repeat(btnCols - 1)}` + `grid-template-columns: ${"1fr ".repeat(btnCols - 1)}`, ); this.options.slice(1).forEach((opt, ind) => { @@ -416,7 +416,7 @@ export class FlashcardModal extends Modal { this.responseBtns.push(document.createElement("button")); this.responseBtns[tindex].setAttribute( "id", - "sr-" + this.options[tindex].toLowerCase() + "-btn" + "sr-" + this.options[tindex].toLowerCase() + "-btn", ); this.responseBtns[tindex].setAttribute("class", "ResponseFloatBarCommandItem"); this.responseBtns[tindex].setText(this.plugin.data.settings.flashcardHardText); @@ -486,7 +486,7 @@ export class FlashcardModal extends Modal { if (opt == this.options[this.options.length - 1]) { this.currentDeck.deleteFlashcardAtIndex( this.currentCardIdx, - this.currentCard.isDue + this.currentCard.isDue, ); } this.currentDeck.nextCard(this); @@ -511,14 +511,14 @@ export class FlashcardModal extends Modal { this.currentCard.ease, this.currentCard.delayBeforeReview, this.plugin.data.settings, - this.plugin.dueDatesFlashcards + this.plugin.dueDatesFlashcards, ); } else { let initial_ease: number = this.plugin.data.settings.baseEase; if ( Object.prototype.hasOwnProperty.call( this.plugin.easeByPath, - this.currentCard.note.path + this.currentCard.note.path, ) ) { initial_ease = Math.round(this.plugin.easeByPath[this.currentCard.note.path]); @@ -533,7 +533,7 @@ export class FlashcardModal extends Modal { initial_ease, 0, this.plugin.data.settings, - this.plugin.dueDatesFlashcards + this.plugin.dueDatesFlashcards, ); } @@ -649,12 +649,12 @@ export class FlashcardModal extends Modal { if (dueIdx !== -1) { this.currentDeck.deleteFlashcardAtIndex( dueIdx, - this.currentDeck.dueFlashcards[dueIdx].isDue + this.currentDeck.dueFlashcards[dueIdx].isDue, ); } else if (newIdx !== -1) { this.currentDeck.deleteFlashcardAtIndex( newIdx, - this.currentDeck.newFlashcards[newIdx].isDue + this.currentDeck.newFlashcards[newIdx].isDue, ); } } @@ -671,7 +671,7 @@ export class FlashcardModal extends Modal { async renderMarkdownWrapper( markdownString: string, containerEl: HTMLElement, - recursiveDepth = 0 + recursiveDepth = 0, ): Promise { if (recursiveDepth > 4) return; @@ -679,7 +679,7 @@ export class FlashcardModal extends Modal { markdownString, containerEl, this.currentCard.note.path, - this.plugin + this.plugin, ); containerEl.findAll(".internal-embed").forEach((el) => { @@ -706,7 +706,7 @@ export class FlashcardModal extends Modal { const file = matched.groups.file || this.currentCard.note.path; const target = this.plugin.app.metadataCache.getFirstLinkpathDest( file, - this.currentCard.note.path + this.currentCard.note.path, ); return { text: matched[0], @@ -738,9 +738,9 @@ export class FlashcardModal extends Modal { ((ev.target as HTMLElement).style.minWidth = (ev.target as HTMLElement).style.minWidth === "100%" ? null - : "100%") + : "100%"), ); - } + }, ); el.addClasses(["image-embed", "is-loaded"]); } else if ( @@ -757,7 +757,7 @@ export class FlashcardModal extends Modal { }, (audio) => { if (el.hasAttribute("alt")) audio.setAttribute("alt", el.getAttribute("alt")); - } + }, ); el.addClasses(["media-embed", "is-loaded"]); } else { @@ -774,7 +774,7 @@ export class FlashcardModal extends Modal { blockId: string; target: TFile; }, - recursiveDepth: number + recursiveDepth: number, ) { const cache = this.app.metadataCache.getCache(link.target.path); const text = await this.app.vault.cachedRead(link.target); @@ -782,7 +782,7 @@ export class FlashcardModal extends Modal { if (link.heading) { const clean = (s: string) => s.replace(/[\W\s]/g, ""); const headingIndex = cache.headings?.findIndex( - (h) => clean(h.heading) === clean(link.heading) + (h) => clean(h.heading) === clean(link.heading), ); const heading = cache.headings[headingIndex]; @@ -923,7 +923,7 @@ export class Deck { const deckView: HTMLElement = containerEl.createDiv("tree-item"); const deckViewSelf: HTMLElement = deckView.createDiv( - "tree-item-self tag-pane-tag is-clickable" + "tree-item-self tag-pane-tag is-clickable", ); const shouldBeInitiallyExpanded: boolean = modal.plugin.data.settings.initiallyExpandAllSubdecksInTree; @@ -1015,7 +1015,7 @@ export class Deck { modal.responseDiv.style.display = "none"; modal.resetButton.disabled = true; modal.titleEl.setText( - `${this.deckName}: ${this.dueFlashcardsCount + this.newFlashcardsCount}` + `${this.deckName}: ${this.dueFlashcardsCount + this.newFlashcardsCount}`, ); modal.answerBtn.style.display = "initial"; @@ -1061,7 +1061,7 @@ export class Deck { if ( Object.prototype.hasOwnProperty.call( modal.plugin.easeByPath, - modal.currentCard.note.path + modal.currentCard.note.path, ) ) { ease = modal.plugin.easeByPath[modal.currentCard.note.path]; @@ -1089,7 +1089,7 @@ export class Deck { } else if (Platform.isMobile) { for (let i = 1; i < modal.responseBtns.length; i++) { modal.responseBtns[i].setText( - textInterval(Math.round(intervals[i] * 100) / 100, true) + textInterval(Math.round(intervals[i] * 100) / 100, true), ); } // modal.hardBtn.setText(textInterval(hardInterval, true)); @@ -1098,7 +1098,7 @@ export class Deck { } else { for (let i = 1; i < modal.responseBtns.length; i++) { modal.responseBtns[i].setText( - `${btnTexts[i]} - ${textInterval(Math.round(intervals[i] * 100) / 100, false)}` + `${btnTexts[i]} - ${textInterval(Math.round(intervals[i] * 100) / 100, false)}`, ); } /* modal.hardBtn.setText( diff --git a/src/flashcard-modal.tsx b/src/flashcard-modal.tsx index f4e4d285..df65fc29 100644 --- a/src/flashcard-modal.tsx +++ b/src/flashcard-modal.tsx @@ -563,7 +563,7 @@ export class FlashcardModal extends Modal { store.setSchedbyId( cardinfo.itemIds[this.currentCard.siblingIdx], [0, due.valueOf(), interval, ease], - correct + correct, ); } diff --git a/src/main.ts b/src/main.ts index 356dfb81..0937f82c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -101,7 +101,7 @@ export default class SRPlugin extends Plugin { this.algorithm = algorithms[this.data.settings.algorithm]; this.algorithm.updateSettings( this, - this.data.settings.algorithmSettings[this.data.settings.algorithm] + this.data.settings.algorithmSettings[this.data.settings.algorithm], ); this.store.buildQueue(); @@ -118,7 +118,7 @@ export default class SRPlugin extends Plugin { if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { // save tracked_files.json this.registerInterval( - window.setInterval(() => (this.sync(), this.store.save()), 5 * 60 * 1000) + window.setInterval(() => (this.sync(), this.store.save()), 5 * 60 * 1000), ); } @@ -215,7 +215,7 @@ export default class SRPlugin extends Plugin { }); } } - }) + }), ); } @@ -384,7 +384,7 @@ export default class SRPlugin extends Plugin { if ( this.data.settings.noteFoldersToIgnore.some((folder) => // note.path.startsWith(folder) - note.path.contains(folder) + note.path.contains(folder), ) ) { continue; @@ -586,7 +586,7 @@ export default class SRPlugin extends Plugin { if ( this.data.settings.tagsToReview.some( (tagToReview) => - tag === (matchedNoteTag = tagToReview) || tag.startsWith(tagToReview + "/") + tag === (matchedNoteTag = tagToReview) || tag.startsWith(tagToReview + "/"), ) ) { shouldIgnore = false; @@ -765,7 +765,7 @@ export default class SRPlugin extends Plugin { if ( this.data.settings.tagsToReview.some( (tagToReview) => - tag === (matchedNoteTag = tagToReview) || tag.startsWith(tagToReview + "/") + tag === (matchedNoteTag = tagToReview) || tag.startsWith(tagToReview + "/"), ) ) { shouldIgnore = false; @@ -893,7 +893,7 @@ export default class SRPlugin extends Plugin { ) { console.debug( "interval diff:should be - (", - this.shortestInterval - item.nextReview + this.shortestInterval - item.nextReview, ); this.shortestInterval = item.nextReview; } @@ -991,7 +991,7 @@ export default class SRPlugin extends Plugin { t("STATUS_BAR", { dueNotesCount: this.dueNotesCount_real, dueFlashcardsCount: this.deckTree.dueFlashcardsCount, - }) + }), ); this.reviewNoteFloatBar.selfDestruct(); @@ -1215,7 +1215,7 @@ export default class SRPlugin extends Plugin { lineNo, cardTextHash, siblingMatches.length, - scheduling + scheduling, ); } const context: string = settings.showContextInCards @@ -1360,7 +1360,7 @@ export default class SRPlugin extends Plugin { if (schedulingInfo[1].length || schedulingInfo[5].length) { fileText = fileText.replace( SCHEDULING_INFO_REGEX, - `---\n${schedulingInfo[1]}` + `${schedulingInfo[5]}---` + `---\n${schedulingInfo[1]}` + `${schedulingInfo[5]}---`, ); } else { fileText = fileText.replace(SCHEDULING_INFO_REGEX, ""); @@ -1398,7 +1398,7 @@ export default class SRPlugin extends Plugin { t("STATUS_BAR", { dueNotesCount: this.dueNotesCount_real, dueFlashcardsCount: this.deckTree.dueFlashcardsCount, - }) + }), ); } @@ -1527,13 +1527,13 @@ export default class SRPlugin extends Plugin { this.registerEvent( this.app.vault.on("rename", (file, old) => { this.store.renameTrackedFile(old, file.path); - }) + }), ); this.registerEvent( this.app.vault.on("delete", (file) => { this.store.untrackFile(file.path); - }) + }), ); this.registerEvent( @@ -1553,7 +1553,7 @@ export default class SRPlugin extends Plugin { } } } - }) + }), ); } } diff --git a/src/modals/reviewresponse-modal.tsx b/src/modals/reviewresponse-modal.tsx index 3955ddd1..dad815ec 100644 --- a/src/modals/reviewresponse-modal.tsx +++ b/src/modals/reviewresponse-modal.tsx @@ -87,7 +87,7 @@ export class reviewNoteResponseModal { showIntvlBtn.setAttribute("class", "ResponseFloatBarCommandItem"); showIntvlBtn.setAttribute( "aria-label", - "时间间隔显隐,\n建议:复习类不显示,渐进总结/增量写作显示" + "时间间隔显隐,\n建议:复习类不显示,渐进总结/增量写作显示", ); // showIntvlBtn.setText("Show"); setIcon(showIntvlBtn, "alarm-clock"); @@ -158,7 +158,7 @@ export class reviewNoteResponseModal { ? textInterval(Number.parseFloat(responseInterval[index].toFixed(5)), true) : `${text} - ${textInterval( Number.parseFloat(responseInterval[index].toFixed(5)), - false + false, )}`; } return text; @@ -179,7 +179,7 @@ export class reviewNoteResponseModal { ? textInterval(responseInterval[1], true) : `${settings.flashcardHardText} - ${textInterval( responseInterval[1], - false + false, )}`, icon: "bold-glyph", }, @@ -194,7 +194,7 @@ export class reviewNoteResponseModal { ? textInterval(responseInterval[2], true) : `${settings.flashcardGoodText} - ${textInterval( responseInterval[2], - false + false, )}`, icon: "remix-GobletLine", }, @@ -209,7 +209,7 @@ export class reviewNoteResponseModal { ? textInterval(responseInterval[3], true) : `${settings.flashcardEasyText} - ${textInterval( responseInterval[3], - false + false, )}`, icon: "remix-EmotionHappyLine", }, @@ -220,7 +220,7 @@ export class reviewNoteResponseModal { if (bar.containerEl) { bar.containerEl.setAttribute( "style", - `grid-template-columns: ${"1fr ".repeat(menuCommands.length + 1)}` + `grid-template-columns: ${"1fr ".repeat(menuCommands.length + 1)}`, ); /* //left: ${0}%; bottom: ${ 4.25 @@ -268,7 +268,7 @@ export class reviewNoteResponseModal { //after review const timmer = setInterval(() => { const reviewNoteResponseModalBar = document.getElementById( - "reviewNoteResponseModalBar" + "reviewNoteResponseModalBar", ); const Markdown = app.workspace.getActiveViewOfType(MarkdownView); if (reviewNoteResponseModalBar) { @@ -287,14 +287,14 @@ export class reviewNoteResponseModal { if (responseInterval != null) { menuCommands.forEach((item) => { const btn = document.getElementById( - "sr-" + item.name.toLowerCase() + "-btn" + "sr-" + item.name.toLowerCase() + "-btn", ); btn.setText(item.text); }); } else { menuCommands.forEach((item) => { const btn = document.getElementById( - "sr-" + item.name.toLowerCase() + "-btn" + "sr-" + item.name.toLowerCase() + "-btn", ); btn.setText(item.name); }); diff --git a/src/settings.ts b/src/settings.ts index 1d2596f6..14e986da 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -640,7 +640,7 @@ export class SRSettingTab extends PluginSettingTab { plugin.store.moveStoreLocation(); await plugin.savePluginData(); this.display(); - }) + }), ); } @@ -669,7 +669,7 @@ export class SRSettingTab extends PluginSettingTab { plugin.data.settings.maxNewPerDay = newPerDay; plugin.savePluginData(); - }) + }), ); } @@ -704,7 +704,7 @@ export class SRSettingTab extends PluginSettingTab { if (confirmed) { const result = this.algorithmSwitchData( oldAlgo, - newValue as algorithmNames + newValue as algorithmNames, ); if (!result) { dropdown.setValue(plugin.data.settings.algorithm); @@ -717,7 +717,7 @@ export class SRSettingTab extends PluginSettingTab { plugin, plugin.data.settings.algorithmSettings[ plugin.data.settings.algorithm - ] + ], ); plugin.savePluginData(); // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -836,7 +836,7 @@ export class SRSettingTab extends PluginSettingTab { btnText[algo][ind] = value; await this.plugin.savePluginData(); }); - }) + }), ); btnTextEl.addExtraButton((button) => { button @@ -873,7 +873,7 @@ export class SRSettingTab extends PluginSettingTab { const data = item.data as AnkiData; const due = new Date(item.nextReview); const lastview = new Date( - item.nextReview - data.lastInterval * DateUtils.DAYS_TO_MILLIS + item.nextReview - data.lastInterval * DateUtils.DAYS_TO_MILLIS, ); const reps = item.timesReviewed; const card = algorithms[algorithmNames.Fsrs].defaultData(); diff --git a/src/sidebar.ts b/src/sidebar.ts index 218da595..266920dc 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -129,7 +129,7 @@ export class ReviewQueueListView extends ItemView { folderTitle, !deck.activeFolders.has(folderTitle), deckCollapsed, - deck + deck, ); schedFolderElDict[folderTitle] = schedFolderEl; } else { @@ -240,7 +240,7 @@ export class ReviewQueueListView extends ItemView { const item = plugin.store.data.items[fid]; plugin.reviewNoteFloatBar.algoDisplay( true, - plugin.algorithm.calcAllOptsIntervals(item) + plugin.algorithm.calcAllOptsIntervals(item), ); return false; From 96f31a85b61071377c69b6941c4eb427454ffa67 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 14 Aug 2023 19:43:44 +0800 Subject: [PATCH 040/155] ShowReleaseNotes --- esbuild.config.mjs | 1 + src/main.ts | 9 ++- src/modals/ReleaseNotes.ts | 129 +++++++++++++++++++++++++++++++++++++ src/settings.ts | 3 + src/utils_recall.ts | 30 +++++++++ 5 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 src/modals/ReleaseNotes.ts diff --git a/esbuild.config.mjs b/esbuild.config.mjs index e6a61453..51be70c3 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -6,6 +6,7 @@ const prod = process.argv[2] === "production"; const context = await esbuild.context({ entryPoints: ["src/main.ts"], + loader: {".md":"text"}, bundle: true, external: ["obsidian", "electron", ...builtins], format: "cjs", diff --git a/src/main.ts b/src/main.ts index 0937f82c..8d69c731 100644 --- a/src/main.ts +++ b/src/main.ts @@ -33,7 +33,8 @@ import Commands from "./commands"; import SrsAlgorithm from "./algorithms"; import { algorithms } from "src/settings"; import { reviewNoteResponseModal } from "./modals/reviewresponse-modal"; -import { DateUtils } from "./utils_recall"; +import { DateUtils, isVersionNewerThanOther } from "./utils_recall"; +import { ReleaseNotes } from "./modals/ReleaseNotes"; interface PluginData { settings: SRSettings; @@ -98,6 +99,12 @@ export default class SRPlugin extends Plugin { appIcon(); + const PLUGIN_VERSION = this.manifest.version; + const obsidianJustInstalled = this.data.settings.previousRelease === "0.0.0"; + if (isVersionNewerThanOther(PLUGIN_VERSION, this.data.settings.previousRelease)) { + new ReleaseNotes(this.app, this, obsidianJustInstalled ? null : PLUGIN_VERSION).open(); + } + this.algorithm = algorithms[this.data.settings.algorithm]; this.algorithm.updateSettings( this, diff --git a/src/modals/ReleaseNotes.ts b/src/modals/ReleaseNotes.ts new file mode 100644 index 00000000..d006e8d7 --- /dev/null +++ b/src/modals/ReleaseNotes.ts @@ -0,0 +1,129 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { App, MarkdownRenderer, Modal, Notice, moment, request } from "obsidian"; +import { errorlog, isVersionNewerThanOther } from "src/utils_recall"; +import ExcalidrawPlugin from "../main"; +import README from "README.md"; +import README_ZH from "docs/README_ZH.md"; +import RELEASE_changelog from "CHANGELOG.md"; + +// const fmd = fs.readFileSync("CHANGELOG.md", "utf8"); +console.debug(README); +console.debug(RELEASE_changelog); + +const local = moment.locale(); +let README_LOC = README; +let readme: string[]; +let readme_tks: string[]; +if (local === "zh-cn" || local === "zh-tw") { + README_LOC = README_ZH; + readme = README_LOC.match(/^(.|\n)*(?=\n## 下载)/gm); + readme_tks = README_LOC.match(/^(## Thanks(?:.|\n)*)$/gm); +} else { + readme = README_LOC.match(/^(.|\n)*(?=\n## How)/gm); + readme_tks = README_LOC.match(/^(## Thanks(?:.|\n)*)$/gm); +} +const latestRelease = RELEASE_changelog.match(/## \[(?:.|\n)*?(?=\n## \[)/gm); +let PLUGIN_VERSION: string; + +// https://github.com/zsviczian/obsidian-excalidraw-plugin/blob/master/src/dialogs/ReleaseNotes.ts +export class ReleaseNotes extends Modal { + private plugin: ExcalidrawPlugin; + private version: string; + // contentEl: any; + + constructor(app: App, plugin: ExcalidrawPlugin, version: string) { + super(app); + this.plugin = plugin; + this.version = version; + PLUGIN_VERSION = plugin.manifest.version; + } + + onOpen(): void { + this.containerEl.classList.add("间隔重复-release"); + this.titleEl.setText(`Welcome to 间隔重复 ${this.version ?? ""}`); + this.createForm(); + } + + async onClose() { + this.contentEl.empty(); + this.plugin.data.settings.previousRelease = PLUGIN_VERSION; + await this.plugin.savePluginData(); + } + + async createForm() { + const FIRST_RUN = [readme[0], readme_tks[0]].join("\n\n---\n"); + const release_note = await this.getReleaseNote(); + const notes: string[] = []; + if (release_note == null) { + notes.push(...FIRST_RUN, latestRelease[0]); + } else { + release_note.slice(0, 9).forEach((el: { release_note: any }) => { + notes.push(el.release_note); + }); + } + let prevRelease = this.plugin.data.settings.previousRelease; + prevRelease = this.version === prevRelease ? "0.0.0" : prevRelease; + // const message = this.version ? notes.join("\n\n---\n") : FIRST_RUN; + let message = this.version + ? Object.values(latestRelease) + .filter((value: string) => { + const ver = value.match(/(?:##\s+\[)([\d\w.]{6,})(?:\s|\])/m)[0]; + return isVersionNewerThanOther(ver,prevRelease); + }) + // .map((key: string) => `${key==="Intro" ? "" : `# ${key}\n`}${RELEASE_NOTES[key]}`) + .slice(0, 10) + .join("\n\n---\n") + : FIRST_RUN; + message = this.version? FIRST_RUN + message: message; + await MarkdownRenderer.renderMarkdown(message, this.contentEl, "", this.plugin); + + this.contentEl.createEl("p", { text: "" }, (el) => { + //files manually follow one of two options: + el.style.textAlign = "right"; + const bOk = el.createEl("button", { text: "Close" }); + bOk.onclick = () => this.close(); + }); + } + + async getReleaseNote(): Promise { + const release_url = + "https://api.github.com/repos/open-spaced-repetiton/obsidian-spaced-repetition-recall/releases?per_page=5&page=1"; + const readMe_url = + "https://api.github.com/repos/open-spaced-repetiton/obsidian-spaced-repetition-recall/readme"; + + // "content": "encoding": "base64" + + let latestVersionInfo = null; + try { + const gitAPIrequest = async (url: string) => { + return JSON.parse( + await request({ + url: url, + }) + ); + }; + + latestVersionInfo = (await gitAPIrequest(release_url)) + .map((el: any) => { + return { + version: el.tag_name, + published: new Date(el.published_at), + note: el.body, + }; + }) + .filter((el: any) => el.version.match(/^\d+\.\d+\.\d+$/)) + .sort((el1: any, el2: any) => el2.published - el1.published); + + const latestVersion = latestVersionInfo[0].version; + + if (isVersionNewerThanOther(latestVersion, PLUGIN_VERSION)) { + new Notice( + `A newer version of 间隔重复 is available in BRAT Plugins.\n\nYou are using ${PLUGIN_VERSION}.\nThe latest is ${latestVersion}` + ); + } + } catch (e) { + errorlog({ where: "Utils/checkVersion", error: e }); + } + return latestVersionInfo; + } +} diff --git a/src/settings.ts b/src/settings.ts index 14e986da..57c03901 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -94,6 +94,8 @@ export interface SRSettings { algorithm: string; // eslint-disable-next-line @typescript-eslint/no-explicit-any algorithmSettings: any; + + previousRelease: string; } export const DEFAULT_SETTINGS: SRSettings = { @@ -153,6 +155,7 @@ export const DEFAULT_SETTINGS: SRSettings = { trackedNoteToDecks: false, algorithm: Object.keys(algorithms)[0], algorithmSettings: { algorithm: Object.values(algorithms)[0].settings }, + previousRelease: "0.0.0.0", }; // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/Settings.ts diff --git a/src/utils_recall.ts b/src/utils_recall.ts index 224829c1..3ac264a4 100644 --- a/src/utils_recall.ts +++ b/src/utils_recall.ts @@ -32,6 +32,7 @@ export class MiscUtils { * @param obj * @param source */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any static assignOnly(obj: any, source: any): any { const newObj = Object.assign(obj); if (source != undefined) { @@ -51,6 +52,7 @@ export class MiscUtils { * @param obj * @param source */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any static assignObjFully(obj: any, source: any): any { const newObj = Object.assign(obj, JSON.parse(JSON.stringify(source))); return newObj; @@ -74,6 +76,7 @@ export class MiscUtils { * * @param {any[]} array */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any static shuffle(array: any[]) { for (let i = array.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); @@ -98,3 +101,30 @@ export function isArray(value: unknown): value is T[] { } return false; } + +// https://github.com/zsviczian/obsidian-excalidraw-plugin/ +export const isVersionNewerThanOther = (version: string, otherVersion: string): boolean => { + const v = version.match(/(\d+)\.(\d+)\.(\d+?)\.?(\d+)?/); + const o = otherVersion.match(/(\d+)\.(\d+)\.(\d+?)\.?(\d+)?/); + + return Boolean( + v && + v.length >= 4 && + o && + o.length >= 4 && + !(isNaN(parseInt(v[1])) || isNaN(parseInt(v[2])) || isNaN(parseInt(v[3]))) && + !(isNaN(parseInt(o[1])) || isNaN(parseInt(o[2])) || isNaN(parseInt(o[3]))) && + (parseInt(v[1]) > parseInt(o[1]) || + (parseInt(v[1]) >= parseInt(o[1]) && parseInt(v[2]) > parseInt(o[2])) || + (parseInt(v[1]) >= parseInt(o[1]) && + parseInt(v[2]) >= parseInt(o[2]) && + parseInt(v[3]) > parseInt(o[3])) || + (v.length > 4 && o.length === 4) || + (v.length > 4 && o.length > 4 && parseInt(v[4]) > parseInt(o[4]))) + ); +}; + +// eslint-disable-next-line @typescript-eslint/ban-types +export const errorlog = (data: {}) => { + console.error({ plugin: "Spaced-rep-recall:", ...data }); +}; From 4d03ede820ee08163a6ca26bdba72e84ba991774 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:08:49 +0800 Subject: [PATCH 041/155] add releaseNotes --- .github/funding/QR_alipay.png | Bin 0 -> 70945 bytes .github/funding/QR_wechat.png | Bin 0 -> 129914 bytes README.md | 13 ++++++++++++ docs/README_ZH.md | 21 ++++++++++++++----- esbuild.config.mjs | 2 +- manifest.json | 7 +++++-- src/modals/ReleaseNotes.ts | 31 ++++++++++++++++----------- src/settings.ts | 38 ++++++++++++++++++++++++++++++++++ src/utils_recall.ts | 2 +- 9 files changed, 93 insertions(+), 21 deletions(-) create mode 100644 .github/funding/QR_alipay.png create mode 100644 .github/funding/QR_wechat.png diff --git a/.github/funding/QR_alipay.png b/.github/funding/QR_alipay.png new file mode 100644 index 0000000000000000000000000000000000000000..35277c6a7c6b207eafcd96df1c6a88e37b625115 GIT binary patch literal 70945 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

i}&+lti=Wc!12)`q=jhZ_7!J)6d^} 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ν>(cGUWq*{CdM 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 literal 0 HcmV?d00001 diff --git a/.github/funding/QR_wechat.png b/.github/funding/QR_wechat.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c9891f290ae900e198d81c7d12146ca97d67a4 GIT binary patch literal 129914 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ǘ%si{ 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index f9c90c7e..0d28aad9 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,21 @@ Check the [docs](https://www.stephenmwangi.com/obsidian-spaced-repetition/) for ## Thanks +I develop this plugin as a hobby, spending my free time doing this. If you find it valuable, then please say THANK YOU or buy me a coffee... + +
+ + +
+ +or buy original plugin author(@st3v3nmw) a coffee... +Buy Me a Coffee at ko-fi.com + +--- + Thank you to everyone who has created a plugin that inspired me and I took code from. - first, thanks to [@st3v3nmw's obsidian-spaced-repetition](https://github.com/st3v3nmw/obsidian-spaced-repetition) and [@martin-jw recall plugin](https://github.com/martin-jw/obsidian-recall) - floatbar(thanks to [@chetachi's cMenu](https://github.com/chetachiezikeuzor/cMenu-Plugin)) - [Fsrs Algorithm](https://github.com/open-spaced-repetition/fsrs.js) +- ReleaseNotes(thanks to [@Zsolt Viczian Excalidraw](https://zsolt.blog)) diff --git a/docs/README_ZH.md b/docs/README_ZH.md index e5aeb335..aa96e04a 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -1,8 +1,6 @@ 本插件是魔改自[obsidian-spaced-repetition](https://github.com/st3v3nmw/obsidian-spaced-repetition) 和 [recall plugin](https://github.com/martin-jw/obsidian-recall) 就是 SR 的复习时间信息可以单独保存,不修改原笔记文件内容,以及添加其他功能。 -# Flashcard-Based and Note-Based Spaced Repetition Plugin - ## Features - [@st3v3nmw's ReadMe](https://github.com/st3v3nmw/obsidian-spaced-repetition#readme) @@ -43,14 +41,27 @@ github: https://github.com/open-spaced-repetition/obsidian-spaced-repetition-rec 或: -1. Download main.js, manifest.json, styles.css from the latest release (see [releases](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/releases/)) -2. Create a new folder in `Vault-name/.obsidian/plugins` and put the downloaded files in there -3. Reload your plugins and enable the plugin +1. 从[最新发布](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/releases/)中下载 main.js, manifest.json, styles.css; +2. 在 `Vault-name/.obsidian/plugins` 中新建个文件夹`obsidian-spaced-repetition-recall`, 把刚下的文件放入新建的文件夹中; +3. 重启Obsidan 开启插件,就可以使用了。 ## Thanks +业余时间折腾的,如果对你有所帮助,可以请我喝瓶饮料呀~ + +
+ + +
+ +或者,请原插件作者(@st3v3nmw)喝杯咖啡 +Buy Me a Coffee at ko-fi.com + +--- + Thank you to everyone who has created a plugin that inspired me and I took code from. - first, thanks to [@st3v3nmw's obsidian-spaced-repetition](https://github.com/st3v3nmw/obsidian-spaced-repetition) and [@martin-jw recall plugin](https://github.com/martin-jw/obsidian-recall) - floatbar(thanks to [@chetachi's cMenu](https://github.com/chetachiezikeuzor/cMenu-Plugin)) - [Fsrs Algorithm](https://github.com/open-spaced-repetition/fsrs.js) +- ReleaseNotes(thanks to [@Zsolt Viczian Excalidraw](https://zsolt.blog)) diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 51be70c3..94e39065 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -6,7 +6,7 @@ const prod = process.argv[2] === "production"; const context = await esbuild.context({ entryPoints: ["src/main.ts"], - loader: {".md":"text"}, + loader: { ".md": "text", ".png": "dataurl" }, bundle: true, external: ["obsidian", "electron", ...builtins], format: "cjs", diff --git a/manifest.json b/manifest.json index bc3d2156..099e3683 100644 --- a/manifest.json +++ b/manifest.json @@ -1,11 +1,14 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.10.1.6", + "version": "1.10.1.7", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", "authorUrl": "https://github.com/Newdea", "isDesktopOnly": false, - "fundingUrl": "" + "fundingUrl": { + "支付宝Alipay": "https://github.com/Newdea/newdea/blob/main/.github/funding/QR_alipay.png", + "微信WeChat": "https://github.com/Newdea/newdea/blob/main/.github/funding/QR_wechat.png" + } } diff --git a/src/modals/ReleaseNotes.ts b/src/modals/ReleaseNotes.ts index d006e8d7..629d7f73 100644 --- a/src/modals/ReleaseNotes.ts +++ b/src/modals/ReleaseNotes.ts @@ -2,8 +2,15 @@ import { App, MarkdownRenderer, Modal, Notice, moment, request } from "obsidian"; import { errorlog, isVersionNewerThanOther } from "src/utils_recall"; import ExcalidrawPlugin from "../main"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import README from "README.md"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import README_ZH from "docs/README_ZH.md"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import RELEASE_changelog from "CHANGELOG.md"; // const fmd = fs.readFileSync("CHANGELOG.md", "utf8"); @@ -65,16 +72,16 @@ export class ReleaseNotes extends Modal { prevRelease = this.version === prevRelease ? "0.0.0" : prevRelease; // const message = this.version ? notes.join("\n\n---\n") : FIRST_RUN; let message = this.version - ? Object.values(latestRelease) - .filter((value: string) => { - const ver = value.match(/(?:##\s+\[)([\d\w.]{6,})(?:\s|\])/m)[0]; - return isVersionNewerThanOther(ver,prevRelease); - }) - // .map((key: string) => `${key==="Intro" ? "" : `# ${key}\n`}${RELEASE_NOTES[key]}`) - .slice(0, 10) - .join("\n\n---\n") - : FIRST_RUN; - message = this.version? FIRST_RUN + message: message; + ? Object.values(latestRelease) + .filter((value: string) => { + const ver = value.match(/(?:##\s+\[)([\d\w.]{6,})(?:\s|\])/m)[0]; + return isVersionNewerThanOther(ver, prevRelease); + }) + // .map((key: string) => `${key==="Intro" ? "" : `# ${key}\n`}${RELEASE_NOTES[key]}`) + .slice(0, 10) + .join("\n\n---\n") + : FIRST_RUN; + message = this.version ? FIRST_RUN + message : message; await MarkdownRenderer.renderMarkdown(message, this.contentEl, "", this.plugin); this.contentEl.createEl("p", { text: "" }, (el) => { @@ -99,7 +106,7 @@ export class ReleaseNotes extends Modal { return JSON.parse( await request({ url: url, - }) + }), ); }; @@ -118,7 +125,7 @@ export class ReleaseNotes extends Modal { if (isVersionNewerThanOther(latestVersion, PLUGIN_VERSION)) { new Notice( - `A newer version of 间隔重复 is available in BRAT Plugins.\n\nYou are using ${PLUGIN_VERSION}.\nThe latest is ${latestVersion}` + `A newer version of 间隔重复 is available in BRAT Plugins.\n\nYou are using ${PLUGIN_VERSION}.\nThe latest is ${latestVersion}`, ); } } catch (e) { diff --git a/src/settings.ts b/src/settings.ts index 57c03901..fedfbe6f 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -12,6 +12,14 @@ import ConfirmModal from "./modals/confirm"; import { FolderSuggest } from "./suggesters/FolderSuggester"; import { DateUtils } from "./utils_recall"; import deepcopy from "deepcopy"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import QR_alipay from ".github/funding/QR_alipay.png"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import QR_wechat from ".github/funding/QR_wechat.png"; + // recall trackfile export enum DataLocation { PluginFolder = "In Plugin Folder", @@ -591,6 +599,8 @@ export class SRSettingTab extends PluginSettingTab { await this.plugin.savePluginData(); }), ); + + this.buildDonation(); } addDataLocationSettings(containerEl: HTMLElement) { @@ -915,4 +925,32 @@ export class SRSettingTab extends PluginSettingTab { } return result; } + + private buildDonation(): void { + const div = this.containerEl.createEl("div"); + const hr: HTMLElement = document.createElement("hr"); + div.appendChild(hr); + div.style.width = "75%"; + div.style.textAlign = "center"; + div.style.margin = "0 auto"; + + const text = document.createElement("p"); + // text.textContent = t("COFFEE"); + text.textContent = "业余时间折腾的,如果手头宽余,可以请我喝瓶饮料呀~"; + div.appendChild(text); + + let anchor = document.createElement("a"); + const image = new Image(); + image.src = QR_alipay; + image.width = 130; + anchor.appendChild(image); + div.appendChild(anchor); + + const image2 = new Image(); + image2.src = QR_wechat; + image2.width = 130; + anchor = document.createElement("a"); + anchor.appendChild(image2); + div.appendChild(anchor); + } } diff --git a/src/utils_recall.ts b/src/utils_recall.ts index 3ac264a4..6c4018ac 100644 --- a/src/utils_recall.ts +++ b/src/utils_recall.ts @@ -120,7 +120,7 @@ export const isVersionNewerThanOther = (version: string, otherVersion: string): parseInt(v[2]) >= parseInt(o[2]) && parseInt(v[3]) > parseInt(o[3])) || (v.length > 4 && o.length === 4) || - (v.length > 4 && o.length > 4 && parseInt(v[4]) > parseInt(o[4]))) + (v.length > 4 && o.length > 4 && parseInt(v[4]) > parseInt(o[4]))), ); }; From a92a64d58f650cb2a6c6c1ce1a3d6f7edc75ecb5 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:15:03 +0800 Subject: [PATCH 042/155] setting: add issue url --- src/settings.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/settings.ts b/src/settings.ts index fedfbe6f..d3474c19 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -192,6 +192,9 @@ export class SRSettingTab extends PluginSettingTab { containerEl.createDiv().innerHTML = t("CHECK_WIKI", { wiki_url: "https://www.stephenmwangi.com/obsidian-spaced-repetition/", }); + const issue_url = + "https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues"; + containerEl.createDiv().innerHTML = `有空时可以看看 issue .`; // trackfile_setting // https://github.com/martin-jw/obsidian-recall/blob/main/src/settings.ts From 95d3a2ed5e662f6d86fa3ad6d7bfb22c22e1735e Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:16:31 +0800 Subject: [PATCH 043/155] words fix --- src/settings.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/settings.ts b/src/settings.ts index d3474c19..1e5aaf0c 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -939,7 +939,7 @@ export class SRSettingTab extends PluginSettingTab { const text = document.createElement("p"); // text.textContent = t("COFFEE"); - text.textContent = "业余时间折腾的,如果手头宽余,可以请我喝瓶饮料呀~"; + text.textContent = "业余时间折腾的,如果对你有所帮助,可以请我喝瓶饮料呀~"; div.appendChild(text); let anchor = document.createElement("a"); From c833b2a249b63afcd50c7edd6afe72359fb1c921 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:34:01 +0800 Subject: [PATCH 044/155] update changlog --- docs/changelog.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- src/flashcard-modal-algo.tsx | 3 ++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 55520e6c..0b10630b 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). + +## [1.10.1.7] + +- 新增:卡片中打开笔记; +- 与主分支同步; +- 新增:在更新插件后,弹出更新说明; +- 新增:设置中可跳转到issue的链接; +- 新增:打赏码; +- 修复:一些小bugs. + ## [1.10.1.6] - 修复 根据标签输出日志文件 diff --git a/package-lock.json b/package-lock.json index 67fdaa94..b7406268 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.1.6", + "version": "1.10.1.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "obsidian-spaced-repetition", - "version": "1.10.1.6", + "version": "1.10.1.7", "license": "MIT", "dependencies": { "chart.js": "^4.3.3", diff --git a/package.json b/package.json index 51d2f8a4..b0996ca2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.1.6", + "version": "1.10.1.7", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { diff --git a/src/flashcard-modal-algo.tsx b/src/flashcard-modal-algo.tsx index c14e872c..cc6b8bbb 100644 --- a/src/flashcard-modal-algo.tsx +++ b/src/flashcard-modal-algo.tsx @@ -312,6 +312,7 @@ export class FlashcardModal extends Modal { this.openNoteFileButton.addEventListener("click", async () => { const activeLeaf: WorkspaceLeaf = this.plugin.app.workspace.getLeaf(); await activeLeaf.openFile(this.currentCard.note); + this.app.workspace.setActiveLeaf(activeLeaf); const activeView: MarkdownView = this.app.workspace.getActiveViewOfType(MarkdownView); if (activeView) { @@ -321,7 +322,7 @@ export class FlashcardModal extends Modal { }); activeView.editor.scrollIntoView({ from: { - line: this.currentCard.lineNo, + line: this.currentCard.lineNo + 20, ch: 0, }, to: { From ca7c3b15f1df7206ab4a42df450e9f7a0b2f4b93 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:52:35 +0800 Subject: [PATCH 045/155] update readme --- README.md | 1 + docs/README_ZH.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 0d28aad9..675ee7cd 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ I develop this plugin as a hobby, spending my free time doing this. If you find or buy original plugin author(@st3v3nmw) a coffee... + Buy Me a Coffee at ko-fi.com --- diff --git a/docs/README_ZH.md b/docs/README_ZH.md index aa96e04a..3fca1ca6 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -55,6 +55,7 @@ github: https://github.com/open-spaced-repetition/obsidian-spaced-repetition-rec 或者,请原插件作者(@st3v3nmw)喝杯咖啡 + Buy Me a Coffee at ko-fi.com --- From e53bb9c29464af26709d0cf407f868d6e49c6543 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:57:55 +0800 Subject: [PATCH 046/155] update release --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 31b97e97..e3949d2d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,6 +8,8 @@ on: env: PLUGIN_NAME: obsidian-spaced-repetition +permissions: write-all + jobs: release: runs-on: ubuntu-latest From cabe86ff43a07b8e19d5b6822df751e5d47ab2a0 Mon Sep 17 00:00:00 2001 From: WwwZMing <44491130+WwwZMing@users.noreply.github.com> Date: Fri, 18 Aug 2023 08:40:08 +0800 Subject: [PATCH 047/155] Update styles.css MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 扩大了按钮的可点击范围 --- styles.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/styles.css b/styles.css index a4b7f7cf..d7d2759f 100644 --- a/styles.css +++ b/styles.css @@ -1,3 +1,12 @@ +.tag-pane-tag-self:before{ + content: ''; + position: absolute; + width: 100%; + height: 100%; + top: -6px; + left: -5px; + cursor: pointer; +} .sr-flashcard-menu { display: block; width: 100%; From 9a82c6da396937b538d56531c374f4df02aeb516 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 19 Aug 2023 11:53:11 +0800 Subject: [PATCH 048/155] chore: pretty --- .github/workflows/pr.yml | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 43bdf841..51f97aeb 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -5,7 +5,50 @@ on: branches: ["**"] jobs: + # https://github.com/snezhig/obsidian-front-matter-title/blob/master/.github/workflows/main.yml + validate: + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + with: + submodules: 'true' + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: "npm" + - run: npm i + + - name: Eslint + run: npm run lint + + - name: Run test + run: npm run test + + pretty: + needs: validate + runs-on: ubuntu-latest + # if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'Newdea/obsidian-spaced-repetition-recall' + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + # Make sure the actual branch is checked out when running on pull requests + ref: ${{ github.head_ref }} + + - name: Prettify code + uses: creyD/prettier_action@v4.3 + with: + prettier_version: 2.8.8 + # This part is also where you can pass other options, for example: + # prettier_options: --write *.ts *.json src test --ignore-path package-lock.json + prettier_options: --write . --ignore-path package-lock.json + lint_and_test: + needs: pretty runs-on: ubuntu-latest steps: From cba660300e79cb39de482835042580d5a229589d Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 15 Aug 2023 08:11:46 +0800 Subject: [PATCH 049/155] fix reg --- src/modals/ReleaseNotes.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/modals/ReleaseNotes.ts b/src/modals/ReleaseNotes.ts index 629d7f73..e7af7498 100644 --- a/src/modals/ReleaseNotes.ts +++ b/src/modals/ReleaseNotes.ts @@ -11,7 +11,7 @@ import README from "README.md"; import README_ZH from "docs/README_ZH.md"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -import RELEASE_changelog from "CHANGELOG.md"; +import RELEASE_changelog from "docs/changelog.md"; // const fmd = fs.readFileSync("CHANGELOG.md", "utf8"); console.debug(README); @@ -23,13 +23,13 @@ let readme: string[]; let readme_tks: string[]; if (local === "zh-cn" || local === "zh-tw") { README_LOC = README_ZH; - readme = README_LOC.match(/^(.|\n)*(?=\n## 下载)/gm); - readme_tks = README_LOC.match(/^(## Thanks(?:.|\n)*)$/gm); + readme = README_LOC.match(/^(.|\r?\n)*(?=\r?\n## 下载)/gm); + readme_tks = README_LOC.match(/^(## Thanks(?:.|\r?\n)*)$/gm); } else { - readme = README_LOC.match(/^(.|\n)*(?=\n## How)/gm); - readme_tks = README_LOC.match(/^(## Thanks(?:.|\n)*)$/gm); + readme = README_LOC.match(/^(.|\r?\n)*(?=\r?\n## How)/gm); + readme_tks = README_LOC.match(/^(## Thanks(?:.|\r?\n)*)$/gm); } -const latestRelease = RELEASE_changelog.match(/## \[(?:.|\n)*?(?=\n## \[)/gm); +const latestRelease = RELEASE_changelog.match(/## \[(?:.|\r?\n)*?(?=\r?\n## \[)/gm); let PLUGIN_VERSION: string; // https://github.com/zsviczian/obsidian-excalidraw-plugin/blob/master/src/dialogs/ReleaseNotes.ts From b48fb2412df5d47bd3baf6cc88f3a5e02a5909db Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 15 Aug 2023 08:30:43 +0800 Subject: [PATCH 050/155] del debug --- src/modals/ReleaseNotes.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/modals/ReleaseNotes.ts b/src/modals/ReleaseNotes.ts index e7af7498..5a1713c4 100644 --- a/src/modals/ReleaseNotes.ts +++ b/src/modals/ReleaseNotes.ts @@ -14,11 +14,9 @@ import README_ZH from "docs/README_ZH.md"; import RELEASE_changelog from "docs/changelog.md"; // const fmd = fs.readFileSync("CHANGELOG.md", "utf8"); -console.debug(README); -console.debug(RELEASE_changelog); const local = moment.locale(); -let README_LOC = README; +let README_LOC: string; let readme: string[]; let readme_tks: string[]; if (local === "zh-cn" || local === "zh-tw") { @@ -26,6 +24,7 @@ if (local === "zh-cn" || local === "zh-tw") { readme = README_LOC.match(/^(.|\r?\n)*(?=\r?\n## 下载)/gm); readme_tks = README_LOC.match(/^(## Thanks(?:.|\r?\n)*)$/gm); } else { + README_LOC = README; readme = README_LOC.match(/^(.|\r?\n)*(?=\r?\n## How)/gm); readme_tks = README_LOC.match(/^(## Thanks(?:.|\r?\n)*)$/gm); } From efb4cf7f9435eb5b266262f89e105a24280a3b87 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 15 Aug 2023 08:52:04 +0800 Subject: [PATCH 051/155] when buildQueue don't untrackfile --- src/data.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data.ts b/src/data.ts index e110715d..22f0348a 100644 --- a/src/data.ts +++ b/src/data.ts @@ -1131,9 +1131,9 @@ export class DataStore { if (!exists) { if (file != null) { console.debug("untrackfile by buildqueue:", file); - new Notice("untrackfile by buildqueue:" + file); - removedItems += this.untrackFile(file.path, false); - // item = null; + // new Notice("untrackfile by buildqueue:" + file); + // removedItems += this.untrackFile(file.path, false); + // // item = null; untrackedFiles += 1; } } else if (file.items.file !== id) { From ad3459b16010be0fca70c3e504e0c0e8253d4be2 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 15 Aug 2023 09:20:59 +0800 Subject: [PATCH 052/155] fix: untrackFilesInFolder --- src/data.ts | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/data.ts b/src/data.ts index 22f0348a..8b474567 100644 --- a/src/data.ts +++ b/src/data.ts @@ -669,13 +669,17 @@ export class DataStore { * @param {boolean} recursive */ untrackFilesInFolder(folder: TFolder, recursive?: boolean) { - if (recursive == null) recursive = true; + let firstCalled = false; + if (recursive == null) { + recursive = true; + firstCalled = true; + } let totalRemoved = 0; folder.children.forEach((child) => { if (child instanceof TFolder) { if (recursive) { - this.untrackFilesInFolder(child, recursive); + totalRemoved += this.untrackFilesInFolder(child, recursive); } } else if (child instanceof TFile) { if (this.isTracked(child.path)) { @@ -684,6 +688,10 @@ export class DataStore { } } }); + if (firstCalled) { + console.log("在文件夹 %s 下,共删除%d个文件", folder.path, totalRemoved); + } + return totalRemoved; } /** @@ -814,7 +822,7 @@ export class DataStore { const index = this.getFileIndex(path); if (index == -1) { - return; + return 0; } const trackedFile = this.data.trackedFiles[index]; @@ -824,14 +832,15 @@ export class DataStore { file != null && "tags" in trackedFile && trackedFile.tags.length > 0 && - trackedFile.tags.last() !== this.getDefaultDackName() + trackedFile.tags.last() !== this.getDefaultDackName() && + trackedFile.tags.last() !== RPITEMTYPE.NOTE ) { // it's taged file, can't untrack by this. console.log(path + " is taged file, can't untrack by this."); new Notice( "it is taged file, can't untrack by this. You can delete the #review tag in note file.", ); - return; + return 0; } const numItems = Object.keys(trackedFile.items).length; @@ -863,6 +872,7 @@ export class DataStore { this.save(); // this.plugin.updateStatusBar(); console.log("Untracked: " + path + nulrstr); + return 1; } /** From 6fca9f8a6a4b77c757029ad2bfc8c8b813e4bd33 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 15 Aug 2023 09:25:40 +0800 Subject: [PATCH 053/155] buildQueue --- src/data.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/data.ts b/src/data.ts index 8b474567..746656cc 100644 --- a/src/data.ts +++ b/src/data.ts @@ -1144,6 +1144,7 @@ export class DataStore { // new Notice("untrackfile by buildqueue:" + file); // removedItems += this.untrackFile(file.path, false); // // item = null; + removedItems += 1; untrackedFiles += 1; } } else if (file.items.file !== id) { @@ -1205,7 +1206,7 @@ export class DataStore { ); if (untrackedFiles > 0) { - new Notice( + console.log( "Recall: Untracked " + untrackedFiles + " files with a total of " + From d99588fabe486193c9b347158788827e42eafac0 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 15 Aug 2023 09:44:27 +0800 Subject: [PATCH 054/155] fix: plugin --- src/modals/ReleaseNotes.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modals/ReleaseNotes.ts b/src/modals/ReleaseNotes.ts index 5a1713c4..e104a37a 100644 --- a/src/modals/ReleaseNotes.ts +++ b/src/modals/ReleaseNotes.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { App, MarkdownRenderer, Modal, Notice, moment, request } from "obsidian"; import { errorlog, isVersionNewerThanOther } from "src/utils_recall"; -import ExcalidrawPlugin from "../main"; +import SRPlugin from "../main"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore @@ -33,11 +33,11 @@ let PLUGIN_VERSION: string; // https://github.com/zsviczian/obsidian-excalidraw-plugin/blob/master/src/dialogs/ReleaseNotes.ts export class ReleaseNotes extends Modal { - private plugin: ExcalidrawPlugin; + private plugin: SRPlugin; private version: string; // contentEl: any; - constructor(app: App, plugin: ExcalidrawPlugin, version: string) { + constructor(app: App, plugin: SRPlugin, version: string) { super(app); this.plugin = plugin; this.version = version; From 2d8e911df9d4593da0107459dd5ac2e19775eb27 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 15 Aug 2023 10:04:57 +0800 Subject: [PATCH 055/155] msg --- src/data.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/data.ts b/src/data.ts index 746656cc..b437ba2b 100644 --- a/src/data.ts +++ b/src/data.ts @@ -10,6 +10,7 @@ import { parse } from "./parser"; import { cyrb53 } from "./utils"; import deepcopy from "deepcopy"; import { isArray } from "src/utils_recall"; +import { stringify } from "querystring"; const ROOT_DATA_PATH = "./tracked_files.json"; const PLUGIN_DATA_PATH = "./.obsidian/plugins/obsidian-spaced-repetition-recall/tracked_files.json"; @@ -689,7 +690,9 @@ export class DataStore { } }); if (firstCalled) { - console.log("在文件夹 %s 下,共删除%d个文件", folder.path, totalRemoved); + const msg = `在文件夹 ${folder.path} 下,共有 ${totalRemoved} 个文件不再跟踪重复了`; + new Notice(msg); + console.log(msg); } return totalRemoved; } From dbfbb81c2470c4dff8c628e4162261eb9f523199 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Thu, 17 Aug 2023 21:55:48 +0800 Subject: [PATCH 056/155] update readme --- README.md | 4 ++-- docs/README_ZH.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 675ee7cd..98aa6fb1 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,8 @@ Check the [docs](https://www.stephenmwangi.com/obsidian-spaced-repetition/) for I develop this plugin as a hobby, spending my free time doing this. If you find it valuable, then please say THANK YOU or buy me a coffee...
- - + +
or buy original plugin author(@st3v3nmw) a coffee... diff --git a/docs/README_ZH.md b/docs/README_ZH.md index 3fca1ca6..e888cbfb 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -47,11 +47,11 @@ github: https://github.com/open-spaced-repetition/obsidian-spaced-repetition-rec ## Thanks -业余时间折腾的,如果对你有所帮助,可以请我喝瓶饮料呀~ +业余时间折腾的,如果对你有所帮助,可以请我喝瓶饮料或奶茶呀~
- - + +
或者,请原插件作者(@st3v3nmw)喝杯咖啡 From 2653ddc803341b06d0dd1157961a9711e4f9437c Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 18 Aug 2023 21:56:17 +0800 Subject: [PATCH 057/155] fix Nan --- src/data.ts | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/data.ts b/src/data.ts index b437ba2b..3643a219 100644 --- a/src/data.ts +++ b/src/data.ts @@ -1,6 +1,6 @@ import SRPlugin from "./main"; import { DateUtils } from "./utils_recall"; -import { DataLocation, SRSettings } from "./settings"; +import { DataLocation, SRSettings, algorithmNames } from "./settings"; import { TFile, TFolder, Notice, getAllTags } from "obsidian"; @@ -10,7 +10,7 @@ import { parse } from "./parser"; import { cyrb53 } from "./utils"; import deepcopy from "deepcopy"; import { isArray } from "src/utils_recall"; -import { stringify } from "querystring"; +import { FsrsData } from "./algorithms/fsrs"; const ROOT_DATA_PATH = "./tracked_files.json"; const PLUGIN_DATA_PATH = "./.obsidian/plugins/obsidian-spaced-repetition-recall/tracked_files.json"; @@ -1627,10 +1627,27 @@ export class DataStore { */ getSchedbyId(id: number): RegExpMatchArray { const item: RepetitionItem = this.data.items[id]; - if (item == null || item.nextReview === 0 || item.timesReviewed === 0) return null; // new card doesn't need schedinfo - const ease = item.data.ease * 100; - const interval = item.data.lastInterval; - // const interval = item.data.iteration; + if ( + item == null || + item.nextReview === 0 || + item.nextReview === null || + item.timesReviewed === 0 + ) { + return null; // new card doesn't need schedinfo + } + let ease: number; + let interval: number; + if (this.plugin.data.settings.algorithm !== algorithmNames.Fsrs) { + ease = item.data.ease * 100; + interval = item.data.lastInterval; + // const interval = item.data.iteration; + } else { + item.data as FsrsData; + interval = item.data.scheduled_days; + // ease just used for StatsChart, not review scheduling. + ease = item.data.state; + } + const due = window.moment(item.nextReview); const dueString: string = due.format("YYYY-MM-DD"); return ["due-interval-ease00", dueString, interval, ease] as RegExpMatchArray; From 4b9076b22aa5545d70de4e480ac9075a68ce0e11 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 19 Aug 2023 14:47:12 +0800 Subject: [PATCH 058/155] symlink --- CHANGELOG.md | 2 +- CONTRIBUTING.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cf57d4c..1bed66b3 120000 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1 @@ -./docs/changelog.md \ No newline at end of file +docs/changelog.md \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0ec6b81d..651dc17d 120000 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1 @@ -./docs/en/contributing.md \ No newline at end of file +docs/en/contributing.md \ No newline at end of file From 5a58561c9059690c24c0ce6a8c3c4fe15bc23b38 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 19 Aug 2023 15:01:04 +0800 Subject: [PATCH 059/155] lint and update readme --- .github/workflows/pr.yml | 66 ++++++++++++++++++++-------------------- docs/changelog.md | 5 +++ manifest.json | 2 +- package-lock.json | 4 +-- package.json | 2 +- styles.css | 8 ++--- 6 files changed, 46 insertions(+), 41 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 51f97aeb..b8dab4ee 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -7,46 +7,46 @@ on: jobs: # https://github.com/snezhig/obsidian-front-matter-title/blob/master/.github/workflows/main.yml validate: - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name - runs-on: ubuntu-latest + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - submodules: 'true' - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: "npm" - - run: npm i + steps: + - uses: actions/checkout@v3 + with: + submodules: "true" + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: "npm" + - run: npm i - - name: Eslint - run: npm run lint + - name: Eslint + run: npm run lint - - name: Run test - run: npm run test + - name: Run test + run: npm run test pretty: - needs: validate - runs-on: ubuntu-latest - # if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'Newdea/obsidian-spaced-repetition-recall' + needs: validate + runs-on: ubuntu-latest + # if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'Newdea/obsidian-spaced-repetition-recall' - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - # Make sure the actual branch is checked out when running on pull requests - ref: ${{ github.head_ref }} + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + # Make sure the actual branch is checked out when running on pull requests + ref: ${{ github.head_ref }} + + - name: Prettify code + uses: creyD/prettier_action@v4.3 + with: + prettier_version: 2.8.8 + # This part is also where you can pass other options, for example: + # prettier_options: --write *.ts *.json src test --ignore-path package-lock.json + prettier_options: --write . --ignore-path package-lock.json - - name: Prettify code - uses: creyD/prettier_action@v4.3 - with: - prettier_version: 2.8.8 - # This part is also where you can pass other options, for example: - # prettier_options: --write *.ts *.json src test --ignore-path package-lock.json - prettier_options: --write . --ignore-path package-lock.json - lint_and_test: needs: pretty runs-on: ubuntu-latest diff --git a/docs/changelog.md b/docs/changelog.md index 0b10630b..4899a699 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.10.1.8] + +- fix #9: View statistics NAN +- enchance #10: 点击到卡组标签名对应那行就可以打开卡片 by [@WwwZMing](https://github.com/WwwZMing) +- 其他一些小bugs修复 ## [1.10.1.7] diff --git a/manifest.json b/manifest.json index 099e3683..5a100a30 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.10.1.7", + "version": "1.10.1.8", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package-lock.json b/package-lock.json index b7406268..74943a8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.1.7", + "version": "1.10.1.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "obsidian-spaced-repetition", - "version": "1.10.1.7", + "version": "1.10.1.8", "license": "MIT", "dependencies": { "chart.js": "^4.3.3", diff --git a/package.json b/package.json index b0996ca2..49e9f0a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.1.7", + "version": "1.10.1.8", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { diff --git a/styles.css b/styles.css index d7d2759f..9c9a410f 100644 --- a/styles.css +++ b/styles.css @@ -1,8 +1,8 @@ -.tag-pane-tag-self:before{ - content: ''; +.tag-pane-tag-self:before { + content: ""; position: absolute; - width: 100%; - height: 100%; + width: 100%; + height: 100%; top: -6px; left: -5px; cursor: pointer; From 093772b475eeb12275756b21179f03d3b368c291 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 19 Aug 2023 21:26:36 +0800 Subject: [PATCH 060/155] fix pluginname --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e3949d2d..ab97157a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,7 @@ on: - "*" env: - PLUGIN_NAME: obsidian-spaced-repetition + PLUGIN_NAME: obsidian-spaced-repetition-recall permissions: write-all From cb03c84556b7c51fcdcb08943c6d0c44fa9ad3f5 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 22 Aug 2023 23:11:36 +0800 Subject: [PATCH 061/155] fix #11, backup tracked_files.json when change data Location fix openfile in flashcards update changelog sym link --- CHANGELOG.md | 2 +- CONTRIBUTING.md | 2 +- docs/changelog.md | 5 +++ jest.config.js | 5 +++ src/data.ts | 60 +++++++++++++++----------- src/flashcard-modal-algo.tsx | 35 +++++++-------- src/modals/{confirm.ts => confirm.tsx} | 16 +++++-- utils/fileTransformer.js | 10 +++++ 8 files changed, 86 insertions(+), 49 deletions(-) rename src/modals/{confirm.ts => confirm.tsx} (73%) create mode 100644 utils/fileTransformer.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bed66b3..1cf57d4c 120000 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1 @@ -docs/changelog.md \ No newline at end of file +./docs/changelog.md \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 651dc17d..0ec6b81d 120000 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1 @@ -docs/en/contributing.md \ No newline at end of file +./docs/en/contributing.md \ No newline at end of file diff --git a/docs/changelog.md b/docs/changelog.md index 4899a699..fccd929e 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.10.1.9] + +- fix #11, backup tracked_files.json when change data Location +- fix openfile in flashcards + ## [1.10.1.8] - fix #9: View statistics NAN diff --git a/jest.config.js b/jest.config.js index 34842b2c..3c519cd7 100644 --- a/jest.config.js +++ b/jest.config.js @@ -7,6 +7,11 @@ module.exports = { moduleNameMapper: { "src/(.*)": "/src/$1", }, + modulePaths: [""], + transform: { + "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": + "/utils/fileTransformer.js", + }, moduleFileExtensions: ["js", "jsx", "ts", "tsx", "json", "node", "d.ts"], roots: ["/src/", "/tests/unit/"], collectCoverageFrom: ["src/**/lang/*.ts", "src/parser.ts", "src/scheduling.ts", "utils.ts"], diff --git a/src/data.ts b/src/data.ts index 3643a219..af489c78 100644 --- a/src/data.ts +++ b/src/data.ts @@ -250,11 +250,23 @@ export class DataStore { */ moveStoreLocation(): boolean { const adapter = this.plugin.app.vault.adapter; + const plugin = this.plugin; const newPath = this.getStorePath(); if (newPath === this.dataPath) { return false; } + let exist = false; + plugin.store.verify(newPath).then((v) => { + exist = v; + if (exist) { + const adapter = this.plugin.app.vault.adapter; + const suffix = "-" + new Date().toISOString().replace(/[:.]/g, ""); + adapter.rename(newPath, newPath + suffix).then(() => { + console.debug("orginal file: " + newPath + " renamed to: " + newPath + suffix); + }); + } + }); try { this.save(); @@ -1140,16 +1152,25 @@ export class DataStore { this.data.items.map(async (item, id) => { if (item != null) { const file = this.getFileForItem(item); - return this.verify(file).then((exists) => { + return this.verify(file.path).then((exists) => { if (!exists) { if (file != null) { - console.debug("untrackfile by buildqueue:", file); - // new Notice("untrackfile by buildqueue:" + file); - // removedItems += this.untrackFile(file.path, false); - // // item = null; - removedItems += 1; - untrackedFiles += 1; + // in case file moved away. + const newfile = this.findMovedFile(file.path); + if (newfile !== null) { + file.path = newfile.path; + exists = true; + console.debug("a file has been moved: " + newfile.path); + } } + } + if (!exists) { + console.debug("untrackfile by buildqueue:", file); + // new Notice("untrackfile by buildqueue:" + file); + // removedItems += this.untrackFile(file.path, false); + // // item = null; + removedItems += 1; + untrackedFiles += 1; } else if (file.items.file !== id) { if (item.timesReviewed == 0) { // This is a new item. @@ -1237,28 +1258,15 @@ export class DataStore { /** * Verify that the file of this item still exists. * - * @param {TrackedFile} file + * @param {string}path */ - async verify(file: TrackedFile): Promise { + async verify(path: string): Promise { const adapter = this.plugin.app.vault.adapter; - if (file != null) { - const result = await adapter.exists(file.path).catch((_reason) => { - console.error("Unable to verify file: ", file.path); - // return false; + if (path != null) { + return await adapter.exists(path).catch((_reason) => { + console.error("Unable to verify file: ", path); + return false; }); - if (!result) { - // in case file moved away. - const newfile = this.findMovedFile(file.path); - if (newfile !== null) { - file.path = newfile.path; - console.debug("a file has been moved: " + newfile.path); - return true; - } else { - return false; - } - } else { - return true; - } } return false; } diff --git a/src/flashcard-modal-algo.tsx b/src/flashcard-modal-algo.tsx index cc6b8bbb..8028b059 100644 --- a/src/flashcard-modal-algo.tsx +++ b/src/flashcard-modal-algo.tsx @@ -310,26 +310,27 @@ export class FlashcardModal extends Modal { setIcon(this.openNoteFileButton, "file-edit"); this.openNoteFileButton.setAttribute("aria-label", t("OPEN_NOTE")); this.openNoteFileButton.addEventListener("click", async () => { - const activeLeaf: WorkspaceLeaf = this.plugin.app.workspace.getLeaf(); + const activeLeaf: WorkspaceLeaf = this.plugin.app.workspace.getLeaf("tab"); await activeLeaf.openFile(this.currentCard.note); - this.app.workspace.setActiveLeaf(activeLeaf); - - const activeView: MarkdownView = this.app.workspace.getActiveViewOfType(MarkdownView); - if (activeView) { - activeView.editor.setCursor({ + if (activeLeaf.view instanceof MarkdownView) { + const activeView = activeLeaf.view; + const pos = { line: this.currentCard.lineNo, ch: 0, - }); - activeView.editor.scrollIntoView({ - from: { - line: this.currentCard.lineNo + 20, - ch: 0, - }, - to: { - line: this.currentCard.lineNo, - ch: 0, - }, - }); + }; + // const posEnd = {} + activeView.editor.setCursor(pos); + if (activeView.getMode() === "preview") { + activeView.currentMode.applyScroll(pos.line); + } else { + activeView.editor.scrollIntoView( + { + from: pos, + to: pos, + }, + true, + ); + } } this.currentDeck.deleteFlashcardAtIndex(this.currentCardIdx, this.currentCard.isDue); diff --git a/src/modals/confirm.ts b/src/modals/confirm.tsx similarity index 73% rename from src/modals/confirm.ts rename to src/modals/confirm.tsx index 89e4a529..053f9692 100644 --- a/src/modals/confirm.ts +++ b/src/modals/confirm.tsx @@ -2,22 +2,25 @@ import { App, Modal, ButtonComponent } from "obsidian"; type ConfirmCallback = (confirmed: boolean) => void; -export default class ConfirmModal extends Modal { +export default class ConfirmModal { message: string; callback: ConfirmCallback; + modal: Modal; constructor(app: App, message: string, callback: ConfirmCallback) { - super(app); + // super(app); this.message = message; + this.modal = new Modal(app); this.callback = callback; } - onOpen() { - const { contentEl } = this; + open() { + const { contentEl } = this.modal; contentEl.createEl("p").setText(this.message); const buttonDiv = contentEl.createDiv("srs-flex-row"); + buttonDiv.setAttribute("align", "center"); new ButtonComponent(buttonDiv) .setButtonText("Confirm") @@ -31,5 +34,10 @@ export default class ConfirmModal extends Modal { this.callback(false); this.close(); }); + this.modal.open(); + } + + close() { + this.modal.close(); } } diff --git a/utils/fileTransformer.js b/utils/fileTransformer.js new file mode 100644 index 00000000..ffa7a6cb --- /dev/null +++ b/utils/fileTransformer.js @@ -0,0 +1,10 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires, no-undef +const path = require("path"); +// eslint-disable-next-line no-undef +module.exports = { + process(sourceText, sourcePath, _options) { + return { + code: `module.exports = ${JSON.stringify(path.basename(sourcePath))};`, + }; + }, +}; From a5dc3e752a927045c767da2b1579c511f83044b8 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 26 Aug 2023 20:53:08 +0800 Subject: [PATCH 062/155] =?UTF-8?q?-=20=20=20big=20update:=20dataLocation?= =?UTF-8?q?=20switch.**be=20careful=20!!!**,=20if=20you=20switch=20dataLoc?= =?UTF-8?q?ation/Algorithm,=20algorithm=20parameters=20of=20card/note=20it?= =?UTF-8?q?em=20will=20lose,=20just=20will=20keep=20next=20review=20date;?= =?UTF-8?q?=20-=20=20=20refactor=20code;=20-=20=20=20fix=20#11,=20#12[?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=90=8C=E6=AD=A5=E9=97=AE=E9=A2=98]=20and?= =?UTF-8?q?=20other=20bugs=20fix.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/changelog.md | 5 +- manifest.json | 2 +- package-lock.json | 4 +- package.json | 2 +- src/algorithms/anki.ts | 7 +- src/algorithms/fsrs.ts | 8 +- src/algorithms/scheduling_default.ts | 35 +- src/algorithms/supermemo.ts | 17 +- src/constants.ts | 2 +- src/data.ts | 933 ++++++++++++++++++++++----- src/flashcard-modal-algo.tsx | 32 +- src/lang/locale/ar.ts | 1 + src/lang/locale/cz.ts | 1 + src/lang/locale/de.ts | 1 + src/lang/locale/en.ts | 3 +- src/lang/locale/es.ts | 1 + src/lang/locale/ja.ts | 1 + src/lang/locale/ko.ts | 1 + src/lang/locale/pt-br.ts | 1 + src/lang/locale/ru.ts | 1 + src/lang/locale/zh-cn.ts | 2 +- src/lang/locale/zh-tw.ts | 2 +- src/main.ts | 740 ++++++++++----------- src/modals/ReleaseNotes.ts | 9 +- src/modals/reviewresponse-modal.tsx | 2 +- src/settings.ts | 179 ++--- src/sidebar.ts | 17 +- src/utils_recall.ts | 17 + 29 files changed, 1356 insertions(+), 672 deletions(-) diff --git a/README.md b/README.md index 98aa6fb1..4ef9ab24 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ This is a modified version of [obsidian-spaced-repetition](https://github.com/st - merge [recall plugin](https://github.com/martin-jw/obsidian-recall) to use seperate file - setting where to save schedule info by Data Location - - ~~save on note file, just as used do.~~ + - save on note file, just as used do. - save on seperate tracked_files.json. - it still have problems about saving cards shedule info, because when we change note content, the lineNumber and texthash will changes. I add a eventListener, but note work well in some cases. Is there any good idea? - setting convert tracked note to decks diff --git a/docs/changelog.md b/docs/changelog.md index fccd929e..acd35f94 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -6,8 +6,9 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). ## [1.10.1.9] -- fix #11, backup tracked_files.json when change data Location -- fix openfile in flashcards +- big update: dataLocation switch.**be careful !!!**, if you switch dataLocation/Algorithm, algorithm parameters of card/note item will lose, just will keep next review date; +- refactor code; +- fix #11, #12[数据同步问题] and other bugs fix. ## [1.10.1.8] diff --git a/manifest.json b/manifest.json index 5a100a30..05dc5847 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.10.1.8", + "version": "1.10.1.9", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package-lock.json b/package-lock.json index 74943a8a..16028e49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.1.8", + "version": "1.10.1.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "obsidian-spaced-repetition", - "version": "1.10.1.8", + "version": "1.10.1.9", "license": "MIT", "dependencies": { "chart.js": "^4.3.3", diff --git a/package.json b/package.json index 49e9f0a9..ea64add7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.1.8", + "version": "1.10.1.9", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { diff --git a/src/algorithms/anki.ts b/src/algorithms/anki.ts index 5a4b6c7a..bf670b54 100644 --- a/src/algorithms/anki.ts +++ b/src/algorithms/anki.ts @@ -1,5 +1,5 @@ import { Setting, Notice } from "obsidian"; -import { DateUtils } from "src/utils_recall"; +import { DateUtils, MiscUtils } from "src/utils_recall"; import SrsAlgorithm from "./../algorithms"; import { RepetitionItem, ReviewResult } from "./../data"; import deepcopy from "deepcopy"; @@ -50,7 +50,7 @@ export class AnkiAlgorithm extends SrsAlgorithm { calcAllOptsIntervals(item: RepetitionItem): number[] { const intvls: number[] = []; this.srsOptions().forEach((opt, _ind) => { - const itemCopy = deepcopy(item); + const itemCopy: RepetitionItem = deepcopy(item); const result = this.onSelection(itemCopy, opt, false); const intvl = Math.round((result.nextReview / DateUtils.DAYS_TO_MILLIS) * 100) / 100; intvls.push(intvl); @@ -59,7 +59,7 @@ export class AnkiAlgorithm extends SrsAlgorithm { } onSelection(item: RepetitionItem, optionStr: string, repeat: boolean): ReviewResult { - const data = item.data as AnkiData; + const data: AnkiData = item.data as AnkiData; const response = AnkiOptions.indexOf(optionStr); let correct = true; @@ -104,6 +104,7 @@ export class AnkiAlgorithm extends SrsAlgorithm { } } + data.ease = MiscUtils.fixed(data.ease, 3); data.iteration += 1; data.lastInterval = nextInterval; diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index 2addf822..16ecd264 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -92,7 +92,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { } defaultData(): FsrsData { - return deepcopy(this.card); + return new fsrsjs.Card(); } srsOptions(): string[] { @@ -124,7 +124,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { return intvls; } onSelection(item: RepetitionItem, optionStr: string, repeat: boolean): ReviewResult { - const data = item.data as FsrsData; + let data = item.data as FsrsData; data.due = new Date(data.due); data.last_review = new Date(data.last_review); const response = FsrsOptions.indexOf(optionStr) + 1; @@ -152,7 +152,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { // console.log(scheduling_cards); //Update the card after rating: - item.data = deepcopy(scheduling_cards[response].card) as FsrsData; + data = item.data = deepcopy(scheduling_cards[response].card) as FsrsData; //Get the due date for card: // const due = card.due; @@ -163,7 +163,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { //Get the review log after rating `Good`: // review_log = scheduling_cards[2].review_log; - const nextInterval = item.data.due.valueOf() - item.data.last_review.valueOf(); + const nextInterval = data.due.valueOf() - data.last_review.valueOf(); this.appendRevlog(now, item, response); diff --git a/src/algorithms/scheduling_default.ts b/src/algorithms/scheduling_default.ts index debe6872..44a737d0 100644 --- a/src/algorithms/scheduling_default.ts +++ b/src/algorithms/scheduling_default.ts @@ -22,6 +22,14 @@ export enum ReviewResponse { Easy, } +interface DefaultAlgoSettings { + baseEase: number; + lapsesIntervalChange: number; + easyBonus: number; + maximumInterval: number; + maxLinkFactor: number; +} + interface Sm2Data { ease: number; lastInterval: number; @@ -90,7 +98,7 @@ export function schedule( } export class DefaultAlgorithm extends SrsAlgorithm { - defaultSettings(): any { + defaultSettings(): DefaultAlgoSettings { return { // algorithm baseEase: 250, @@ -103,8 +111,8 @@ export class DefaultAlgorithm extends SrsAlgorithm { defaultData(): Sm2Data { return { - ease: 2.5, - lastInterval: 1, //todo: if should set it to 1, the anki is 0. + ease: this.settings.baseEase, + lastInterval: 1, // the anki is 0. iteration: 1, }; } @@ -114,7 +122,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { } calcAllOptsIntervals(item: RepetitionItem): number[] { - const data = item.data as Sm2Data; + const data: Sm2Data = item.data as Sm2Data; const due = item.nextReview; const now: number = Date.now(); const delayBeforeReview = due === 0 ? 0 : now - due; //just in case. @@ -132,7 +140,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { const schedObj: Record = schedule( ind, dataCopy.lastInterval, - dataCopy.ease * 100, + dataCopy.ease, delayBeforeReview, this.settings, dueDates, @@ -149,12 +157,14 @@ export class DefaultAlgorithm extends SrsAlgorithm { const response = Sm2Options.indexOf(optionStr) as ReviewResponse; + let correct = true; if (repeat) { if (response < 1) { - return { correct: false, nextReview: -1 }; + correct = false; } else { - return { correct: true, nextReview: -1 }; + correct = true; } + return { correct: correct, nextReview: -1 }; } const due = item.nextReview; @@ -163,14 +173,14 @@ export class DefaultAlgorithm extends SrsAlgorithm { const schedObj: Record = schedule( response, data.lastInterval, - data.ease * 100, + data.ease, delayBeforeReview, this.settings, this.plugin.dueDatesNotes, ); const nextReview = schedObj.interval; - data.ease = schedObj.ease / 100; + data.ease = Math.round(schedObj.ease); if (response < 1) { data.iteration = 1; data.lastInterval = nextReview; @@ -181,8 +191,6 @@ export class DefaultAlgorithm extends SrsAlgorithm { } else { data.iteration += 1; data.lastInterval = nextReview; - console.log("item.data:", item.data); - console.log("smdata:", data); return { correct: true, nextReview: nextReview * DateUtils.DAYS_TO_MILLIS, @@ -190,7 +198,10 @@ export class DefaultAlgorithm extends SrsAlgorithm { } } - displaySettings(containerEl: HTMLElement, update: (settings: any) => void): void { + displaySettings( + containerEl: HTMLElement, + update: (settings: DefaultAlgoSettings) => void, + ): void { containerEl.createDiv().innerHTML = t("CHECK_ALGORITHM_WIKI", { algo_url: "https://www.stephenmwangi.com/obsidian-spaced-repetition/algorithms/", }); diff --git a/src/algorithms/supermemo.ts b/src/algorithms/supermemo.ts index 46089ac1..d58924ff 100644 --- a/src/algorithms/supermemo.ts +++ b/src/algorithms/supermemo.ts @@ -1,7 +1,8 @@ -import { DateUtils } from "src/utils_recall"; +import { DateUtils, MiscUtils } from "src/utils_recall"; import SrsAlgorithm from "./../algorithms"; import { RepetitionItem, ReviewResult } from "./../data"; import deepcopy from "deepcopy"; +import { AnkiAlgorithm } from "./anki"; interface Sm2Data { ease: number; @@ -18,7 +19,7 @@ const Sm2Options: string[] = ["Blackout", "Incorrect", "Incorrect (Easy)", "Hard export class Sm2Algorithm extends SrsAlgorithm { // eslint-disable-next-line @typescript-eslint/no-explicit-any defaultSettings(): any { - return {}; + return new AnkiAlgorithm().defaultSettings(); } defaultData(): Sm2Data { @@ -83,9 +84,10 @@ export class Sm2Algorithm extends SrsAlgorithm { data.ease = 1.3; } + data.ease = MiscUtils.fixed(data.ease, 3); data.lastInterval = nextReview; - console.log("item.data:", item.data); - console.log("smdata:", data); + // console.log("item.data:", item.data); + // console.log("smdata:", data); return { correct: true, nextReview: nextReview * DateUtils.DAYS_TO_MILLIS, @@ -97,6 +99,11 @@ export class Sm2Algorithm extends SrsAlgorithm { displaySettings(containerEl: HTMLElement, update: (settings: any) => void): void { containerEl.createDiv().innerHTML = '用于间隔重复的算法. 目前与Anki算法共用参数(仅算法处理方式不同),更多信息请查阅 sm2算法.'; - return; + + const anki = new AnkiAlgorithm(); + anki.updateSettings(this.plugin, this.settings); + anki.displaySettings(containerEl, (settings) => { + update((this.settings = settings)); + }); } } diff --git a/src/constants.ts b/src/constants.ts index d97f6084..b7d4cd87 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,5 +1,5 @@ export const SCHEDULING_INFO_REGEX = - /^---\n((?:.*\n)*)sr-due: (.+)\nsr-interval: (\d+)\nsr-ease: (\d+)\n((?:.*\n)?)---/; + /^---\n((?:.*\n)*)sr-due: (.+)\nsr-interval: (\d+)\nsr-ease: (\d+)\n((?:.*\n)?)---\n/; export const YAML_FRONT_MATTER_REGEX = /^---\n((?:.*\n)*?)---/; export const MULTI_SCHEDULING_EXTRACTOR = /!([\d-]+),(\d+),(\d+)/gm; diff --git a/src/data.ts b/src/data.ts index af489c78..f39db1ca 100644 --- a/src/data.ts +++ b/src/data.ts @@ -1,16 +1,24 @@ import SRPlugin from "./main"; -import { DateUtils } from "./utils_recall"; -import { DataLocation, SRSettings, algorithmNames } from "./settings"; +import { BlockUtils, DateUtils } from "./utils_recall"; +import { DataLocation, SRSettings, algorithmNames, algorithms } from "./settings"; -import { TFile, TFolder, Notice, getAllTags } from "obsidian"; +import { TFile, TFolder, Notice, getAllTags, FrontMatterCache } from "obsidian"; import { ReviewDeck } from "src/review-deck"; import { CardType, ReviewResponse } from "./scheduling"; import { parse } from "./parser"; -import { cyrb53 } from "./utils"; +import { escapeRegexString } from "./utils"; import deepcopy from "deepcopy"; import { isArray } from "src/utils_recall"; import { FsrsData } from "./algorithms/fsrs"; +import { AnkiData } from "./algorithms/anki"; +import { Rating } from "fsrs.js"; +import { + LEGACY_SCHEDULING_EXTRACTOR, + MULTI_SCHEDULING_EXTRACTOR, + SCHEDULING_INFO_REGEX, + YAML_FRONT_MATTER_REGEX, +} from "./constants"; const ROOT_DATA_PATH = "./tracked_files.json"; const PLUGIN_DATA_PATH = "./.obsidian/plugins/obsidian-spaced-repetition-recall/tracked_files.json"; @@ -49,6 +57,10 @@ interface SrsData { * @type {number} */ lastQueue: number; + /** + * @type {number} + */ + mtime: number; /** * @type {0} */ @@ -101,7 +113,7 @@ export interface RepetitionItem { */ // eslint-disable-next-line @typescript-eslint/no-explicit-any - data: any; // Additional data, determined by the selected algorithm. + data: unknown; // Additional data, determined by the selected algorithm. } /** @@ -168,6 +180,7 @@ const DEFAULT_SRS_DATA: SrsData = { items: [], trackedFiles: [], lastQueue: 0, + mtime: 0, newAdded: 0, }; @@ -206,6 +219,11 @@ export class DataStore { */ dataPath: string; + /** + * ms + * @type {number} + */ + EndofToday: number; /** * @type {string} */ @@ -219,6 +237,7 @@ export class DataStore { constructor(plugin: SRPlugin) { this.plugin = plugin; this.dataPath = this.getStorePath(); + this.EndofToday = this._EndofToday(); } /** @@ -227,15 +246,18 @@ export class DataStore { * @returns {string} */ getStorePath(): string { + const dir = this.plugin.manifest.dir; const dataLocation = this.plugin.data.settings.dataLocation; if (dataLocation == DataLocation.PluginFolder) { - return PLUGIN_DATA_PATH; + // return PLUGIN_DATA_PATH; + return dir + ROOT_DATA_PATH.substring(1); } else if (dataLocation == DataLocation.RootFolder) { return ROOT_DATA_PATH; } else if (dataLocation == DataLocation.SpecifiedFolder) { return this.plugin.data.settings.customFolder; } else if (dataLocation == DataLocation.SaveOnNoteFile) { - return PLUGIN_DATA_PATH; + // return PLUGIN_DATA_PATH; + return dir + ROOT_DATA_PATH.substring(1); } } @@ -307,6 +329,7 @@ export class DataStore { Object.assign({}, DEFAULT_SRS_DATA), JSON.parse(data), ); + this.data.mtime = await this.getmtime(); } } else { console.log("Tracked files not found! Creating new file..."); @@ -316,6 +339,18 @@ export class DataStore { } } + /** + * re load if tracked_files.json updated by other device. + */ + reLoad() { + // const now: Date = new Date().getTime(); + this.getmtime().then((mtime) => { + if (mtime - this.data.mtime > 10) { + this.load(); + } + }); + } + /** * save. */ @@ -323,15 +358,37 @@ export class DataStore { await this.plugin.app.vault.adapter.write(path, JSON.stringify(this.data)).catch((e) => { new Notice("Unable to save data file!"); console.log(e); + return; }); } /** - * Returns total number of items tracked by the SRS. + * get file modified time. should only set to data.mtime when load. + * @param path + * @returns */ + async getmtime(path = this.dataPath) { + const adapter = this.plugin.app.vault.adapter; + const stat = await adapter.stat(path.normalize()); + if (stat != null) { + return stat.mtime; + } else { + return 0; + } + } + + private _EndofToday() { + // end of today + const offsetMinutes = new Date().getTimezoneOffset(); + const nowToday = + Math.ceil(Date.now() / DateUtils.DAYS_TO_MILLIS) * DateUtils.DAYS_TO_MILLIS + + offsetMinutes * 60 * 1000 - + 1; + return nowToday; + } + /** - * items. - * + * Returns total number of items tracked by the SRS. * @returns {number} */ items(): number { @@ -480,22 +537,37 @@ export class DataStore { * @param id Item id, can get by: * findex = this.store.getFileIndex(note.path); * id = this.data.trackedFiles[findex].items["file"] - * @returns id | -1 + * @returns boolean */ - isNewAdd(id: number) { - if (id < 0) { - console.log("[wrong file ID]: file %d not tracked. ", id); - return -1; - } - if (this.data.items[id] == null) { - console.log("[wrong file ID]: file %d had been untracked. ", id); - return -2; + isNewAdd(id: number): boolean { + try { + if (this.data.items[id]["nextReview"] > 0) { + return false; + } else if ( + this.data.items[id]["nextReview"] === 0 || + this.data.items[id]["timesReviewed"] === 0 + ) { + // This is a new item. + return true; + } else { + return false; + } + } catch (error) { + return false; } - if (this.data.items[id]["nextReview"] == 0 || this.data.items[id]["timesReviewed"] == 0) { - // This is a new item. - return id; + } + + isDue(id: number) { + try { + if (this.data.items[id]["nextReview"] > 0 || this.data.items[id]["timesReviewed"] > 0) { + // This is a new item. + return true; + } else { + return false; + } + } catch (error) { + return false; } - return -1; } isCardItem(id: number) { @@ -796,10 +868,14 @@ export class DataStore { * @returns {CardInfo} cardInfo of new add. */ trackFileCard(note: TFile, lineNo: number, cardTextHash: string): CardInfo { - if (!this.isTrackedCardfile(note.path)) { + if (!this.isTracked(note.path)) { console.log("Attempt to add card in untracked file: " + note.path); this.trackFile(note.path, RPITEMTYPE.CARD, false); } + const carditem = this.getAndSyncCardInfo(note, lineNo, cardTextHash); + if (carditem != null) { + return carditem; + } const trackedFile = this.getTrackedFile(note.path); // const newcardItem: CardInfo = { lineNo: lineNo, cardTextHash: cardTextHash, itemIds: [] }; @@ -817,7 +893,7 @@ export class DataStore { trackedFile.cardItems.sort((a, b) => { return a.lineNo - b.lineNo; }); - this.save(); + // this.save(); console.log("Tracked: " + note.path + ", lineNo:" + lineNo + 1); // +1 just for better read. @@ -864,7 +940,6 @@ export class DataStore { const ind = trackedFile.items[key]; if (this.isQueued(ind)) { this.data.queue.remove(ind); - delete this.data.toDayAllQueue[ind]; } if (this.isInRepeatQueue(ind)) { this.data.repeatQueue.remove(ind); @@ -1034,8 +1109,9 @@ export class DataStore { this.updateItemDeckName(iid, deckName); } } + newitemIds.sort((a: number, b: number) => a - b); cardinfo.itemIds = newitemIds; - this.save(); + // this.save(); console.log( trackedFile.path + @@ -1062,6 +1138,11 @@ export class DataStore { return { added, removed }; } + /** + * updateItemDeckName, if different, uupdate. Else do none thing. + * @param id + * @param deckName + */ updateItemDeckName(id: number, deckName: string) { const item = this.data.items[id]; if (item.deckName !== deckName) { @@ -1088,7 +1169,7 @@ export class DataStore { : RPITEMTYPE.CARD; this.data.items[id] = newItem; - this.save(); + // this.save(); console.debug("update item[%d]:", id, item); return; } @@ -1097,6 +1178,23 @@ export class DataStore { } } + /** + * updateItem AlgorithmData. + * @param id + * @param key + * @param value + */ + updateItemAlgorithmData(id: number, key: string, value: unknown) { + try { + const data = this.data.items[id].data as AnkiData | FsrsData; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + data[key] = value; + } catch (error) { + console.log(error); + } + } + /** * renameTrackedFile. * @@ -1138,7 +1236,6 @@ export class DataStore { this.data.newAdded = 0; this.clearQueue(); } - // data.cardQueue = []; let oldAdd = 0; let newAdd = 0; @@ -1152,12 +1249,13 @@ export class DataStore { this.data.items.map(async (item, id) => { if (item != null) { const file = this.getFileForItem(item); + if (file?.path == undefined) return; return this.verify(file.path).then((exists) => { if (!exists) { if (file != null) { // in case file moved away. const newfile = this.findMovedFile(file.path); - if (newfile !== null) { + if (newfile != null) { file.path = newfile.path; exists = true; console.debug("a file has been moved: " + newfile.path); @@ -1172,10 +1270,10 @@ export class DataStore { removedItems += 1; untrackedFiles += 1; } else if (file.items.file !== id) { + // card Queue if (item.timesReviewed == 0) { // This is a new item. if (maxNew == -1 || data.newAdded < maxNew) { - // item.nextReview = now.getTime(); data.newAdded += 1; data.cardQueue.push(id); newAdd_card += 1; @@ -1190,11 +1288,11 @@ export class DataStore { } } } else { + // note Queue if (item.timesReviewed == 0) { // This is a new item. - if (maxNew == -1 || data.newAdded < maxNew) { - // item.nextReview = now.getTime(); // it doesn't matter. - data.newAdded += 1; + if (!this.isQueued(id) && (maxNew == -1 || newAdd < maxNew)) { + // data.newAdded += 1; data.queue.push(id); newAdd += 1; } @@ -1218,26 +1316,26 @@ export class DataStore { // MiscUtils.shuffle(data.queue); // } - console.log( - "Added " + (oldAdd + newAdd) + " notes to review queue, with " + newAdd + " new!", - ); - console.log( - "Added " + - (oldAdd_card + newAdd_card) + - " cards to review queue, with " + - newAdd_card + - " new!", - ); - - if (untrackedFiles > 0) { - console.log( - "Recall: Untracked " + - untrackedFiles + - " files with a total of " + - removedItems + - " items while building queue!", - ); - } + // console.log( + // "Added " + (oldAdd + newAdd) + " notes to review queue, with " + newAdd + " new!", + // ); + // console.log( + // "Added " + + // (oldAdd_card + newAdd_card) + + // " cards to review queue, with " + + // newAdd_card + + // " new!", + // ); + + // if (untrackedFiles > 0) { + // console.log( + // "Recall: Untracked " + + // untrackedFiles + + // " files with a total of " + + // removedItems + + // " items while building queue!", + // ); + // } } loadRepeatQueue(rvdecks: { [deckKey: string]: ReviewDeck }) { @@ -1245,11 +1343,12 @@ export class DataStore { // const repeatDeckCounts: Record = {}; this.data.repeatQueue.forEach((id) => { const dname: string = this.getItembyID(id).deckName; - this.data.toDayAllQueue[id] = dname; + // this.data.toDayAllQueue[id] = dname; // if (!Object.keys(repeatDeckCounts).includes(dname)) { // repeatDeckCounts[dname] = 0; // } rvdecks[dname].dueNotesCount++; + this.plugin.dueNotesCount++; }); // return repeatDeckCounts; } @@ -1271,8 +1370,7 @@ export class DataStore { return false; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - clearQueue(queue: any = null) { + clearQueue(queue: unknown = null) { if (queue == null) { this.data.queue = []; this.data.repeatQueue = []; @@ -1394,7 +1492,7 @@ export class DataStore { } // console.debug("after delete nullitems:", items); - + this.clearQueue(); this.save(); console.log( @@ -1434,7 +1532,7 @@ export class DataStore { let shouldIgnore = false; if (!Object.prototype.hasOwnProperty.call(trackedFile, "tags")) { trackedFile["tags"] = [this.getDefaultDackName()]; - this.save(); + // this.save(); } for (const tag of trackedFile.tags) { if ( @@ -1457,7 +1555,7 @@ export class DataStore { continue; } // already add to other tagDeck. - if (this.isNewAdd(this.data.queue[i]) >= 0) { + if (this.isNewAdd(this.data.queue[i])) { rdeck.newNotes.push(file); this.plugin.newNotesCount++; console.debug("syncRCsrsDataToSRreviewDecks: newadd"); @@ -1470,7 +1568,7 @@ export class DataStore { } } - const [, due, _interval, ease] = this.getReviewNoteHeaderData(path); + const [, due, _interval, ease] = this.getItemSched(item); if (Object.prototype.hasOwnProperty.call(this.plugin.easeByPath, path)) { this.plugin.easeByPath[path] = (this.plugin.easeByPath[path] + ease) / 2; } else { @@ -1497,69 +1595,41 @@ export class DataStore { const trackedFile = this.getTrackedFile(note.path); const ind = this.getFileIndex(note.path); let now_number: number = now; - const nowToday: number = - Math.ceil(Date.now() / DateUtils.DAYS_TO_MILLIS) * DateUtils.DAYS_TO_MILLIS; + const nowToday: number = this.EndofToday; if (item == null) { this.updateItemById(fileid, ind); console.debug("syncRCDataToSRrevDeck update item:", item); } if (now == null) { - //it's inside plugin.sync(); now_number = nowToday; - const currNow = Date.now(); - if ( - nowToday - item.nextReview > 0 && - (this.data.toDayLatterQueue[fileid] == undefined || currNow - item.nextReview > 0) - ) { - this.data.toDayAllQueue[fileid] = rdeck.deckName; - delete this.data.toDayLatterQueue[fileid]; - } else if (nowToday - item.nextReview < 0) { - // just in case some unknow errors. - delete this.data.toDayAllQueue[fileid]; - } } else { - delete this.data.toDayAllQueue[fileid]; - if (item.nextReview <= nowToday) { - this.data.toDayLatterQueue[fileid] = rdeck.deckName; - } else if (item.nextReview > nowToday) { - delete this.data.toDayLatterQueue[fileid]; - } + delete this.data.toDayLatterQueue[fileid]; + Object.keys(this.data.toDayLatterQueue).forEach((fileid) => { const id = Number.parseInt(fileid); if (now - this.data.items[id].nextReview > 0) { - if (!Object.prototype.hasOwnProperty.call(this.data.toDayAllQueue, id)) { - const dname = (this.data.toDayAllQueue[id] = this.data.items[id].deckName); - this.plugin.reviewDecks[dname].dueNotesCount++; - } + const dname = this.data.items[id].deckName; + this.plugin.reviewDecks[dname].dueNotesCount++; delete this.data.toDayLatterQueue[id]; } }); } - if (this.isNewAdd(fileid) >= 0) { + if (this.isNewAdd(fileid)) { rdeck.newNotes.push(note); this.plugin.newNotesCount++; // console.debug("syncRCDataToSRrevDeck : addNew", fileid); } else { rdeck.scheduledNotes.push({ note: note, dueUnix: item.nextReview }); - if (item.nextReview <= nowToday) { + if (item.nextReview <= now_number) { rdeck.dueNotesCount++; this.plugin.dueNotesCount++; } - // update pulgin data - const [, due, _interval, ease] = this.getReviewNoteHeaderData(note.path); - if (now != null) { - // this.plugin.easeByPath just update in plugin.sync(), shouldn't update in pulgin.singNoteSyncQueue() - if (Object.prototype.hasOwnProperty.call(this.plugin.easeByPath, note.path)) { - this.plugin.easeByPath[note.path] = - (this.plugin.easeByPath[note.path] + ease) / 2; - } else { - this.plugin.easeByPath[note.path] = ease; - } - } - const nDays: number = Math.ceil((due - now_number) / (24 * 3600 * 1000)); + const nDays: number = Math.ceil( + (item.nextReview - now_number) / DateUtils.DAYS_TO_MILLIS, + ); if (!Object.prototype.hasOwnProperty.call(this.plugin.dueDatesNotes, nDays)) { this.plugin.dueDatesNotes[nDays] = 0; } @@ -1568,11 +1638,11 @@ export class DataStore { // update this.trackFile if (!Object.prototype.hasOwnProperty.call(trackedFile, "tags")) { trackedFile["tags"] = [rdeck.deckName]; - this.save(); + // this.save(); } else { if (!trackedFile.tags.includes(rdeck.deckName)) { trackedFile.tags.push(rdeck.deckName); - this.save(); + // this.save(); } } @@ -1580,7 +1650,7 @@ export class DataStore { this.updateItemDeckName(fileid, rdeck.deckName); if (!Object.prototype.hasOwnProperty.call(item, "itemType")) { item.itemType = this.isCardItem(fileid) ? RPITEMTYPE.CARD : RPITEMTYPE.NOTE; - this.save(); + // this.save(); } return; @@ -1609,29 +1679,52 @@ export class DataStore { this.setSchedbyId(fileId, sched, correct); } + getItemSched(item: RepetitionItem) { + try { + const data = item.data as AnkiData; + const ease = data.ease; + const interval = data.lastInterval; + // const interval = item.data.iteration; + const due = item.nextReview; + const sched = [item.ID, due, interval, ease]; + console.debug("getItemSched:", sched); + return sched; + } catch (error) { + console.log("getItemSched:", error); + return null; + } + } + /** - * get ReviewNote dataItems to HeaderData - * getSchedbyId - * @param path + * get ReviewNote frontmatter Data from notefile. + * + * @param frontmatter * @returns number[] | [0, due, interval, ease]; */ - getReviewNoteHeaderData(path: string): number[] { - const item: RepetitionItem = this.getItemsOfFile(path)[0]; - if (item == null) { - console.log("getReviewNoteHeaderData --> note: %s doesn't have item: ", path, item); - return; + getReviewNoteHeaderData(frontmatter: FrontMatterCache): number[] { + // file has scheduling information + if ( + Object.prototype.hasOwnProperty.call(frontmatter, "sr-due") && + Object.prototype.hasOwnProperty.call(frontmatter, "sr-interval") && + Object.prototype.hasOwnProperty.call(frontmatter, "sr-ease") + ) { + const dueUnix: number = window + .moment(frontmatter["sr-due"], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) + .valueOf(); + const interval: number = frontmatter["sr-interval"] as number; + const ease: number = frontmatter["sr-ease"] as number; + const sched = [null, dueUnix, interval, ease]; + return sched; + } else { + console.log("getReviewNoteHeaderData --> note: %s doesn't have sr frontmatter. "); + return null; } - const ease = item.data.ease * 100; - const interval = item.data.lastInterval; - // const interval = item.data.iteration; - const due = item.nextReview; - return [0, due, interval, ease]; } /** * @description: getSchedbyId , give returns to scheduling * @param {number} id - * @return {[]} ["due-interval-ease00", due, interval, ease] | null for new + * @return {[]} ["due-interval-ease00", dueString, interval, ease] | null for new */ getSchedbyId(id: number): RegExpMatchArray { const item: RepetitionItem = this.data.items[id]; @@ -1643,24 +1736,33 @@ export class DataStore { ) { return null; // new card doesn't need schedinfo } + let ease: number; let interval: number; if (this.plugin.data.settings.algorithm !== algorithmNames.Fsrs) { - ease = item.data.ease * 100; - interval = item.data.lastInterval; + const data: AnkiData = item.data as AnkiData; + ease = data.ease; + interval = data.lastInterval; // const interval = item.data.iteration; } else { - item.data as FsrsData; - interval = item.data.scheduled_days; + const data = item.data as FsrsData; + interval = data.scheduled_days; // ease just used for StatsChart, not review scheduling. - ease = item.data.state; + ease = data.state; } const due = window.moment(item.nextReview); const dueString: string = due.format("YYYY-MM-DD"); - return ["due-interval-ease00", dueString, interval, ease] as RegExpMatchArray; + return [id, dueString, interval, ease] as unknown as RegExpMatchArray; } + /** + * setSchedbyId: set sched into items[id] + * @param id + * @param sched RegExpMatchArray + * @param correct user response + * @returns + */ setSchedbyId(id: number, sched: RegExpMatchArray | number[] | string[], correct?: boolean) { const item: RepetitionItem = this.data.items[id]; if (item == null) { @@ -1668,14 +1770,17 @@ export class DataStore { // this.updateItemById(id); //not work well yet. return; } + sched[0] = id; + // console.debug("setSchedbyId:", sched); + const data: AnkiData = item.data as AnkiData; item.nextReview = typeof sched[1] == "number" - ? sched[1] + ? Number(sched[1]) : window .moment(sched[1], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) .valueOf(); - item.data.lastInterval = sched[2] as number; - item.data.ease = (sched[3] as number) / 100; + data.lastInterval = Number(sched[2]); + data.ease = Number(sched[3]); if (correct != null) { item.timesReviewed += 1; @@ -1694,9 +1799,14 @@ export class DataStore { * @param note * @returns */ - async syncNoteCardsIndex(note: TFile): Promise { - if (!this.isTaged(note, "card") && !this.isTrackedCardfile(note.path)) { - return; + async syncNoteCardsIndex( + note: TFile, + callback?: (cardText: string, cardinfo: CardInfo) => void, + ): Promise { + if (callback == null) { + if (!this.isTaged(note, RPITEMTYPE.CARD) && !this.isTrackedCardfile(note.path)) { + return; + } } const trackedFile = this.getTrackedFile(note.path); @@ -1718,6 +1828,7 @@ export class DataStore { ); for (const parsedCard of parsedCards) { + // deckPath = noteDeckPath; const lineNo: number = parsedCard[2]; let cardText: string = parsedCard[1]; @@ -1733,13 +1844,21 @@ export class DataStore { .replace("#", "") .split("/"); if (cardDeckPath) { + // deckPath = cardDeckPath; cardText = cardText.replaceAll(tagInCardRegEx, ""); } } - const cardTextHash: string = cyrb53(cardText); + const cardTextHash: string = BlockUtils.getTxtHash(cardText); const cardinfo = this.getAndSyncCardInfo(note, lineNo, cardTextHash); + if (callback != null) { + callback(cardText, { + lineNo: lineNo, + cardTextHash: cardTextHash, + itemIds: cardinfo?.itemIds, + }); + } lines.push(lineNo); cardHashList[lineNo] = cardTextHash; if (cardinfo == null) { @@ -1750,7 +1869,10 @@ export class DataStore { // console.debug("cardHashList: ", cardHashList); // sync by total parsedCards.length - const carditems = trackedFile.cardItems; + const carditems = trackedFile?.cardItems; + if (carditems == null) { + return; + } if (lines.length === carditems.length && negIndFlag) { for (let i = 0; i < lines.length; i++) { if (lines[i] !== carditems[i].lineNo) { @@ -1771,72 +1893,82 @@ export class DataStore { */ isTaged(note: TFile, tagtype?: string) { if (tagtype == null) { - tagtype = "note"; + tagtype = RPITEMTYPE.NOTE; } // on tracked notfile changed. - const fileCachedData = app.metadataCache.getFileCache(note) || {}; - let shouldIgnore = true; + const fileCachedData = this.plugin.app.metadataCache.getFileCache(note) || {}; const tags = getAllTags(fileCachedData) || []; if ( this.plugin.data.settings.noteFoldersToIgnore.some((folder) => - note.path.startsWith(folder), + note.path.contains(folder), ) ) { return false; } - if (tagtype === "note") { - if (this.getNoteDeckName(tags) !== null) { - shouldIgnore = false; + if (tagtype === RPITEMTYPE.NOTE) { + if (this.getNoteDeckName(tags) != null) { + return true; } - } else if (tagtype === "card") { + } else if (tagtype === RPITEMTYPE.CARD) { for (const tag of tags) { if (this.isTagedDeckName(tag)) { - shouldIgnore = false; - break; + return true; } } - } else if (tagtype === "all") { - if (this.getNoteDeckName(tags) !== null) { - shouldIgnore = false; + } else { + if (this.getNoteDeckName(tags) != null) { + return true; } for (const tag of tags) { if (this.isTagedDeckName(tag)) { - shouldIgnore = false; - break; + return true; } } } - return !shouldIgnore; + return false; } + /** + * if deckName of a note is in tagsToReview, return true. + * @param deckName + * @returns boolean + */ isTagedNoteDeckName(deckName: string) { - let isTaged = false; if ( this.plugin.data.settings.tagsToReview.some( (tagToReview) => deckName === tagToReview || deckName.startsWith(tagToReview + "/"), ) ) { - isTaged = true; + return true; } - return isTaged; + return false; } - isTagedDeckName(deckName: string) { - let isTaged = false; + /** + * isTagedDeckName, if deckName is in flashcardTags, return true. + * @param deckName + * @returns + */ + isTagedDeckName(deckName: string): boolean { if ( this.plugin.data.settings.flashcardTags.some( (flashcardTag) => deckName === flashcardTag || deckName.startsWith(flashcardTag + "/"), ) ) { - isTaged = true; + return true; } - return isTaged; + return false; } + /** + * select a tag in tags, which is also in tagsToReview. If not, return null. + * @param tags + * @returns + */ getNoteDeckName(tags: string[]): string | null { for (const tag of tags) { if ( @@ -1859,7 +1991,7 @@ export class DataStore { * @param count * @param scheduling RegExpMatchArray[] */ - syncTrackfileCardSched( + getTrackfileCardSched( note: TFile, deckName: string, lineNo: number, @@ -1872,22 +2004,497 @@ export class DataStore { } let carditem = this.getAndSyncCardInfo(note, lineNo, cardTextHash); - if (carditem == null) { + if (carditem != null) { + carditem.itemIds.forEach((id) => { + const sched = this.getSchedbyId(id); + // ignore new add card + if (sched != null) { + scheduling.push(sched); + } + }); + } else { carditem = this.trackFileCard(note, lineNo, cardTextHash); } - if (!this.isTagedDeckName(deckName) && !this.isTagedNoteDeckName(deckName)) { deckName = this.getDefaultDackName(); } this.updateCardItems(note, carditem, count, deckName); - carditem.itemIds.forEach((id) => { - const sched = this.getSchedbyId(id); - // ignore new add card - if (sched != null) { - scheduling.push(sched); - } + return scheduling; + } + + setTrackfileCardSched( + note: TFile, + deckName: string, + lineNo: number, + cardTextHash: string, + count: number, + scheduling?: RegExpMatchArray[], + ): CardInfo { + if (scheduling == null || scheduling.length == 0) { + return; + } + + const carditem = this.trackFileCard(note, lineNo, cardTextHash); + + // if (!this.isTagedDeckName(deckName) && !this.isTagedNoteDeckName(deckName)) { + // deckName = this.getDefaultDackName(); + // } + this.updateCardItems(note, carditem, count, deckName); + + carditem.itemIds.forEach((id: number, index) => { + this.setSchedbyId(id, scheduling[index], true); }); + return carditem; + } - return scheduling; + /** + * algorithmSwitchData + * @param fromAlgo + * @param toAlgo + * @returns Promise return true if switchData success. + */ + async algorithmSwitchData(fromAlgo: algorithmNames, toAlgo: algorithmNames): Promise { + const plugin = this.plugin; + const items = plugin.store.data.items; + + const old_path = plugin.store.dataPath; + + await plugin.store.save(old_path + ".bak"); + plugin.store.pruneData(); + const fromTo = "(from " + fromAlgo + " to: " + toAlgo; + try { + if ( + fromAlgo === algorithmNames.Anki || + fromAlgo === algorithmNames.Default || + fromAlgo === algorithmNames.SM2 + ) { + if (toAlgo === algorithmNames.Fsrs) { + const options = this.plugin.algorithm.srsOptions(); + const fsrs = algorithms[algorithmNames.Fsrs]; + fsrs.updateSettings( + plugin, + plugin.data.settings.algorithmSettings[algorithmNames.Fsrs], + ); + const initItvl = fsrs.settings.w[4]; + items.forEach((item) => { + if (item != null && item.data != null) { + const reps = item.timesReviewed; + let card = fsrs.defaultData() as FsrsData; + if (reps > 0) { + const data = item.data as AnkiData; + const due = new Date(item.nextReview); + const interval = data.lastInterval; + const lastview = new Date( + item.nextReview - data.lastInterval * DateUtils.DAYS_TO_MILLIS, + ); + + let opt: string; + item.data = card; + if (interval > initItvl * 3) { + // card.state = State.Learning; + // in case the param is to big. + opt = options[Rating.Easy - 1]; + fsrs.onSelection(item, opt, false); + } + if (interval > initItvl) { + opt = options[Rating.Easy - 1]; + fsrs.onSelection(item, opt, false); + } + opt = options[Rating.Good - 1]; + fsrs.onSelection(item, opt, false); + + // item.data = deepcopy(card); + const tempitem = this.getItembyID(item.ID); + card = tempitem.data as FsrsData; + + card.due = due; + card.scheduled_days = interval; + card.reps = reps; + card.last_review = lastview; + } else { + item.data = card; + } + // item.data = deepcopy(card); + if ( + card.difficulty === 0 || + card.difficulty == null || + card.stability === 0 || + card.stability == null + ) { + if (reps > 0) { + const show = [item.ID, card, reps]; + console.warn( + "data switch: d, s" + + card.difficulty + + ", " + + card.stability, + ); + console.warn(...show); + } + } + } + }); + } else if ( + (fromAlgo === algorithmNames.Anki || fromAlgo === algorithmNames.SM2) && + toAlgo === algorithmNames.Default + ) { + items.forEach((item) => { + if (item != null && item.data != null) { + const data: AnkiData = item.data as AnkiData; + data.ease *= 100; + if (data.lastInterval === 0) { + data.lastInterval = 1; + } else { + data.lastInterval *= 1; + } + } + }); + } else if ( + fromAlgo === algorithmNames.Default && + (toAlgo === algorithmNames.Anki || toAlgo === algorithmNames.SM2) + ) { + items.forEach((item) => { + if (item != null && item.data != null) { + const data = item.data as AnkiData; + data.ease /= 100; + } + }); + } else if ( + (fromAlgo === algorithmNames.Anki && toAlgo === algorithmNames.SM2) || + (toAlgo === algorithmNames.Anki && fromAlgo === algorithmNames.SM2) + ) { + console.log("use same data, don't have to convert."); + } else { + const msg = + "algorithmSwithchData logic is not implement in this case" + + fromTo + + ", please issue it."; + new Notice(msg); + console.error(msg); + throw new Error(msg); + } + } else if ( + fromAlgo === algorithmNames.Fsrs && + (toAlgo === algorithmNames.Anki || toAlgo === algorithmNames.SM2) + ) { + algorithms[algorithmNames.Anki].updateSettings( + plugin, + plugin.data.settings.algorithmSettings[algorithmNames.Anki], + ); + items.forEach((item) => { + const data = item.data as FsrsData; + const lastitval = data.scheduled_days; + const iter = data.reps; + const newdata = algorithms[algorithmNames.Anki].defaultData() as AnkiData; + newdata.lastInterval = + lastitval > newdata.lastInterval ? lastitval : newdata.lastInterval; + newdata.iteration = iter; + item.data = deepcopy(newdata); + }); + } else if (fromAlgo === algorithmNames.Fsrs && toAlgo === algorithmNames.Default) { + algorithms[algorithmNames.Default].updateSettings( + plugin, + plugin.data.settings.algorithmSettings[algorithmNames.Default], + ); + items.forEach((item) => { + const data = item.data as FsrsData; + const lastitval = data.scheduled_days; + const iter = data.reps; + const newdata = algorithms[algorithmNames.Default].defaultData() as AnkiData; + newdata.lastInterval = + lastitval > newdata.lastInterval ? lastitval : newdata.lastInterval; + newdata.iteration = iter; + item.data = deepcopy(newdata); + }); + } else { + const msg = + "algorithmSwithchData logic is not implement in this case " + + fromTo + + "please issue it."; + new Notice(msg); + console.error(msg); + throw new Error(msg); + } + const msg = fromTo + "转换完成,因算法参数不同,会导致后续复习间隔调整"; + new Notice(msg); + console.debug(msg); + return true; + } catch (error) { + await plugin.store.load(old_path + ".bak"); + new Notice(error + fromTo + "转换失败,已恢复旧算法及数据"); + console.log(error); + return false; + } + } + + /** + * converteNoteSchedToTrackfile + * + */ + async converteNoteSchedToTrackfile() { + const plugin = this.plugin; + const store = plugin.store; + + // if (plugin.syncLock) { + // return; + // } + plugin.syncLock = true; + + await store.load(); + // const algo = plugin.algorithm; + // const opts = algo.srsOptions(); + const notes: TFile[] = plugin.app.vault.getMarkdownFiles(); + for (const note of notes) { + if ( + plugin.data.settings.noteFoldersToIgnore.some((folder) => + note.path.contains(folder), + ) + ) { + continue; + } + + const deckPath: string[] = plugin.findDeckPath(note); + if (deckPath.length !== 0) { + // await plugin.findFlashcardsInNote(note, deckPath, false, false); + let fileText: string = await plugin.app.vault.read(note); + let fileChanged = false; + await this.syncNoteCardsIndex(note, (cardText, cardinfo) => { + let scheduling: RegExpMatchArray[] = [ + ...cardText.matchAll(MULTI_SCHEDULING_EXTRACTOR), + ]; + if (scheduling.length === 0) + scheduling = [...cardText.matchAll(LEGACY_SCHEDULING_EXTRACTOR)]; + if (scheduling.length > 0) { + this.setTrackfileCardSched( + note, + "#" + deckPath[0], + cardinfo.lineNo, + cardinfo.cardTextHash, + scheduling.length, + scheduling, + ); + // console.debug(cardinfo.lineNo, scheduling); + + const newCardText = this.updateCardSchedXml(cardText); + const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); + fileText = fileText.replace(replacementRegex, () => newCardText); + fileChanged = true; + } + }).then(async () => { + if (fileChanged) { + await plugin.app.vault.modify(note, fileText); + } + }); + } + + const fileCachedData = plugin.app.metadataCache.getFileCache(note) || {}; + + const frontmatter: FrontMatterCache | Record = + fileCachedData.frontmatter || {}; + const tags = getAllTags(fileCachedData) || []; + + const deckname = this.getNoteDeckName(tags); + if (deckname != null) { + const sched = this.getReviewNoteHeaderData(frontmatter); + if (sched != null) { + // console.debug("converteNoteSchedToTrackfile find:", note.path); + if (!store.isTracked(note.path)) { + store.trackFile(note.path, deckname); + } + const id = store.getFileId(note.path); + // store.reviewId(id, opts[1]); + + this.setSchedbyId(id, sched, true); + await this.updateNoteSchedFrontHeader(note); + } + } + } + + this.save(); + plugin.syncLock = false; + const msg = "converteNoteSchedToTrackfile success!"; + new Notice(msg); + console.log(msg); + } + + /** + *converteTrackfileToNoteSched + */ + async converteTrackfileToNoteSched() { + const plugin = this.plugin; + const store = plugin.store; + + plugin.syncLock = true; + + const tracked_files = this.data.trackedFiles; + for (const tkfile of tracked_files) { + if (tkfile == null) { + continue; + } + if ( + plugin.data.settings.noteFoldersToIgnore.some((folder) => + tkfile.path.contains(folder), + ) + ) { + continue; + } + + let exists = await this.verify(tkfile.path); + if (!exists) { + // in case file moved away. + const newfile = this.findMovedFile(tkfile.path); + if (newfile != null) { + tkfile.path = newfile.path; + exists = true; + console.debug("a file has been moved: " + newfile.path); + } + } + if (exists) { + const id = tkfile.items["file"]; + const note = this.plugin.app.vault.getAbstractFileByPath(tkfile.path) as TFile; + const deckPath: string[] = plugin.findDeckPath(note); + if (deckPath.length !== 0) { + // await plugin.findFlashcardsInNote(note, deckPath, false, false); + let fileText: string = await plugin.app.vault.read(note); + let fileChanged = false; + await this.syncNoteCardsIndex(note, (cardText, cardinfo) => { + if (cardinfo == null || cardinfo?.itemIds == null) { + return; + } + const ids = cardinfo.itemIds; + ids.sort((a: number, b: number) => a - b); + const scheduling: RegExpMatchArray[] = []; + ids.forEach((id: number) => { + const sched = this.getSchedbyId(id); + // ignore new add card + if (sched != null) { + scheduling.push(sched); + } + }); + const newCardText = this.updateCardSchedXml(cardText, scheduling); + const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); + fileText = fileText.replace(replacementRegex, () => newCardText); + fileChanged = true; + }).then(async () => { + if (fileChanged) { + await plugin.app.vault.modify(note, fileText); + } + }); + } + if (this.isDue(id)) { + // let due: number, ease: number, interval: number; + + const ret = store.getSchedbyId(id); + if (ret != null) { + // console.debug("converteTrackfileToNoteSched: " + tkfile.path); + await this.updateNoteSchedFrontHeader(note, ret); + } + } + } + } + plugin.syncLock = false; + const msg = "converteTrackfileToNoteSched success!"; + new Notice(msg); + console.log(msg); + } + + /** + * updateNoteSchedFrontHeader, if sched == null, delete sched info in frontmatter. + * @param note TFile + * @param sched [, due, interval, ease] | null + */ + async updateNoteSchedFrontHeader(note: TFile, sched?: RegExpMatchArray) { + // update yaml schedule + const plugin = this.plugin; + let schedString = ""; + if (sched != null) { + const [, dueString, interval, ease] = sched; + // const dueString: string = window.moment(due).format("YYYY-MM-DD"); + schedString = `sr-due: ${dueString}\nsr-interval: ${interval}\n` + `sr-ease: ${ease}\n`; + } else { + schedString = ""; + } + + let fileText: string = await plugin.app.vault.read(note); + + // check if scheduling info exists + if (SCHEDULING_INFO_REGEX.test(fileText)) { + const schedulingInfo = SCHEDULING_INFO_REGEX.exec(fileText); + if (schedulingInfo[1].length || schedulingInfo[5].length) { + fileText = fileText.replace( + SCHEDULING_INFO_REGEX, + `---\n${schedulingInfo[1]}${schedString}` + `${schedulingInfo[5]}---\n`, + ); + } else { + fileText = fileText.replace(SCHEDULING_INFO_REGEX, ""); + } + } else if (YAML_FRONT_MATTER_REGEX.test(fileText)) { + // new note with existing YAML front matter + const existingYaml = YAML_FRONT_MATTER_REGEX.exec(fileText); + fileText = fileText.replace( + YAML_FRONT_MATTER_REGEX, + `---\n${existingYaml[1]}${schedString}---`, + ); + } else { + fileText = `---\n${schedString}---\n${fileText}`; + } + await plugin.app.vault.modify(note, fileText); + } + + /** + * updateCardSchedXml, if have scheduling, update card sched in note. else delete it. + * @param cardText + * @param scheduling + * @param cardCount + * @returns + */ + updateCardSchedXml(cardText: string, scheduling?: RegExpMatchArray[], cardCount?: number) { + const plugin = this.plugin; + let schedString = ""; + let sep: string = plugin.data.settings.cardCommentOnSameLine ? " " : "\n"; + const headerReg = /."; + } else { + schedString = ""; + } + + // const idxSched: number = cardText.lastIndexOf(sep + "/gm, ""); + } +} diff --git a/src/Deck.ts b/src/Deck.ts new file mode 100644 index 00000000..fceecb56 --- /dev/null +++ b/src/Deck.ts @@ -0,0 +1,226 @@ +import { Card } from "./Card"; +import { FlashcardReviewMode } from "./FlashcardReviewSequencer"; +import { Question } from "./Question"; +import { IQuestionPostponementList } from "./QuestionPostponementList"; +import { TopicPath } from "./TopicPath"; + +export enum CardListType { + NewCard, + DueCard, + All, +} + +export class Deck { + public deckName: string; + public newFlashcards: Card[]; + public dueFlashcards: Card[]; + public subdecks: Deck[]; + public parent: Deck | null; + + public getCardCount(cardListType: CardListType, includeSubdeckCounts: boolean): number { + let result: number = 0; + if (cardListType == CardListType.NewCard || cardListType == CardListType.All) + result += this.newFlashcards.length; + if (cardListType == CardListType.DueCard || cardListType == CardListType.All) + result += this.dueFlashcards.length; + + if (includeSubdeckCounts) { + for (const deck of this.subdecks) { + result += deck.getCardCount(cardListType, includeSubdeckCounts); + } + } + return result; + } + + constructor(deckName: string, parent: Deck | null) { + this.deckName = deckName; + this.newFlashcards = []; + this.dueFlashcards = []; + this.subdecks = []; + this.parent = parent; + } + + static get emptyDeck(): Deck { + return new Deck("Root", null); + } + + get isRootDeck() { + return this.parent == null; + } + + getDeck(topicPath: TopicPath): Deck { + return this._getOrCreateDeck(topicPath, false); + } + + getOrCreateDeck(topicPath: TopicPath): Deck { + return this._getOrCreateDeck(topicPath, true); + } + + private _getOrCreateDeck(topicPath: TopicPath, createAllowed: boolean): Deck { + if (!topicPath.hasPath) { + return this; + } + const t: TopicPath = topicPath.clone(); + const deckName: string = t.shift(); + for (const subdeck of this.subdecks) { + if (deckName === subdeck.deckName) { + return subdeck._getOrCreateDeck(t, createAllowed); + } + } + + let result: Deck = null; + if (createAllowed) { + const subdeck: Deck = new Deck(deckName, this /* parent */); + this.subdecks.push(subdeck); + result = subdeck._getOrCreateDeck(t, createAllowed); + } + return result; + } + + getTopicPath(): TopicPath { + const list: string[] = []; + // eslint-disable-next-line @typescript-eslint/no-this-alias + let deck: Deck = this; + while (!deck.isRootDeck) { + list.push(deck.deckName); + deck = deck.parent; + } + return new TopicPath(list.reverse()); + } + + getRootDeck(): Deck { + // eslint-disable-next-line @typescript-eslint/no-this-alias + let deck: Deck = this; + while (!deck.isRootDeck) { + deck = deck.parent; + } + return deck; + } + + getCard(index: number, cardListType: CardListType): Card { + const cardList: Card[] = this.getCardListForCardType(cardListType); + return cardList[index]; + } + + getCardListForCardType(cardListType: CardListType): Card[] { + return cardListType == CardListType.DueCard ? this.dueFlashcards : this.newFlashcards; + } + + appendCard(topicPath: TopicPath, cardObj: Card): void { + const deck: Deck = this.getOrCreateDeck(topicPath); + const cardList: Card[] = deck.getCardListForCardType(cardObj.cardListType); + + cardList.push(cardObj); + } + + deleteCard(card: Card): void { + const cardList: Card[] = this.getCardListForCardType(card.cardListType); + const idx = cardList.indexOf(card); + if (idx != -1) cardList.splice(idx, 1); + } + + deleteCardAtIndex(index: number, cardListType: CardListType): void { + const cardList: Card[] = this.getCardListForCardType(cardListType); + cardList.splice(index, 1); + } + + deleteAllCardsForQuestion(question: Question): void { + for (let idx = question.cards.length - 1; idx >= 0; idx--) { + this.deleteCardAtIndex(idx, question.cards[idx].cardListType); + } + } + + toDeckArray(): Deck[] { + const result: Deck[] = []; + result.push(this); + for (const subdeck of this.subdecks) { + result.push(...subdeck.toDeckArray()); + } + return result; + } + + sortSubdecksList(): void { + this.subdecks.sort((a, b) => { + if (a.deckName < b.deckName) { + return -1; + } else if (a.deckName > b.deckName) { + return 1; + } + return 0; + }); + + for (const deck of this.subdecks) { + deck.sortSubdecksList(); + } + } + + debugLogToConsole(desc: string = null) { + let str: string = desc != null ? `${desc}: ` : ""; + console.log((str += this.toString())); + } + + toString(indent: number = 0): string { + let result: string = ""; + let indentStr: string = " ".repeat(indent * 4); + + result += `${indentStr}${this.deckName}\r\n`; + indentStr += " "; + for (let i = 0; i < this.newFlashcards.length; i++) { + const card = this.newFlashcards[i]; + result += `${indentStr}New: ${i}: ${card.front}::${card.back}\r\n`; + } + for (let i = 0; i < this.dueFlashcards.length; i++) { + const card = this.dueFlashcards[i]; + const s = card.isDue ? "Due" : "Not due"; + result += `${indentStr}${s}: ${i}: ${card.front}::${card.back}\r\n`; + } + + for (const subdeck of this.subdecks) { + result += subdeck.toString(indent + 1); + } + return result; + } + + clone(): Deck { + return this.copyWithCardFilter(() => true); + } + + copyWithCardFilter(predicate: (value: Card) => boolean, parent: Deck = null): Deck { + const result: Deck = new Deck(this.deckName, parent); + result.newFlashcards = [...this.newFlashcards.filter((card) => predicate(card))]; + result.dueFlashcards = [...this.dueFlashcards.filter((card) => predicate(card))]; + + for (const s of this.subdecks) { + const newParent = result; + const newDeck = s.copyWithCardFilter(predicate, newParent); + result.subdecks.push(newDeck); + } + return result; + } + + static otherListType(cardListType: CardListType): CardListType { + let result: CardListType; + if (cardListType == CardListType.NewCard) result = CardListType.DueCard; + else if (cardListType == CardListType.DueCard) result = CardListType.NewCard; + else throw "Invalid cardListType"; + return result; + } +} + +export class DeckTreeFilter { + static filterForReviewableCards(reviewableDeckTree: Deck): Deck { + return reviewableDeckTree.copyWithCardFilter((card) => !card.question.hasEditLaterTag); + } + + static filterForRemainingCards( + questionPostponementList: IQuestionPostponementList, + deckTree: Deck, + reviewMode: FlashcardReviewMode, + ): Deck { + return deckTree.copyWithCardFilter( + (card) => + (reviewMode == FlashcardReviewMode.Cram || card.isNew || card.isDue) && + !questionPostponementList.includes(card.question), + ); + } +} diff --git a/src/DeckTreeIterator.ts b/src/DeckTreeIterator.ts new file mode 100644 index 00000000..8f5b39d7 --- /dev/null +++ b/src/DeckTreeIterator.ts @@ -0,0 +1,231 @@ +import { Card } from "./Card"; +import { CardListType, Deck } from "./Deck"; +import { Question } from "./Question"; +import { TopicPath } from "./TopicPath"; +import { globalRandomNumberProvider } from "./util/RandomNumberProvider"; + +export enum CardListOrder { + NewFirst, + DueFirst, + Random, +} +export enum OrderMethod { + Sequential, + Random, +} +export enum IteratorDeckSource { + UpdatedByIterator, + CloneBeforeUse, +} + +export interface IIteratorOrder { + // Choose decks in sequential order, or randomly + deckOrder: OrderMethod; + + // Within a deck, choose: new cards first, due cards first, or randomly + cardListOrder: CardListOrder; + + // Within a card list (i.e. either new or due), choose cards sequentially or randomly + cardOrder: OrderMethod; +} + +export interface IDeckTreeIterator { + get currentDeck(): Deck; + get currentCard(): Card; + get hasCurrentCard(): boolean; + setDeck(deck: Deck): void; + deleteCurrentCard(): boolean; + deleteCurrentQuestion(): boolean; + moveCurrentCardToEndOfList(): void; + nextCard(): boolean; +} + +class SingleDeckIterator { + deck: Deck; + iteratorOrder: IIteratorOrder; + preferredCardListType: CardListType; + cardIdx?: number; + cardListType?: CardListType; + + get hasCurrentCard(): boolean { + return this.cardIdx != null; + } + + get currentCard(): Card { + if (this.cardIdx == null) return null; + return this.deck.getCard(this.cardIdx, this.cardListType); + } + + constructor(iteratorOrder: IIteratorOrder) { + this.iteratorOrder = iteratorOrder; + this.preferredCardListType = + this.iteratorOrder.cardListOrder == CardListOrder.DueFirst + ? CardListType.DueCard + : CardListType.NewCard; + } + + setDeck(deck: Deck): void { + this.deck = deck; + this.setCardListType(null); + } + + private setCardListType(cardListType?: CardListType): void { + this.cardListType = cardListType; + this.cardIdx = null; + } + + nextCard(): boolean { + // First return cards in the preferred list + if (this.cardListType == null) { + this.setCardListType(this.preferredCardListType); + } + + if (!this.nextCardWithinList()) { + if (this.cardListType == this.preferredCardListType) { + // Nothing left in the preferred list, so try the non-preferred list type + this.setCardListType(Deck.otherListType(this.cardListType)); + if (!this.nextCardWithinList()) { + this.setCardListType(null); + } + } else { + this.cardIdx = null; + } + } + return this.cardIdx != null; + } + + private nextCardWithinList(): boolean { + let result: boolean = false; + const cardList: Card[] = this.deck.getCardListForCardType(this.cardListType); + + // Delete the current card so we don't return it again + if (this.hasCurrentCard) { + this.deleteCurrentCard(); + } + result = cardList.length > 0; + if (result) { + switch (this.iteratorOrder.cardOrder) { + case OrderMethod.Sequential: + this.cardIdx = 0; + break; + + case OrderMethod.Random: + this.cardIdx = globalRandomNumberProvider.getInteger(0, cardList.length - 1); + break; + } + } + return result; + } + + deleteCurrentQuestion(): void { + this.ensureCurrentCard(); + const q: Question = this.currentCard.question; + const cards: Card[] = this.deck.getCardListForCardType(this.cardListType); + do { + this.deck.deleteCardAtIndex(this.cardIdx, this.cardListType); + } while (this.cardIdx < cards.length && Object.is(q, cards[this.cardIdx].question)); + this.setNoCurrentCard(); + } + + deleteCurrentCard(): void { + this.ensureCurrentCard(); + this.deck.deleteCardAtIndex(this.cardIdx, this.cardListType); + this.setNoCurrentCard(); + } + + moveCurrentCardToEndOfList(): void { + this.ensureCurrentCard(); + const cardList: Card[] = this.deck.getCardListForCardType(this.cardListType); + if (cardList.length <= 1) return; + const card = this.currentCard; + this.deck.deleteCardAtIndex(this.cardIdx, this.cardListType); + this.deck.appendCard(TopicPath.emptyPath, card); + this.setNoCurrentCard(); + } + + private setNoCurrentCard() { + this.cardIdx = null; + } + + private ensureCurrentCard() { + if (this.cardIdx == null || this.cardListType == null) throw "no current card"; + } +} + +export class DeckTreeIterator implements IDeckTreeIterator { + deckTree: Deck; + preferredCardListType: CardListType; + iteratorOrder: IIteratorOrder; + deckSource: IteratorDeckSource; + + singleDeckIterator: SingleDeckIterator; + deckArray: Deck[]; + deckIdx?: number; + + get hasCurrentCard(): boolean { + return this.deckIdx != null && this.singleDeckIterator.hasCurrentCard; + } + + get currentDeck(): Deck { + if (this.deckIdx == null) return null; + return this.deckArray[this.deckIdx]; + } + + get currentCard(): Card { + if (this.deckIdx == null || !this.singleDeckIterator.hasCurrentCard) return null; + return this.singleDeckIterator.currentCard; + } + + constructor(iteratorOrder: IIteratorOrder, deckSource: IteratorDeckSource) { + this.singleDeckIterator = new SingleDeckIterator(iteratorOrder); + this.iteratorOrder = iteratorOrder; + this.deckSource = deckSource; + } + + setDeck(deck: Deck): void { + // We don't want to change the supplied deck, so first clone + if (this.deckSource == IteratorDeckSource.CloneBeforeUse) deck = deck.clone(); + + this.deckTree = deck; + this.deckArray = deck.toDeckArray(); + this.setDeckIdx(null); + } + + private setDeckIdx(deckIdx?: number): void { + this.deckIdx = deckIdx; + if (deckIdx != null) this.singleDeckIterator.setDeck(this.deckArray[deckIdx]); + } + + nextCard(): boolean { + let result: boolean = false; + if (this.deckIdx == null) { + this.setDeckIdx(0); + } + while (this.deckIdx < this.deckArray.length) { + if (this.singleDeckIterator.nextCard()) { + result = true; + break; + } + this.deckIdx++; + if (this.deckIdx < this.deckArray.length) { + this.singleDeckIterator.setDeck(this.deckArray[this.deckIdx]); + } + } + if (!result) this.deckIdx = null; + return result; + } + + deleteCurrentQuestion(): boolean { + this.singleDeckIterator.deleteCurrentQuestion(); + return this.nextCard(); + } + + deleteCurrentCard(): boolean { + this.singleDeckIterator.deleteCurrentCard(); + return this.nextCard(); + } + + moveCurrentCardToEndOfList(): void { + this.singleDeckIterator.moveCurrentCardToEndOfList(); + } +} diff --git a/src/DeckTreeStatsCalculator.ts b/src/DeckTreeStatsCalculator.ts new file mode 100644 index 00000000..e810b094 --- /dev/null +++ b/src/DeckTreeStatsCalculator.ts @@ -0,0 +1,41 @@ +import { Deck } from "./Deck"; +import { + CardListOrder, + DeckTreeIterator, + IDeckTreeIterator, + IIteratorOrder, + IteratorDeckSource, + OrderMethod, +} from "./DeckTreeIterator"; +import { Card } from "./Card"; +import { Stats } from "./stats"; +import { CardScheduleInfo } from "./CardSchedule"; + +export class DeckTreeStatsCalculator { + private deckTree: Deck; + + calculate(deckTree: Deck): Stats { + // Order doesn't matter as long as we iterate over everything + const iteratorOrder: IIteratorOrder = { + deckOrder: OrderMethod.Sequential, + cardListOrder: CardListOrder.DueFirst, + cardOrder: OrderMethod.Sequential, + }; + const iterator: IDeckTreeIterator = new DeckTreeIterator( + iteratorOrder, + IteratorDeckSource.CloneBeforeUse, + ); + const result = new Stats(); + iterator.setDeck(deckTree); + while (iterator.nextCard()) { + const card: Card = iterator.currentCard; + if (card.hasSchedule) { + const schedule: CardScheduleInfo = card.scheduleInfo; + result.update(schedule.delayBeforeReviewDaysInt, schedule.interval, schedule.ease); + } else { + result.incrementNew(); + } + } + return result; + } +} diff --git a/src/FlashcardReviewSequencer.ts b/src/FlashcardReviewSequencer.ts new file mode 100644 index 00000000..af522bb1 --- /dev/null +++ b/src/FlashcardReviewSequencer.ts @@ -0,0 +1,188 @@ +import { Card } from "./Card"; +import { CardListType, Deck } from "./Deck"; +import { Question, QuestionText } from "./Question"; +import { ReviewResponse } from "./scheduling"; +import { SRSettings } from "./settings"; +import { TopicPath } from "./TopicPath"; +import { CardScheduleInfo, ICardScheduleCalculator } from "./CardSchedule"; +import { Note } from "./Note"; +import { IDeckTreeIterator } from "./DeckTreeIterator"; +import { IQuestionPostponementList } from "./QuestionPostponementList"; + +export interface IFlashcardReviewSequencer { + get hasCurrentCard(): boolean; + get currentCard(): Card; + get currentQuestion(): Question; + get currentNote(): Note; + get currentDeck(): Deck; + get originalDeckTree(): Deck; + + setDeckTree(originalDeckTree: Deck, remainingDeckTree: Deck): void; + setCurrentDeck(topicPath: TopicPath): void; + getDeckStats(topicPath: TopicPath): DeckStats; + skipCurrentCard(): void; + determineCardSchedule(response: ReviewResponse, card: Card): CardScheduleInfo; + processReview(response: ReviewResponse): Promise; + updateCurrentQuestionText(text: string): Promise; +} + +export class DeckStats { + dueCount: number; + newCount: number; + totalCount: number; + + constructor(dueCount: number, newCount: number, totalCount: number) { + this.dueCount = dueCount; + this.newCount = newCount; + this.totalCount = totalCount; + } +} + +export enum FlashcardReviewMode { + Cram, + Review, +} + +export class FlashcardReviewSequencer implements IFlashcardReviewSequencer { + private _originalDeckTree: Deck; + private remainingDeckTree: Deck; + private reviewMode: FlashcardReviewMode; + private cardSequencer: IDeckTreeIterator; + private settings: SRSettings; + private cardScheduleCalculator: ICardScheduleCalculator; + private questionPostponementList: IQuestionPostponementList; + + constructor( + reviewMode: FlashcardReviewMode, + cardSequencer: IDeckTreeIterator, + settings: SRSettings, + cardScheduleCalculator: ICardScheduleCalculator, + questionPostponementList: IQuestionPostponementList, + ) { + this.reviewMode = reviewMode; + this.cardSequencer = cardSequencer; + this.settings = settings; + this.cardScheduleCalculator = cardScheduleCalculator; + this.questionPostponementList = questionPostponementList; + } + + get hasCurrentCard(): boolean { + return this.cardSequencer.currentCard != null; + } + + get currentCard(): Card { + return this.cardSequencer.currentCard; + } + + get currentQuestion(): Question { + return this.currentCard?.question; + } + + get currentDeck(): Deck { + return this.cardSequencer.currentDeck; + } + + get currentNote(): Note { + return this.currentQuestion.note; + } + + setDeckTree(originalDeckTree: Deck, remainingDeckTree: Deck): void { + this._originalDeckTree = originalDeckTree; + this.remainingDeckTree = remainingDeckTree; + this.setCurrentDeck(TopicPath.emptyPath); + } + + setCurrentDeck(topicPath: TopicPath): void { + const deck: Deck = this.remainingDeckTree.getDeck(topicPath); + this.cardSequencer.setDeck(deck); + this.cardSequencer.nextCard(); + } + + get originalDeckTree(): Deck { + return this._originalDeckTree; + } + + getDeckStats(topicPath: TopicPath): DeckStats { + const totalCount: number = this._originalDeckTree + .getDeck(topicPath) + .getCardCount(CardListType.All, true); + const remainingDeck: Deck = this.remainingDeckTree.getDeck(topicPath); + const newCount: number = remainingDeck.getCardCount(CardListType.NewCard, true); + const dueCount: number = remainingDeck.getCardCount(CardListType.DueCard, true); + return new DeckStats(dueCount, newCount, totalCount); + } + + skipCurrentCard(): void { + this.questionPostponementList.addIfRequired(this.currentQuestion); + this.cardSequencer.deleteCurrentQuestion(); + } + + private deleteCurrentCard(): void { + this.cardSequencer.deleteCurrentCard(); + } + + async processReview(response: ReviewResponse): Promise { + switch (this.reviewMode) { + case FlashcardReviewMode.Review: + await this.processReview_ReviewMode(response); + break; + + case FlashcardReviewMode.Cram: + await this.processReview_CramMode(response); + break; + } + } + + async processReview_ReviewMode(response: ReviewResponse): Promise { + this.currentCard.scheduleInfo = this.determineCardSchedule(response, this.currentCard); + + // Update the source file with the updated schedule + await this.currentQuestion.writeQuestion(this.settings); + + // Move/delete the card + if (response == ReviewResponse.Reset) { + this.cardSequencer.moveCurrentCardToEndOfList(); + this.cardSequencer.nextCard(); + } else this.deleteCurrentCard(); + } + + async processReview_CramMode(response: ReviewResponse): Promise { + if (response == ReviewResponse.Easy) this.deleteCurrentCard(); + else { + this.cardSequencer.moveCurrentCardToEndOfList(); + this.cardSequencer.nextCard(); + } + } + + determineCardSchedule(response: ReviewResponse, card: Card): CardScheduleInfo { + let result: CardScheduleInfo; + + if (response == ReviewResponse.Reset) { + // Resetting the card schedule + result = this.cardScheduleCalculator.getResetCardSchedule(); + } else { + // scheduled card + if (card.hasSchedule) { + result = this.cardScheduleCalculator.calcUpdatedSchedule( + response, + card.scheduleInfo, + ); + } else { + const currentNote: Note = card.question.note; + result = this.cardScheduleCalculator.getNewCardSchedule( + response, + currentNote.filePath, + ); + } + } + return result; + } + + async updateCurrentQuestionText(text: string): Promise { + const q: QuestionText = this.currentQuestion.questionText; + + q.actualQuestion = text; + + await this.currentQuestion.writeQuestion(this.settings); + } +} diff --git a/src/Note.ts b/src/Note.ts new file mode 100644 index 00000000..46ae5cb8 --- /dev/null +++ b/src/Note.ts @@ -0,0 +1,51 @@ +import { SRSettings } from "./settings"; +import { Deck } from "./Deck"; +import { Question } from "./Question"; +import { ISRFile } from "./SRFile"; + +export class Note { + file: ISRFile; + questionList: Question[]; + + get hasChanged(): boolean { + return this.questionList.some((question) => question.hasChanged); + } + + get filePath(): string { + return this.file.path; + } + + constructor(file: ISRFile, questionList: Question[]) { + this.file = file; + this.questionList = questionList; + questionList.forEach((question) => (question.note = this)); + } + + appendCardsToDeck(deck: Deck): void { + for (const question of this.questionList) { + for (const card of question.cards) { + deck.appendCard(question.topicPath, card); + } + } + } + + debugLogToConsole(desc: string = "") { + let str: string = `Note: ${desc}: ${this.questionList.length} questions\r\n`; + for (let i = 0; i < this.questionList.length; i++) { + const q: Question = this.questionList[i]; + str += `[${i}]: ${q.questionType}: ${q.lineNo}: ${q.topicPath?.path}: ${q.questionText.original}\r\n`; + } + console.debug(str); + } + + async writeNoteFile(settings: SRSettings): Promise { + let fileText: string = await this.file.read(); + for (const question of this.questionList) { + if (question.hasChanged) { + fileText = question.updateQuestionText(fileText, settings); + } + } + await this.file.write(fileText); + this.questionList.forEach((question) => (question.hasChanged = false)); + } +} diff --git a/src/NoteEaseCalculator.ts b/src/NoteEaseCalculator.ts new file mode 100644 index 00000000..24cc1bee --- /dev/null +++ b/src/NoteEaseCalculator.ts @@ -0,0 +1,31 @@ +import { Note } from "./Note"; +import { SRSettings } from "./settings"; + +export class NoteEaseCalculator { + static Calculate(note: Note, settings: SRSettings): number { + let totalEase: number = 0; + let scheduledCount: number = 0; + + note.questionList.forEach((question) => { + question.cards + .filter((card) => card.hasSchedule) + .forEach((card) => { + totalEase += card.scheduleInfo.ease; + scheduledCount++; + }); + }); + + let result: number = 0; + if (scheduledCount > 0) { + const flashcardsInNoteAvgEase: number = totalEase / scheduledCount; + const flashcardContribution: number = Math.min( + 1.0, + Math.log(scheduledCount + 0.5) / Math.log(64), + ); + result = + flashcardsInNoteAvgEase * flashcardContribution + + settings.baseEase * (1.0 - flashcardContribution); + } + return result; + } +} diff --git a/src/NoteEaseList.ts b/src/NoteEaseList.ts new file mode 100644 index 00000000..d69d97bd --- /dev/null +++ b/src/NoteEaseList.ts @@ -0,0 +1,36 @@ +import { SRSettings } from "./settings"; + +export interface INoteEaseList { + hasEaseForPath(path: string): boolean; + getEaseByPath(path: string): number; + setEaseForPath(path: string, ease: number): void; +} + +export class NoteEaseList implements INoteEaseList { + settings: SRSettings; + dict: Record = {}; + + constructor(settings: SRSettings) { + this.settings = settings; + } + + get baseEase() { + return this.settings.baseEase; + } + + hasEaseForPath(path: string): boolean { + return Object.prototype.hasOwnProperty.call(this.dict, path); + } + + getEaseByPath(path: string): number { + let ease: number = this.baseEase; + if (this.hasEaseForPath(path)) { + ease = Math.round(this.dict[path]); + } + return ease; + } + + setEaseForPath(path: string, ease: number): void { + this.dict[path] = ease; + } +} diff --git a/src/NoteFileLoader.ts b/src/NoteFileLoader.ts new file mode 100644 index 00000000..83ed69e9 --- /dev/null +++ b/src/NoteFileLoader.ts @@ -0,0 +1,32 @@ +import { ISRFile } from "./SRFile"; +import { Note } from "./Note"; +import { Question } from "./Question"; +import { TopicPath } from "./TopicPath"; +import { NoteQuestionParser } from "./NoteQuestionParser"; +import { SRSettings } from "./settings"; + +export class NoteFileLoader { + fileText: string; + fixesMade: boolean; + noteTopicPath: TopicPath; + noteFile: ISRFile; + settings: SRSettings; + + constructor(settings: SRSettings) { + this.settings = settings; + } + + async load(noteFile: ISRFile, noteTopicPath: TopicPath): Promise { + this.noteFile = noteFile; + + const questionParser: NoteQuestionParser = new NoteQuestionParser(this.settings); + + const questionList: Question[] = await questionParser.createQuestionList( + noteFile, + noteTopicPath, + ); + + const result: Note = new Note(noteFile, questionList); + return result; + } +} diff --git a/src/NoteParser.ts b/src/NoteParser.ts new file mode 100644 index 00000000..01a00ab6 --- /dev/null +++ b/src/NoteParser.ts @@ -0,0 +1,22 @@ +import { NoteQuestionParser } from "./NoteQuestionParser"; +import { ISRFile } from "./SRFile"; +import { Note } from "./Note"; +import { SRSettings } from "./settings"; +import { TopicPath } from "./TopicPath"; + +export class NoteParser { + settings: SRSettings; + noteText: string; + + constructor(settings: SRSettings) { + this.settings = settings; + } + + async parse(noteFile: ISRFile, folderTopicPath: TopicPath): Promise { + const questionParser: NoteQuestionParser = new NoteQuestionParser(this.settings); + const questions = await questionParser.createQuestionList(noteFile, folderTopicPath); + + const result: Note = new Note(noteFile, questions); + return result; + } +} diff --git a/src/NoteQuestionParser.ts b/src/NoteQuestionParser.ts new file mode 100644 index 00000000..1f8c01b6 --- /dev/null +++ b/src/NoteQuestionParser.ts @@ -0,0 +1,147 @@ +import { Card } from "./Card"; +import { CardScheduleInfo, NoteCardScheduleParser } from "./CardSchedule"; +import { parse } from "./parser"; +import { CardType, Question } from "./Question"; +import { CardFrontBack, CardFrontBackUtil } from "./QuestionType"; +import { SRSettings } from "./settings"; +import { ISRFile } from "./SRFile"; +import { TopicPath } from "./TopicPath"; + +export class ParsedQuestionInfo { + cardType: CardType; + cardText: string; + lineNo: number; + + constructor(cardType: CardType, cardText: string, lineNo: number) { + this.cardType = cardType; + this.cardText = cardText; + this.lineNo = lineNo; + } +} + +export class NoteQuestionParser { + settings: SRSettings; + noteFile: ISRFile; + noteTopicPath: TopicPath; + noteText: string; + + constructor(settings: SRSettings) { + this.settings = settings; + } + + async createQuestionList(noteFile: ISRFile, folderTopicPath: TopicPath): Promise { + this.noteFile = noteFile; + const noteText: string = await noteFile.read(); + let noteTopicPath: TopicPath; + if (this.settings.convertFoldersToDecks) { + noteTopicPath = folderTopicPath; + } else { + const tagList: string[] = noteFile.getAllTags(); + noteTopicPath = this.determineTopicPathFromTags(tagList); + } + const result: Question[] = this.doCreateQuestionList(noteText, noteTopicPath); + return result; + } + + private doCreateQuestionList(noteText: string, noteTopicPath: TopicPath): Question[] { + this.noteText = noteText; + this.noteTopicPath = noteTopicPath; + + const result: Question[] = []; + const parsedQuestionInfoList: [CardType, string, number][] = this.parseQuestions(); + for (const t of parsedQuestionInfoList) { + const parsedQuestionInfo: ParsedQuestionInfo = new ParsedQuestionInfo(t[0], t[1], t[2]); + const question: Question = this.createQuestionObject(parsedQuestionInfo); + + // Each rawCardText can turn into multiple CardFrontBack's (e.g. CardType.Cloze, CardType.SingleLineReversed) + const cardFrontBackList: CardFrontBack[] = CardFrontBackUtil.expand( + question.questionType, + question.questionText.actualQuestion, + this.settings, + ); + + // And if the card has been reviewed, then scheduling info as well + let cardScheduleInfoList: CardScheduleInfo[] = + NoteCardScheduleParser.createCardScheduleInfoList(question.questionText.original); + + // we have some extra scheduling dates to delete + const correctLength = cardFrontBackList.length; + if (cardScheduleInfoList.length > correctLength) { + question.hasChanged = true; + cardScheduleInfoList = cardScheduleInfoList.slice(0, correctLength); + } + + // Create the list of card objects, and attach to the question + const cardList: Card[] = this.createCardList(cardFrontBackList, cardScheduleInfoList); + question.setCardList(cardList); + result.push(question); + } + return result; + } + + private parseQuestions(): [CardType, string, number][] { + const settings: SRSettings = this.settings; + const result: [CardType, string, number][] = parse( + this.noteText, + settings.singleLineCardSeparator, + settings.singleLineReversedCardSeparator, + settings.multilineCardSeparator, + settings.multilineReversedCardSeparator, + settings.convertHighlightsToClozes, + settings.convertBoldTextToClozes, + settings.convertCurlyBracketsToClozes, + ); + return result; + } + + private createQuestionObject(parsedQuestionInfo: ParsedQuestionInfo): Question { + const { cardType, cardText, lineNo } = parsedQuestionInfo; + + const questionContext: string[] = this.noteFile.getQuestionContext(lineNo); + const result = Question.Create( + this.settings, + cardType, + this.noteTopicPath, + cardText, + lineNo, + questionContext, + ); + return result; + } + + private createCardList( + cardFrontBackList: CardFrontBack[], + cardScheduleInfoList: CardScheduleInfo[], + ): Card[] { + const siblings: Card[] = []; + + // One card for each CardFrontBack, regardless if there is scheduled info for it + for (let i = 0; i < cardFrontBackList.length; i++) { + const { front, back } = cardFrontBackList[i]; + + const hasScheduleInfo: boolean = i < cardScheduleInfoList.length; + const cardObj: Card = new Card({ + front, + back, + cardIdx: i, + }); + cardObj.scheduleInfo = hasScheduleInfo ? cardScheduleInfoList[i] : null; + + siblings.push(cardObj); + } + return siblings; + } + + private determineTopicPathFromTags(tagList: string[]): TopicPath { + let result: TopicPath = TopicPath.emptyPath; + outer: for (const tagToReview of this.settings.flashcardTags) { + for (const tag of tagList) { + if (tag === tagToReview || tag.startsWith(tagToReview + "/")) { + result = TopicPath.getTopicPathFromTag(tag); + break outer; + } + } + } + return result; + } +} diff --git a/src/Question.ts b/src/Question.ts new file mode 100644 index 00000000..82948c10 --- /dev/null +++ b/src/Question.ts @@ -0,0 +1,223 @@ +import { Card } from "./Card"; +import { CardScheduleInfo, NoteCardScheduleParser } from "./CardSchedule"; +import { SR_HTML_COMMENT_BEGIN, SR_HTML_COMMENT_END } from "./constants"; +import { Note } from "./Note"; +import { SRSettings } from "./settings"; +import { TopicPath } from "./TopicPath"; +import { MultiLineTextFinder } from "./util/MultiLineTextFinder"; +import { cyrb53 } from "./util/utils"; + +export enum CardType { + SingleLineBasic, + SingleLineReversed, + MultiLineBasic, + MultiLineReversed, + Cloze, +} + +// +// QuestionText comprises the following components: +// 1. QuestionTopicPath (optional) +// 2. Actual question text (mandatory) +// 3. Card schedule info as HTML comment (optional) +// +// For example +// +// Actual question text only: +// Q1::A1 +// +// Question text with topic path: +// #flashcards/science Q2::A2 +// +// Question text with card schedule info: +// #flashcards/science Q2::A2 +// +export class QuestionText { + // Complete text including all components, as read from file + original: string; + + // The question topic path (only present if topic path included in original text) + topicPath: TopicPath; + + // The white space after the topic path, before the actualQuestion + // We keep this so that when a question is updated, we can retain the original spacing + postTopicPathWhiteSpace: string; + + // Just the question text, e.g. "Q1::A1" + actualQuestion: string; + + // Hash of string (topicPath + actualQuestion) + // Explicitly excludes the HTML comment with the scheduling info + textHash: string; + + constructor( + original: string, + topicPath: TopicPath, + postTopicPathWhiteSpace: string, + actualQuestion: string, + ) { + this.original = original; + this.topicPath = topicPath; + this.postTopicPathWhiteSpace = postTopicPathWhiteSpace; + this.actualQuestion = actualQuestion; + this.textHash = cyrb53(this.formatForNote()); + } + + endsWithCodeBlock(): boolean { + return this.actualQuestion.endsWith("```"); + } + + static create(original: string, settings: SRSettings): QuestionText { + const [topicPath, postTopicPathWhiteSpace, actualQuestion] = this.splitText( + original, + settings, + ); + + return new QuestionText(original, topicPath, postTopicPathWhiteSpace, actualQuestion); + } + + static splitText(original: string, settings: SRSettings): [TopicPath, string, string] { + const strippedSR = NoteCardScheduleParser.removeCardScheduleInfo(original).trim(); + let actualQuestion: string = strippedSR; + let whiteSpace: string = ""; + + let topicPath: TopicPath = TopicPath.emptyPath; + if (!settings.convertFoldersToDecks) { + const t = TopicPath.getTopicPathFromCardText(strippedSR); + if (t?.hasPath) { + topicPath = t; + [actualQuestion, whiteSpace] = + TopicPath.removeTopicPathFromStartOfCardText(strippedSR); + } + } + + return [topicPath, whiteSpace, actualQuestion]; + } + + formatForNote(): string { + let result: string = ""; + if (this.topicPath.hasPath) { + result += this.topicPath.formatAsTag(); + result += this.postTopicPathWhiteSpace ?? " "; + } + result += this.actualQuestion; + return result; + } +} + +export class Question { + note: Note; + questionType: CardType; + topicPath: TopicPath; + questionText: QuestionText; + lineNo: number; + hasEditLaterTag: boolean; + questionContext: string[]; + cards: Card[]; + hasChanged: boolean; + + constructor(init?: Partial) { + Object.assign(this, init); + } + + getHtmlCommentSeparator(settings: SRSettings): string { + let sep: string = settings.cardCommentOnSameLine ? " " : "\n"; + // Override separator if last block is a codeblock + if (this.questionText.endsWithCodeBlock() && sep !== "\n") { + sep = "\n"; + } + return sep; + } + + setCardList(cards: Card[]): void { + this.cards = cards; + this.cards.forEach((card) => (card.question = this)); + } + + formatScheduleAsHtmlComment(settings: SRSettings): string { + let result: string = SR_HTML_COMMENT_BEGIN; + + // We always want the correct schedule format, so we use this if there is no schedule for a card + + for (let i = 0; i < this.cards.length; i++) { + const card: Card = this.cards[i]; + const schedule: CardScheduleInfo = card.hasSchedule + ? card.scheduleInfo + : CardScheduleInfo.getDummySchedule(settings); + result += schedule.formatSchedule(); + } + result += SR_HTML_COMMENT_END; + return result; + } + + formatForNote(settings: SRSettings): string { + let result: string = this.questionText.formatForNote(); + if (this.cards.some((card) => card.hasSchedule)) { + result += + this.getHtmlCommentSeparator(settings) + this.formatScheduleAsHtmlComment(settings); + } + return result; + } + + updateQuestionText(noteText: string, settings: SRSettings): string { + const originalText: string = this.questionText.original; + + // Get the entire text for the question including: + // 1. the topic path (if present), + // 2. the question text + // 3. the schedule HTML comment (if present) + const replacementText = this.formatForNote(settings); + + let newText = MultiLineTextFinder.findAndReplace(noteText, originalText, replacementText); + if (newText) { + this.questionText = QuestionText.create(replacementText, settings); + } else { + console.error( + `updateQuestionText: Text not found: ${originalText.substring( + 0, + 100, + )} in note: ${noteText.substring(0, 100)}`, + ); + newText = noteText; + } + return newText; + } + + async writeQuestion(settings: SRSettings): Promise { + const fileText: string = await this.note.file.read(); + + const newText: string = this.updateQuestionText(fileText, settings); + await this.note.file.write(newText); + this.hasChanged = false; + } + + static Create( + settings: SRSettings, + questionType: CardType, + noteTopicPath: TopicPath, + originalText: string, + lineNo: number, + context: string[], + ): Question { + const hasEditLaterTag = originalText.includes(settings.editLaterTag); + const questionText: QuestionText = QuestionText.create(originalText, settings); + + let topicPath: TopicPath = noteTopicPath; + if (questionText.topicPath.hasPath) { + topicPath = questionText.topicPath; + } + + const result: Question = new Question({ + questionType, + topicPath, + questionText, + lineNo, + hasEditLaterTag, + questionContext: context, + cards: null, + hasChanged: false, + }); + + return result; + } +} diff --git a/src/QuestionPostponementList.ts b/src/QuestionPostponementList.ts new file mode 100644 index 00000000..07bcd19d --- /dev/null +++ b/src/QuestionPostponementList.ts @@ -0,0 +1,38 @@ +import { Question } from "./Question"; +import SRPlugin from "./main"; +import { SRSettings } from "./settings"; + +export interface IQuestionPostponementList { + clear(): void; + addIfRequired(question: Question): void; + includes(question: Question): boolean; + write(): Promise; +} + +export class QuestionPostponementList implements IQuestionPostponementList { + list: string[]; + plugin: SRPlugin; + settings: SRSettings; + + constructor(plugin: SRPlugin, settings: SRSettings, list: string[]) { + this.plugin = plugin; + this.settings = settings; + this.list = list; + } + + clear(): void { + this.list = []; + } + + addIfRequired(question: Question): void { + if (this.settings.burySiblingCards) this.list.push(question.questionText.textHash); + } + + includes(question: Question): boolean { + return this.list.includes(question.questionText.textHash); + } + + async write(): Promise { + await this.plugin.savePluginData(); + } +} diff --git a/src/QuestionType.ts b/src/QuestionType.ts new file mode 100644 index 00000000..2592d07b --- /dev/null +++ b/src/QuestionType.ts @@ -0,0 +1,171 @@ +import { CardType } from "./Question"; +import { SRSettings } from "./settings"; + +export class CardFrontBack { + front: string; + back: string; + + constructor(front: string, back: string) { + this.front = front.trim(); + this.back = back.trim(); + } +} + +export class CardFrontBackUtil { + static expand( + questionType: CardType, + questionText: string, + settings: SRSettings, + ): CardFrontBack[] { + const handler: IQuestionTypeHandler = QuestionTypeFactory.create(questionType); + return handler.expand(questionText, settings); + } +} + +export interface IQuestionTypeHandler { + expand(questionText: string, settings: SRSettings): CardFrontBack[]; +} + +class QuestionType_SingleLineBasic implements IQuestionTypeHandler { + expand(questionText: string, settings: SRSettings): CardFrontBack[] { + const idx: number = questionText.indexOf(settings.singleLineCardSeparator); + const item: CardFrontBack = new CardFrontBack( + questionText.substring(0, idx), + questionText.substring(idx + settings.singleLineCardSeparator.length), + ); + const result: CardFrontBack[] = [item]; + return result; + } +} + +class QuestionType_SingleLineReversed implements IQuestionTypeHandler { + expand(questionText: string, settings: SRSettings): CardFrontBack[] { + const idx: number = questionText.indexOf(settings.singleLineReversedCardSeparator); + const side1: string = questionText.substring(0, idx), + side2: string = questionText.substring( + idx + settings.singleLineReversedCardSeparator.length, + ); + const result: CardFrontBack[] = [ + new CardFrontBack(side1, side2), + new CardFrontBack(side2, side1), + ]; + return result; + } +} + +class QuestionType_MultiLineBasic implements IQuestionTypeHandler { + expand(questionText: string, settings: SRSettings): CardFrontBack[] { + const idx = questionText.indexOf("\n" + settings.multilineCardSeparator + "\n"); + const item: CardFrontBack = new CardFrontBack( + questionText.substring(0, idx), + questionText.substring(idx + 2 + settings.multilineCardSeparator.length), + ); + const result: CardFrontBack[] = [item]; + return result; + } +} + +class QuestionType_MultiLineReversed implements IQuestionTypeHandler { + expand(questionText: string, settings: SRSettings): CardFrontBack[] { + const idx = questionText.indexOf("\n" + settings.multilineReversedCardSeparator + "\n"); + const side1: string = questionText.substring(0, idx), + side2: string = questionText.substring( + idx + 2 + settings.multilineReversedCardSeparator.length, + ); + + const result: CardFrontBack[] = [ + new CardFrontBack(side1, side2), + new CardFrontBack(side2, side1), + ]; + return result; + } +} + +class QuestionType_Cloze implements IQuestionTypeHandler { + expand(questionText: string, settings: SRSettings): CardFrontBack[] { + const siblings: RegExpMatchArray[] = []; + if (settings.convertHighlightsToClozes) { + siblings.push(...questionText.matchAll(/==(.*?)==/gm)); + } + if (settings.convertBoldTextToClozes) { + siblings.push(...questionText.matchAll(/\*\*(.*?)\*\*/gm)); + } + if (settings.convertCurlyBracketsToClozes) { + siblings.push(...questionText.matchAll(/{{(.*?)}}/gm)); + } + siblings.sort((a, b) => { + if (a.index < b.index) { + return -1; + } + if (a.index > b.index) { + return 1; + } + // What is unit test to cover following statement; otherwise jest please ignore + return 0; + }); + + let front: string, back: string; + const result: CardFrontBack[] = []; + for (const m of siblings) { + const deletionStart: number = m.index, + deletionEnd: number = deletionStart + m[0].length; + front = + questionText.substring(0, deletionStart) + + QuestionType_ClozeUtil.renderClozeFront() + + questionText.substring(deletionEnd); + front = front + .replace(/==/gm, "") + .replace(/\*\*/gm, "") + .replace(/{{/gm, "") + .replace(/}}/gm, ""); + back = + questionText.substring(0, deletionStart) + + QuestionType_ClozeUtil.renderClozeBack( + questionText.substring(deletionStart, deletionEnd), + ) + + questionText.substring(deletionEnd); + back = back + .replace(/==/gm, "") + .replace(/\*\*/gm, "") + .replace(/{{/gm, "") + .replace(/}}/gm, ""); + result.push(new CardFrontBack(front, back)); + } + + return result; + } +} + +export class QuestionType_ClozeUtil { + static renderClozeFront(): string { + return "[...]"; + } + + static renderClozeBack(str: string): string { + return "" + str + ""; + } +} + +export class QuestionTypeFactory { + static create(questionType: CardType): IQuestionTypeHandler { + let handler: IQuestionTypeHandler; + switch (questionType) { + case CardType.SingleLineBasic: + handler = new QuestionType_SingleLineBasic(); + break; + case CardType.SingleLineReversed: + handler = new QuestionType_SingleLineReversed(); + break; + case CardType.MultiLineBasic: + handler = new QuestionType_MultiLineBasic(); + break; + case CardType.MultiLineReversed: + handler = new QuestionType_MultiLineReversed(); + break; + case CardType.Cloze: + handler = new QuestionType_Cloze(); + break; + } + return handler; + } +} diff --git a/src/review-deck.ts b/src/ReviewDeck.ts similarity index 100% rename from src/review-deck.ts rename to src/ReviewDeck.ts diff --git a/src/SRFile.ts b/src/SRFile.ts new file mode 100644 index 00000000..46378070 --- /dev/null +++ b/src/SRFile.ts @@ -0,0 +1,109 @@ +import { + MetadataCache, + TFile, + Vault, + getAllTags as ObsidianGetAllTags, + HeadingCache, +} from "obsidian"; +import { getAllTagsFromText } from "./util/utils"; + +export interface ISRFile { + get path(): string; + get basename(): string; + getAllTags(): string[]; + getQuestionContext(cardLine: number): string[]; + read(): Promise; + write(content: string): Promise; +} + +export class SrTFile implements ISRFile { + file: TFile; + vault: Vault; + metadataCache: MetadataCache; + + constructor(vault: Vault, metadataCache: MetadataCache, file: TFile) { + this.vault = vault; + this.metadataCache = metadataCache; + this.file = file; + } + + get path(): string { + return this.file.path; + } + + get basename(): string { + return this.file.basename; + } + + getAllTags(): string[] { + const fileCachedData = this.metadataCache.getFileCache(this.file) || {}; + return ObsidianGetAllTags(fileCachedData) || []; + } + + getQuestionContext(cardLine: number): string[] { + const fileCachedData = this.metadataCache.getFileCache(this.file) || {}; + const headings: HeadingCache[] = fileCachedData.headings || []; + const stack: HeadingCache[] = []; + for (const heading of headings) { + if (heading.position.start.line > cardLine) { + break; + } + + while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) { + stack.pop(); + } + + stack.push(heading); + } + + const result = []; + for (const headingObj of stack) { + headingObj.heading = headingObj.heading.replace(/\[\^\d+\]/gm, "").trim(); + result.push(headingObj.heading); + } + return result; + } + + async read(): Promise { + return await this.vault.read(this.file); + } + + async write(content: string): Promise { + await this.vault.modify(this.file, content); + } +} + +export class UnitTestSRFile implements ISRFile { + content: string; + _path: string; + + constructor(content: string, path: string = null) { + this.content = content; + this._path = path; + } + + get path(): string { + return this._path; + } + + get basename(): string { + return ""; + } + + getAllTags(): string[] { + return getAllTagsFromText(this.content); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getQuestionContext(cardLine: number): string[] { + return []; + } + + async read(): Promise { + return this.content; + } + + async write(content: string): Promise { + this.content = content; + } +} diff --git a/src/TopicPath.ts b/src/TopicPath.ts new file mode 100644 index 00000000..23914066 --- /dev/null +++ b/src/TopicPath.ts @@ -0,0 +1,120 @@ +import { SRSettings } from "src/settings"; +import { OBSIDIAN_TAG_AT_STARTOFLINE_REGEX } from "./constants"; +import { ISRFile } from "./SRFile"; + +export class TopicPath { + path: string[]; + + constructor(path: string[]) { + if (path == null) throw "null path"; + if (path.some((str) => str.includes("/"))) throw "path entries must not contain '/'"; + this.path = path; + } + + get hasPath(): boolean { + return this.path.length > 0; + } + + get isEmptyPath(): boolean { + return !this.hasPath; + } + + static get emptyPath(): TopicPath { + return new TopicPath([]); + } + + shift(): string { + if (this.isEmptyPath) throw "can't shift an empty path"; + return this.path.shift(); + } + + clone(): TopicPath { + return new TopicPath([...this.path]); + } + + formatAsTag(): string { + if (this.isEmptyPath) throw "Empty path"; + const result = "#" + this.path.join("/"); + return result; + } + + static getTopicPathOfFile(noteFile: ISRFile, settings: SRSettings): TopicPath { + let deckPath: string[] = []; + let result: TopicPath = TopicPath.emptyPath; + + if (settings.convertFoldersToDecks) { + deckPath = noteFile.path.split("/"); + deckPath.pop(); // remove filename + if (deckPath.length != 0) { + result = new TopicPath(deckPath); + } + } else { + const tagList: TopicPath[] = this.getTopicPathsFromTagList(noteFile.getAllTags()); + + outer: for (const tagToReview of this.getTopicPathsFromTagList( + settings.flashcardTags, + )) { + for (const tag of tagList) { + if (tagToReview.isSameOrAncestorOf(tag)) { + result = tag; + break outer; + } + } + } + } + + return result; + } + + isSameOrAncestorOf(topicPath: TopicPath): boolean { + if (this.isEmptyPath) return topicPath.isEmptyPath; + if (this.path.length > topicPath.path.length) return false; + for (let i = 0; i < this.path.length; i++) { + if (this.path[i] != topicPath.path[i]) return false; + } + return true; + } + + static getTopicPathFromCardText(cardText: string): TopicPath { + const path = cardText.trimStart().match(OBSIDIAN_TAG_AT_STARTOFLINE_REGEX)?.slice(-1)[0]; + return path?.length > 0 ? TopicPath.getTopicPathFromTag(path) : null; + } + + static removeTopicPathFromStartOfCardText(cardText: string): [string, string] { + const cardText1: string = cardText + .trimStart() + .replaceAll(OBSIDIAN_TAG_AT_STARTOFLINE_REGEX, ""); + const cardText2: string = cardText1.trimStart(); + const whiteSpaceLength: number = cardText1.length - cardText2.length; + const whiteSpace: string = cardText1.substring(0, whiteSpaceLength); + return [cardText2, whiteSpace]; + } + + static getTopicPathsFromTagList(tagList: string[]): TopicPath[] { + const result: TopicPath[] = []; + for (const tag of tagList) { + if (this.isValidTag(tag)) result.push(TopicPath.getTopicPathFromTag(tag)); + } + return result; + } + + static isValidTag(tag: string): boolean { + if (tag == null || tag.length == 0) return false; + if (tag[0] != "#") return false; + if (tag.length == 1) return false; + + return true; + } + + static getTopicPathFromTag(tag: string): TopicPath { + if (tag == null || tag.length == 0) throw "Null/empty tag"; + if (tag[0] != "#") throw "Tag must start with #"; + if (tag.length == 1) throw "Invalid tag"; + + const path: string[] = tag + .replace("#", "") + .split("/") + .filter((str) => str); + return new TopicPath(path); + } +} diff --git a/src/constants.ts b/src/constants.ts index b7d4cd87..e3752c0c 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -4,6 +4,9 @@ export const YAML_FRONT_MATTER_REGEX = /^---\n((?:.*\n)*?)---/; export const MULTI_SCHEDULING_EXTRACTOR = /!([\d-]+),(\d+),(\d+)/gm; export const LEGACY_SCHEDULING_EXTRACTOR = //gm; +export const OBSIDIAN_TAG_AT_STARTOFLINE_REGEX = /^#[^\s#]+/gi; +export const PREFERRED_DATE_FORMAT = "YYYY-MM-DD"; +export const ALLOWED_DATE_FORMATS = [PREFERRED_DATE_FORMAT, "DD-MM-YYYY", "ddd MMM DD YYYY"]; export const IMAGE_FORMATS = [ "jpg", @@ -24,3 +27,8 @@ export const VIDEO_FORMATS = ["mp4", "mkv", "avi", "mov"]; export const COLLAPSE_ICON = ''; + +export const TICKS_PER_DAY = 24 * 3600 * 1000; + +export const SR_HTML_COMMENT_BEGIN = ""; diff --git a/src/flashcard-modal.tsx b/src/flashcard-modal.tsx deleted file mode 100644 index df65fc29..00000000 --- a/src/flashcard-modal.tsx +++ /dev/null @@ -1,1066 +0,0 @@ -import { - ButtonComponent, - Modal, - App, - MarkdownRenderer, - Notice, - Platform, - TFile, - TextAreaComponent, - setIcon, -} from "obsidian"; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import h from "vhtml"; - -import type SRPlugin from "src/main"; -import { Card, CardType, schedule, textInterval, ReviewResponse } from "src/scheduling"; -import { - COLLAPSE_ICON, - MULTI_SCHEDULING_EXTRACTOR, - LEGACY_SCHEDULING_EXTRACTOR, - IMAGE_FORMATS, - AUDIO_FORMATS, - VIDEO_FORMATS, -} from "src/constants"; -import { escapeRegexString, cyrb53 } from "src/utils"; -import { t } from "src/lang/helpers"; -import { DataLocation } from "./settings"; - -export enum FlashcardModalMode { - DecksList, - Front, - Back, - Closed, -} - -// from https://github.com/chhoumann/quickadd/blob/bce0b4cdac44b867854d6233796e3406dfd163c6/src/gui/GenericInputPrompt/GenericInputPrompt.ts#L5 -export class FlashcardEditModal extends Modal { - public plugin: SRPlugin; - public input: string; - public waitForClose: Promise; - - private resolvePromise: (input: string) => void; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private rejectPromise: (reason?: any) => void; - private didSubmit = false; - private inputComponent: TextAreaComponent; - private readonly modalText: string; - - public static Prompt(app: App, plugin: SRPlugin, placeholder: string): Promise { - const newPromptModal = new FlashcardEditModal(app, plugin, placeholder); - return newPromptModal.waitForClose; - } - constructor(app: App, plugin: SRPlugin, existingText: string) { - super(app); - this.plugin = plugin; - this.titleEl.setText(t("EDIT_CARD")); - this.titleEl.addClass("sr-centered"); - this.modalText = existingText; - - this.waitForClose = new Promise((resolve, reject) => { - this.resolvePromise = resolve; - this.rejectPromise = reject; - }); - this.display(); - this.open(); - } - - private display() { - this.contentEl.empty(); - this.modalEl.addClass("sr-flashcard-input-modal"); - - const mainContentContainer: HTMLDivElement = this.contentEl.createDiv(); - mainContentContainer.addClass("sr-flashcard-input-area"); - this.inputComponent = this.createInputField(mainContentContainer, this.modalText); - this.createButtonBar(mainContentContainer); - } - - private createButton( - container: HTMLElement, - text: string, - callback: (evt: MouseEvent) => void, - ) { - const btn = new ButtonComponent(container); - btn.setButtonText(text).onClick(callback); - return btn; - } - - private createButtonBar(mainContentContainer: HTMLDivElement) { - const buttonBarContainer: HTMLDivElement = mainContentContainer.createDiv(); - buttonBarContainer.addClass("sr-flashcard-edit-button-bar"); - this.createButton( - buttonBarContainer, - t("SAVE"), - this.submitClickCallback, - ).setCta().buttonEl.style.marginRight = "0"; - this.createButton(buttonBarContainer, t("CANCEL"), this.cancelClickCallback); - } - - protected createInputField(container: HTMLElement, value: string) { - const textComponent = new TextAreaComponent(container); - - textComponent.inputEl.style.width = "100%"; - textComponent - .setValue(value ?? "") - .onChange((value) => (this.input = value)) - .inputEl.addEventListener("keydown", this.submitEnterCallback); - - return textComponent; - } - - private submitClickCallback = (_: MouseEvent) => this.submit(); - private cancelClickCallback = (_: MouseEvent) => this.cancel(); - - private submitEnterCallback = (evt: KeyboardEvent) => { - if ((evt.ctrlKey || evt.metaKey) && evt.key === "Enter") { - evt.preventDefault(); - this.submit(); - } - }; - - private submit() { - this.didSubmit = true; - - this.close(); - } - - private cancel() { - this.close(); - } - - onOpen() { - super.onOpen(); - - this.inputComponent.inputEl.focus(); - } - - onClose() { - super.onClose(); - this.resolveInput(); - this.removeInputListener(); - } - - private resolveInput() { - if (!this.didSubmit) this.rejectPromise(t("NO_INPUT")); - else this.resolvePromise(this.input); - } - - private removeInputListener() { - this.inputComponent.inputEl.removeEventListener("keydown", this.submitEnterCallback); - } -} - -export class FlashcardModal extends Modal { - public plugin: SRPlugin; - public answerBtn: HTMLElement; - public flashcardView: HTMLElement; - public hardBtn: HTMLElement; - public goodBtn: HTMLElement; - public easyBtn: HTMLElement; - public nextBtn: HTMLElement; - public responseDiv: HTMLElement; - public resetButton: HTMLButtonElement; - public editButton: HTMLElement; - public contextView: HTMLElement; - public currentCard: Card; - public currentCardIdx: number; - public currentDeck: Deck; - public checkDeck: Deck; - public mode: FlashcardModalMode; - public ignoreStats: boolean; - - constructor(app: App, plugin: SRPlugin, ignoreStats = false) { - super(app); - - this.plugin = plugin; - this.ignoreStats = ignoreStats; - - this.titleEl.setText(t("DECKS")); - this.titleEl.addClass("sr-centered"); - - if (Platform.isMobile) { - this.contentEl.style.display = "block"; - } - this.modalEl.style.position = "relative"; - this.modalEl.style.height = this.plugin.data.settings.flashcardHeightPercentage + "%"; - this.modalEl.style.width = this.plugin.data.settings.flashcardWidthPercentage + "%"; - - this.contentEl.style.position = "relative"; - // this.contentEl.style.height = "92%"; - this.contentEl.addClass("sr-modal-content"); - - // TODO: refactor into event handler? - document.body.onkeydown = (e) => { - // TODO: Please fix this. It's ugly. - // Checks if the input textbox is in focus before processing keyboard shortcuts. - if ( - document.activeElement.nodeName !== "TEXTAREA" && - this.mode !== FlashcardModalMode.DecksList - ) { - const consume = () => { - e.preventDefault(); - e.stopPropagation(); - }; - if (this.mode !== FlashcardModalMode.Closed && e.code === "KeyS") { - this.skipCurrentCard(); - consume(); - } else if ( - this.mode === FlashcardModalMode.Front && - (e.code === "Space" || e.code === "Enter") - ) { - this.showAnswer(); - consume(); - } else if (this.mode === FlashcardModalMode.Back) { - if (e.code === "Numpad1" || e.code === "Digit1") { - this.processReview(ReviewResponse.Hard); - consume(); - } else if (e.code === "Numpad2" || e.code === "Digit2" || e.code === "Space") { - this.processReview(ReviewResponse.Good); - consume(); - } else if (e.code === "Numpad3" || e.code === "Digit3") { - this.processReview(ReviewResponse.Easy); - consume(); - } else if (e.code === "Numpad0" || e.code === "Digit0") { - this.processReview(ReviewResponse.Reset); - consume(); - } - } - } - }; - } - - onOpen(): void { - this.decksList(); - } - - onClose(): void { - this.mode = FlashcardModalMode.Closed; - } - - decksList(): void { - const aimDeck = this.plugin.deckTree.subdecks.filter( - (deck) => deck.deckName === this.plugin.data.historyDeck, - ); - if (this.plugin.data.historyDeck && aimDeck.length > 0) { - const deck = aimDeck[0]; - this.currentDeck = deck; - this.checkDeck = deck.parent; - this.setupCardsView(); - deck.nextCard(this); - return; - } - - this.mode = FlashcardModalMode.DecksList; - this.titleEl.setText(t("DECKS")); - this.titleEl.innerHTML += ( -

- - {this.plugin.deckTree.dueFlashcardsCount.toString()} - - - {this.plugin.deckTree.newFlashcardsCount.toString()} - - - {this.plugin.deckTree.totalFlashcards.toString()} - -

- ); - this.contentEl.empty(); - this.contentEl.setAttribute("id", "sr-flashcard-view"); - - for (const deck of this.plugin.deckTree.subdecks) { - deck.render(this.contentEl, this); - } - } - - setupCardsView(): void { - this.contentEl.empty(); - - const flashCardMenu = this.contentEl.createDiv("sr-flashcard-menu"); - - const backButton = flashCardMenu.createEl("button"); - backButton.addClass("sr-flashcard-menu-item"); - setIcon(backButton, "arrow-left"); - backButton.setAttribute("aria-label", t("BACK")); - backButton.addEventListener("click", () => { - this.plugin.data.historyDeck = ""; - this.decksList(); - }); - - this.editButton = flashCardMenu.createEl("button"); - this.editButton.addClass("sr-flashcard-menu-item"); - setIcon(this.editButton, "edit"); - this.editButton.setAttribute("aria-label", t("EDIT_CARD")); - this.editButton.addEventListener("click", async () => { - // remove SR info from input modal prompt - const textPromptArr = this.currentCard.cardText.split("\n"); - let textPrompt = ""; - if (textPromptArr[textPromptArr.length - 1].startsWith("`; - } else { - scheduling = [...this.currentCard.cardText.matchAll(MULTI_SCHEDULING_EXTRACTOR)]; - if (scheduling.length === 0) { - scheduling = [ - ...this.currentCard.cardText.matchAll(LEGACY_SCHEDULING_EXTRACTOR), - ]; - } - - const currCardSched: string[] = [ - "0", - dueString, - interval.toString(), - ease.toString(), - ]; - if (this.currentCard.isDue) { - scheduling[this.currentCard.siblingIdx] = currCardSched; - } else { - scheduling.push(currCardSched); - } - - this.currentCard.cardText = this.currentCard.cardText.replace(//gm, ""); - this.currentCard.cardText += ""; - } - - fileText = fileText.replace(replacementRegex, () => this.currentCard.cardText); - - await this.app.vault.modify(this.currentCard.note, fileText); - } else { - const store = this.plugin.store; - const lineNo: number = this.currentCard.lineNo; - const hash: string = cyrb53(this.currentCard.cardText); - const cardinfo = store.getAndSyncCardInfo(this.currentCard.note, lineNo, hash); - let correct = true; - if (!(response == ReviewResponse.Easy || response == ReviewResponse.Good)) { - correct = false; - } - store.setSchedbyId( - cardinfo.itemIds[this.currentCard.siblingIdx], - [0, due.valueOf(), interval, ease], - correct, - ); - } - - for (const sibling of this.currentCard.siblings) { - sibling.cardText = this.currentCard.cardText; - } - if (this.plugin.data.settings.burySiblingCards) { - this.burySiblingCards(true); - } - - this.currentDeck.nextCard(this); - } - - private async burySiblingCards(tillNextDay: boolean): Promise { - if (tillNextDay) { - this.plugin.data.buryList.push(cyrb53(this.currentCard.cardText)); - await this.plugin.savePluginData(); - } - - for (const sibling of this.currentCard.siblings) { - const dueIdx = this.currentDeck.dueFlashcards.indexOf(sibling); - const newIdx = this.currentDeck.newFlashcards.indexOf(sibling); - - if (dueIdx !== -1) { - this.currentDeck.deleteFlashcardAtIndex( - dueIdx, - this.currentDeck.dueFlashcards[dueIdx].isDue, - ); - } else if (newIdx !== -1) { - this.currentDeck.deleteFlashcardAtIndex( - newIdx, - this.currentDeck.newFlashcards[newIdx].isDue, - ); - } - } - } - - private skipCurrentCard(): void { - this.currentDeck.deleteFlashcardAtIndex(this.currentCardIdx, this.currentCard.isDue); - this.burySiblingCards(false); - this.currentDeck.nextCard(this); - } - - // slightly modified version of the renderMarkdown function in - // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/KanbanView.tsx - async renderMarkdownWrapper( - markdownString: string, - containerEl: HTMLElement, - recursiveDepth = 0, - ): Promise { - if (recursiveDepth > 4) return; - - MarkdownRenderer.renderMarkdown( - markdownString, - containerEl, - this.currentCard.note.path, - this.plugin, - ); - - containerEl.findAll(".internal-embed").forEach((el) => { - const link = this.parseLink(el.getAttribute("src")); - - // file does not exist, display dead link - if (!link.target) { - el.innerText = link.text; - } else if (link.target instanceof TFile) { - if (link.target.extension !== "md") { - this.embedMediaFile(el, link.target); - } else { - el.innerText = ""; - this.renderTransclude(el, link, recursiveDepth); - } - } - }); - } - - private parseLink(src: string) { - const linkComponentsRegex = - /^(?[^#^]+)?(?:#(?!\^)(?.+)|#\^(?.+)|#)?$/; - const matched = typeof src === "string" && src.match(linkComponentsRegex); - const file = matched.groups.file || this.currentCard.note.path; - const target = this.plugin.app.metadataCache.getFirstLinkpathDest( - file, - this.currentCard.note.path, - ); - return { - text: matched[0], - file: matched.groups.file, - heading: matched.groups.heading, - blockId: matched.groups.blockId, - target: target, - }; - } - - private embedMediaFile(el: HTMLElement, target: TFile) { - el.innerText = ""; - if (IMAGE_FORMATS.includes(target.extension)) { - el.createEl( - "img", - { - attr: { - src: this.plugin.app.vault.getResourcePath(target), - }, - }, - (img) => { - if (el.hasAttribute("width")) - img.setAttribute("width", el.getAttribute("width")); - else img.setAttribute("width", "100%"); - if (el.hasAttribute("alt")) img.setAttribute("alt", el.getAttribute("alt")); - el.addEventListener( - "click", - (ev) => - ((ev.target as HTMLElement).style.minWidth = - (ev.target as HTMLElement).style.minWidth === "100%" - ? null - : "100%"), - ); - }, - ); - el.addClasses(["image-embed", "is-loaded"]); - } else if ( - AUDIO_FORMATS.includes(target.extension) || - VIDEO_FORMATS.includes(target.extension) - ) { - el.createEl( - AUDIO_FORMATS.includes(target.extension) ? "audio" : "video", - { - attr: { - controls: "", - src: this.plugin.app.vault.getResourcePath(target), - }, - }, - (audio) => { - if (el.hasAttribute("alt")) audio.setAttribute("alt", el.getAttribute("alt")); - }, - ); - el.addClasses(["media-embed", "is-loaded"]); - } else { - el.innerText = target.path; - } - } - - private async renderTransclude( - el: HTMLElement, - link: { - text: string; - file: string; - heading: string; - blockId: string; - target: TFile; - }, - recursiveDepth: number, - ) { - const cache = this.app.metadataCache.getCache(link.target.path); - const text = await this.app.vault.cachedRead(link.target); - let blockText; - if (link.heading) { - const clean = (s: string) => s.replace(/[\W\s]/g, ""); - const headingIndex = cache.headings?.findIndex( - (h) => clean(h.heading) === clean(link.heading), - ); - const heading = cache.headings[headingIndex]; - - const startAt = heading.position.start.offset; - const endAt = - cache.headings.slice(headingIndex + 1).find((h) => h.level <= heading.level) - ?.position?.start?.offset || text.length; - - blockText = text.substring(startAt, endAt); - } else if (link.blockId) { - const block = cache.blocks[link.blockId]; - const startAt = block.position.start.offset; - const endAt = block.position.end.offset; - blockText = text.substring(startAt, endAt); - } else { - blockText = text; - } - - this.renderMarkdownWrapper(blockText, el, recursiveDepth + 1); - } -} - -export class Deck { - public deckName: string; - public newFlashcards: Card[]; - public newFlashcardsCount = 0; // counts those in subdecks too - public dueFlashcards: Card[]; - public dueFlashcardsCount = 0; // counts those in subdecks too - public totalFlashcards = 0; // counts those in subdecks too - public subdecks: Deck[]; - public parent: Deck | null; - - constructor(deckName: string, parent: Deck | null) { - this.deckName = deckName; - this.newFlashcards = []; - this.newFlashcardsCount = 0; - this.dueFlashcards = []; - this.dueFlashcardsCount = 0; - this.totalFlashcards = 0; - this.subdecks = []; - this.parent = parent; - } - - createDeck(deckPath: string[]): void { - if (deckPath.length === 0) { - return; - } - - const deckName: string = deckPath.shift(); - for (const deck of this.subdecks) { - if (deckName === deck.deckName) { - deck.createDeck(deckPath); - return; - } - } - - const deck: Deck = new Deck(deckName, this); - this.subdecks.push(deck); - deck.createDeck(deckPath); - } - - insertFlashcard(deckPath: string[], cardObj: Card): void { - if (cardObj.isDue) { - this.dueFlashcardsCount++; - } else { - this.newFlashcardsCount++; - } - this.totalFlashcards++; - - if (deckPath.length === 0) { - if (cardObj.isDue) { - this.dueFlashcards.push(cardObj); - } else { - this.newFlashcards.push(cardObj); - } - return; - } - - const deckName: string = deckPath.shift(); - for (const deck of this.subdecks) { - if (deckName === deck.deckName) { - deck.insertFlashcard(deckPath, cardObj); - return; - } - } - } - - // count flashcards that have either been buried - // or aren't due yet - countFlashcard(deckPath: string[], n = 1): void { - this.totalFlashcards += n; - - const deckName: string = deckPath.shift(); - for (const deck of this.subdecks) { - if (deckName === deck.deckName) { - deck.countFlashcard(deckPath, n); - return; - } - } - } - - deleteFlashcardAtIndex(index: number, cardIsDue: boolean): void { - if (cardIsDue) { - this.dueFlashcards.splice(index, 1); - this.dueFlashcardsCount--; - } else { - this.newFlashcards.splice(index, 1); - this.newFlashcardsCount--; - } - - let deck: Deck = this.parent; - while (deck !== null) { - if (cardIsDue) { - deck.dueFlashcardsCount--; - } else { - deck.newFlashcardsCount--; - } - deck = deck.parent; - } - } - - sortSubdecksList(): void { - this.subdecks.sort((a, b) => { - if (a.deckName < b.deckName) { - return -1; - } else if (a.deckName > b.deckName) { - return 1; - } - return 0; - }); - - for (const deck of this.subdecks) { - deck.sortSubdecksList(); - } - } - - render(containerEl: HTMLElement, modal: FlashcardModal): void { - const deckView: HTMLElement = containerEl.createDiv("tree-item"); - - const deckViewSelf: HTMLElement = deckView.createDiv( - "tree-item-self tag-pane-tag is-clickable", - ); - const shouldBeInitiallyExpanded: boolean = - modal.plugin.data.settings.initiallyExpandAllSubdecksInTree; - let collapsed = !shouldBeInitiallyExpanded; - let collapseIconEl: HTMLElement | null = null; - if (this.subdecks.length > 0) { - collapseIconEl = deckViewSelf.createDiv("tree-item-icon collapse-icon"); - collapseIconEl.innerHTML = COLLAPSE_ICON; - (collapseIconEl.childNodes[0] as HTMLElement).style.transform = collapsed - ? "rotate(-90deg)" - : ""; - } - - const deckViewInner: HTMLElement = deckViewSelf.createDiv("tree-item-inner"); - deckViewInner.addEventListener("click", () => { - modal.plugin.data.historyDeck = this.deckName; - modal.currentDeck = this; - modal.checkDeck = this.parent; - modal.setupCardsView(); - this.nextCard(modal); - }); - const deckViewInnerText: HTMLElement = deckViewInner.createDiv("tag-pane-tag-text"); - deckViewInnerText.innerHTML += {this.deckName}; - const deckViewOuter: HTMLElement = deckViewSelf.createDiv("tree-item-flair-outer"); - deckViewOuter.innerHTML += ( - - - {this.dueFlashcardsCount.toString()} - - - {this.newFlashcardsCount.toString()} - - - {this.totalFlashcards.toString()} - - - ); - - const deckViewChildren: HTMLElement = deckView.createDiv("tree-item-children"); - deckViewChildren.style.display = collapsed ? "none" : "block"; - if (this.subdecks.length > 0) { - collapseIconEl.addEventListener("click", () => { - if (collapsed) { - (collapseIconEl.childNodes[0] as HTMLElement).style.transform = ""; - deckViewChildren.style.display = "block"; - } else { - (collapseIconEl.childNodes[0] as HTMLElement).style.transform = - "rotate(-90deg)"; - deckViewChildren.style.display = "none"; - } - collapsed = !collapsed; - }); - } - for (const deck of this.subdecks) { - deck.render(deckViewChildren, modal); - } - } - - nextCard(modal: FlashcardModal): void { - if (this.newFlashcards.length + this.dueFlashcards.length === 0) { - if (this.dueFlashcardsCount + this.newFlashcardsCount > 0) { - for (const deck of this.subdecks) { - if (deck.dueFlashcardsCount + deck.newFlashcardsCount > 0) { - modal.currentDeck = deck; - deck.nextCard(modal); - return; - } - } - } - - if (this.parent == modal.checkDeck) { - modal.plugin.data.historyDeck = ""; - modal.decksList(); - } else { - this.parent.nextCard(modal); - } - return; - } - - modal.responseDiv.style.display = "none"; - modal.resetButton.disabled = true; - modal.titleEl.setText( - `${this.deckName}: ${this.dueFlashcardsCount + this.newFlashcardsCount}`, - ); - - modal.answerBtn.style.display = "initial"; - modal.flashcardView.empty(); - modal.mode = FlashcardModalMode.Front; - - let interval = 1.0, - ease: number = modal.plugin.data.settings.baseEase, - delayBeforeReview = 0; - if (this.dueFlashcards.length > 0) { - if (modal.plugin.data.settings.randomizeCardOrder) { - modal.currentCardIdx = Math.floor(Math.random() * this.dueFlashcards.length); - } else { - modal.currentCardIdx = 0; - } - modal.currentCard = this.dueFlashcards[modal.currentCardIdx]; - modal.renderMarkdownWrapper(modal.currentCard.front, modal.flashcardView); - - interval = modal.currentCard.interval; - ease = modal.currentCard.ease; - delayBeforeReview = modal.currentCard.delayBeforeReview; - } else if (this.newFlashcards.length > 0) { - if (modal.plugin.data.settings.randomizeCardOrder) { - const pickedCardIdx = Math.floor(Math.random() * this.newFlashcards.length); - modal.currentCardIdx = pickedCardIdx; - - // look for first unscheduled sibling - const pickedCard: Card = this.newFlashcards[pickedCardIdx]; - let idx = pickedCardIdx; - while (idx >= 0 && pickedCard.siblings.includes(this.newFlashcards[idx])) { - if (!this.newFlashcards[idx].isDue) { - modal.currentCardIdx = idx; - } - idx--; - } - } else { - modal.currentCardIdx = 0; - } - - modal.currentCard = this.newFlashcards[modal.currentCardIdx]; - modal.renderMarkdownWrapper(modal.currentCard.front, modal.flashcardView); - - if ( - Object.prototype.hasOwnProperty.call( - modal.plugin.easeByPath, - modal.currentCard.note.path, - ) - ) { - ease = modal.plugin.easeByPath[modal.currentCard.note.path]; - } - } - - const hardInterval: number = schedule( - ReviewResponse.Hard, - interval, - ease, - delayBeforeReview, - modal.plugin.data.settings, - ).interval; - const goodInterval: number = schedule( - ReviewResponse.Good, - interval, - ease, - delayBeforeReview, - modal.plugin.data.settings, - ).interval; - const easyInterval: number = schedule( - ReviewResponse.Easy, - interval, - ease, - delayBeforeReview, - modal.plugin.data.settings, - ).interval; - - if (modal.ignoreStats) { - // Same for mobile/desktop - modal.hardBtn.setText(`${modal.plugin.data.settings.flashcardHardText}`); - modal.easyBtn.setText(`${modal.plugin.data.settings.flashcardEasyText}`); - } else if (Platform.isMobile) { - modal.hardBtn.setText(textInterval(hardInterval, true)); - modal.goodBtn.setText(textInterval(goodInterval, true)); - modal.easyBtn.setText(textInterval(easyInterval, true)); - } else { - modal.hardBtn.setText( - `${modal.plugin.data.settings.flashcardHardText} - ${textInterval( - hardInterval, - false, - )}`, - ); - modal.goodBtn.setText( - `${modal.plugin.data.settings.flashcardGoodText} - ${textInterval( - goodInterval, - false, - )}`, - ); - modal.easyBtn.setText( - `${modal.plugin.data.settings.flashcardEasyText} - ${textInterval( - easyInterval, - false, - )}`, - ); - } - - if (modal.plugin.data.settings.showContextInCards) - modal.contextView.setText(modal.currentCard.context); - } -} diff --git a/src/gui/flashcard-modal.tsx b/src/gui/flashcard-modal.tsx new file mode 100644 index 00000000..a574de4d --- /dev/null +++ b/src/gui/flashcard-modal.tsx @@ -0,0 +1,515 @@ +import { Modal, App, Notice, Platform, setIcon } from "obsidian"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import h from "vhtml"; + +import type SRPlugin from "src/main"; +import { SRSettings } from "src/settings"; +import { textInterval, ReviewResponse } from "src/scheduling"; +import { COLLAPSE_ICON } from "src/constants"; +import { t } from "src/lang/helpers"; +import { Card } from "../Card"; +import { CardListType, Deck } from "../Deck"; +import { CardType, Question } from "../Question"; +import { + DeckStats, + FlashcardReviewMode, + IFlashcardReviewSequencer as IFlashcardReviewSequencer, +} from "src/FlashcardReviewSequencer"; +import { FlashcardEditModal } from "./flashcards-edit-modal"; +import { Note } from "src/Note"; +import { RenderMarkdownWrapper } from "src/util/RenderMarkdownWrapper"; +import { CardScheduleInfo } from "src/CardSchedule"; +import { TopicPath } from "src/TopicPath"; + +export enum FlashcardModalMode { + DecksList, + Front, + Back, + Closed, +} + +export class FlashcardModal extends Modal { + public plugin: SRPlugin; + public answerBtn: HTMLElement; + public flashcardView: HTMLElement; + private flashCardMenu: HTMLDivElement; + public hardBtn: HTMLElement; + public goodBtn: HTMLElement; + public easyBtn: HTMLElement; + public nextBtn: HTMLElement; + public responseDiv: HTMLElement; + public resetButton: HTMLButtonElement; + public editButton: HTMLElement; + public contextView: HTMLElement; + public mode: FlashcardModalMode; + private reviewSequencer: IFlashcardReviewSequencer; + private settings: SRSettings; + private reviewMode: FlashcardReviewMode; + + private get currentCard(): Card { + return this.reviewSequencer.currentCard; + } + + private get currentQuestion(): Question { + return this.reviewSequencer.currentQuestion; + } + + private get currentNote(): Note { + return this.reviewSequencer.currentNote; + } + + constructor( + app: App, + plugin: SRPlugin, + settings: SRSettings, + reviewSequencer: IFlashcardReviewSequencer, + reviewMode: FlashcardReviewMode, + ) { + super(app); + + this.plugin = plugin; + this.settings = settings; + this.reviewSequencer = reviewSequencer; + this.reviewMode = reviewMode; + + this.titleEl.setText(t("DECKS")); + this.titleEl.addClass("sr-centered"); + + if (Platform.isMobile) { + this.contentEl.style.display = "block"; + } + this.modalEl.style.height = this.settings.flashcardHeightPercentage + "%"; + this.modalEl.style.width = this.settings.flashcardWidthPercentage + "%"; + + this.contentEl.style.position = "relative"; + this.contentEl.style.height = "92%"; + this.contentEl.addClass("sr-modal-content"); + + // TODO: refactor into event handler? + document.body.onkeydown = (e) => { + // TODO: Please fix this. It's ugly. + // Checks if the input textbox is in focus before processing keyboard shortcuts. + if ( + document.activeElement.nodeName !== "TEXTAREA" && + this.mode !== FlashcardModalMode.DecksList + ) { + const consume = () => { + e.preventDefault(); + e.stopPropagation(); + }; + if (this.mode !== FlashcardModalMode.Closed && e.code === "KeyS") { + this.skipCurrentCard(); + consume(); + } else if ( + this.mode === FlashcardModalMode.Front && + (e.code === "Space" || e.code === "Enter" || e.code === "NumpadEnter") + ) { + this.showAnswer(); + consume(); + } else if (this.mode === FlashcardModalMode.Back) { + if (e.code === "Numpad1" || e.code === "Digit1") { + this.processReview(ReviewResponse.Hard); + consume(); + } else if (e.code === "Numpad2" || e.code === "Digit2" || e.code === "Space") { + this.processReview(ReviewResponse.Good); + consume(); + } else if (e.code === "Numpad3" || e.code === "Digit3") { + this.processReview(ReviewResponse.Easy); + consume(); + } else if (e.code === "Numpad0" || e.code === "Digit0") { + this.processReview(ReviewResponse.Reset); + consume(); + } + } + } + }; + } + + onOpen(): void { + this.renderDecksList(); + } + + onClose(): void { + this.mode = FlashcardModalMode.Closed; + } + + renderDecksList(): void { + this.mode = FlashcardModalMode.DecksList; + const stats: DeckStats = this.reviewSequencer.getDeckStats(TopicPath.emptyPath); + this.titleEl.setText(t("DECKS")); + this.titleEl.innerHTML += ( +

+ + {stats.dueCount.toString()} + + + {stats.newCount.toString()} + + + {stats.totalCount.toString()} + +

+ ); + this.contentEl.empty(); + this.contentEl.setAttribute("id", "sr-flashcard-view"); + + for (const deck of this.reviewSequencer.originalDeckTree.subdecks) { + this.renderDeck(deck, this.contentEl, this); + } + } + + renderDeck(deck: Deck, containerEl: HTMLElement, modal: FlashcardModal): void { + const deckView: HTMLElement = containerEl.createDiv("tree-item"); + + const deckViewSelf: HTMLElement = deckView.createDiv( + "tree-item-self tag-pane-tag is-clickable", + ); + const shouldBeInitiallyExpanded: boolean = modal.settings.initiallyExpandAllSubdecksInTree; + let collapsed = !shouldBeInitiallyExpanded; + let collapseIconEl: HTMLElement | null = null; + if (deck.subdecks.length > 0) { + collapseIconEl = deckViewSelf.createDiv("tree-item-icon collapse-icon"); + collapseIconEl.innerHTML = COLLAPSE_ICON; + (collapseIconEl.childNodes[0] as HTMLElement).style.transform = collapsed + ? "rotate(-90deg)" + : ""; + } + + const deckViewInner: HTMLElement = deckViewSelf.createDiv("tree-item-inner"); + const deckViewInnerText: HTMLElement = deckViewInner.createDiv("tag-pane-tag-text"); + deckViewInnerText.innerHTML += {deck.deckName}; + const deckViewOuter: HTMLElement = deckViewSelf.createDiv("tree-item-flair-outer"); + const deckStats = this.reviewSequencer.getDeckStats(deck.getTopicPath()); + deckViewOuter.innerHTML += ( + + + {deckStats.dueCount.toString()} + + + {deckStats.newCount.toString()} + + + {deckStats.totalCount.toString()} + + + ); + + const deckViewChildren: HTMLElement = deckView.createDiv("tree-item-children"); + deckViewChildren.style.display = collapsed ? "none" : "block"; + if (deck.subdecks.length > 0) { + collapseIconEl.addEventListener("click", (e) => { + if (collapsed) { + (collapseIconEl.childNodes[0] as HTMLElement).style.transform = ""; + deckViewChildren.style.display = "block"; + } else { + (collapseIconEl.childNodes[0] as HTMLElement).style.transform = + "rotate(-90deg)"; + deckViewChildren.style.display = "none"; + } + + // We stop the propagation of the event so that the click event for deckViewSelf doesn't get called + // if the user clicks on the collapse icon + e.stopPropagation(); + collapsed = !collapsed; + }); + } + + // Add the click handler to deckViewSelf instead of deckViewInner so that it activates + // over the entire rectangle of the tree item, not just the text of the topic name + // https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/709 + deckViewSelf.addEventListener("click", () => { + this.startReviewOfDeck(deck); + }); + + for (const subdeck of deck.subdecks) { + this.renderDeck(subdeck, deckViewChildren, modal); + } + } + + startReviewOfDeck(deck: Deck) { + this.reviewSequencer.setCurrentDeck(deck.getTopicPath()); + if (this.reviewSequencer.hasCurrentCard) { + this.setupCardsView(); + this.showCurrentCard(); + } else this.renderDecksList(); + } + + setupCardsView(): void { + this.contentEl.empty(); + + this.flashCardMenu = this.contentEl.createDiv("sr-flashcard-menu"); + + this.createBackButton(); + this.createEditButton(); + this.createResetButton(); + this.createCardInfoButton(); + this.createSkipButton(); + + if (this.settings.showContextInCards) { + this.contextView = this.contentEl.createDiv(); + this.contextView.setAttribute("id", "sr-context"); + } + + this.flashcardView = this.contentEl.createDiv("div"); + this.flashcardView.setAttribute("id", "sr-flashcard-view"); + + this.createResponseButtons(); + + this.createShowAnswerButton(); + + if (this.reviewMode == FlashcardReviewMode.Cram) { + this.goodBtn.style.display = "none"; + + this.responseDiv.addClass("sr-ignorestats-response"); + this.easyBtn.addClass("sr-ignorestats-btn"); + this.hardBtn.addClass("sr-ignorestats-btn"); + } + } + + createShowAnswerButton() { + this.answerBtn = this.contentEl.createDiv(); + this.answerBtn.setAttribute("id", "sr-show-answer"); + this.answerBtn.setText(t("SHOW_ANSWER")); + this.answerBtn.addEventListener("click", () => { + this.showAnswer(); + }); + } + + createResponseButtons() { + this.responseDiv = this.contentEl.createDiv("sr-flashcard-response"); + + this.hardBtn = document.createElement("button"); + this.hardBtn.setAttribute("id", "sr-hard-btn"); + this.hardBtn.setText(this.settings.flashcardHardText); + this.hardBtn.addEventListener("click", () => { + this.processReview(ReviewResponse.Hard); + }); + this.responseDiv.appendChild(this.hardBtn); + + this.goodBtn = document.createElement("button"); + this.goodBtn.setAttribute("id", "sr-good-btn"); + this.goodBtn.setText(this.settings.flashcardGoodText); + this.goodBtn.addEventListener("click", () => { + this.processReview(ReviewResponse.Good); + }); + this.responseDiv.appendChild(this.goodBtn); + + this.easyBtn = document.createElement("button"); + this.easyBtn.setAttribute("id", "sr-easy-btn"); + this.easyBtn.setText(this.settings.flashcardEasyText); + this.easyBtn.addEventListener("click", () => { + this.processReview(ReviewResponse.Easy); + }); + this.responseDiv.appendChild(this.easyBtn); + this.responseDiv.style.display = "none"; + } + + createSkipButton() { + const skipButton = this.flashCardMenu.createEl("button"); + skipButton.addClass("sr-flashcard-menu-item"); + setIcon(skipButton, "chevrons-right"); + skipButton.setAttribute("aria-label", t("SKIP")); + skipButton.addEventListener("click", () => { + this.skipCurrentCard(); + }); + } + + createCardInfoButton() { + const cardInfo = this.flashCardMenu.createEl("button"); + cardInfo.addClass("sr-flashcard-menu-item"); + setIcon(cardInfo, "info"); + cardInfo.setAttribute("aria-label", "View Card Info"); + cardInfo.addEventListener("click", async () => { + this.displayCurrentCardInfoNotice(); + }); + } + + displayCurrentCardInfoNotice() { + const schedule = this.currentCard.scheduleInfo; + const currentEaseStr = t("CURRENT_EASE_HELP_TEXT") + (schedule?.ease ?? t("NEW")); + const currentIntervalStr = + t("CURRENT_INTERVAL_HELP_TEXT") + textInterval(schedule?.interval, false); + const generatedFromStr = t("CARD_GENERATED_FROM", { + notePath: this.currentQuestion.note.filePath, + }); + new Notice(currentEaseStr + "\n" + currentIntervalStr + "\n" + generatedFromStr); + } + + createBackButton() { + const backButton = this.flashCardMenu.createEl("button"); + backButton.addClass("sr-flashcard-menu-item"); + setIcon(backButton, "arrow-left"); + backButton.setAttribute("aria-label", t("BACK")); + backButton.addEventListener("click", () => { + /* this.plugin.data.historyDeck = ""; */ + this.renderDecksList(); + }); + } + + createResetButton() { + this.resetButton = this.flashCardMenu.createEl("button"); + this.resetButton.addClass("sr-flashcard-menu-item"); + setIcon(this.resetButton, "refresh-cw"); + this.resetButton.setAttribute("aria-label", t("RESET_CARD_PROGRESS")); + this.resetButton.addEventListener("click", () => { + this.processReview(ReviewResponse.Reset); + }); + } + + createEditButton() { + this.editButton = this.flashCardMenu.createEl("button"); + this.editButton.addClass("sr-flashcard-menu-item"); + setIcon(this.editButton, "edit"); + this.editButton.setAttribute("aria-label", t("EDIT_CARD")); + this.editButton.addEventListener("click", async () => { + this.doEditQuestionText(); + }); + } + + async doEditQuestionText(): Promise { + const currentQ: Question = this.reviewSequencer.currentQuestion; + + // Just the question/answer text; without any preceding topic tag + const textPrompt = currentQ.questionText.actualQuestion; + + const editModal = FlashcardEditModal.Prompt(this.app, textPrompt); + editModal + .then(async (modifiedCardText) => { + this.reviewSequencer.updateCurrentQuestionText(modifiedCardText); + }) + .catch((reason) => console.log(reason)); + } + + private showAnswer(): void { + this.mode = FlashcardModalMode.Back; + + this.answerBtn.style.display = "none"; + this.responseDiv.style.display = "grid"; + + if (this.currentCard.hasSchedule) { + this.resetButton.disabled = false; + } + + if (this.currentQuestion.questionType !== CardType.Cloze) { + const hr: HTMLElement = document.createElement("hr"); + hr.setAttribute("id", "sr-hr-card-divide"); + this.flashcardView.appendChild(hr); + } else { + this.flashcardView.empty(); + } + + const wrapper: RenderMarkdownWrapper = new RenderMarkdownWrapper( + this.app, + this.plugin, + this.currentNote.filePath, + ); + wrapper.renderMarkdownWrapper(this.currentCard.back, this.flashcardView); + } + + private async processReview(response: ReviewResponse): Promise { + await this.reviewSequencer.processReview(response); + // console.log(`processReview: ${response}: ${this.currentCard?.front ?? 'None'}`) + await this.handleNextCard(); + } + + private async skipCurrentCard(): Promise { + this.reviewSequencer.skipCurrentCard(); + // console.log(`skipCurrentCard: ${this.currentCard?.front ?? 'None'}`) + await this.handleNextCard(); + } + + private async handleNextCard(): Promise { + if (this.currentCard != null) await this.showCurrentCard(); + else this.renderDecksList(); + } + + private async showCurrentCard(): Promise { + const deck: Deck = this.reviewSequencer.currentDeck; + + this.responseDiv.style.display = "none"; + this.resetButton.disabled = true; + this.titleEl.setText(`${deck.deckName}: ${deck.getCardCount(CardListType.All, true)}`); + + this.answerBtn.style.display = "initial"; + this.flashcardView.empty(); + this.mode = FlashcardModalMode.Front; + + const wrapper: RenderMarkdownWrapper = new RenderMarkdownWrapper( + this.app, + this.plugin, + this.currentNote.filePath, + ); + await wrapper.renderMarkdownWrapper(this.currentCard.front, this.flashcardView); + + if (this.reviewMode == FlashcardReviewMode.Cram) { + // Same for mobile/desktop + this.hardBtn.setText(`${this.settings.flashcardHardText}`); + this.easyBtn.setText(`${this.settings.flashcardEasyText}`); + } else { + this.setupEaseButton( + this.hardBtn, + this.settings.flashcardHardText, + ReviewResponse.Hard, + ); + this.setupEaseButton( + this.goodBtn, + this.settings.flashcardGoodText, + ReviewResponse.Good, + ); + this.setupEaseButton( + this.easyBtn, + this.settings.flashcardEasyText, + ReviewResponse.Easy, + ); + } + + if (this.settings.showContextInCards) + this.contextView.setText( + this.formatQuestionContextText(this.currentQuestion.questionContext), + ); + } + + private formatQuestionContextText(questionContext: string[]): string { + const result = `${this.currentNote.file.basename} > ${questionContext.join(" > ")}`; + return result; + } + + private setupEaseButton( + button: HTMLElement, + buttonName: string, + reviewResponse: ReviewResponse, + ) { + const schedule: CardScheduleInfo = this.reviewSequencer.determineCardSchedule( + reviewResponse, + this.currentCard, + ); + const interval: number = schedule.interval; + + if (Platform.isMobile) { + button.setText(textInterval(interval, true)); + } else { + button.setText(`${buttonName} - ${textInterval(interval, false)}`); + } + } +} diff --git a/src/gui/flashcards-edit-modal.ts b/src/gui/flashcards-edit-modal.ts new file mode 100644 index 00000000..1330c811 --- /dev/null +++ b/src/gui/flashcards-edit-modal.ts @@ -0,0 +1,117 @@ +import { App, ButtonComponent, Modal, TextAreaComponent } from "obsidian"; +import { t } from "src/lang/helpers"; + +// from https://github.com/chhoumann/quickadd/blob/bce0b4cdac44b867854d6233796e3406dfd163c6/src/gui/GenericInputPrompt/GenericInputPrompt.ts#L5 +export class FlashcardEditModal extends Modal { + public input: string; + public waitForClose: Promise; + + private resolvePromise: (input: string) => void; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private rejectPromise: (reason?: any) => void; + private didSubmit = false; + private inputComponent: TextAreaComponent; + private readonly modalText: string; + + public static Prompt(app: App, placeholder: string): Promise { + const newPromptModal = new FlashcardEditModal(app, placeholder); + return newPromptModal.waitForClose; + } + constructor(app: App, existingText: string) { + super(app); + this.titleEl.setText(t("EDIT_CARD")); + this.titleEl.addClass("sr-centered"); + this.modalText = existingText; + + this.waitForClose = new Promise((resolve, reject) => { + this.resolvePromise = resolve; + this.rejectPromise = reject; + }); + this.display(); + this.open(); + } + + private display() { + this.contentEl.empty(); + this.modalEl.addClass("sr-flashcard-input-modal"); + + const mainContentContainer: HTMLDivElement = this.contentEl.createDiv(); + mainContentContainer.addClass("sr-flashcard-input-area"); + this.inputComponent = this.createInputField(mainContentContainer, this.modalText); + this.createButtonBar(mainContentContainer); + } + + private createButton( + container: HTMLElement, + text: string, + callback: (evt: MouseEvent) => void, + ) { + const btn = new ButtonComponent(container); + btn.setButtonText(text).onClick(callback); + return btn; + } + + private createButtonBar(mainContentContainer: HTMLDivElement) { + const buttonBarContainer: HTMLDivElement = mainContentContainer.createDiv(); + buttonBarContainer.addClass("sr-flashcard-edit-button-bar"); + this.createButton( + buttonBarContainer, + t("SAVE"), + this.submitClickCallback, + ).setCta().buttonEl.style.marginRight = "0"; + this.createButton(buttonBarContainer, t("CANCEL"), this.cancelClickCallback); + } + + protected createInputField(container: HTMLElement, value: string) { + const textComponent = new TextAreaComponent(container); + + textComponent.inputEl.style.width = "100%"; + textComponent + .setValue(value ?? "") + .onChange((value) => (this.input = value)) + .inputEl.addEventListener("keydown", this.submitEnterCallback); + + return textComponent; + } + + private submitClickCallback = (_: MouseEvent) => this.submit(); + private cancelClickCallback = (_: MouseEvent) => this.cancel(); + + private submitEnterCallback = (evt: KeyboardEvent) => { + if ((evt.ctrlKey || evt.metaKey) && evt.key === "Enter") { + evt.preventDefault(); + this.submit(); + } + }; + + private submit() { + this.didSubmit = true; + + this.close(); + } + + private cancel() { + this.close(); + } + + onOpen() { + super.onOpen(); + + this.inputComponent.inputEl.focus(); + } + + onClose() { + super.onClose(); + this.resolveInput(); + this.removeInputListener(); + } + + private resolveInput() { + if (!this.didSubmit) this.rejectPromise(t("NO_INPUT")); + else this.resolvePromise(this.input); + } + + private removeInputListener() { + this.inputComponent.inputEl.removeEventListener("keydown", this.submitEnterCallback); + } +} diff --git a/src/sidebar.ts b/src/gui/sidebar.ts similarity index 99% rename from src/sidebar.ts rename to src/gui/sidebar.ts index 2ad6c4c2..3ee2598c 100644 --- a/src/sidebar.ts +++ b/src/gui/sidebar.ts @@ -2,7 +2,7 @@ import { ItemView, WorkspaceLeaf, Menu, TFile } from "obsidian"; import type SRPlugin from "src/main"; import { COLLAPSE_ICON } from "src/constants"; -import { ReviewDeck } from "src/review-deck"; +import { ReviewDeck } from "src/ReviewDeck"; import { t } from "src/lang/helpers"; import { DataLocation } from "./settings"; diff --git a/src/stats-modal.tsx b/src/gui/stats-modal.tsx similarity index 90% rename from src/stats-modal.tsx rename to src/gui/stats-modal.tsx index c075d2ad..ed93e347 100644 --- a/src/stats-modal.tsx +++ b/src/gui/stats-modal.tsx @@ -17,7 +17,7 @@ import { } from "chart.js"; import type SRPlugin from "src/main"; -import { getKeysPreserveType, getTypedObjectEntries } from "src/utils"; +import { getKeysPreserveType, getTypedObjectEntries } from "src/util/utils"; import { textInterval } from "src/scheduling"; import { t } from "src/lang/helpers"; import { RPITEMTYPE } from "./data"; @@ -37,14 +37,6 @@ Chart.register( ArcElement, ); -export interface Stats { - eases: Record; - intervals: Record; - newCount: number; - youngCount: number; - matureCount: number; -} - export class StatsModal extends Modal { private plugin: SRPlugin; @@ -135,8 +127,8 @@ export class StatsModal extends Modal { const rc = this.plugin.store.getReviewedCardCounts(); const now = window.moment(Date.now()); const todayDate: string = now.format("YYYY-MM-DD"); - if(!(todayDate in rc)){ - rc[todayDate]={due: 0, new: 0}; + if (!(todayDate in rc)) { + rc[todayDate] = { due: 0, new: 0 }; } const rdueCnt = rc[todayDate].due, rnewCnt = rc[todayDate].new; @@ -159,15 +151,14 @@ export class StatsModal extends Modal { ); // Add forecast - let maxN: number = Math.max(...getKeysPreserveType(this.plugin.dueDatesFlashcards)); + const cardStats: Stats = this.plugin.cardStats; + let maxN: number = cardStats.delayedDays.getMaxValue(); for (let dueOffset = 0; dueOffset <= maxN; dueOffset++) { - if (!Object.prototype.hasOwnProperty.call(this.plugin.dueDatesFlashcards, dueOffset)) { - this.plugin.dueDatesFlashcards[dueOffset] = 0; - } + cardStats.delayedDays.clearCountIfMissing(dueOffset); } const dueDatesFlashcardsCopy: Record = { 0: 0 }; - for (const [dueOffset, dueCount] of getTypedObjectEntries(this.plugin.dueDatesFlashcards)) { + for (const [dueOffset, dueCount] of getTypedObjectEntries(cardStats.delayedDays.dict)) { if (dueOffset <= 0) { dueDatesFlashcardsCopy[0] += dueCount; } else { @@ -175,7 +166,6 @@ export class StatsModal extends Modal { } } - const cardStats: Stats = this.plugin.cardStats; const scheduledCount: number = cardStats.youngCount + cardStats.matureCount; maxN = Math.max(maxN, 1); @@ -192,36 +182,27 @@ export class StatsModal extends Modal { t("NUMBER_OF_CARDS"), ); - maxN = Math.max(...getKeysPreserveType(cardStats.intervals)); + maxN = cardStats.intervals.getMaxValue(); for (let interval = 0; interval <= maxN; interval++) { - if (!Object.prototype.hasOwnProperty.call(cardStats.intervals, interval)) { - cardStats.intervals[interval] = 0; - } + cardStats.intervals.clearCountIfMissing(interval); } // Add intervals const average_interval: string = textInterval( Math.round( - (getTypedObjectEntries(cardStats.intervals) - .map(([interval, count]) => interval * count) - .reduce((a, b) => a + b, 0) / - scheduledCount) * - 10, + (cardStats.intervals.getTotalOfValueMultiplyCount() / scheduledCount) * 10, ) / 10 || 0, false, ), - longest_interval: string = textInterval( - Math.max(...getKeysPreserveType(cardStats.intervals)) || 0, - false, - ); + longest_interval: string = textInterval(cardStats.intervals.getMaxValue(), false); createStatsChart( "bar", "intervalsChart", t("INTERVALS"), t("INTERVALS_DESC"), - Object.keys(cardStats.intervals), - Object.values(cardStats.intervals), + Object.keys(cardStats.intervals.dict), + Object.values(cardStats.intervals.dict), t("INTERVALS_SUMMARY", { avg: average_interval, longest: longest_interval }), t("COUNT"), t("DAYS"), @@ -229,18 +210,12 @@ export class StatsModal extends Modal { ); // Add eases - const eases: number[] = getKeysPreserveType(cardStats.eases); + const eases: number[] = getKeysPreserveType(cardStats.eases.dict); for (let ease = Math.min(...eases); ease <= Math.max(...eases); ease++) { - if (!Object.prototype.hasOwnProperty.call(cardStats.eases, ease)) { - cardStats.eases[ease] = 0; - } + cardStats.eases.clearCountIfMissing(ease); } const average_ease: number = - Math.round( - getTypedObjectEntries(cardStats.eases) - .map(([ease, count]) => ease * count) - .reduce((a, b) => a + b, 0) / scheduledCount, - ) || 0; + Math.round(cardStats.eases.getTotalOfValueMultiplyCount() / scheduledCount) || 0; const esaeStr: string[] = []; Object.keys(cardStats.eases).forEach((value: string) => { @@ -267,7 +242,7 @@ export class StatsModal extends Modal { ); // Add card types - const totalCardsCount: number = this.plugin.deckTree.totalFlashcards; + const totalCardsCount: number = this.plugin.deckTree.getCardCount(CardListType.All, true); createStatsChart( "pie", "cardTypesChart", @@ -294,8 +269,8 @@ export class StatsModal extends Modal { const rc = this.plugin.store.getReviewedCounts(); const now = window.moment(Date.now()); const todayDate: string = now.format("YYYY-MM-DD"); - if(!(todayDate in rc)){ - rc[todayDate]={due: 0, new: 0}; + if (!(todayDate in rc)) { + rc[todayDate] = { due: 0, new: 0 }; } const rdueCnt = rc[todayDate].due, rnewCnt = rc[todayDate].new; diff --git a/src/main.ts b/src/main.ts index de5f3fe8..4559b7a8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -30,8 +30,31 @@ import { import { escapeRegexString, cyrb53 } from "src/utils"; import { ReviewDeck, ReviewDeckSelectionModal } from "src/review-deck"; import { t } from "src/lang/helpers"; -import { parse } from "src/parser"; import { appIcon } from "src/icons/appicon"; +import { TopicPath } from "./TopicPath"; +import { CardListType, Deck, DeckTreeFilter } from "./Deck"; +import { Stats } from "./stats"; +import { + FlashcardReviewMode, + FlashcardReviewSequencer as FlashcardReviewSequencer, + IFlashcardReviewSequencer as IFlashcardReviewSequencer, +} from "./FlashcardReviewSequencer"; +import { + CardListOrder, + DeckTreeIterator, + IDeckTreeIterator, + IIteratorOrder, + IteratorDeckSource, + OrderMethod, +} from "./DeckTreeIterator"; +import { CardScheduleCalculator } from "./CardSchedule"; +import { Note } from "./Note"; +import { NoteFileLoader } from "./NoteFileLoader"; +import { ISRFile, SrTFile as SrTFile } from "./SRFile"; +import { NoteEaseCalculator } from "./NoteEaseCalculator"; +import { DeckTreeStatsCalculator } from "./DeckTreeStatsCalculator"; +import { NoteEaseList } from "./NoteEaseList"; +import { QuestionPostponementList } from "./QuestionPostponementList"; // https://github.com/martin-jw/obsidian-recall import { DataStore, RPITEMTYPE } from "./data"; @@ -78,9 +101,8 @@ export default class SRPlugin extends Plugin { public reviewDecks: { [deckKey: string]: ReviewDeck } = {}; public lastSelectedReviewDeck: string; - public newNotes: TFile[] = []; - public scheduledNotes: SchedNote[] = []; - public easeByPath: Record = {}; + public easeByPath: NoteEaseList; + private questionPostponementList: QuestionPostponementList; private incomingLinks: Record = {}; private pageranks: Record = {}; public newNotesCount = 0; @@ -90,7 +112,7 @@ export default class SRPlugin extends Plugin { public dueDatesNotes: Record = {}; // Record<# of days in future, due count> public deckTree: Deck = new Deck("root", null); - public dueDatesFlashcards: Record = {}; // Record<# of days in future, due count> + private remainingDeckTree: Deck; public cardStats: Stats; public noteStats: Stats; @@ -148,7 +170,11 @@ export default class SRPlugin extends Plugin { this.addRibbonIcon("SpacedRepIcon", t("REVIEW_CARDS"), async () => { if (!this.syncLock) { await this.sync(); - new FlashcardModal(this.app, this).open(); + this.openFlashcardModal( + this.deckTree, + this.remainingDeckTree, + FlashcardReviewMode.Review, + ); } }); @@ -288,7 +314,11 @@ export default class SRPlugin extends Plugin { callback: async () => { if (!this.syncLock) { await this.sync(); - new FlashcardModal(this.app, this).open(); + this.openFlashcardModal( + this.deckTree, + this.remainingDeckTree, + FlashcardReviewMode.Review, + ); } }, }); @@ -297,8 +327,8 @@ export default class SRPlugin extends Plugin { id: "srs-cram-flashcards", name: t("CRAM_ALL_CARDS"), callback: async () => { - await this.sync(true); - new FlashcardModal(this.app, this, true).open(); + await this.sync(); + this.openFlashcardModal(this.deckTree, this.deckTree, FlashcardReviewMode.Cram); }, }); @@ -308,10 +338,7 @@ export default class SRPlugin extends Plugin { callback: async () => { const openFile: TFile | null = this.app.workspace.getActiveFile(); if (openFile && openFile.extension === "md") { - this.deckTree = new Deck("root", null); - const deckPath: string[] = this.findDeckPath(openFile); - await this.findFlashcardsInNote(openFile, deckPath); - new FlashcardModal(this.app, this).open(); + this.openFlashcardModalForSingleNote(openFile, FlashcardReviewMode.Review); } }, }); @@ -322,10 +349,7 @@ export default class SRPlugin extends Plugin { callback: async () => { const openFile: TFile | null = this.app.workspace.getActiveFile(); if (openFile && openFile.extension === "md") { - this.deckTree = new Deck("root", null); - const deckPath: string[] = this.findDeckPath(openFile); - await this.findFlashcardsInNote(openFile, deckPath, false, true); - new FlashcardModal(this.app, this, true).open(); + this.openFlashcardModalForSingleNote(openFile, FlashcardReviewMode.Cram); } }, }); @@ -377,7 +401,7 @@ export default class SRPlugin extends Plugin { // reset notes stuff graph.reset(); - this.easeByPath = {}; + this.easeByPath = new NoteEaseList(this.data.settings); this.incomingLinks = {}; this.pageranks = {}; this.newNotesCount = 0; @@ -386,26 +410,18 @@ export default class SRPlugin extends Plugin { this.reviewDecks = {}; // reset flashcards stuff - this.deckTree = new Deck("root", null); - this.dueDatesFlashcards = {}; - this.cardStats = { - eases: {}, - intervals: {}, - newCount: 0, - youngCount: 0, - matureCount: 0, - }; + const fullDeckTree = new Deck("root", null); const now = window.moment(Date.now()); const todayDate: string = now.format("YYYY-MM-DD"); // clear bury list if we've changed dates if (todayDate !== this.data.buryDate) { this.data.buryDate = todayDate; - this.data.buryList = []; + this.questionPostponementList.clear(); } const notes: TFile[] = this.app.vault.getMarkdownFiles(); - for (const note of notes) { + for (const noteFile of notes) { if ( this.data.settings.noteFoldersToIgnore.some((folder) => // note.path.startsWith(folder) @@ -415,11 +431,11 @@ export default class SRPlugin extends Plugin { continue; } - if (this.incomingLinks[note.path] === undefined) { - this.incomingLinks[note.path] = []; + if (this.incomingLinks[noteFile.path] === undefined) { + this.incomingLinks[noteFile.path] = []; } - const links = this.app.metadataCache.resolvedLinks[note.path] || {}; + const links = this.app.metadataCache.resolvedLinks[noteFile.path] || {}; for (const targetPath in links) { if (this.incomingLinks[targetPath] === undefined) this.incomingLinks[targetPath] = []; @@ -427,29 +443,29 @@ export default class SRPlugin extends Plugin { // markdown files only if (targetPath.split(".").pop().toLowerCase() === "md") { this.incomingLinks[targetPath].push({ - sourcePath: note.path, + sourcePath: noteFile.path, linkCount: links[targetPath], }); - graph.link(note.path, targetPath, links[targetPath]); + graph.link(noteFile.path, targetPath, links[targetPath]); } } - const deckPath: string[] = this.findDeckPath(note); - if (deckPath.length !== 0) { - const flashcardsInNoteAvgEase: number = await this.findFlashcardsInNote( + const topicPath: TopicPath = this.findTopicPath(this.createSrTFile(noteFile)); + if (topicPath.hasPath) { + const note: Note = await this.loadNote(noteFile, topicPath); + const flashcardsInNoteAvgEase: number = NoteEaseCalculator.Calculate( note, - deckPath, - false, - ignoreStats, + this.data.settings, ); + note.appendCardsToDeck(fullDeckTree); if (flashcardsInNoteAvgEase > 0) { - this.easeByPath[note.path] = flashcardsInNoteAvgEase; + this.easeByPath.setEaseForPath(note.filePath, flashcardsInNoteAvgEase); } } - const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; + const fileCachedData = this.app.metadataCache.getFileCache(noteFile) || {}; const frontmatter: FrontMatterCache | Record = fileCachedData.frontmatter || {}; @@ -492,18 +508,19 @@ export default class SRPlugin extends Plugin { .valueOf(); for (const matchedNoteTag of matchedNoteTags) { - this.reviewDecks[matchedNoteTag].scheduledNotes.push({ note, dueUnix }); + this.reviewDecks[matchedNoteTag].scheduledNotes.push({ note: noteFile, dueUnix }); if (dueUnix <= now.valueOf()) { this.reviewDecks[matchedNoteTag].dueNotesCount++; } } - if (Object.prototype.hasOwnProperty.call(this.easeByPath, note.path)) { - this.easeByPath[note.path] = - (this.easeByPath[note.path] + frontmatter["sr-ease"]) / 2; + let ease: number; + if (this.easeByPath.hasEaseForPath(noteFile.path)) { + ease = (this.easeByPath.getEaseByPath(noteFile.path) + frontmatter["sr-ease"]) / 2; } else { - this.easeByPath[note.path] = frontmatter["sr-ease"]; + ease = frontmatter["sr-ease"]; } + this.easeByPath.setEaseForPath(noteFile.path, ease); if (dueUnix <= now.valueOf()) { this.dueNotesCount++; @@ -520,10 +537,21 @@ export default class SRPlugin extends Plugin { this.pageranks[node] = rank * 10000; }); + // Reviewable cards are all except those with the "edit later" tag + this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); + // sort the deck names this.deckTree.sortSubdecksList(); + this.remainingDeckTree = DeckTreeFilter.filterForRemainingCards( + this.questionPostponementList, + this.deckTree, + FlashcardReviewMode.Review, + ); + const calc: DeckTreeStatsCalculator = new DeckTreeStatsCalculator(); + this.cardStats = calc.calculate(this.deckTree); + if (this.data.settings.showDebugMessages) { - console.log(`SR: ${t("EASES")}`, this.easeByPath); + console.log(`SR: ${t("EASES")}`, this.easeByPath.dict); console.log(`SR: ${t("DECKS")}`, this.deckTree); } @@ -543,7 +571,7 @@ export default class SRPlugin extends Plugin { this.statusBar.setText( t("STATUS_BAR", { dueNotesCount: this.dueNotesCount, - dueFlashcardsCount: this.deckTree.dueFlashcardsCount, + dueFlashcardsCount: this.remainingDeckTree.getCardCount(CardListType.All, true), }), ); @@ -778,7 +806,7 @@ export default class SRPlugin extends Plugin { totalLinkCount = 0; for (const statObj of this.incomingLinks[note.path] || []) { - const ease: number = this.easeByPath[statObj.sourcePath]; + const ease: number = this.easeByPath.getEaseByPath(statObj.sourcePath); if (ease) { linkTotal += statObj.linkCount * this.pageranks[statObj.sourcePath] * ease; linkPGTotal += this.pageranks[statObj.sourcePath] * statObj.linkCount; @@ -788,7 +816,7 @@ export default class SRPlugin extends Plugin { const outgoingLinks = this.app.metadataCache.resolvedLinks[note.path] || {}; for (const linkedFilePath in outgoingLinks) { - const ease: number = this.easeByPath[linkedFilePath]; + const ease: number = this.easeByPath.getEaseByPath(linkedFilePath); if (ease) { linkTotal += outgoingLinks[linkedFilePath] * this.pageranks[linkedFilePath] * ease; @@ -807,7 +835,7 @@ export default class SRPlugin extends Plugin { : linkContribution * this.data.settings.baseEase); // add note's average flashcard ease if available if (Object.prototype.hasOwnProperty.call(this.easeByPath, note.path)) { - ease = (ease + this.easeByPath[note.path]) / 2; + ease = (ease + this.easeByPath.getEaseByPath(note.path)) / 2; } ease = Math.round(ease); interval = 1.0; @@ -860,7 +888,11 @@ export default class SRPlugin extends Plugin { } if (this.data.settings.burySiblingCards) { - await this.findFlashcardsInNote(note, [], true); // bury all cards in current note + const topicPath: TopicPath = this.findTopicPath(this.createSrTFile(note)); + const noteX: Note = await this.loadNote(note, topicPath); + for (const question of noteX.questionList) { + this.data.buryList.push(question.questionText.textHash); + } await this.savePluginData(); } await this.app.vault.modify(note, fileText); @@ -1603,25 +1635,3 @@ export default class SRPlugin extends Plugin { ); } } - -function getCardContext(cardLine: number, headings: HeadingCache[], note_title: string): string { - const stack: HeadingCache[] = []; - for (const heading of headings) { - if (heading.position.start.line > cardLine) { - break; - } - - while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) { - stack.pop(); - } - - stack.push(heading); - } - - let context = `${note_title} > `; - for (const headingObj of stack) { - headingObj.heading = headingObj.heading.replace(/\[\^\d+\]/gm, "").trim(); - context += `${headingObj.heading} > `; - } - return context.slice(0, -3); -} diff --git a/src/parser.ts b/src/parser.ts index a101918b..b1701089 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -1,4 +1,4 @@ -import { CardType } from "src/scheduling"; +import { CardType } from "./Question"; /** * Returns flashcards found in `text` diff --git a/src/scheduling.ts b/src/scheduling.ts index 2701884a..677f107d 100644 --- a/src/scheduling.ts +++ b/src/scheduling.ts @@ -1,5 +1,3 @@ -import { TFile } from "obsidian"; - import { SRSettings } from "src/settings"; import { t } from "src/lang/helpers"; @@ -12,36 +10,6 @@ export enum ReviewResponse { // Flashcards -export interface Card { - editLater: boolean; - // scheduling - isDue: boolean; - interval?: number; - ease?: number; - delayBeforeReview?: number; - // note - note: TFile; - lineNo: number; - // visuals - front: string; - back: string; - cardText: string; - context: string; - // types - cardType: CardType; - // information for sibling cards - siblingIdx: number; - siblings: Card[]; -} - -export enum CardType { - SingleLineBasic, - SingleLineReversed, - MultiLineBasic, - MultiLineReversed, - Cloze, -} - export function schedule( response: ReviewResponse, interval: number, diff --git a/src/stats.ts b/src/stats.ts new file mode 100644 index 00000000..edadf19d --- /dev/null +++ b/src/stats.ts @@ -0,0 +1,42 @@ +import { ValueCountDict } from "./util/NumberCountDict"; + +export class Stats { + eases: ValueCountDict = new ValueCountDict(); + intervals: ValueCountDict = new ValueCountDict(); + delayedDays: ValueCountDict = new ValueCountDict(); + newCount: number = 0; + youngCount: number = 0; + matureCount: number = 0; + + get totalCount(): number { + return this.youngCount + this.matureCount; + } + + incrementNew() { + this.newCount++; + } + + update(delayedDays: number, interval: number, ease: number) { + this.intervals.incrementCount(interval); + this.eases.incrementCount(ease); + this.delayedDays.incrementCount(delayedDays); + + if (interval >= 32) { + this.matureCount++; + } else { + this.youngCount++; + } + } + + getMaxInterval(): number { + return this.intervals.getMaxValue(); + } + + getAverageInterval(): number { + return this.intervals.getTotalOfValueMultiplyCount() / this.totalCount; + } + + getAverageEases(): number { + return this.eases.getTotalOfValueMultiplyCount() / this.totalCount; + } +} diff --git a/src/util/DateProvider.ts b/src/util/DateProvider.ts new file mode 100644 index 00000000..1674c60b --- /dev/null +++ b/src/util/DateProvider.ts @@ -0,0 +1,41 @@ +import moment from "moment"; +import { Moment } from "moment"; +import { ALLOWED_DATE_FORMATS } from "src/constants"; + +export interface IDateProvider { + get today(): Moment; +} + +export class LiveDateProvider implements IDateProvider { + get today(): Moment { + return moment().startOf("day"); + } +} + +export class StaticDateProvider implements IDateProvider { + private moment: Moment; + + constructor(moment: Moment) { + this.moment = moment; + } + + get today(): Moment { + return this.moment.clone(); + } + + static fromDateStr(str: string): StaticDateProvider { + return new StaticDateProvider(DateUtil.dateStrToMoment(str)); + } +} + +export class DateUtil { + static dateStrToMoment(str: string): Moment { + return moment(str, ALLOWED_DATE_FORMATS); + } +} + +export let globalDateProvider: IDateProvider = new LiveDateProvider(); + +export function setupStaticDateProvider_20230906() { + globalDateProvider = StaticDateProvider.fromDateStr("2023-09-06"); +} diff --git a/src/util/MultiLineTextFinder.ts b/src/util/MultiLineTextFinder.ts new file mode 100644 index 00000000..bd5a43a9 --- /dev/null +++ b/src/util/MultiLineTextFinder.ts @@ -0,0 +1,45 @@ +import { splitTextIntoLineArray } from "./utils"; + +export class MultiLineTextFinder { + static findAndReplace( + sourceText: string, + searchText: string, + replacementText: string, + ): string | null { + let result: string = null; + if (sourceText.includes(searchText)) { + result = sourceText.replace(searchText, replacementText); + } else { + const sourceTextArray = splitTextIntoLineArray(sourceText); + const searchTextArray = splitTextIntoLineArray(searchText); + const lineNo: number = MultiLineTextFinder.find(sourceTextArray, searchTextArray); + if (lineNo) { + const replacementTextArray = splitTextIntoLineArray(replacementText); + const linesToRemove: number = searchTextArray.length; + sourceTextArray.splice(lineNo, linesToRemove, ...replacementTextArray); + result = sourceTextArray.join("\n"); + } + } + return result; + } + + static find(sourceText: string[], searchText: string[]): number | null { + let result: number = null; + let searchIdx: number = 0; + const maxSearchIdx: number = searchText.length - 1; + for (let sourceIdx = 0; sourceIdx < sourceText.length; sourceIdx++) { + const sourceLine: string = sourceText[sourceIdx].trim(); + const searchLine: string = searchText[searchIdx].trim(); + if (searchLine == sourceLine) { + if (searchIdx == maxSearchIdx) { + result = sourceIdx - searchIdx; + break; + } + searchIdx++; + } else { + searchIdx = 0; + } + } + return result; + } +} diff --git a/src/util/NumberCountDict.ts b/src/util/NumberCountDict.ts new file mode 100644 index 00000000..5d6d0cc7 --- /dev/null +++ b/src/util/NumberCountDict.ts @@ -0,0 +1,30 @@ +import { getKeysPreserveType, getTypedObjectEntries } from "./utils"; + +export class ValueCountDict { + dict: Record = {}; // Record + + clearCountIfMissing(value: number): void { + if (!this.hasValue(value)) this.dict[value] = 0; + } + + hasValue(value: number): boolean { + return Object.prototype.hasOwnProperty.call(this.dict, value); + } + + incrementCount(value: number): void { + this.clearCountIfMissing(value); + this.dict[value]++; + } + + getMaxValue(): number { + return Math.max(...getKeysPreserveType(this.dict)) || 0; + } + + getTotalOfValueMultiplyCount(): number { + const v: number = + getTypedObjectEntries(this.dict) + .map(([value, count]) => value * count) + .reduce((a, b) => a + b, 0) || 0; + return v; + } +} diff --git a/src/util/RandomNumberProvider.ts b/src/util/RandomNumberProvider.ts new file mode 100644 index 00000000..aa14f86d --- /dev/null +++ b/src/util/RandomNumberProvider.ts @@ -0,0 +1,40 @@ +export interface IRandomNumberProvider { + getInteger(lowerBound: number, upperBound: number): number; +} + +export class RandomNumberProvider implements IRandomNumberProvider { + getInteger(lowerBound: number, upperBound: number): number { + const range = upperBound - lowerBound + 1; + return Math.floor(Math.random() * range) + lowerBound; + } +} + +export class StaticRandomNumberProvider implements IRandomNumberProvider { + expectedLowerBound: number; + expectedUpperBound: number; + next: number; + + getInteger(lowerBound: number, upperBound: number): number { + if (lowerBound != this.expectedLowerBound || upperBound != this.expectedUpperBound) + throw `lowerBound: ${lowerBound}/${this.expectedLowerBound}, upperBound: ${upperBound}/${this.expectedUpperBound}`; + return this.next; + } +} + +export let globalRandomNumberProvider: IRandomNumberProvider = new RandomNumberProvider(); +export const staticRandomNumberProvider: StaticRandomNumberProvider = + new StaticRandomNumberProvider(); + +export interface IStaticRandom { + lower: number; + upper: number; + next: number; +} + +export function setupNextRandomNumber(info: IStaticRandom) { + staticRandomNumberProvider.expectedLowerBound = info.lower; + staticRandomNumberProvider.expectedUpperBound = info.upper; + staticRandomNumberProvider.next = info.next; + + globalRandomNumberProvider = staticRandomNumberProvider; +} diff --git a/src/util/RenderMarkdownWrapper.ts b/src/util/RenderMarkdownWrapper.ts new file mode 100644 index 00000000..f084a59f --- /dev/null +++ b/src/util/RenderMarkdownWrapper.ts @@ -0,0 +1,145 @@ +import { App, MarkdownRenderer, TFile } from "obsidian"; +import { AUDIO_FORMATS, IMAGE_FORMATS, VIDEO_FORMATS } from "../constants"; +import SRPlugin from "../main"; + +export class RenderMarkdownWrapper { + private app: App; + private notePath: string; + private plugin: SRPlugin; + + constructor(app: App, plugin: SRPlugin, notePath: string) { + this.app = app; + this.notePath = notePath; + this.plugin = plugin; + } + + // slightly modified version of the renderMarkdown function in + // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/KanbanView.tsx + async renderMarkdownWrapper( + markdownString: string, + containerEl: HTMLElement, + recursiveDepth = 0, + ): Promise { + if (recursiveDepth > 4) return; + + MarkdownRenderer.renderMarkdown(markdownString, containerEl, this.notePath, this.plugin); + + containerEl.findAll(".internal-embed").forEach((el) => { + const link = this.parseLink(el.getAttribute("src")); + + // file does not exist, display dead link + if (!link.target) { + el.innerText = link.text; + } else if (link.target instanceof TFile) { + if (link.target.extension !== "md") { + this.embedMediaFile(el, link.target); + } else { + el.innerText = ""; + this.renderTransclude(el, link, recursiveDepth); + } + } + }); + } + + private parseLink(src: string) { + const linkComponentsRegex = + /^(?[^#^]+)?(?:#(?!\^)(?.+)|#\^(?.+)|#)?$/; + const matched = typeof src === "string" && src.match(linkComponentsRegex); + const file = matched.groups.file || this.notePath; + const target = this.plugin.app.metadataCache.getFirstLinkpathDest(file, this.notePath); + return { + text: matched[0], + file: matched.groups.file, + heading: matched.groups.heading, + blockId: matched.groups.blockId, + target: target, + }; + } + + private embedMediaFile(el: HTMLElement, target: TFile) { + el.innerText = ""; + if (IMAGE_FORMATS.includes(target.extension)) { + el.createEl( + "img", + { + attr: { + src: this.plugin.app.vault.getResourcePath(target), + }, + }, + (img) => { + if (el.hasAttribute("width")) + img.setAttribute("width", el.getAttribute("width")); + else img.setAttribute("width", "100%"); + if (el.hasAttribute("alt")) img.setAttribute("alt", el.getAttribute("alt")); + el.addEventListener( + "click", + (ev) => + ((ev.target as HTMLElement).style.minWidth = + (ev.target as HTMLElement).style.minWidth === "100%" + ? null + : "100%"), + ); + }, + ); + el.addClasses(["image-embed", "is-loaded"]); + } else if ( + AUDIO_FORMATS.includes(target.extension) || + VIDEO_FORMATS.includes(target.extension) + ) { + el.createEl( + AUDIO_FORMATS.includes(target.extension) ? "audio" : "video", + { + attr: { + controls: "", + src: this.plugin.app.vault.getResourcePath(target), + }, + }, + (audio) => { + if (el.hasAttribute("alt")) audio.setAttribute("alt", el.getAttribute("alt")); + }, + ); + el.addClasses(["media-embed", "is-loaded"]); + } else { + el.innerText = target.path; + } + } + + private async renderTransclude( + el: HTMLElement, + link: { + text: string; + file: string; + heading: string; + blockId: string; + target: TFile; + }, + recursiveDepth: number, + ) { + const cache = this.app.metadataCache.getCache(link.target.path); + const text = await this.app.vault.cachedRead(link.target); + let blockText; + if (link.heading) { + const clean = (s: string) => s.replace(/[\W\s]/g, ""); + const headingIndex = cache.headings?.findIndex( + (h) => clean(h.heading) === clean(link.heading), + ); + const heading = cache.headings[headingIndex]; + + const startAt = heading.position.start.offset; + const endAt = + cache.headings.slice(headingIndex + 1).find((h) => h.level <= heading.level) + ?.position?.start?.offset || text.length; + + blockText = text.substring(startAt, endAt); + } else if (link.blockId) { + const block = cache.blocks[link.blockId]; + const startAt = block.position.start.offset; + const endAt = block.position.end.offset; + blockText = text.substring(startAt, endAt); + } else { + blockText = text; + } + + this.renderMarkdownWrapper(blockText, el, recursiveDepth + 1); + } +} diff --git a/src/utils.ts b/src/util/utils.ts similarity index 74% rename from src/utils.ts rename to src/util/utils.ts index 3d465d2d..1debe429 100644 --- a/src/utils.ts +++ b/src/util/utils.ts @@ -1,3 +1,7 @@ +import moment from "moment"; +import { Moment } from "moment"; +import { PREFERRED_DATE_FORMAT } from "src/constants"; + type Hex = number; // https://stackoverflow.com/a/69019874 @@ -54,3 +58,24 @@ export function cyrb53(str: string, seed = 0): string { h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909); return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(16); } + +export function ticksFromDate(year: number, month: number, day: number): number { + return moment({ year, month, day }).utc().valueOf(); +} + +// 👇️ format as "YYYY-MM-DD" +// https://bobbyhadz.com/blog/typescript-date-format +export function formatDate_YYYY_MM_DD(ticks: Moment): string { + return ticks.format(PREFERRED_DATE_FORMAT); +} + +export function getAllTagsFromText(text: string): string[] { + const tagRegex = /#[^\s#]+/gi; + const result: RegExpMatchArray = text.match(tagRegex); + if (!result) return []; + return result; +} + +export function splitTextIntoLineArray(text: string): string[] { + return text.replaceAll("\r\n", "\n").split("\n"); +} diff --git a/tests/unit/DeckTreeIterator.test.ts b/tests/unit/DeckTreeIterator.test.ts new file mode 100644 index 00000000..92cb6f9f --- /dev/null +++ b/tests/unit/DeckTreeIterator.test.ts @@ -0,0 +1,497 @@ +import { NoteQuestionParser } from "src/NoteQuestionParser"; +import { CardListType, Deck } from "src/Deck"; +import { DEFAULT_SETTINGS } from "src/settings"; +import { SampleItemDecks } from "./SampleItems"; +import { TopicPath } from "src/TopicPath"; +import { + CardListOrder, + DeckTreeIterator, + IIteratorOrder, + IteratorDeckSource, + OrderMethod, +} from "src/DeckTreeIterator"; +import { + StaticDateProvider, + globalDateProvider, + setupStaticDateProvider_20230906, +} from "src/util/DateProvider"; +import { setupNextRandomNumber } from "src/util/RandomNumberProvider"; + +export var order_DueFirst_Sequential: IIteratorOrder = { + cardOrder: OrderMethod.Sequential, + cardListOrder: CardListOrder.DueFirst, + deckOrder: OrderMethod.Sequential, +}; +var order_DueFirst_Random: IIteratorOrder = { + cardOrder: OrderMethod.Random, + cardListOrder: CardListOrder.DueFirst, + deckOrder: OrderMethod.Sequential, +}; +var order_NewFirst_Sequential: IIteratorOrder = { + cardOrder: OrderMethod.Sequential, + cardListOrder: CardListOrder.NewFirst, + deckOrder: OrderMethod.Sequential, +}; + +var iterator: DeckTreeIterator; + +beforeAll(() => { + setupStaticDateProvider_20230906(); +}); + +describe("setDeck", () => { + test("currentDeck null immediately after setDeck", async () => { + let text: string = ` + Q1::A1 + Q2::A2 + Q3::A3`; + let deck: Deck = await SampleItemDecks.createDeckFromText(text, new TopicPath(["Root"])); + let iterator: DeckTreeIterator = new DeckTreeIterator( + order_NewFirst_Sequential, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + expect(iterator.currentDeck).toEqual(null); + }); +}); + +describe("nextCard", () => { + describe("Sequential ordering", () => { + describe("Due cards before new cards", () => { + test("Single topic, new cards only", async () => { + let text: string = ` + Q1::A1 + Q2::A2 + Q3::A3`; + let deck: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + let iterator: DeckTreeIterator = new DeckTreeIterator( + order_DueFirst_Sequential, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + + // No due cards, so expect the new ones immediately + expect(iterator.nextCard()).toEqual(true); + expect(iterator.currentDeck.deckName).toEqual("Root"); + expect(iterator.currentCard.front).toEqual("Q1"); + + expect(iterator.nextCard()).toEqual(true); + expect(iterator.currentCard.front).toEqual("Q2"); + + expect(iterator.nextCard()).toEqual(true); + expect(iterator.currentCard.front).toEqual("Q3"); + + expect(iterator.nextCard()).toEqual(false); + }); + + describe("Single topic, mixture of new and scheduled cards", () => { + test("Get the scheduled cards first", async () => { + let text: string = ` + Q1::A1 + Q2::A2 + Q3::A3 + Q4::A4 + Q5::A5 + Q6::A6`; + let deck: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + iterator = new DeckTreeIterator( + order_DueFirst_Sequential, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + + // Scheduled cards first + nextCardThenCheck("Q2"); + nextCardThenCheck("Q4"); + nextCardThenCheck("Q5"); + + // New cards next + nextCardThenCheck("Q1"); + nextCardThenCheck("Q3"); + nextCardThenCheck("Q6"); + + // Check no more + expect(iterator.nextCard()).toEqual(false); + }); + }); + + describe("Multiple topics, mixture of new and scheduled cards", () => { + test("Get the ancestor deck's cards first, then descendants", async () => { + let text: string = ` + #flashcards Q1::A1 + #flashcards Q2::A2 + #flashcards Q3::A3 + + #flashcards/science Q4::A4 + #flashcards/science Q5::A5 + + #flashcards/science/physics Q6::A6 + #flashcards/science/physics Q7::A7 + + #flashcards/science/chemistry Q8::A8 + `; + let deck: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + iterator = new DeckTreeIterator( + order_DueFirst_Sequential, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + + // Due root deck's cards first + nextCardThenCheck("Q2"); + + // Then the new cards + nextCardThenCheck("Q1"); + nextCardThenCheck("Q3"); + + // Then subdeck #flashcards/science (due then new) + nextCardThenCheck("Q4"); + nextCardThenCheck("Q5"); + + // Then subdeck #flashcards/science/physics + nextCardThenCheck("Q6"); + nextCardThenCheck("Q7"); + + // Then subdeck #flashcards/science/chemistry + nextCardThenCheck("Q8"); + + // Check no more + expect(iterator.nextCard()).toEqual(false); + }); + }); + }); + + describe("New cards before due cards", () => { + test("Single topic, new cards only", async () => { + let text: string = ` + Q1::A1 + Q2::A2 + Q3::A3`; + let deck: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + let iterator: DeckTreeIterator = new DeckTreeIterator( + order_NewFirst_Sequential, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + + expect(iterator.nextCard()).toEqual(true); + expect(iterator.currentDeck.deckName).toEqual("Root"); + expect(iterator.currentCard.front).toEqual("Q1"); + + expect(iterator.nextCard()).toEqual(true); + expect(iterator.currentCard.front).toEqual("Q2"); + + expect(iterator.nextCard()).toEqual(true); + expect(iterator.currentCard.front).toEqual("Q3"); + + expect(iterator.nextCard()).toEqual(false); + }); + + describe("Single topic, mixture of new and scheduled cards", () => { + test("Get the new cards first", async () => { + let text: string = ` + Q1::A1 + Q2::A2 + Q3::A3 + Q4::A4 + Q5::A5 + Q6::A6`; + let deck: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + iterator = new DeckTreeIterator( + order_NewFirst_Sequential, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + + // New cards first + nextCardThenCheck("Q1"); + nextCardThenCheck("Q3"); + nextCardThenCheck("Q6"); + + // Scheduled cards next + nextCardThenCheck("Q2"); + nextCardThenCheck("Q4"); + nextCardThenCheck("Q5"); + + // Check no more + expect(iterator.nextCard()).toEqual(false); + }); + + test("Get the scheduled cards first", async () => { + let text: string = ` + Q1::A1 + Q2::A2 + Q3::A3 + Q4::A4 + Q5::A5 + Q6::A6`; + let deck: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + iterator = new DeckTreeIterator( + order_DueFirst_Sequential, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + + // Scheduled cards first + nextCardThenCheck("Q2"); + nextCardThenCheck("Q4"); + nextCardThenCheck("Q5"); + + // New cards next + nextCardThenCheck("Q1"); + nextCardThenCheck("Q3"); + nextCardThenCheck("Q6"); + + // Check no more + expect(iterator.nextCard()).toEqual(false); + }); + }); + + describe("Multiple topics, mixture of new and scheduled cards", () => { + test("Get the ancestor deck's cards first, then descendants", async () => { + let text: string = ` + #flashcards Q1::A1 + #flashcards Q2::A2 + #flashcards Q3::A3 + + #flashcards/science Q4::A4 + #flashcards/science Q5::A5 + + #flashcards/science/physics Q6::A6 + #flashcards/science/physics Q7::A7 + + #flashcards/science/chemistry Q8::A8 + `; + let deck: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + iterator = new DeckTreeIterator( + order_NewFirst_Sequential, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + + // New root deck's cards first + nextCardThenCheck("Q1"); + nextCardThenCheck("Q3"); + nextCardThenCheck("Q2"); + + // Then subdeck #flashcards/science + nextCardThenCheck("Q5"); + nextCardThenCheck("Q4"); + + // Then subdeck #flashcards/science/physics + nextCardThenCheck("Q6"); + nextCardThenCheck("Q7"); + + // Then subdeck #flashcards/science/chemistry + nextCardThenCheck("Q8"); + + // Check no more + expect(iterator.nextCard()).toEqual(false); + }); + }); + }); + }); + + describe("Random ordering", () => { + describe("Due cards before new cards", () => { + test("All new cards", async () => { + let text: string = ` + Q0::A0 + Q1::A1 + Q2::A2 + Q3::A3 + Q4::A4 + Q5::A5 + Q6::A6`; + let deck: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + iterator = new DeckTreeIterator( + order_DueFirst_Random, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + + // [0, 1, 2, 3, 4, 5, 6] + setupNextRandomNumber({ lower: 0, upper: 6, next: 5 }); + nextCardThenCheck("Q5"); + // [0, 1, 2, 3, 4, 6] + setupNextRandomNumber({ lower: 0, upper: 5, next: 5 }); + nextCardThenCheck("Q6"); + // [0, 1, 2, 3, 4] + setupNextRandomNumber({ lower: 0, upper: 4, next: 1 }); + nextCardThenCheck("Q1"); + // [0, 2, 3, 4] + setupNextRandomNumber({ lower: 0, upper: 3, next: 3 }); + nextCardThenCheck("Q4"); + // [0, 2, 3] + setupNextRandomNumber({ lower: 0, upper: 2, next: 1 }); + nextCardThenCheck("Q2"); + // [0, 3] + setupNextRandomNumber({ lower: 0, upper: 1, next: 1 }); + nextCardThenCheck("Q3"); + // [0] + setupNextRandomNumber({ lower: 0, upper: 0, next: 0 }); + nextCardThenCheck("Q0"); + + // Check no more + expect(iterator.nextCard()).toEqual(false); + }); + + test("Mixture new/scheduled", async () => { + let text: string = ` + QN0::A + QS0::A + QN1::A + QS1::A + QS2::A + QN2::A + QN3::A + QS3::Q `; + let deck: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + iterator = new DeckTreeIterator( + order_DueFirst_Random, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + + // Scheduled cards first + // [QN0, QN1, QN2, QN3], [QS0, QS1, QS2, QS3] + setupNextRandomNumber({ lower: 0, upper: 3, next: 3 }); + nextCardThenCheck("QS3"); + + // [QN0, QN1, QN2, QN3], [QS0, QS1, QS2] + setupNextRandomNumber({ lower: 0, upper: 2, next: 1 }); + nextCardThenCheck("QS1"); + + // [QN0, QN1, QN2, QN3], [QS0, QS2] + setupNextRandomNumber({ lower: 0, upper: 1, next: 0 }); + nextCardThenCheck("QS0"); + + // [QN0, QN1, QN2, QN3], [QS2] + setupNextRandomNumber({ lower: 0, upper: 0, next: 0 }); + nextCardThenCheck("QS2"); + + // New cards next + // [QN0, QN1, QN2, QN3] + setupNextRandomNumber({ lower: 0, upper: 3, next: 2 }); + nextCardThenCheck("QN2"); + + // [QN0, QN1, QN3] + setupNextRandomNumber({ lower: 0, upper: 2, next: 2 }); + nextCardThenCheck("QN3"); + + // [QN0, QN1] + setupNextRandomNumber({ lower: 0, upper: 1, next: 0 }); + nextCardThenCheck("QN0"); + + // [QN1] + setupNextRandomNumber({ lower: 0, upper: 0, next: 0 }); + nextCardThenCheck("QN1"); + + // Check no more + expect(iterator.nextCard()).toEqual(false); + }); + }); + }); +}); + +describe("hasCurrentCard", () => { + test("false immediately after setDeck", async () => { + let text: string = ` + Q1::A1 + Q2::A2 + Q3::A3`; + let deck: Deck = await SampleItemDecks.createDeckFromText(text, new TopicPath(["Root"])); + let iterator: DeckTreeIterator = new DeckTreeIterator( + order_NewFirst_Sequential, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + expect(iterator.hasCurrentCard).toEqual(false); + }); + + test("true immediately after nextCard", async () => { + let text: string = ` + Q1::A1 + Q2::A2 + Q3::A3`; + let deck: Deck = await SampleItemDecks.createDeckFromText(text, new TopicPath(["Root"])); + let iterator: DeckTreeIterator = new DeckTreeIterator( + order_NewFirst_Sequential, + IteratorDeckSource.UpdatedByIterator, + ); + iterator.setDeck(deck); + expect(iterator.nextCard()).toEqual(true); + expect(iterator.hasCurrentCard).toEqual(true); + }); +}); +/* describe("deleteCurrentCard", () => { + test("Delete after all cards iterated - exception throw", async () => { + let text: string = ` + Q1::A1 + Q2::A2 usim + Q3::A3`; + let deck: Deck = await SampleItemDecks.createDeckFromText(text, new TopicPath(["Root"])); + iterator = new DeckTreeSequentialIterator(order_NewFirst_Sequential); + iterator.setDeck(deck); + + expect(iterator.nextCard()).toEqual(true); + expect(iterator.nextCard()).toEqual(true); + expect(iterator.nextCard()).toEqual(true); + expect(iterator.nextCard()).toEqual(false); + + const t = () => { + iterator.deleteCurrentCard(); + }; + expect(t).toThrow(); + }); + + test("Delete card, with single card remaining after it", async () => { + let text: string = ` + Q1::A1 + Q2::A2 + Q3::A3`; + let deck: Deck = await SampleItemDecks.createDeckFromText(text, new TopicPath(["Root"])); + expect(deck.newFlashcards.length).toEqual(3); + iterator = new DeckTreeSequentialIterator(order_NewFirst_Sequential); + iterator.setDeck(deck); + + nextCardThenCheck("Q1"); + nextCardThenCheck("Q2"); + expect(iterator.deleteCurrentCard()).toEqual(true); + expect(iterator.currentCard.front).toEqual("Q3"); + expect(iterator.deleteCurrentCard()).toEqual(false); + }); + +}); + */ +function nextCardThenCheck(expectedFront: string): void { + expect(iterator.nextCard()).toEqual(true); + expect(iterator.currentCard.front).toEqual(expectedFront); +} diff --git a/tests/unit/FlashcardReviewSequencer.test.ts b/tests/unit/FlashcardReviewSequencer.test.ts new file mode 100644 index 00000000..86c1a76f --- /dev/null +++ b/tests/unit/FlashcardReviewSequencer.test.ts @@ -0,0 +1,825 @@ +import { CardScheduleCalculator } from "src/CardSchedule"; +import { + DeckTreeIterator, + IDeckTreeIterator, + IIteratorOrder, + IteratorDeckSource, +} from "src/DeckTreeIterator"; +import { + FlashcardReviewMode, + FlashcardReviewSequencer, + IFlashcardReviewSequencer, +} from "src/FlashcardReviewSequencer"; +import { TopicPath } from "src/TopicPath"; +import { CardListType, Deck } from "src/Deck"; +import { DEFAULT_SETTINGS, SRSettings } from "src/settings"; +import { SampleItemDecks } from "./SampleItems"; +import { UnitTestSRFile } from "src/SRFile"; +import { ReviewResponse } from "src/scheduling"; +import { setupStaticDateProvider_20230906 } from "src/util/DateProvider"; +import moment from "moment"; +import { INoteEaseList, NoteEaseList } from "src/NoteEaseList"; +import { QuestionPostponementList, IQuestionPostponementList } from "src/QuestionPostponementList"; +import { order_DueFirst_Sequential } from "./DeckTreeIterator.test"; + +class TestContext { + cardSequencer: IDeckTreeIterator; + noteEaseList: INoteEaseList; + cardScheduleCalculator: CardScheduleCalculator; + reviewSequencer: IFlashcardReviewSequencer; + questionPostponementList: QuestionPostponementList; + file: UnitTestSRFile; + originalText: string; + fakeFilePath: string; + + constructor(init?: Partial) { + Object.assign(this, init); + } + + async setSequencerDeckTreeFromOriginalText(): Promise { + let deck: Deck = await SampleItemDecks.createDeckFromFile( + this.file, + new TopicPath(["Root"]), + ); + this.reviewSequencer.setDeckTree(deck, deck); + return deck; + } + + static Create( + iteratorOrder: IIteratorOrder, + reviewMode: FlashcardReviewMode, + settings: SRSettings, + text: string, + fakeFilePath?: string, + ): TestContext { + let cardSequencer: IDeckTreeIterator = new DeckTreeIterator( + iteratorOrder, + IteratorDeckSource.UpdatedByIterator, + ); + let noteEaseList = new NoteEaseList(settings); + let cardScheduleCalculator: CardScheduleCalculator = new CardScheduleCalculator( + settings, + noteEaseList, + ); + let cardPostponementList: QuestionPostponementList = new QuestionPostponementList( + null, + settings, + [], + ); + let reviewSequencer: IFlashcardReviewSequencer = new FlashcardReviewSequencer( + reviewMode, + cardSequencer, + settings, + cardScheduleCalculator, + cardPostponementList, + ); + var file: UnitTestSRFile = new UnitTestSRFile(text, fakeFilePath); + + let result: TestContext = new TestContext({ + cardSequencer, + noteEaseList, + cardScheduleCalculator, + reviewSequencer, + questionPostponementList: cardPostponementList, + file, + originalText: text, + fakeFilePath, + }); + return result; + } +} + +interface Info1 { + cardQ2_PreReviewText: string; + cardQ2_PostReviewEase: number; + cardQ2_PostReviewInterval: number; + cardQ2_PostReviewDueDate: string; + cardQ2_PostReviewText: string; +} + +async function checkReviewResponse_ReviewMode( + reviewResponse: ReviewResponse, + info: Info1, +): Promise { + let text: string = ` +#flashcards Q1::A1 +#flashcards Q2::A2 +#flashcards Q3::A3`; + + let fakeFilePath: string = moment().millisecond().toString(); + let c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Review, + DEFAULT_SETTINGS, + text, + fakeFilePath, + ); + let deck: Deck = await c.setSequencerDeckTreeFromOriginalText(); + + // State before calling processReview + let card = c.reviewSequencer.currentCard; + expect(card.front).toEqual("Q2"); + expect(card.scheduleInfo).toMatchObject({ + ease: 270, + interval: 4, + }); + + // State after calling processReview - next card + await c.reviewSequencer.processReview(reviewResponse); + expect(c.reviewSequencer.currentCard.front).toEqual("Q1"); + + // Schedule for the reviewed card has been updated + expect(card.scheduleInfo.ease).toEqual(info.cardQ2_PostReviewEase); + expect(card.scheduleInfo.interval).toEqual(info.cardQ2_PostReviewInterval); + expect(card.scheduleInfo.dueDate.unix).toEqual(moment(info.cardQ2_PostReviewDueDate).unix); + + // Note text has been updated + let expectedText: string = c.originalText.replace( + info.cardQ2_PreReviewText, + info.cardQ2_PostReviewText, + ); + expect(await c.file.read()).toEqual(expectedText); +} + +async function checkReviewResponse_CramMode(reviewResponse: ReviewResponse): Promise { + let text: string = ` +#flashcards Q1::A1 +#flashcards Q2::A2 +#flashcards Q3::A3 +#flashcards Q4::A4 `; + + let str: string = moment().millisecond().toString(); + let c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Cram, + DEFAULT_SETTINGS, + text, + str, + ); + let deck: Deck = await c.setSequencerDeckTreeFromOriginalText(); + + // State before calling processReview + let card = c.reviewSequencer.currentCard; + expect(card.front).toEqual("Q1"); + let expectInfo = { + ease: 270, + interval: 4, + }; + expect(card.scheduleInfo).toMatchObject(expectInfo); + + // State after calling processReview - next card + await c.reviewSequencer.processReview(reviewResponse); + expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); + + // No change to schedule for reviewed card in cram mode + expect(card.scheduleInfo).toMatchObject(expectInfo); + expect(card.scheduleInfo.dueDate.unix).toEqual(moment("2023-09-02").unix); + + // Note text remains the same + let expectedText: string = c.originalText; + expect(await c.file.read()).toEqual(expectedText); + + return c; +} + +async function setupSample1( + reviewMode: FlashcardReviewMode, + settings: SRSettings, +): Promise { + let text: string = ` +#flashcards Q1::A1 + +#flashcards Q2::A2 + + +#flashcards Q3::A3 +#flashcards/science Q4::A4 +#flashcards/science/physics Q5::A5 +#flashcards/math Q6::A6`; + + let c: TestContext = TestContext.Create(order_DueFirst_Sequential, reviewMode, settings, text); + await c.setSequencerDeckTreeFromOriginalText(); + return c; +} + +async function setupSample2(reviewMode: FlashcardReviewMode): Promise { + let text: string = ` +#flashcards Q1::A1 + + +#flashcards Q2:::A2 + + +#flashcards Q3::A3 + + +#flashcards This single ==question== turns into ==3 separate== ==cards== + +`; + + let c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + reviewMode, + DEFAULT_SETTINGS, + text, + ); + await c.setSequencerDeckTreeFromOriginalText(); + return c; +} + +function skipThenCheckCardFront(sequencer: IFlashcardReviewSequencer, expectedFront: string): void { + sequencer.skipCurrentCard(); + expect(sequencer.currentCard.front).toEqual(expectedFront); +} + +////////////////////////////////////////////////////////////////////// + +beforeAll(() => { + setupStaticDateProvider_20230906(); +}); + +describe("setDeckTree", () => { + test("Empty deck", () => { + let c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Review, + DEFAULT_SETTINGS, + "", + ); + c.reviewSequencer.setDeckTree(Deck.emptyDeck, Deck.emptyDeck); + expect(c.reviewSequencer.currentDeck).toEqual(null); + expect(c.reviewSequencer.currentCard).toEqual(null); + }); + + // After setDeckTree, the first card in the deck is the current card + test("Single level deck with some new cards", async () => { + let text: string = ` +Q1::A1 +Q2::A2 +Q3::A3`; + let c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Review, + DEFAULT_SETTINGS, + text, + ); + let deck: Deck = await c.setSequencerDeckTreeFromOriginalText(); + expect(deck.newFlashcards.length).toEqual(3); + + expect(c.reviewSequencer.currentDeck.newFlashcards.length).toEqual(3); + let expected = { + front: "Q1", + back: "A1", + }; + expect(c.reviewSequencer.currentCard).toMatchObject(expected); + }); +}); + +describe("skipCurrentCard", () => { + test("Simple test", async () => { + let c: TestContext = await setupSample1(FlashcardReviewMode.Review, DEFAULT_SETTINGS); + expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); + + // No more due cards after current card, so we expect the first new card for topic #flashcards + skipThenCheckCardFront(c.reviewSequencer, "Q1"); + skipThenCheckCardFront(c.reviewSequencer, "Q3"); + }); + + test("Skip repeatedly until no more", async () => { + let c: TestContext = await setupSample1(FlashcardReviewMode.Review, DEFAULT_SETTINGS); + expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); + + // No more due cards after current card, so we expect the first new card for topic #flashcards + skipThenCheckCardFront(c.reviewSequencer, "Q1"); + skipThenCheckCardFront(c.reviewSequencer, "Q3"); + + skipThenCheckCardFront(c.reviewSequencer, "Q4"); + skipThenCheckCardFront(c.reviewSequencer, "Q5"); + skipThenCheckCardFront(c.reviewSequencer, "Q6"); + + c.reviewSequencer.skipCurrentCard(); + expect(c.reviewSequencer.hasCurrentCard).toEqual(false); + }); + + test("Skipping a card skips all sibling cards", async () => { + let text: string = ` +#flashcards Q1::A1 + + +#flashcards Q2:::A2 + + +#flashcards Q3::A3 + + +#flashcards This single ==question== turns into ==3 separate== ==cards== + +`; + + let c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Review, + DEFAULT_SETTINGS, + text, + ); + await c.setSequencerDeckTreeFromOriginalText(); + expect(c.reviewSequencer.currentQuestion.cards.length).toEqual(1); + expect(c.reviewSequencer.currentCard.front).toEqual("Q1"); + + skipThenCheckCardFront(c.reviewSequencer, "Q2"); + expect(c.reviewSequencer.currentQuestion.cards.length).toEqual(2); + + // Skipping Q2 skips over both Q2::A2 and A2::Q2, goes straight to Q3 + skipThenCheckCardFront(c.reviewSequencer, "Q3"); + expect(c.reviewSequencer.currentQuestion.cards.length).toEqual(1); + + // Skip over Q3 + c.reviewSequencer.skipCurrentCard(); + expect(c.reviewSequencer.currentQuestion.cards[0].front).toMatch(/This single/); + expect(c.reviewSequencer.currentQuestion.cards.length).toEqual(3); + + // Skip over the cloze, skips all 3 cards, no cards left + c.reviewSequencer.skipCurrentCard(); + expect(c.reviewSequencer.hasCurrentCard).toEqual(false); + }); + + describe("Checking postponement list", () => { + describe("FlashcardReviewMode.Review", () => { + test("burySiblingCards=false - skipped question not added to postponement list", async () => { + let settings: SRSettings = { ...DEFAULT_SETTINGS }; + settings.burySiblingCards = false; + + let c: TestContext = await setupSample1(FlashcardReviewMode.Review, settings); + expect(c.questionPostponementList.list.length).toEqual(0); + expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); + + // Skip over these 2 questions + skipThenCheckCardFront(c.reviewSequencer, "Q1"); + skipThenCheckCardFront(c.reviewSequencer, "Q3"); + + expect(c.questionPostponementList.list.length).toEqual(0); + }); + + test("burySiblingCards=true - skipped question added to postponement list", async () => { + let settings: SRSettings = { ...DEFAULT_SETTINGS }; + settings.burySiblingCards = true; + + let c: TestContext = await setupSample1(FlashcardReviewMode.Review, settings); + expect(c.questionPostponementList.list.length).toEqual(0); + expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); + + // Skip over 2 questions + skipThenCheckCardFront(c.reviewSequencer, "Q1"); + skipThenCheckCardFront(c.reviewSequencer, "Q3"); + + expect(c.questionPostponementList.list.length).toEqual(2); + }); + }); + + describe("FlashcardReviewMode.Cram", () => { + test("Cram mode - skipped question not added to postponement list", async () => { + let c: TestContext = await setupSample1(FlashcardReviewMode.Cram, DEFAULT_SETTINGS); + expect(c.questionPostponementList.list.length).toEqual(0); + expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); + + // Skip over these questions + skipThenCheckCardFront(c.reviewSequencer, "Q1"); + skipThenCheckCardFront(c.reviewSequencer, "Q3"); + + expect(c.questionPostponementList.list.length).toEqual(0); + }); + }); + }); + // No postponement during cramming + // Deletion of sibling cards after text modification + // Deletion of sibling cards after card skip + // Delete+postpone +}); + +describe("processReview", () => { + describe("FlashcardReviewMode.Review", () => { + describe("ReviewResponse.Reset", () => { + test("Simple test - 3 cards all due in same deck - reset card moves to end of deck", async () => { + let text: string = ` + #flashcards Q1::A1 + #flashcards Q2::A2 + #flashcards Q3::A3 `; + + let c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Review, + DEFAULT_SETTINGS, + text, + ); + let deck: Deck = await c.setSequencerDeckTreeFromOriginalText(); + + // State before calling processReview + let card = c.reviewSequencer.currentCard; + expect(card.front).toEqual("Q1"); + expect(card.scheduleInfo).toMatchObject({ + ease: 270, + interval: 4, + }); + + // State after calling processReview - same current card + // (only need to check ease, interval - dueDate & delayBeforeReview are not relevant) + await c.reviewSequencer.processReview(ReviewResponse.Reset); + card = c.reviewSequencer.currentCard; + expect(card.front).toEqual("Q2"); + expect(card.scheduleInfo).toMatchObject({ + ease: 270, + interval: 5, + }); + + c.reviewSequencer.skipCurrentCard(); + card = c.reviewSequencer.currentCard; + expect(card.front).toEqual("Q3"); + expect(card.scheduleInfo).toMatchObject({ + ease: 270, + interval: 6, + }); + + // After skipping Q3, we should see Q1 the reset card with updated ease/interval + c.reviewSequencer.skipCurrentCard(); + card = c.reviewSequencer.currentCard; + expect(card.front).toEqual("Q1"); + expect(card.scheduleInfo).toMatchObject({ + ease: DEFAULT_SETTINGS.baseEase, + interval: 1, + }); + }); + }); + + describe("ReviewResponse.Easy", () => { + test("Card schedule is updated, next card becomes current", async () => { + const expected: Info1 = { + cardQ2_PreReviewText: "Q2::A2 ", + cardQ2_PostReviewEase: 290, + cardQ2_PostReviewInterval: 15, + cardQ2_PostReviewDueDate: "2023-09-21", // 15 days after the unit testing fixed date of 2023-09-06 + cardQ2_PostReviewText: `Q2::A2 +`, + }; + await checkReviewResponse_ReviewMode(ReviewResponse.Easy, expected); + }); + }); + }); + + describe("FlashcardReviewMode.Cram", () => { + describe("ReviewResponse.Easy", () => { + test("Next card after reviewed card becomes current; reviewed easy card doesn't resurface", async () => { + // [Q1, Q2, Q3] review Q1, then current becomes Q2 + let c: TestContext = await checkReviewResponse_CramMode(ReviewResponse.Easy); + expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); + skipThenCheckCardFront(c.reviewSequencer, "Q3"); + skipThenCheckCardFront(c.reviewSequencer, "Q4"); + + c.reviewSequencer.skipCurrentCard(); + expect(c.reviewSequencer.hasCurrentCard).toEqual(false); + }); + }); + + describe("ReviewResponse.Hard", () => { + test("Next card after reviewed card becomes current; reviewed hard card seen again", async () => { + // [Q1, Q2, Q3] review Q1, then current becomes Q2 + let c: TestContext = await checkReviewResponse_CramMode(ReviewResponse.Hard); + expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); + skipThenCheckCardFront(c.reviewSequencer, "Q3"); + skipThenCheckCardFront(c.reviewSequencer, "Q4"); + skipThenCheckCardFront(c.reviewSequencer, "Q1"); + + c.reviewSequencer.skipCurrentCard(); + expect(c.reviewSequencer.hasCurrentCard).toEqual(false); + }); + }); + }); +}); + +describe("updateCurrentQuestionText", () => { + let space: string = " "; + + describe("Checking update to file", () => { + describe("Single line card type; Settings - schedule on following line", () => { + test("Question has schedule on following line before/after update", async () => { + let text: string = ` +#flashcards Q1::A1 + +#flashcards Q2::A2 + + +#flashcards Q3::A3`; + + let updatedQ: string = "A much more in depth question::A much more detailed answer"; + let originalStr: string = `#flashcards Q2::A2 +`; + let updatedStr: string = `#flashcards A much more in depth question::A much more detailed answer +`; + await checkUpdateCurrentQuestionText( + text, + updatedQ, + originalStr, + updatedStr, + DEFAULT_SETTINGS, + ); + }); + + test("Question has schedule on same line (but pushed to following line due to settings)", async () => { + let text: string = ` +#flashcards Q1::A1 + +#flashcards Q2::A2 + +#flashcards Q3::A3`; + + let updatedQ: string = "A much more in depth question::A much more detailed answer"; + let originalStr: string = `#flashcards Q2::A2 `; + let expectedUpdatedStr: string = `#flashcards A much more in depth question::A much more detailed answer +`; + await checkUpdateCurrentQuestionText( + text, + updatedQ, + originalStr, + expectedUpdatedStr, + DEFAULT_SETTINGS, + ); + }); + }); + + describe("Single line card type; Settings - schedule on same line", () => { + let settings: SRSettings = { ...DEFAULT_SETTINGS }; + settings.cardCommentOnSameLine = true; + + test("Question has schedule on same line before/after", async () => { + let text1: string = ` +#flashcards Q1::A1 + +#flashcards Q2::A2 + +#flashcards Q3::A3`; + + let updatedQ: string = "A much more in depth question::A much more detailed answer"; + let originalStr: string = `#flashcards Q2::A2 `; + let updatedStr: string = `#flashcards A much more in depth question::A much more detailed answer `; + await checkUpdateCurrentQuestionText( + text1, + updatedQ, + originalStr, + updatedStr, + settings, + ); + }); + + test("Question has schedule on following line (but placed on same line due to settings)", async () => { + let text: string = ` +#flashcards Q1::A1 + +#flashcards Q2::A2 + + +#flashcards Q3::A3`; + + let updatedQ: string = "A much more in depth question::A much more detailed answer"; + let originalStr: string = `#flashcards Q2::A2 +`; + let updatedStr: string = `#flashcards A much more in depth question::A much more detailed answer `; + await checkUpdateCurrentQuestionText( + text, + updatedQ, + originalStr, + updatedStr, + settings, + ); + }); + }); + + describe("Multiline card type; Settings - schedule on following line", () => { + test("Question starts immediately after tag; Existing schedule present", async () => { + let originalStr: string = `Q2 +? +A2 +`; + + let text: string = ` +#flashcards Q1::A1 + +#flashcards ${originalStr} + +#flashcards Q3::A3`; + + let updatedQ: string = `Multiline question +Question starting immediately after tag +? +A2 (answer now includes more detail) +extra answer line 2`; + + let expectedUpdatedStr: string = `Multiline question +Question starting immediately after tag +? +A2 (answer now includes more detail) +extra answer line 2 +`; + + await checkUpdateCurrentQuestionText( + text, + updatedQ, + originalStr, + expectedUpdatedStr, + DEFAULT_SETTINGS, + ); + }); + + test("Question starts on same line as tag (after two spaces); Existing schedule present", async () => { + let originalStr: string = `Q2 +? +A2 +`; + + let text: string = ` +#flashcards Q1::A1 + +#flashcards${space}${space}${originalStr} + +#flashcards Q3::A3`; + + let updatedQ: string = `Multiline question +Question starting immediately after tag +? +A2 (answer now includes more detail) +extra answer line 2`; + + let expectedUpdatedStr: string = `Multiline question +Question starting immediately after tag +? +A2 (answer now includes more detail) +extra answer line 2 +`; + + await checkUpdateCurrentQuestionText( + text, + updatedQ, + originalStr, + expectedUpdatedStr, + DEFAULT_SETTINGS, + ); + }); + + test("Question starts line after tag; Existing schedule present", async () => { + let originalStr: string = `#flashcards +Q2 +? +A2 +`; + + let text: string = ` +#flashcards Q1::A1 + +${originalStr} + +#flashcards Q3::A3`; + + let updatedQ: string = `Multiline question +Question starting line after tag +? +A2 (answer now includes more detail) +extra answer line 2`; + + let expectedUpdatedStr: string = `#flashcards +Multiline question +Question starting line after tag +? +A2 (answer now includes more detail) +extra answer line 2 +`; + + await checkUpdateCurrentQuestionText( + text, + updatedQ, + originalStr, + expectedUpdatedStr, + DEFAULT_SETTINGS, + ); + }); + + test("Question starts line after tag (no white space after tag); New card", async () => { + let originalQuestionStr: string = `#flashcards +Q2 +? +A2`; + + let fileText: string = ` +${originalQuestionStr} + +#flashcards Q1::A1 + +#flashcards Q3::A3`; + + let updatedQuestionText: string = `Multiline question +Question starting immediately after tag +? +A2 (answer now includes more detail) +extra answer line 2`; + + let expectedUpdatedStr: string = `#flashcards +${updatedQuestionText}`; + + await checkUpdateCurrentQuestionText( + fileText, + updatedQuestionText, + originalQuestionStr, + expectedUpdatedStr, + DEFAULT_SETTINGS, + ); + }); + + test("Question starts line after tag (single space after tag before newline); New card", async () => { + let originalQuestionStr: string = `#flashcards${space} +Q2 +? +A2`; + + let fileText: string = ` +${originalQuestionStr} + +#flashcards Q1::A1 + +#flashcards Q3::A3`; + + let updatedQuestionText: string = `Multiline question +Question starting immediately after tag +? +A2 (answer now includes more detail) +extra answer line 2`; + + let expectedUpdatedStr: string = `#flashcards +${updatedQuestionText}`; + + await checkUpdateCurrentQuestionText( + fileText, + updatedQuestionText, + originalQuestionStr, + expectedUpdatedStr, + DEFAULT_SETTINGS, + ); + }); + }); + }); +}); + +describe("Sequences", () => { + test("Update question text, followed by review response", async () => { + let text1: string = ` +#flashcards Q2::A2 + +#flashcards Q3::A3`; + + // Do the update step + let updatedQ: string = "A much more in depth question::A much more detailed answer"; + let originalStr: string = `#flashcards Q2::A2`; + let updatedStr: string = `#flashcards A much more in depth question::A much more detailed answer`; + + let c: TestContext = await checkUpdateCurrentQuestionText( + text1, + updatedQ, + originalStr, + updatedStr, + DEFAULT_SETTINGS, + ); + + // Now do the review step + await c.reviewSequencer.processReview(ReviewResponse.Hard); + + // Schedule for the reviewed card has been updated + let expectedText: string = ` +${updatedStr} + + +#flashcards Q3::A3`; + + expect(await c.file.read()).toEqual(expectedText); + }); +}); + +async function checkUpdateCurrentQuestionText( + noteText: string, + updatedQ: string, + originalStr: string, + updatedStr: string, + settings: SRSettings, +): Promise { + let c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Review, + settings, + noteText, + ); + await c.setSequencerDeckTreeFromOriginalText(); + expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); + + await c.reviewSequencer.updateCurrentQuestionText(updatedQ); + + // originalText should remain the same except for the specific substring change from originalStr => updatedStr + if (!c.originalText.includes(originalStr)) throw `Text not found: ${originalStr}`; + let expectedFileText: string = c.originalText.replace(originalStr, updatedStr); + expect(await c.file.read()).toEqual(expectedFileText); + return c; +} diff --git a/tests/unit/Note.test.ts b/tests/unit/Note.test.ts new file mode 100644 index 00000000..96b59024 --- /dev/null +++ b/tests/unit/Note.test.ts @@ -0,0 +1,76 @@ +import { NoteParser } from "src/NoteParser"; +import { UnitTestSRFile } from "src/SRFile"; +import { TopicPath } from "src/TopicPath"; +import { Deck } from "src/Deck"; +import { Note } from "src/Note"; +import { Question } from "src/Question"; +import { DEFAULT_SETTINGS } from "src/settings"; +import { NoteFileLoader } from "src/NoteFileLoader"; + +let parser: NoteParser = new NoteParser(DEFAULT_SETTINGS); +var noteFileLoader: NoteFileLoader = new NoteFileLoader(DEFAULT_SETTINGS); + +describe("appendCardsToDeck", () => { + test("Multiple questions, single card per question", async () => { + let noteText: string = `#flashcards/test +Q1::A1 +Q2::A2 +Q3::A3 +`; + let file: UnitTestSRFile = new UnitTestSRFile(noteText); + let folderTopicPath = TopicPath.emptyPath; + let note: Note = await parser.parse(file, folderTopicPath); + let deck: Deck = Deck.emptyDeck; + note.appendCardsToDeck(deck); + let subdeck: Deck = deck.getDeck(new TopicPath(["flashcards", "test"])); + expect(subdeck.newFlashcards[0].front).toEqual("Q1"); + expect(subdeck.newFlashcards[1].front).toEqual("Q2"); + expect(subdeck.newFlashcards[2].front).toEqual("Q3"); + expect(subdeck.dueFlashcards.length).toEqual(0); + }); + + test("Multiple questions, multiple cards per question", async () => { + let noteText: string = `#flashcards/test +Q1:::A1 +Q2:::A2 +Q3:::A3 +`; + let file: UnitTestSRFile = new UnitTestSRFile(noteText); + let folderTopicPath = TopicPath.emptyPath; + let note: Note = await parser.parse(file, folderTopicPath); + let deck: Deck = Deck.emptyDeck; + note.appendCardsToDeck(deck); + let subdeck: Deck = deck.getDeck(new TopicPath(["flashcards", "test"])); + expect(subdeck.newFlashcards.length).toEqual(6); + let frontList = subdeck.newFlashcards.map((card) => card.front); + + expect(frontList).toEqual(["Q1", "A1", "Q2", "A2", "Q3", "A3"]); + expect(subdeck.dueFlashcards.length).toEqual(0); + }); +}); + +describe("writeNoteFile", () => { + test("Multiple questions, some with too many schedule details", async () => { + let originalText: string = `#flashcards/test +Q1::A1 +#flashcards Q2::A2 + +Q3:::A3 + +`; + let file: UnitTestSRFile = new UnitTestSRFile(originalText); + let note: Note = await noteFileLoader.load(file, TopicPath.emptyPath); + + await note.writeNoteFile(DEFAULT_SETTINGS); + let updatedText: string = file.content; + + let expectedText: string = `#flashcards/test +Q1::A1 +#flashcards Q2::A2 + +Q3:::A3 + +`; + expect(updatedText).toEqual(expectedText); + }); +}); diff --git a/tests/unit/NoteCardScheduleParser.test.ts b/tests/unit/NoteCardScheduleParser.test.ts new file mode 100644 index 00000000..49f37df4 --- /dev/null +++ b/tests/unit/NoteCardScheduleParser.test.ts @@ -0,0 +1,43 @@ +import { CardScheduleInfo, NoteCardScheduleParser } from "src/CardSchedule"; +import { TICKS_PER_DAY } from "src/constants"; +import { setupStaticDateProvider_20230906 } from "src/util/DateProvider"; + +beforeAll(() => { + setupStaticDateProvider_20230906(); +}); + +test("No schedule info for question", () => { + expect(NoteCardScheduleParser.createCardScheduleInfoList("A::B")).toEqual([]); +}); + +test("Single schedule info for question (on separate line)", () => { + let actual: CardScheduleInfo[] = + NoteCardScheduleParser.createCardScheduleInfoList(`What symbol represents an electric field:: $\\large \\vec E$ +`); + + expect(actual).toEqual([ + CardScheduleInfo.fromDueDateStr("2023-09-02", 4, 270, -4 * TICKS_PER_DAY), + ]); +}); + +test("Single schedule info for question (on same line)", () => { + let actual: CardScheduleInfo[] = NoteCardScheduleParser.createCardScheduleInfoList( + `What symbol represents an electric field:: $\\large \\vec E$`, + ); + + expect(actual).toEqual([ + CardScheduleInfo.fromDueDateStr("2023-09-02", 4, 270, -4 * TICKS_PER_DAY), + ]); +}); + +test("Multiple schedule info for question (on separate line)", () => { + let actual: CardScheduleInfo[] = + NoteCardScheduleParser.createCardScheduleInfoList(`This is a really very ==interesting== and ==fascinating== and ==great== test + `); + + expect(actual).toEqual([ + CardScheduleInfo.fromDueDateStr("2023-09-03", 1, 230, -3 * TICKS_PER_DAY), + CardScheduleInfo.fromDueDateStr("2023-09-05", 3, 250, -1 * TICKS_PER_DAY), + CardScheduleInfo.fromDueDateStr("2023-09-06", 4, 270, 0), + ]); +}); diff --git a/tests/unit/NoteEaseList.test.ts b/tests/unit/NoteEaseList.test.ts new file mode 100644 index 00000000..4f5c4b81 --- /dev/null +++ b/tests/unit/NoteEaseList.test.ts @@ -0,0 +1,22 @@ +import { NoteEaseList } from "src/NoteEaseList"; +import { DEFAULT_SETTINGS } from "src/settings"; + +test("baseEase", async () => { + let list: NoteEaseList = new NoteEaseList(DEFAULT_SETTINGS); + expect(list.baseEase).toEqual(250); +}); + +test("hasEaseForPath", async () => { + let list: NoteEaseList = new NoteEaseList(DEFAULT_SETTINGS); + expect(list.hasEaseForPath("Unknown path")).toEqual(false); + + list.setEaseForPath("Known path", 100); + expect(list.hasEaseForPath("Known path")).toEqual(true); +}); + +test("getEaseByPath", async () => { + let list: NoteEaseList = new NoteEaseList(DEFAULT_SETTINGS); + + list.setEaseForPath("Known path", 100); + expect(list.getEaseByPath("Known path")).toEqual(100); +}); diff --git a/tests/unit/NoteFileLoader.test.ts b/tests/unit/NoteFileLoader.test.ts new file mode 100644 index 00000000..ab07ae5f --- /dev/null +++ b/tests/unit/NoteFileLoader.test.ts @@ -0,0 +1,35 @@ +import { Note } from "src/Note"; +import { NoteFileLoader } from "src/NoteFileLoader"; +import { UnitTestSRFile } from "src/SRFile"; +import { TopicPath } from "src/TopicPath"; +import { DEFAULT_SETTINGS } from "src/settings"; + +var noteFileLoader: NoteFileLoader = new NoteFileLoader(DEFAULT_SETTINGS); + +describe("load", () => { + test("Multiple questions, none with too many schedule details", async () => { + let noteText: string = `#flashcards/test +Q1::A1 +#flashcards Q2::A2 + +Q3:::A3 + +`; + let file: UnitTestSRFile = new UnitTestSRFile(noteText); + let note: Note = await noteFileLoader.load(file, TopicPath.emptyPath); + expect(note.hasChanged).toEqual(false); + }); + + test("Multiple questions, some with too many schedule details", async () => { + let noteText: string = `#flashcards/test +Q1::A1 +#flashcards Q2::A2 + +Q3:::A3 + +`; + let file: UnitTestSRFile = new UnitTestSRFile(noteText); + let note: Note = await noteFileLoader.load(file, TopicPath.emptyPath); + expect(note.hasChanged).toEqual(true); + }); +}); diff --git a/tests/unit/NoteParser.test.ts b/tests/unit/NoteParser.test.ts new file mode 100644 index 00000000..fb57ed00 --- /dev/null +++ b/tests/unit/NoteParser.test.ts @@ -0,0 +1,28 @@ +import { NoteParser } from "src/NoteParser"; +import { UnitTestSRFile } from "src/SRFile"; +import { TopicPath } from "src/TopicPath"; +import { Note } from "src/Note"; +import { Question } from "src/Question"; +import { DEFAULT_SETTINGS } from "src/settings"; +import { setupStaticDateProvider_20230906 } from "src/util/DateProvider"; + +let parser: NoteParser = new NoteParser(DEFAULT_SETTINGS); + +beforeAll(() => { + setupStaticDateProvider_20230906(); +}); + +describe("Multiple questions in the text", () => { + test("SingleLineBasic: No schedule info", async () => { + let noteText: string = `#flashcards/test +Q1::A1 +Q2::A2 +Q3::A3 +`; + let file: UnitTestSRFile = new UnitTestSRFile(noteText); + let folderTopicPath = TopicPath.emptyPath; + let note: Note = await parser.parse(file, folderTopicPath); + let questionList = note.questionList; + expect(questionList.length).toEqual(3); + }); +}); diff --git a/tests/unit/NoteQuestionParser.test.ts b/tests/unit/NoteQuestionParser.test.ts new file mode 100644 index 00000000..323f9cbb --- /dev/null +++ b/tests/unit/NoteQuestionParser.test.ts @@ -0,0 +1,352 @@ +import { NoteQuestionParser } from "src/NoteQuestionParser"; +import { CardScheduleInfo } from "src/CardSchedule"; +import { TICKS_PER_DAY } from "src/constants"; +import { CardType, Question } from "src/Question"; +import { DEFAULT_SETTINGS, SRSettings } from "src/settings"; +import { TopicPath } from "src/TopicPath"; +import { createTest_NoteQuestionParser } from "./SampleItems"; +import { ISRFile, UnitTestSRFile } from "src/SRFile"; +import { setupStaticDateProvider_20230906 } from "src/util/DateProvider"; + +let parserWithDefaultSettings: NoteQuestionParser = createTest_NoteQuestionParser(DEFAULT_SETTINGS); +let settings_ConvertFoldersToDecks: SRSettings = { ...DEFAULT_SETTINGS }; +settings_ConvertFoldersToDecks.convertFoldersToDecks = true; +let parser_ConvertFoldersToDecks: NoteQuestionParser = createTest_NoteQuestionParser( + settings_ConvertFoldersToDecks, +); + +beforeAll(() => { + setupStaticDateProvider_20230906(); +}); + +test("No questions in the text", async () => { + let noteText: string = "An interesting note, but no questions"; + let folderTopicPath: TopicPath = TopicPath.emptyPath; + let noteFile: ISRFile = new UnitTestSRFile(noteText); + + expect(await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath)).toEqual( + [], + ); +}); + +describe("Single question in the text", () => { + test("SingleLineBasic: No schedule info", async () => { + let noteText: string = ` +A::B +`; + let noteFile: ISRFile = new UnitTestSRFile(noteText); + + let folderTopicPath: TopicPath = TopicPath.emptyPath; + let card1 = { + cardIdx: 0, + scheduleInfo: null as CardScheduleInfo, + }; + let expected = [ + { + questionType: CardType.SingleLineBasic, + topicPath: TopicPath.emptyPath, + questionText: { + original: `A::B`, + actualQuestion: "A::B", + topicPath: TopicPath.emptyPath, + }, + + lineNo: 1, + hasEditLaterTag: false, + cards: [card1], + hasChanged: false, + }, + ]; + expect( + await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath), + ).toMatchObject(expected); + }); + + test("SingleLineBasic: With schedule info", async () => { + let noteText: string = `#flashcards/test +A::B + + `; + let noteFile: ISRFile = new UnitTestSRFile(noteText); + + let folderTopicPath: TopicPath = TopicPath.emptyPath; + let delayDays = 3 - 6; + let card1 = { + cardIdx: 0, + scheduleInfo: CardScheduleInfo.fromDueDateStr( + "2023-09-03", + 1, + 230, + delayDays * TICKS_PER_DAY, + ), + }; + let expected = [ + { + questionType: CardType.SingleLineBasic, + topicPath: new TopicPath(["flashcards", "test"]), + questionText: { + original: `A::B +`, + actualQuestion: "A::B", + topicPath: TopicPath.emptyPath, + textHash: "1c6b0b01215dc4", + }, + lineNo: 1, + hasEditLaterTag: false, + cards: [card1], + hasChanged: false, + }, + ]; + expect( + await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath), + ).toMatchObject(expected); + }); +}); + +describe("Multiple questions in the text", () => { + test("SingleLineBasic: No schedule info", async () => { + let noteText: string = `#flashcards/test +Q1::A1 +Q2::A2 +`; + let noteFile: ISRFile = new UnitTestSRFile(noteText); + let folderTopicPath: TopicPath = TopicPath.emptyPath; + let questionList: Question[] = await parser_ConvertFoldersToDecks.createQuestionList( + noteFile, + folderTopicPath, + ); + expect(questionList.length).toEqual(2); + }); + + test("SingleLineBasic: Note topic applies to all questions when not overriden", async () => { + let noteText: string = ` +Q1::A1 +Q2::A2 +Q3::A3 +`; + let noteFile: ISRFile = new UnitTestSRFile(noteText); + + let folderTopicPath: TopicPath = new TopicPath(["flashcards", "science"]); + let questionList: Question[] = await parser_ConvertFoldersToDecks.createQuestionList( + noteFile, + folderTopicPath, + ); + expect(questionList.length).toEqual(3); + expect(questionList[0].topicPath).toEqual(new TopicPath(["flashcards", "science"])); + expect(questionList[1].topicPath).toEqual(new TopicPath(["flashcards", "science"])); + expect(questionList[2].topicPath).toEqual(new TopicPath(["flashcards", "science"])); + }); +}); + +describe("Handling tags within note", () => { + describe("Settings mode: Convert folder path to tag", () => { + let settings: SRSettings = { ...DEFAULT_SETTINGS }; + settings.convertFoldersToDecks = true; + let parser2: NoteQuestionParser = createTest_NoteQuestionParser(settings); + + test("Folder path applies to all questions within note", async () => { + let noteText: string = ` + Q1::A1 + Q2::A2 + Q3::A3 + `; + + let noteFile: ISRFile = new UnitTestSRFile(noteText); + let folderTopicPath: TopicPath = new TopicPath(["folder", "subfolder"]); + let questionList: Question[] = await parser2.createQuestionList( + noteFile, + folderTopicPath, + ); + expect(questionList.length).toEqual(3); + for (let i = 0; i < questionList.length; i++) + expect(questionList[i].topicPath).toEqual(new TopicPath(["folder", "subfolder"])); + }); + + test("Topic tag within note is ignored (outside all questions)", async () => { + let noteText: string = `#flashcards/test +Q1::A1 + `; + + let noteFile: ISRFile = new UnitTestSRFile(noteText); + let folderTopicPath: TopicPath = new TopicPath(["folder", "subfolder"]); + let questionList: Question[] = await parser2.createQuestionList( + noteFile, + folderTopicPath, + ); + expect(questionList.length).toEqual(1); + expect(questionList[0].topicPath).toEqual(new TopicPath(["folder", "subfolder"])); + }); + + // Behavior here mimics SR_ORIGINAL + // It could be argued that topic tags within a question should override the folder based topic + test("Topic tag within note is ignored (within specific question)", async () => { + // The tag "#flashcards/test" specifies a different topic than the folderTopicPath below + let noteText: string = ` +#flashcards/test Q1::A1 + `; + + let noteFile: ISRFile = new UnitTestSRFile(noteText); + let folderTopicPath: TopicPath = new TopicPath(["folder", "subfolder"]); + let questionList: Question[] = await parser2.createQuestionList( + noteFile, + folderTopicPath, + ); + expect(questionList.length).toEqual(1); + expect(questionList[0].topicPath).toEqual(new TopicPath(["folder", "subfolder"])); + }); + }); + + describe("Settings mode: Use tags within note", () => { + expect(parserWithDefaultSettings.settings.convertFoldersToDecks).toEqual(false); + + test("Topic tag before first question applies to all questions", async () => { + let noteText: string = `#flashcards/test + Q1::A1 + Q2::A2 + Q3::A3 + `; + let noteFile: ISRFile = new UnitTestSRFile(noteText); + + let expectedPath: TopicPath = new TopicPath(["flashcards", "test"]); + let folderTopicPath: TopicPath = TopicPath.emptyPath; + let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( + noteFile, + folderTopicPath, + ); + expect(questionList.length).toEqual(3); + expect(questionList[0].topicPath).toEqual(expectedPath); + expect(questionList[1].topicPath).toEqual(expectedPath); + expect(questionList[2].topicPath).toEqual(expectedPath); + }); + + test("Topic tag within question overrides the note topic, for that topic only", async () => { + let noteText: string = `#flashcards/test + Q1::A1 + #flashcards/examination Q2::A2 + Q3::This has the "flashcards/test" topic, not "flashcards/examination" + `; + let noteFile: ISRFile = new UnitTestSRFile(noteText); + + let folderTopicPath: TopicPath = TopicPath.emptyPath; + let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( + noteFile, + folderTopicPath, + ); + expect(questionList.length).toEqual(3); + expect(questionList[0].topicPath).toEqual(new TopicPath(["flashcards", "test"])); + expect(questionList[1].topicPath).toEqual(new TopicPath(["flashcards", "examination"])); + expect(questionList[2].topicPath).toEqual(new TopicPath(["flashcards", "test"])); + }); + + test("First topic tag within note (outside questions) is used as the note's topic tag, even if it appears after the first question", async () => { + let noteText: string = ` + Q1::A1 This has the "flashcards/test" topic, even though the first topic tag is after this line in the file + #flashcards/test + Q2::A2 + Q3::A3 + `; + let noteFile: ISRFile = new UnitTestSRFile(noteText); + + let expectedPath: TopicPath = new TopicPath(["flashcards", "test"]); + let folderTopicPath: TopicPath = TopicPath.emptyPath; + let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( + noteFile, + folderTopicPath, + ); + expect(questionList.length).toEqual(3); + for (let i = 0; i < questionList.length; i++) + expect(questionList[i].topicPath).toEqual(expectedPath); + }); + + test("Only first topic tag within note (outside questions) is used as the note's topic tag, subsequent ignored", async () => { + let noteText: string = ` + Q1::A1 + #flashcards/test + Q2::A2 + #flashcards/examination + Q3::This has the "flashcards/test" topic, not "flashcards/examination" + `; + let noteFile: ISRFile = new UnitTestSRFile(noteText); + + let expectedPath: TopicPath = new TopicPath(["flashcards", "test"]); + let folderTopicPath: TopicPath = TopicPath.emptyPath; + let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( + noteFile, + folderTopicPath, + ); + expect(questionList.length).toEqual(3); + for (let i = 0; i < questionList.length; i++) + expect(questionList[i].topicPath).toEqual(expectedPath); + }); + }); + + describe("Tags within question", () => { + expect(parserWithDefaultSettings.settings.convertFoldersToDecks).toEqual(false); + + test("Leading white space before topic tag", async () => { + let noteText: string = ` + #flashcards/science Q5::A5 + `; + let noteFile: ISRFile = new UnitTestSRFile(noteText); + + let expectedPath: TopicPath = new TopicPath(["flashcards", "science"]); + let folderTopicPath: TopicPath = TopicPath.emptyPath; + let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( + noteFile, + folderTopicPath, + ); + expect(questionList.length).toEqual(1); + expect(questionList[0].topicPath).toEqual(expectedPath); + expect(questionList[0].cards.length).toEqual(1); + expect(questionList[0].cards[0].front).toEqual("Q5"); + }); + }); +}); + +function checkQuestion1(question: Question) { + expect(question.cards.length).toEqual(1); + let card1 = { + cardIdx: 0, + isDue: false, + front: "Q1", + back: "A1", + scheduleInfo: null as CardScheduleInfo, + }; + let expected = { + questionType: CardType.SingleLineBasic, + topicPath: TopicPath.emptyPath, + questionTextOriginal: `Q1::A1`, + questionTextCleaned: "Q1::A1", + lineNo: 1, + hasEditLaterTag: false, + context: "", + hasChanged: false, + }; + expect(question).toMatchObject(expected); + expect(question.cards[0]).toMatchObject(card1); + return question; +} + +function checkQuestion2(question: Question) { + expect(question.cards.length).toEqual(1); + let card1 = { + cardIdx: 0, + isDue: false, + front: "Q2", + back: "A2", + scheduleInfo: null as CardScheduleInfo, + }; + let expected = { + questionType: CardType.SingleLineBasic, + topicPath: TopicPath.emptyPath, + questionTextOriginal: `Q2::A2`, + questionTextCleaned: "Q2::A2", + lineNo: 2, + hasEditLaterTag: false, + context: "", + hasChanged: false, + }; + expect(question).toMatchObject(expected); + expect(question.cards[0]).toMatchObject(card1); + return question; +} diff --git a/tests/unit/Question.test.ts b/tests/unit/Question.test.ts new file mode 100644 index 00000000..d61c4668 --- /dev/null +++ b/tests/unit/Question.test.ts @@ -0,0 +1,34 @@ +import { TopicPath } from "src/TopicPath"; +import { DEFAULT_SETTINGS, SRSettings } from "src/settings"; +import { Question, QuestionText } from "src/Question"; + +let settings_cardCommentOnSameLine: SRSettings = { ...DEFAULT_SETTINGS }; +settings_cardCommentOnSameLine.cardCommentOnSameLine = true; + +describe("Question", () => { + describe("getHtmlCommentSeparator", () => { + test("Ends with a code block", async () => { + let text: string = + "How do you ... Python?\n?\n" + + "```\nprint('Hello World!')\nprint('Howdy?')\nlambda x: x[0]\n```"; + + let question: Question = new Question({ + questionText: new QuestionText(text, TopicPath.emptyPath, "", text), + }); + + expect(question.getHtmlCommentSeparator(DEFAULT_SETTINGS)).toEqual("\n"); + expect(question.getHtmlCommentSeparator(settings_cardCommentOnSameLine)).toEqual("\n"); + }); + + test("Doesn't end with a code block", async () => { + let text: string = "Q1::A1"; + + let question: Question = new Question({ + questionText: new QuestionText(text, TopicPath.emptyPath, "", text), + }); + + expect(question.getHtmlCommentSeparator(DEFAULT_SETTINGS)).toEqual("\n"); + expect(question.getHtmlCommentSeparator(settings_cardCommentOnSameLine)).toEqual(" "); + }); + }); +}); diff --git a/tests/unit/QuestionType.test.ts b/tests/unit/QuestionType.test.ts new file mode 100644 index 00000000..108c153b --- /dev/null +++ b/tests/unit/QuestionType.test.ts @@ -0,0 +1,98 @@ +import { CardType } from "src/Question"; +import { CardFrontBack, CardFrontBackUtil, QuestionType_ClozeUtil } from "src/QuestionType"; +import { DEFAULT_SETTINGS, SRSettings } from "src/settings"; + +test("CardType.SingleLineBasic", () => { + expect(CardFrontBackUtil.expand(CardType.SingleLineBasic, "A::B", DEFAULT_SETTINGS)).toEqual([ + new CardFrontBack("A", "B"), + ]); +}); + +test("CardType.SingleLineReversed", () => { + expect( + CardFrontBackUtil.expand(CardType.SingleLineReversed, "A:::B", DEFAULT_SETTINGS), + ).toEqual([new CardFrontBack("A", "B"), new CardFrontBack("B", "A")]); +}); + +describe("CardType.MultiLineBasic", () => { + test("Basic", () => { + expect( + CardFrontBackUtil.expand( + CardType.MultiLineBasic, + "A1\nA2\n?\nB1\nB2", + DEFAULT_SETTINGS, + ), + ).toEqual([new CardFrontBack("A1\nA2", "B1\nB2")]); + }); +}); + +test("CardType.MultiLineReversed", () => { + expect( + CardFrontBackUtil.expand( + CardType.MultiLineReversed, + "A1\nA2\n??\nB1\nB2", + DEFAULT_SETTINGS, + ), + ).toEqual([new CardFrontBack("A1\nA2", "B1\nB2"), new CardFrontBack("B1\nB2", "A1\nA2")]); +}); + +test("CardType.Cloze", () => { + let frontHtml = QuestionType_ClozeUtil.renderClozeFront(); + + expect( + CardFrontBackUtil.expand( + CardType.Cloze, + "This is a very ==interesting== test", + DEFAULT_SETTINGS, + ), + ).toEqual([ + new CardFrontBack( + "This is a very " + frontHtml + " test", + "This is a very " + QuestionType_ClozeUtil.renderClozeBack("interesting") + " test", + ), + ]); + + let settings2: SRSettings = DEFAULT_SETTINGS; + settings2.convertBoldTextToClozes = true; + settings2.convertHighlightsToClozes = true; + settings2.convertCurlyBracketsToClozes = true; + + expect( + CardFrontBackUtil.expand(CardType.Cloze, "This is a very **interesting** test", settings2), + ).toEqual([ + new CardFrontBack( + "This is a very " + frontHtml + " test", + "This is a very " + QuestionType_ClozeUtil.renderClozeBack("interesting") + " test", + ), + ]); + + expect( + CardFrontBackUtil.expand(CardType.Cloze, "This is a very {{interesting}} test", settings2), + ).toEqual([ + new CardFrontBack( + "This is a very " + frontHtml + " test", + "This is a very " + QuestionType_ClozeUtil.renderClozeBack("interesting") + " test", + ), + ]); + + expect( + CardFrontBackUtil.expand( + CardType.Cloze, + "This is a really very {{interesting}} and ==fascinating== and **great** test", + settings2, + ), + ).toEqual([ + new CardFrontBack( + "This is a really very [...] and fascinating and great test", + "This is a really very interesting and fascinating and great test", + ), + new CardFrontBack( + "This is a really very interesting and [...] and great test", + "This is a really very interesting and fascinating and great test", + ), + new CardFrontBack( + "This is a really very interesting and fascinating and [...] test", + "This is a really very interesting and fascinating and great test", + ), + ]); +}); diff --git a/tests/unit/SampleItems.ts b/tests/unit/SampleItems.ts new file mode 100644 index 00000000..8c5434fe --- /dev/null +++ b/tests/unit/SampleItems.ts @@ -0,0 +1,57 @@ +import { Card } from "src/Card"; +import { Deck } from "src/Deck"; +import { Note } from "src/Note"; +import { NoteParser } from "src/NoteParser"; +import { NoteQuestionParser } from "src/NoteQuestionParser"; +import { CardType, Question } from "src/Question"; +import { CardFrontBack, CardFrontBackUtil } from "src/QuestionType"; +import { DEFAULT_SETTINGS, SRSettings } from "src/settings"; +import { UnitTestSRFile } from "src/SRFile"; +import { TopicPath } from "src/TopicPath"; + +export function createTest_NoteQuestionParser(settings: SRSettings): NoteQuestionParser { + let questionParser: NoteQuestionParser = new NoteQuestionParser(settings); + return questionParser; +} +export function createTest_NoteParser(): NoteParser { + let result = new NoteParser(DEFAULT_SETTINGS); + return result; +} +export const test_RefDate_20230906: Date = new Date(2023, 8, 6); + +export class SampleItemDecks { + static async createSingleLevelTree_NewCards(): Promise { + let text: string = ` +Q1::A1 +Q2::A2 +Q3::A3`; + return await SampleItemDecks.createDeckFromText(text, new TopicPath(["flashcards"])); + } + + static createScienceTree(): Deck { + let deck: Deck = new Deck("Root", null); + deck.getOrCreateDeck(new TopicPath(["Science", "Physics", "Electromagnetism"])); + deck.getOrCreateDeck(new TopicPath(["Science", "Physics", "Light"])); + deck.getOrCreateDeck(new TopicPath(["Science", "Physics", "Fluids"])); + deck.getOrCreateDeck(new TopicPath(["Math", "Geometry"])); + deck.getOrCreateDeck(new TopicPath(["Math", "Algebra", "Polynomials"])); + return deck; + } + + static async createDeckFromText(text: string, folderTopicPath: TopicPath): Promise { + let file: UnitTestSRFile = new UnitTestSRFile(text); + return await this.createDeckFromFile(file, folderTopicPath); + } + + static async createDeckFromFile( + file: UnitTestSRFile, + folderTopicPath: TopicPath, + ): Promise { + let deck: Deck = new Deck("Root", null); + let topicPath: TopicPath = TopicPath.emptyPath; + let noteParser: NoteParser = createTest_NoteParser(); + let note: Note = await noteParser.parse(file, folderTopicPath); + note.appendCardsToDeck(deck); + return deck; + } +} diff --git a/tests/unit/TopicPath.test.ts b/tests/unit/TopicPath.test.ts new file mode 100644 index 00000000..ba77f027 --- /dev/null +++ b/tests/unit/TopicPath.test.ts @@ -0,0 +1,335 @@ +import { ISRFile, UnitTestSRFile } from "src/SRFile"; +import { TopicPath } from "src/TopicPath"; +import { DEFAULT_SETTINGS, SRSettings } from "src/settings"; + +describe("Constructor exception handling", () => { + test("Constructor rejects null path", () => { + const t = () => { + let path: TopicPath = new TopicPath(null); + }; + expect(t).toThrow(); + }); + + test("Constructor allows zero length array", () => { + let path: TopicPath = new TopicPath([]); + expect(path.hasPath).toEqual(false); + }); + + test("Constructor rejects path that includes '/'", () => { + const t = () => { + let path: TopicPath = new TopicPath(["Hello/Goodbye"]); + }; + expect(t).toThrow(); + }); +}); + +describe("shift", () => { + test("shift() on multi-part path", () => { + let path: TopicPath = new TopicPath(["Level1", "Level2", "Level3"]); + let result: string = path.shift(); + + expect(result).toEqual("Level1"); + expect(path).toEqual(new TopicPath(["Level2", "Level3"])); + }); + + test("shift() on single-part path", () => { + let path: TopicPath = new TopicPath(["Level1"]); + let result: string = path.shift(); + + expect(result).toEqual("Level1"); + expect(path.hasPath).toEqual(false); + }); + + test("shift() on empty path", () => { + let path: TopicPath = new TopicPath(["Level1"]); + let result: string = path.shift(); + + const t = () => { + path.shift(); + }; + expect(t).toThrow("can't shift an empty path"); + }); +}); + +describe("getTopicPathFromCardText", () => { + test("Card text doesn't include tag", () => { + let cardText: string = "Card text doesn't include tag"; + let path: TopicPath = TopicPath.getTopicPathFromCardText(cardText); + + expect(path).toEqual(null); + }); + + test("Card text includes single level tag", () => { + let cardText: string = "#flashcards Card text does include tag"; + let path: TopicPath = TopicPath.getTopicPathFromCardText(cardText); + + expect(path).toEqual(new TopicPath(["flashcards"])); + }); + + test("Card text includes multi level tag", () => { + let cardText: string = "#flashcards/science/chemistry Card text does include tag"; + let path: TopicPath = TopicPath.getTopicPathFromCardText(cardText); + + expect(path).toEqual(new TopicPath(["flashcards", "science", "chemistry"])); + + cardText = "#flashcards/examination Q2::A2"; + path = TopicPath.getTopicPathFromCardText(cardText); + + expect(path).toEqual(new TopicPath(["flashcards", "examination"])); + }); + + test("Card text includes 2 multi level tags", () => { + let cardText: string = + "#flashcards/science/chemistry Card text includes multiple tag #flashcards/test/chemistry"; + let path: TopicPath = TopicPath.getTopicPathFromCardText(cardText); + + expect(path).toEqual(new TopicPath(["flashcards", "science", "chemistry"])); + }); +}); + +describe("removeTopicPathFromCardText", () => { + test("Card text doesn't include tag", () => { + let cardText: string = "Card text doesn't include tag"; + let expectedCardText: string = cardText; + let [actualQuestion, whiteSpace] = TopicPath.removeTopicPathFromStartOfCardText(cardText); + + expect(actualQuestion).toEqual(expectedCardText); + expect(whiteSpace).toEqual(""); + }); + + test("Card text includes single level tag", () => { + let cardText: string = "#flashcards Card text does include tag"; + let [actualQuestion, whiteSpace] = TopicPath.removeTopicPathFromStartOfCardText(cardText); + + expect(actualQuestion).toEqual("Card text does include tag"); + expect(whiteSpace).toEqual(" "); + }); + + test("Card text includes multi level tag", () => { + let cardText: string = "#flashcards/science/chemistry Card text does include tag"; + let [actualQuestion, whiteSpace] = TopicPath.removeTopicPathFromStartOfCardText(cardText); + + expect(actualQuestion).toEqual("Card text does include tag"); + expect(whiteSpace).toEqual(" "); + }); + + test("White space present before topic tag", () => { + let cardText: string = " #flashcards/science/chemistry Card text does include tag"; + let [actualQuestion, whiteSpace] = TopicPath.removeTopicPathFromStartOfCardText(cardText); + + expect(actualQuestion).toEqual("Card text does include tag"); + expect(whiteSpace).toEqual(" "); + }); + + test("Multiple spaces after topic tag", () => { + let spaces: string = " "; + let cardText: string = `#flashcards/science/chemistry${spaces}Card text does include tag`; + let [actualQuestion, whiteSpace] = TopicPath.removeTopicPathFromStartOfCardText(cardText); + + expect(actualQuestion).toEqual("Card text does include tag"); + expect(whiteSpace).toEqual(spaces); + }); +}); + +describe("getTopicPathFromTag", () => { + test("Null string", () => { + const t = () => { + TopicPath.getTopicPathFromTag(null); + }; + expect(t).toThrow(); + }); + + test("Empty string", () => { + const t = () => { + TopicPath.getTopicPathFromTag(""); + }; + expect(t).toThrow(); + }); + + test("String that doesn't start with a #", () => { + const t = () => { + TopicPath.getTopicPathFromTag("Invalid tag"); + }; + expect(t).toThrow(); + }); + + test("String that is only the #", () => { + const t = () => { + TopicPath.getTopicPathFromTag("#"); + }; + expect(t).toThrow(); + }); + + test("Single level tag", () => { + let result: TopicPath = TopicPath.getTopicPathFromTag("#flashcard"); + + expect(result.path).toEqual(["flashcard"]); + }); + + test("Multi level tag", () => { + let result: TopicPath = TopicPath.getTopicPathFromTag("#flashcard/science/physics"); + + expect(result.path).toEqual(["flashcard", "science", "physics"]); + }); + + test("Tag with trailing slash", () => { + let result: TopicPath = TopicPath.getTopicPathFromTag("#flashcard/science/physics/"); + + expect(result.path).toEqual(["flashcard", "science", "physics"]); + }); + + test("Tag with multiple adjacent slashes", () => { + let result: TopicPath = TopicPath.getTopicPathFromTag("#flashcard///science//physics"); + + expect(result.path).toEqual(["flashcard", "science", "physics"]); + }); +}); + +describe("isSameOrAncestorOf", () => { + test("a, b are both empty", () => { + let a: TopicPath = TopicPath.emptyPath; + let b: TopicPath = TopicPath.emptyPath; + expect(a.isSameOrAncestorOf(b)).toEqual(true); + }); + + test("a is empty, b has path", () => { + let a: TopicPath = TopicPath.emptyPath; + let b: TopicPath = new TopicPath(["flashcard"]); + expect(a.isSameOrAncestorOf(b)).toEqual(false); + }); + + test("a has path, b is empty", () => { + let a: TopicPath = new TopicPath(["flashcard"]); + let b: TopicPath = TopicPath.emptyPath; + expect(a.isSameOrAncestorOf(b)).toEqual(false); + }); + + describe("a, b both have paths", () => { + test("a same as b", () => { + let a: TopicPath = new TopicPath(["flashcard"]); + let b: TopicPath = new TopicPath(["flashcard"]); + expect(a.isSameOrAncestorOf(b)).toEqual(true); + + a = new TopicPath(["flashcard", "science"]); + b = new TopicPath(["flashcard", "science"]); + expect(a.isSameOrAncestorOf(b)).toEqual(true); + }); + + test("a is ancestor of b", () => { + let a: TopicPath = new TopicPath(["flashcard"]); + let b: TopicPath = new TopicPath(["flashcard", "science"]); + expect(a.isSameOrAncestorOf(b)).toEqual(true); + + a = new TopicPath(["flashcard"]); + b = new TopicPath(["flashcard", "science", "physics"]); + expect(a.isSameOrAncestorOf(b)).toEqual(true); + }); + + test("a is different to b", () => { + let a: TopicPath = new TopicPath(["flashcard", "math"]); + let b: TopicPath = new TopicPath(["flashcard", "science"]); + expect(a.isSameOrAncestorOf(b)).toEqual(false); + + a = new TopicPath(["flashcard", "science", "physics"]); + b = new TopicPath(["flashcard", "science", "chemistry"]); + expect(a.isSameOrAncestorOf(b)).toEqual(false); + }); + }); +}); + +describe("clone", () => { + test("clone of empty", () => { + let a: TopicPath = TopicPath.emptyPath; + let b: TopicPath = a.clone(); + expect(b.isEmptyPath).toEqual(true); + }); + + test("clone of path", () => { + let a: TopicPath = new TopicPath(["flashcard"]); + let b: TopicPath = a.clone(); + expect(b.path).toEqual(["flashcard"]); + + a = new TopicPath(["flashcard", "science"]); + b = a.clone(); + expect(b.path).toEqual(["flashcard", "science"]); + }); +}); + +describe("formatTag", () => { + test("Simple test", () => { + let topicPath: TopicPath = new TopicPath(["flashcards", "science"]); + + expect(topicPath.formatAsTag()).toEqual("#flashcards/science"); + }); + + test("Empty path", () => { + const t = () => { + let str: string = TopicPath.emptyPath.formatAsTag(); + }; + expect(t).toThrow(); + }); +}); + +describe("isValidTag", () => { + test("Invalid tags", () => { + expect(TopicPath.isValidTag(null)).toEqual(false); + expect(TopicPath.isValidTag("")).toEqual(false); + expect(TopicPath.isValidTag("!Flashcards")).toEqual(false); + expect(TopicPath.isValidTag("#")).toEqual(false); + }); + + test("Valid tags", () => { + expect(TopicPath.isValidTag("#flashcards")).toEqual(true); + }); +}); + +describe("getTopicPathOfFile", () => { + describe("convertFoldersToDecks: false", () => { + test("Mixture of irrelevant tags and relevant ones", () => { + let content: string = ` + #ignored Q1::A1 + #ignored Q2::A2 + #also-Ignored Q3::A3 + #flashcards/science Q4::A4 + #flashcards/science/physics Q5::A5 + #flashcards/math Q6::A6`; + let file: ISRFile = new UnitTestSRFile(content); + let expected = ["flashcards", "science"]; + + expect(TopicPath.getTopicPathOfFile(file, DEFAULT_SETTINGS).path).toEqual(expected); + }); + + test("No relevant tags", () => { + let content: string = ` + #ignored Q1::A1 + #ignored Q2::A2 + #also-Ignored Q3::A3 + Q4::A4 + #ignored/science/physics Q5::A5 + Q6::A6`; + let file: ISRFile = new UnitTestSRFile(content); + + expect(TopicPath.getTopicPathOfFile(file, DEFAULT_SETTINGS).isEmptyPath).toEqual(true); + }); + }); + + describe("convertFoldersToDecks: true", () => { + let settings_ConvertFoldersToDecks: SRSettings = { ...DEFAULT_SETTINGS }; + settings_ConvertFoldersToDecks.convertFoldersToDecks = true; + test("Mixture of irrelevant tags and relevant ones", () => { + let ignoredContent: string = ` + #ignored Q1::A1 + #ignored Q2::A2 + #also-Ignored Q3::A3 + #flashcards/science Q4::A4 + #flashcards/science/physics Q5::A5 + #flashcards/math Q6::A6`; + + let fakeFilePath: string = "history/modern/Greek.md"; + let file: ISRFile = new UnitTestSRFile(ignoredContent, fakeFilePath); + let expected = ["history", "modern"]; + let actual = TopicPath.getTopicPathOfFile(file, settings_ConvertFoldersToDecks); + expect(actual.path).toEqual(expected); + }); + }); +}); diff --git a/tests/unit/deck.test.ts b/tests/unit/deck.test.ts new file mode 100644 index 00000000..092f0423 --- /dev/null +++ b/tests/unit/deck.test.ts @@ -0,0 +1,286 @@ +import { CardListType, Deck } from "src/Deck"; +import { TopicPath } from "src/TopicPath"; +import { SampleItemDecks } from "./SampleItems"; +import { Card } from "src/Card"; + +describe("constructor", () => { + test("Deck name", () => { + let actual: Deck = new Deck("Great Name", null); + + expect(actual.deckName).toEqual("Great Name"); + }); +}); + +describe("getOrCreateDeck()", () => { + test("Empty topic path", () => { + let deck: Deck = new Deck("Great Name", null); + deck.getOrCreateDeck(TopicPath.emptyPath); + + expect(deck.deckName).toEqual("Great Name"); + expect(deck.subdecks.length).toEqual(0); + }); + + test("Create single subdeck on empty deck", () => { + let deck: Deck = new Deck("Root", null); + let path: TopicPath = new TopicPath(["Level1"]); + let subdeck: Deck = deck.getOrCreateDeck(path); + + expect(deck.deckName).toEqual("Root"); + expect(deck.subdecks.length).toEqual(1); + expect(subdeck === deck.subdecks[0]).toEqual(true); + expect(subdeck.deckName).toEqual("Level1"); + }); + + test("Create multiple subdecks under single deck", () => { + let deck: Deck = new Deck("Root", null); + let subdeckA: Deck = deck.getOrCreateDeck(new TopicPath(["Level1A"])); + let subdeckB: Deck = deck.getOrCreateDeck(new TopicPath(["Level1B"])); + let subdeckC: Deck = deck.getOrCreateDeck(new TopicPath(["Level1C"])); + + expect(deck.deckName).toEqual("Root"); + expect(deck.subdecks.length).toEqual(3); + + expect(subdeckA === deck.subdecks[0]).toEqual(true); + expect(subdeckA.deckName).toEqual("Level1A"); + + expect(subdeckB === deck.subdecks[1]).toEqual(true); + expect(subdeckB.deckName).toEqual("Level1B"); + + expect(subdeckC === deck.subdecks[2]).toEqual(true); + expect(subdeckC.deckName).toEqual("Level1C"); + }); + + test("Create multi-level deck in separate steps", () => { + let deck: Deck = new Deck("Root", null); + let subdeck1: Deck = deck.getOrCreateDeck(new TopicPath(["Level1"])); + let subdeck2: Deck = subdeck1.getOrCreateDeck(new TopicPath(["Level2"])); + let subdeck3: Deck = subdeck2.getOrCreateDeck(new TopicPath(["Level3"])); + + expect(deck.deckName).toEqual("Root"); + expect(deck.subdecks.length).toEqual(1); + + expect(subdeck1 === deck.subdecks[0]).toEqual(true); + expect(subdeck1.deckName).toEqual("Level1"); + expect(subdeck1.subdecks.length).toEqual(1); + + expect(subdeck2 === subdeck1.subdecks[0]).toEqual(true); + expect(subdeck2.deckName).toEqual("Level2"); + expect(subdeck2.subdecks.length).toEqual(1); + + expect(subdeck3 === subdeck2.subdecks[0]).toEqual(true); + expect(subdeck3.deckName).toEqual("Level3"); + expect(subdeck3.subdecks.length).toEqual(0); + }); + + test("Create multi-level deck in single step", () => { + let deck: Deck = new Deck("Root", null); + let subdeck3: Deck = deck.getOrCreateDeck(new TopicPath(["Level1", "Level2", "Level3"])); + + expect(deck.deckName).toEqual("Root"); + expect(deck.subdecks.length).toEqual(1); + + let subdeck1: Deck = deck.subdecks[0]; + expect(subdeck1.deckName).toEqual("Level1"); + expect(subdeck1.subdecks.length).toEqual(1); + + let subdeck2: Deck = subdeck1.subdecks[0]; + expect(subdeck2.deckName).toEqual("Level2"); + expect(subdeck2.subdecks.length).toEqual(1); + + expect(subdeck3 === subdeck2.subdecks[0]).toEqual(true); + expect(subdeck3.deckName).toEqual("Level3"); + expect(subdeck3.subdecks.length).toEqual(0); + }); +}); + +describe("getTopicPath()", () => { + test("Empty topic path", () => { + let deck: Deck = new Deck("Root", null); + let path: TopicPath = deck.getTopicPath(); + + expect(path.isEmptyPath).toEqual(true); + }); + + test("Single level topic path", () => { + let deck: Deck = new Deck("Root", null); + let subdeck: Deck = deck.getOrCreateDeck(new TopicPath(["Science"])); + let topicPath: TopicPath = subdeck.getTopicPath(); + + expect(topicPath.path).toEqual(["Science"]); + }); + + test("Multi level topic path", () => { + let deck: Deck = new Deck("Root", null); + let subdeck: Deck = deck.getOrCreateDeck(new TopicPath(["Science", "Chemistry"])); + let topicPath: TopicPath = subdeck.getTopicPath(); + + expect(topicPath.path).toEqual(["Science", "Chemistry"]); + }); +}); + +describe("appendCard()", () => { + test("Append to root deck", () => { + let deck: Deck = new Deck("Root", null); + let path: TopicPath = deck.getTopicPath(); + + expect(path.isEmptyPath).toEqual(true); + }); + + test("Single level topic path", () => { + let deck: Deck = new Deck("Root", null); + let subdeck: Deck = deck.getOrCreateDeck(new TopicPath(["Science"])); + let topicPath: TopicPath = subdeck.getTopicPath(); + + expect(topicPath.path).toEqual(["Science"]); + }); + + test("Multi level topic path", () => { + let deck: Deck = new Deck("Root", null); + let subdeck: Deck = deck.getOrCreateDeck(new TopicPath(["Science", "Chemistry"])); + let topicPath: TopicPath = subdeck.getTopicPath(); + + expect(topicPath.path).toEqual(["Science", "Chemistry"]); + }); +}); + +describe("toDeckArray()", () => { + test("Empty tree", () => { + let deckTree: Deck = new Deck("Root", null); + let deckArray: Deck[] = deckTree.toDeckArray(); + let nameArray: string[] = deckArray.map((deck) => deck.deckName); + + expect(nameArray).toEqual(["Root"]); + }); + + test("Single level test", () => { + let deckTree: Deck = new Deck("Root", null); + deckTree.getOrCreateDeck(new TopicPath(["Aliens"])); + let deckArray: Deck[] = deckTree.toDeckArray(); + let nameArray: string[] = deckArray.map((deck) => deck.deckName); + + let expectedArray: string[] = ["Root", "Aliens"]; + expect(nameArray).toEqual(expectedArray); + }); + + test("Multi level test", () => { + let deckTree: Deck = SampleItemDecks.createScienceTree(); + let deckArray: Deck[] = deckTree.toDeckArray(); + let nameArray: string[] = deckArray.map((deck) => deck.deckName); + + let expectedArray: string[] = [ + "Root", + "Science", + "Physics", + "Electromagnetism", + "Light", + "Fluids", + "Math", + "Geometry", + "Algebra", + "Polynomials", + ]; + expect(nameArray).toEqual(expectedArray); + }); +}); + +describe("copyWithCardFilter()", () => { + describe("Single level tree", () => { + test("No cards", () => { + let original: Deck = new Deck("Root", null); + let copy: Deck = original.copyWithCardFilter((card) => true); + + original.deckName = "New deck name"; + expect(copy.deckName).toEqual("Root"); + }); + + test("With new cards", async () => { + let text: string = ` + Q1::A1 + Q2::A2 + Q3::A3`; + let original: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + let copy: Deck = original.copyWithCardFilter((card) => card.front.includes("2")); + + expect(copy.newFlashcards.length).toEqual(1); + expect(copy.newFlashcards[0].front).toEqual("Q2"); + }); + + test("With scheduled cards", async () => { + let text: string = ` + Q1::A1 + Q2::A2 + Q3::A3 `; + let original: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + let copy: Deck = original.copyWithCardFilter((card) => !card.front.includes("2")); + + expect(copy.newFlashcards.length).toEqual(0); + expect(copy.dueFlashcards.length).toEqual(2); + expect(copy.dueFlashcards[0].front).toEqual("Q1"); + expect(copy.dueFlashcards[1].front).toEqual("Q3"); + }); + }); + + describe("Multi level tree", () => { + test("No change in original deck after copy", async () => { + let text: string = ` + #flashcards Q1::A1 + #flashcards Q2::A2 + #flashcards Q3::A3 + + #flashcards/science Q4::A4 + #flashcards/science Q5::A5 + + #flashcards/science/physics Q6::A6`; + let original: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + let originalCountPreCopy: number = original.getCardCount(CardListType.All, true); + expect(originalCountPreCopy).toEqual(6); + + let copy: Deck = original.copyWithCardFilter( + (card) => parseInt(card.front[1]) % 2 == 1, + ); + let originalCountPostCopy: number = original.getCardCount(CardListType.All, true); + expect(originalCountPreCopy).toEqual(originalCountPostCopy); + }); + + test("With new cards", async () => { + let text: string = ` + #flashcards Q1::A1 + #flashcards Q2::A2 + #flashcards Q3::A3 + + #flashcards/science Q4::A4 + #flashcards/science Q5::A5 + + #flashcards/science/physics Q6::A6`; + let original: Deck = await SampleItemDecks.createDeckFromText( + text, + new TopicPath(["Root"]), + ); + + let copy: Deck = original.copyWithCardFilter( + (card) => parseInt(card.front[1]) % 2 == 1, + ); + + let subdeck: Deck = copy.getDeck(new TopicPath(["flashcards"])); + expect(subdeck.newFlashcards.length).toEqual(2); + expect(subdeck.newFlashcards[0].front).toEqual("Q1"); + expect(subdeck.newFlashcards[1].front).toEqual("Q3"); + + subdeck = copy.getDeck(new TopicPath(["flashcards", "science"])); + expect(subdeck.newFlashcards.length).toEqual(1); + expect(subdeck.newFlashcards[0].front).toEqual("Q5"); + + subdeck = copy.getDeck(new TopicPath(["flashcards", "science", "physics"])); + expect(subdeck.newFlashcards.length).toEqual(0); + }); + }); +}); diff --git a/tests/unit/parser.test.ts b/tests/unit/parser.test.ts index 7e687398..183dc679 100644 --- a/tests/unit/parser.test.ts +++ b/tests/unit/parser.test.ts @@ -1,5 +1,5 @@ import { parse } from "src/parser"; -import { CardType } from "src/scheduling"; +import { CardType } from "src/Question"; const defaultArgs: [string, string, string, string, boolean, boolean, boolean] = [ "::", @@ -28,6 +28,9 @@ test("Test parsing of single line basic cards", () => { [CardType.SingleLineBasic, "Q1::A1", 2], [CardType.SingleLineBasic, "Q2:: A2", 3], ]); + expect(parse("#flashcards/science Question ::Answer", ...defaultArgs)).toEqual([ + [CardType.SingleLineBasic, "#flashcards/science Question ::Answer", 0], + ]); }); test("Test parsing of single line reversed cards", () => { @@ -66,6 +69,9 @@ test("Test parsing of multi line basic cards", () => { [CardType.MultiLineBasic, "Line0\nQ1\n?\nA1\nAnswerExtra", 4], [CardType.MultiLineBasic, "Q2\n?\nA2", 9], ]); + expect(parse("#flashcards/tag-on-previous-line\nQuestion\n?\nAnswer", ...defaultArgs)).toEqual([ + [CardType.MultiLineBasic, "#flashcards/tag-on-previous-line\nQuestion\n?\nAnswer", 2], + ]); }); test("Test parsing of multi line reversed cards", () => { diff --git a/tests/unit/util/MultiLineTextFinder.test.ts b/tests/unit/util/MultiLineTextFinder.test.ts new file mode 100644 index 00000000..bec40d9f --- /dev/null +++ b/tests/unit/util/MultiLineTextFinder.test.ts @@ -0,0 +1,180 @@ +import { MultiLineTextFinder } from "src/util/MultiLineTextFinder"; +import { splitTextIntoLineArray } from "src/util/utils"; + +let space: string = " "; +let text10: string = `Some Stuff 0 More Stuff +Some Stuff 1 More Stuff +Some Stuff 2 More Stuff +Some Stuff 3 More Stuff +Some Stuff 4 More Stuff +Some Stuff 5 More Stuff +Some Stuff 6 More Stuff +Some Stuff 7 More Stuff +Some Stuff 8 More Stuff +Some Stuff 9 More Stuff`; +let text20: string = `Some Stuff 0 More Stuff +Some Stuff 1 More Stuff +Some Stuff 2 More Stuff +Some Stuff 3 More Stuff +Some Stuff 4 More Stuff +Some Stuff 5 More Stuff +Some Stuff 6 More Stuff +Some Stuff 7 More Stuff +Some Stuff 8 More Stuff +Some Stuff 9 More Stuff +Some Stuff 10 More Stuff +Some Stuff 11 More Stuff +Some Stuff 12 More Stuff +Some Stuff 13 More Stuff +Some Stuff 14 More Stuff +Some Stuff 15 More Stuff + Some Stuff 16 More Stuff +Some Stuff 17 More Stuff${space}${space} +Some Stuff 18 More Stuff +Some Stuff 19 More Stuff +Some Stuff 20 More Stuff +`; + +describe("find", () => { + describe("Single line search string - Match found", () => { + test("Search string present as complete line within text (identical)", () => { + let searchStr: string = "Some Stuff 14 More Stuff"; + + checkFindResult(text20, searchStr, 14); + }); + + test("Search string present as complete line within text (search has pre/post additional spaces)", () => { + let searchStr: string = " Some Stuff 14 More Stuff"; + checkFindResult(text20, searchStr, 14); + + searchStr = "Some Stuff 14 More Stuff "; + checkFindResult(text20, searchStr, 14); + + searchStr = " Some Stuff 14 More Stuff "; + checkFindResult(text20, searchStr, 14); + }); + + test("Search string present as complete line within text (source text has pre/post additional spaces)", () => { + let searchStr: string = "Some Stuff 16 More Stuff"; + checkFindResult(text20, searchStr, 16); + + searchStr = "Some Stuff 17 More Stuff"; + checkFindResult(text20, searchStr, 17); + }); + }); + + describe("Multi line search string - Match found", () => { + test("Search string present from line 1", () => { + let searchStr: string = `Some Stuff 1 More Stuff + Some Stuff 2 More Stuff + Some Stuff 3 More Stuff`; + + checkFindResult(text20, searchStr, 1); + }); + + test("Search string present mid file", () => { + let searchStr: string = `Some Stuff 9 More Stuff + Some Stuff 10 More Stuff + Some Stuff 11 More Stuff`; + checkFindResult(text20, searchStr, 9); + }); + + test("Search string present at end of file", () => { + let searchStr: string = `Some Stuff 19 More Stuff + Some Stuff 20 More Stuff`; + checkFindResult(text20, searchStr, 19); + }); + }); + + describe("Single line search string - No match found", () => { + test("Search string is a match but only to part of the line", () => { + let searchStr: string = "Stuff 14 More Stuff"; + + checkFindResult(text20, searchStr, null); + }); + }); + + describe("Multi line search string - No match found", () => { + test("Search string doesn't match any source line", () => { + let searchStr: string = `Nothing here that matches + Or hear `; + checkFindResult(text20, searchStr, null); + }); + + test("Some, but not all of the search string lines matches the source", () => { + let searchStr: string = `Some Stuff 9 More Stuff + Some Stuff 10 More Stuff + Some Stuff 11 More Stuff - this line doesn't match`; + checkFindResult(text20, searchStr, null); + }); + }); +}); + +describe("findAndReplace", () => { + test("Multi line search string present as exact match", () => { + let searchStr: string = `Some Stuff 4 More Stuff +Some Stuff 5 More Stuff +Some Stuff 6 More Stuff`; + + let replacementStr: string = `Replacement line`; + + let expectedResult: string = `Some Stuff 0 More Stuff +Some Stuff 1 More Stuff +Some Stuff 2 More Stuff +Some Stuff 3 More Stuff +Replacement line +Some Stuff 7 More Stuff +Some Stuff 8 More Stuff +Some Stuff 9 More Stuff`; + checkFindAndReplaceResult(text10, searchStr, replacementStr, expectedResult); + }); + + test("Multi line search string has pre/post spaces", () => { + let searchStr: string = `Some Stuff 4 More Stuff +${space}Some Stuff 5 More Stuff +Some Stuff 6 More Stuff${space}${space}`; + + let replacementStr: string = `Replacement line 1 +Replacement line 2`; + + let expectedResult: string = `Some Stuff 0 More Stuff +Some Stuff 1 More Stuff +Some Stuff 2 More Stuff +Some Stuff 3 More Stuff +Replacement line 1 +Replacement line 2 +Some Stuff 7 More Stuff +Some Stuff 8 More Stuff +Some Stuff 9 More Stuff`; + checkFindAndReplaceResult(text10, searchStr, replacementStr, expectedResult); + }); + + test("No match found", () => { + let searchStr: string = `Some Stuff 4 More Stuff +Some Stuff 5 More Stuff +Some Stuff 7 More Stuff`; + + let replacementStr: string = `Replacement line 1 +Replacement line 2`; + + let expectedResult: string = null; + checkFindAndReplaceResult(text10, searchStr, replacementStr, expectedResult); + }); +}); + +function checkFindAndReplaceResult( + text: string, + searchStr: string, + replacementStr: string, + expectedResult: string, +) { + let result: string = MultiLineTextFinder.findAndReplace(text, searchStr, replacementStr); + expect(result).toEqual(expectedResult); +} + +function checkFindResult(text: string, searchStr: string, expectedResult: number) { + let textArray = splitTextIntoLineArray(text); + let searchArray = splitTextIntoLineArray(searchStr); + let result: number = MultiLineTextFinder.find(textArray, searchArray); + expect(result).toEqual(expectedResult); +} From 54d0a21279349609bef0e52655bf6825e8b2a711 Mon Sep 17 00:00:00 2001 From: Stephen Mwangi Date: Mon, 9 Oct 2023 07:15:14 +0300 Subject: [PATCH 069/155] Bump version to 1.10.2 (#756) --- docs/changelog.md | 21 +++++++++++++++------ package.json | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index c78e13cf..840525bc 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -70,7 +70,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). ### Added -- [@Newdea](https://github.com/Newdea) merge [recall plugin](https://github.com/martin-jw/obsidian-recall) to use seperate file [#162] +- (https://github.com/Newdea) merge [recall plugin](https://github.com/martin-jw/obsidian-recall) to use seperate file [#162] - setting where to save schedule info by `Data Location` - save on note file, just as used do. - save on seperate `tracked_files.json` which storing on vault or sr plugin folder. If select this, this plugin will convert shedule info to seperate file, and delete shedule info in note file. @@ -79,19 +79,29 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - setting `convert tracked note to decks` - setting Algorithm ( not work yet) - file menu to tracknote/untracknote -- [@Newdea](https://github.com/Newdea) show floatbar(thanks to [@chetachi's cMenu](https://github.com/chetachiezikeuzor/cMenu-Plugin)) for reviewing response when reviewing note by click statusbar or review command or sidebar +- (https://github.com/Newdea) show floatbar(thanks to [@chetachi's cMenu](https://github.com/chetachiezikeuzor/cMenu-Plugin)) for reviewing response when reviewing note by click statusbar or review command or sidebar ### Changed -- [@Newdea](https://github.com/Newdea) add a setting option to Reviewing a Notes directly [#635](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/635) +- (https://github.com/Newdea) add a setting option to Reviewing a Notes directly [#635](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/635) ### Fixed -- [@Newdea] fixed open the next note automatically after reviewing another [#582](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/582) -- [@Newdea] fixed sidebar doesn't show/update some files. [#393](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/393) +- fixed open the next note automatically after reviewing another [#582](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/582) +- fixed sidebar doesn't show/update some files. [#393](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/393) +#### [1.10.2](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.1...1.10.2) + +- refactor: Separate business logic from user interface code [`#751`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/751) +- Remove the spaces before and after the question marks in the multi-line basic flashcards [`#719`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/719) +- chore: Update dependencies [`44e9bb6`](https://github.com/st3v3nmw/obsidian-spaced-repetition/commit/44e9bb63dad5e8ab664f7582aa403386d341aa44) +- chore: Update dependencies [`1f69f96`](https://github.com/st3v3nmw/obsidian-spaced-repetition/commit/1f69f9641920d7caf70e7928c62a13f24ef81ff5) +- feat: Add E2E testing [`1ef0663`](https://github.com/st3v3nmw/obsidian-spaced-repetition/commit/1ef066308c893642d2b968bc0e7b75873af68960) #### [1.10.1](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.0...1.10.1) +> 5 May 2023 + +- Bump version to v1.10.1 [`#679`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/679) - style: Fix formatting [`#678`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/678) - remove skip after modifying card text [`#671`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/671) - Add translations to the Spanish language. [`#667`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/667) @@ -102,7 +112,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Fix issue requiring collapseIcon to be clicked twice to expand/collapsed deck tree [`#656`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/656) - Update ru.ts [`#657`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/657) - Consume keyboard event in flashcard modal [`#637`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/637) -- Bump version to v1.10.1 [`cbea6a4`](https://github.com/st3v3nmw/obsidian-spaced-repetition/commit/cbea6a4b5a529bf214264bac8d6a1d35a246d50e) #### [1.10.0](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.9.4...1.10.0) diff --git a/package.json b/package.json index ebbf5bf5..0d5d3895 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "format": "npx prettier --write .", "lint": "npx prettier --check . && npx eslint src/", "test": "jest", - "changelog": "auto-changelog --template=compact --package --unreleased && npx prettier --write CHANGELOG.md", + "changelog": "auto-changelog --template=compact --package && npx prettier --write docs/changelog.md", "e2e": "make setup_e2e && wdio run ./wdio.conf.js" }, "keywords": [ From 232f50626a01ce1076e463f71a99d9def234368d Mon Sep 17 00:00:00 2001 From: Ronny Zulaikha <75528127+ronzulu@users.noreply.github.com> Date: Wed, 18 Oct 2023 13:44:50 +1100 Subject: [PATCH 070/155] Fix bugs regarding bury sibling cards (#763) * Implemented fixes, added test case * Write question postponement list; update change log * Post pnpm format * Minor fix for unit test cases --- docs/changelog.md | 5 + src/CardSchedule.ts | 17 +- src/DeckTreeIterator.ts | 16 +- src/FlashcardReviewSequencer.ts | 11 +- src/NoteQuestionParser.ts | 5 +- src/Question.ts | 2 +- src/QuestionPostponementList.ts | 9 +- src/util/DateProvider.ts | 17 +- tests/unit/FlashcardReviewSequencer.test.ts | 273 ++++++++++++++++---- 9 files changed, 294 insertions(+), 61 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 840525bc..fd8578cc 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -89,6 +89,11 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fixed open the next note automatically after reviewing another [#582](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/582) - fixed sidebar doesn't show/update some files. [#393](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/393) +#### Unreleased + +- Fix: Bury Siblings Is Not Honored [`#759`](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/759) +- Fix: Skipping a card seems to permanently bury it and make it impossible to review again in the same day [`#760`](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/760) + #### [1.10.2](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.1...1.10.2) - refactor: Separate business logic from user interface code [`#751`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/751) diff --git a/src/CardSchedule.ts b/src/CardSchedule.ts index 12403ab4..151940b1 100644 --- a/src/CardSchedule.ts +++ b/src/CardSchedule.ts @@ -16,6 +16,15 @@ export class CardScheduleInfo { ease: number; delayBeforeReviewTicks: number; + // A question can have multiple cards. The schedule info for all sibling cards are formatted together + // in a single comment, such as: + // + // + // However, not all sibling cards may have been reviewed. Therefore we need a method of indicating that a particular card + // has not been reviewed, and should be considered "new" + // This is done by using this magic value for the date + private static dummyDueDateForNewCard: string = "2000-01-01"; + constructor(dueDate: Moment, interval: number, ease: number, delayBeforeReviewTicks: number) { this.dueDate = dueDate; this.interval = interval; @@ -31,9 +40,13 @@ export class CardScheduleInfo { return this.dueDate.isSameOrBefore(globalDateProvider.today); } - static getDummySchedule(settings: SRSettings): CardScheduleInfo { + isDummyScheduleForNewCard(): boolean { + return this.formatDueDate() == CardScheduleInfo.dummyDueDateForNewCard; + } + + static getDummyScheduleForNewCard(settings: SRSettings): CardScheduleInfo { return CardScheduleInfo.fromDueDateStr( - "2000-01-01", + CardScheduleInfo.dummyDueDateForNewCard, CardScheduleInfo.initialInterval, settings.baseEase, 0, diff --git a/src/DeckTreeIterator.ts b/src/DeckTreeIterator.ts index 8f5b39d7..0da88f70 100644 --- a/src/DeckTreeIterator.ts +++ b/src/DeckTreeIterator.ts @@ -120,13 +120,21 @@ class SingleDeckIterator { deleteCurrentQuestion(): void { this.ensureCurrentCard(); const q: Question = this.currentCard.question; - const cards: Card[] = this.deck.getCardListForCardType(this.cardListType); - do { - this.deck.deleteCardAtIndex(this.cardIdx, this.cardListType); - } while (this.cardIdx < cards.length && Object.is(q, cards[this.cardIdx].question)); + + // A question could have some cards in the new list and some in the due list + this.deleteQuestionFromList(q, CardListType.NewCard); + this.deleteQuestionFromList(q, CardListType.DueCard); + this.setNoCurrentCard(); } + private deleteQuestionFromList(q: Question, cardListType: CardListType): void { + const cards: Card[] = this.deck.getCardListForCardType(cardListType); + for (let i = cards.length - 1; i >= 0; i--) { + if (Object.is(q, cards[i].question)) this.deck.deleteCardAtIndex(i, cardListType); + } + } + deleteCurrentCard(): void { this.ensureCurrentCard(); this.deck.deleteCardAtIndex(this.cardIdx, this.cardListType); diff --git a/src/FlashcardReviewSequencer.ts b/src/FlashcardReviewSequencer.ts index af522bb1..871c72b0 100644 --- a/src/FlashcardReviewSequencer.ts +++ b/src/FlashcardReviewSequencer.ts @@ -113,7 +113,6 @@ export class FlashcardReviewSequencer implements IFlashcardReviewSequencer { } skipCurrentCard(): void { - this.questionPostponementList.addIfRequired(this.currentQuestion); this.cardSequencer.deleteCurrentQuestion(); } @@ -143,7 +142,15 @@ export class FlashcardReviewSequencer implements IFlashcardReviewSequencer { if (response == ReviewResponse.Reset) { this.cardSequencer.moveCurrentCardToEndOfList(); this.cardSequencer.nextCard(); - } else this.deleteCurrentCard(); + } else { + if (this.settings.burySiblingCards) { + this.questionPostponementList.add(this.currentQuestion); + await this.questionPostponementList.write(); + this.cardSequencer.deleteCurrentQuestion(); + } else { + this.deleteCurrentCard(); + } + } } async processReview_CramMode(response: ReviewResponse): Promise { diff --git a/src/NoteQuestionParser.ts b/src/NoteQuestionParser.ts index 1f8c01b6..fdd63bc2 100644 --- a/src/NoteQuestionParser.ts +++ b/src/NoteQuestionParser.ts @@ -120,12 +120,15 @@ export class NoteQuestionParser { const { front, back } = cardFrontBackList[i]; const hasScheduleInfo: boolean = i < cardScheduleInfoList.length; + const schedule: CardScheduleInfo = cardScheduleInfoList[i]; + const cardObj: Card = new Card({ front, back, cardIdx: i, }); - cardObj.scheduleInfo = hasScheduleInfo ? cardScheduleInfoList[i] : null; + cardObj.scheduleInfo = + hasScheduleInfo && !schedule.isDummyScheduleForNewCard() ? schedule : null; siblings.push(cardObj); } diff --git a/src/Question.ts b/src/Question.ts index 82948c10..c94d879f 100644 --- a/src/Question.ts +++ b/src/Question.ts @@ -143,7 +143,7 @@ export class Question { const card: Card = this.cards[i]; const schedule: CardScheduleInfo = card.hasSchedule ? card.scheduleInfo - : CardScheduleInfo.getDummySchedule(settings); + : CardScheduleInfo.getDummyScheduleForNewCard(settings); result += schedule.formatSchedule(); } result += SR_HTML_COMMENT_END; diff --git a/src/QuestionPostponementList.ts b/src/QuestionPostponementList.ts index 07bcd19d..54386169 100644 --- a/src/QuestionPostponementList.ts +++ b/src/QuestionPostponementList.ts @@ -4,7 +4,7 @@ import { SRSettings } from "./settings"; export interface IQuestionPostponementList { clear(): void; - addIfRequired(question: Question): void; + add(question: Question): void; includes(question: Question): boolean; write(): Promise; } @@ -24,8 +24,8 @@ export class QuestionPostponementList implements IQuestionPostponementList { this.list = []; } - addIfRequired(question: Question): void { - if (this.settings.burySiblingCards) this.list.push(question.questionText.textHash); + add(question: Question): void { + if (!this.includes(question)) this.list.push(question.questionText.textHash); } includes(question: Question): boolean { @@ -33,6 +33,9 @@ export class QuestionPostponementList implements IQuestionPostponementList { } async write(): Promise { + // This is null only whilst unit testing is being performed + if (this.plugin == null) return; + await this.plugin.savePluginData(); } } diff --git a/src/util/DateProvider.ts b/src/util/DateProvider.ts index 1674c60b..b995818d 100644 --- a/src/util/DateProvider.ts +++ b/src/util/DateProvider.ts @@ -36,6 +36,21 @@ export class DateUtil { export let globalDateProvider: IDateProvider = new LiveDateProvider(); +const originDate: string = "2023-09-06"; + +export function setupStaticDateProvider(dateStr: string) { + globalDateProvider = StaticDateProvider.fromDateStr(dateStr); +} + +function getOriginDateAsMoment(): Moment { + return DateUtil.dateStrToMoment(originDate); +} + +export function setupStaticDateProvider_OriginDatePlusDays(days: number) { + const simulatedDate: Moment = getOriginDateAsMoment().add(days, "d"); + globalDateProvider = new StaticDateProvider(simulatedDate); +} + export function setupStaticDateProvider_20230906() { - globalDateProvider = StaticDateProvider.fromDateStr("2023-09-06"); + setupStaticDateProvider(originDate); } diff --git a/tests/unit/FlashcardReviewSequencer.test.ts b/tests/unit/FlashcardReviewSequencer.test.ts index 86c1a76f..923afdf1 100644 --- a/tests/unit/FlashcardReviewSequencer.test.ts +++ b/tests/unit/FlashcardReviewSequencer.test.ts @@ -11,18 +11,30 @@ import { IFlashcardReviewSequencer, } from "src/FlashcardReviewSequencer"; import { TopicPath } from "src/TopicPath"; -import { CardListType, Deck } from "src/Deck"; +import { CardListType, Deck, DeckTreeFilter } from "src/Deck"; import { DEFAULT_SETTINGS, SRSettings } from "src/settings"; import { SampleItemDecks } from "./SampleItems"; import { UnitTestSRFile } from "src/SRFile"; import { ReviewResponse } from "src/scheduling"; -import { setupStaticDateProvider_20230906 } from "src/util/DateProvider"; +import { + setupStaticDateProvider, + setupStaticDateProvider_20230906, + setupStaticDateProvider_OriginDatePlusDays, +} from "src/util/DateProvider"; import moment from "moment"; import { INoteEaseList, NoteEaseList } from "src/NoteEaseList"; import { QuestionPostponementList, IQuestionPostponementList } from "src/QuestionPostponementList"; import { order_DueFirst_Sequential } from "./DeckTreeIterator.test"; +let clozeQuestion1: string = "This single ==question== turns into ==3 separate== ==cards=="; +let clozeQuestion1Card1: RegExp = /This single.+\.\.\..+turns into 3 separate cards/; +let clozeQuestion1Card2: RegExp = /This single question turns into.+\.\.\..+cards/; +let clozeQuestion1Card3: RegExp = /This single question turns into 3 separate.+\.\.\./; + class TestContext { + settings: SRSettings; + reviewMode: FlashcardReviewMode; + iteratorOrder: IIteratorOrder; cardSequencer: IDeckTreeIterator; noteEaseList: INoteEaseList; cardScheduleCalculator: CardScheduleCalculator; @@ -36,13 +48,43 @@ class TestContext { Object.assign(this, init); } + async resetContext(text: string, daysAfterOrigin: number): Promise { + this.originalText = text; + this.file.content = text; + let cardSequencer: IDeckTreeIterator = new DeckTreeIterator( + this.iteratorOrder, + IteratorDeckSource.UpdatedByIterator, + ); + let reviewSequencer: IFlashcardReviewSequencer = new FlashcardReviewSequencer( + this.reviewMode, + cardSequencer, + this.settings, + this.cardScheduleCalculator, + this.questionPostponementList, + ); + setupStaticDateProvider_OriginDatePlusDays(daysAfterOrigin); + + await this.setSequencerDeckTreeFromOriginalText(); + } + + // Within the actual application, clearing the postponement list is done in main.ts, and therefore not + // unit testable. Within the unit tests, this is used instead. + clearQuestionPostponementList(): void { + this.questionPostponementList.clear(); + } + async setSequencerDeckTreeFromOriginalText(): Promise { - let deck: Deck = await SampleItemDecks.createDeckFromFile( + const deckTree: Deck = await SampleItemDecks.createDeckFromFile( this.file, new TopicPath(["Root"]), ); - this.reviewSequencer.setDeckTree(deck, deck); - return deck; + const remainingDeckTree = DeckTreeFilter.filterForRemainingCards( + this.questionPostponementList, + deckTree, + this.reviewMode, + ); + this.reviewSequencer.setDeckTree(deckTree, remainingDeckTree); + return deckTree; } static Create( @@ -76,6 +118,9 @@ class TestContext { var file: UnitTestSRFile = new UnitTestSRFile(text, fakeFilePath); let result: TestContext = new TestContext({ + settings, + reviewMode, + iteratorOrder, cardSequencer, noteEaseList, cardScheduleCalculator, @@ -227,6 +272,24 @@ async function setupSample2(reviewMode: FlashcardReviewMode): Promise { + let settings: SRSettings = { ...DEFAULT_SETTINGS }; + settings.burySiblingCards = burySiblingCards; + + let c: TestContext = await setupSample1(flashcardReviewMode, settings); + expect(c.questionPostponementList.list.length).toEqual(0); + expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); + + // Skip over these 2 questions + skipThenCheckCardFront(c.reviewSequencer, "Q1"); + skipThenCheckCardFront(c.reviewSequencer, "Q3"); + + expect(c.questionPostponementList.list.length).toEqual(0); +} + function skipThenCheckCardFront(sequencer: IFlashcardReviewSequencer, expectedFront: string): void { sequencer.skipCurrentCard(); expect(sequencer.currentCard.front).toEqual(expectedFront); @@ -234,7 +297,8 @@ function skipThenCheckCardFront(sequencer: IFlashcardReviewSequencer, expectedFr ////////////////////////////////////////////////////////////////////// -beforeAll(() => { +// Do this before each test, as some tests change the "current" date +beforeEach(() => { setupStaticDateProvider_20230906(); }); @@ -297,8 +361,7 @@ describe("skipCurrentCard", () => { skipThenCheckCardFront(c.reviewSequencer, "Q5"); skipThenCheckCardFront(c.reviewSequencer, "Q6"); - c.reviewSequencer.skipCurrentCard(); - expect(c.reviewSequencer.hasCurrentCard).toEqual(false); + skipAndCheckNoRemainingCards(c); }); test("Skipping a card skips all sibling cards", async () => { @@ -343,57 +406,24 @@ describe("skipCurrentCard", () => { expect(c.reviewSequencer.hasCurrentCard).toEqual(false); }); - describe("Checking postponement list", () => { + describe("Checking postponement list (skipped cards)", () => { describe("FlashcardReviewMode.Review", () => { test("burySiblingCards=false - skipped question not added to postponement list", async () => { - let settings: SRSettings = { ...DEFAULT_SETTINGS }; - settings.burySiblingCards = false; - - let c: TestContext = await setupSample1(FlashcardReviewMode.Review, settings); - expect(c.questionPostponementList.list.length).toEqual(0); - expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); - - // Skip over these 2 questions - skipThenCheckCardFront(c.reviewSequencer, "Q1"); - skipThenCheckCardFront(c.reviewSequencer, "Q3"); - - expect(c.questionPostponementList.list.length).toEqual(0); + checkEmptyPostponementList(false, FlashcardReviewMode.Review); }); - test("burySiblingCards=true - skipped question added to postponement list", async () => { - let settings: SRSettings = { ...DEFAULT_SETTINGS }; - settings.burySiblingCards = true; - - let c: TestContext = await setupSample1(FlashcardReviewMode.Review, settings); - expect(c.questionPostponementList.list.length).toEqual(0); - expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); - - // Skip over 2 questions - skipThenCheckCardFront(c.reviewSequencer, "Q1"); - skipThenCheckCardFront(c.reviewSequencer, "Q3"); - - expect(c.questionPostponementList.list.length).toEqual(2); + // https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/760 + test("burySiblingCards=true - skipped question not added to postponement list", async () => { + checkEmptyPostponementList(true, FlashcardReviewMode.Review); }); }); describe("FlashcardReviewMode.Cram", () => { test("Cram mode - skipped question not added to postponement list", async () => { - let c: TestContext = await setupSample1(FlashcardReviewMode.Cram, DEFAULT_SETTINGS); - expect(c.questionPostponementList.list.length).toEqual(0); - expect(c.reviewSequencer.currentCard.front).toEqual("Q2"); - - // Skip over these questions - skipThenCheckCardFront(c.reviewSequencer, "Q1"); - skipThenCheckCardFront(c.reviewSequencer, "Q3"); - - expect(c.questionPostponementList.list.length).toEqual(0); + checkEmptyPostponementList(false, FlashcardReviewMode.Cram); }); }); }); - // No postponement during cramming - // Deletion of sibling cards after text modification - // Deletion of sibling cards after card skip - // Delete+postpone }); describe("processReview", () => { @@ -463,6 +493,146 @@ describe("processReview", () => { await checkReviewResponse_ReviewMode(ReviewResponse.Easy, expected); }); }); + + describe("Checking postponement list (after card reviewed, burySiblingCards=false)", () => { + test("reviewed question not added to postponement list; sibling cards are sequenced (not deleted)", async () => { + let settings: SRSettings = { ...DEFAULT_SETTINGS }; + settings.burySiblingCards = false; + + let text: string = ` +#flashcards This single ==question== turns into ==3 separate== ==cards== + +Q1::A1 + `; + + let c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Review, + settings, + text, + ); + await c.setSequencerDeckTreeFromOriginalText(); + expect(c.cardSequencer.currentDeck.getCardCount(CardListType.All, false)).toEqual( + 4, + ); + + expect(c.reviewSequencer.currentCard.front).toMatch(clozeQuestion1Card1); + + // After reviewing, sibling cards still present + await c.reviewSequencer.processReview(ReviewResponse.Easy); + expect(c.reviewSequencer.currentCard.front).toMatch(clozeQuestion1Card2); + await c.reviewSequencer.processReview(ReviewResponse.Good); + expect(c.reviewSequencer.currentCard.front).toMatch(clozeQuestion1Card3); + + // After reviewing last sibling, move to next card + await c.reviewSequencer.processReview(ReviewResponse.Hard); + expect(c.reviewSequencer.currentCard.front).toEqual("Q1"); + + skipAndCheckNoRemainingCards(c); + checkQuestionPostponementListCount(c, 0); + }); + }); + + describe("Checking postponement list (after card reviewed, burySiblingCards=true)", () => { + test("reviewed question added to postponement list; sibling cards are buried", async () => { + let settings: SRSettings = { ...DEFAULT_SETTINGS }; + settings.burySiblingCards = true; + + let text: string = ` +#flashcards ${clozeQuestion1} + +Q1::A1 + `; + + let c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Review, + settings, + text, + ); + await c.setSequencerDeckTreeFromOriginalText(); + expect(c.cardSequencer.currentDeck.getCardCount(CardListType.All, false)).toEqual( + 4, + ); + + expect(c.reviewSequencer.currentCard.front).toMatch(clozeQuestion1Card1); + + // After reviewing, sibling cards skipped + await c.reviewSequencer.processReview(ReviewResponse.Easy); + expect(c.reviewSequencer.currentCard.front).toEqual("Q1"); + + skipAndCheckNoRemainingCards(c); + + // Single question on the list () + checkQuestionPostponementListCount(c, 1); + }); + + test("card reviewed as hard, after restarting the review process, that question skipped and next question is shown", async () => { + let settings: SRSettings = { ...DEFAULT_SETTINGS }; + settings.burySiblingCards = true; + + let text: string = ` +#flashcards ${clozeQuestion1} + +Q1::A1 + `; + + // Simulate performing the review on 2023-09-06 + // Check that the reviewed card, scheduled for following day; 2 buried cards have schedule dates with magic number indicating unreviewed card ("2000-01-01") + setupStaticDateProvider_OriginDatePlusDays(0); + const c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Review, + settings, + text, + ); + await c.setSequencerDeckTreeFromOriginalText(); + expect(c.reviewSequencer.currentCard.front).toMatch(clozeQuestion1Card1); + await c.reviewSequencer.processReview(ReviewResponse.Hard); + text = c.file.content; + let expectedCard1Review: string = "2023-09-07,1,230"; + expect(text).toContain( + ``, + ); + checkQuestionPostponementListCount(c, 1); + + // Reset the context to the new content (that now includes the schedule info); simulate same day + // First question not shown (as all of its cards have been "buried"); second question shown + let daysAfterOrigin: number = 0; + await c.resetContext(text, daysAfterOrigin); + expect(c.reviewSequencer.currentCard.front).toEqual("Q1"); + + // Simulate next day 2023-09-07 + // First card (rated as hard the previous day) is reshown; now reviewed as Good + c.clearQuestionPostponementList(); + daysAfterOrigin = 1; + await c.resetContext(text, daysAfterOrigin); + expect(c.reviewSequencer.currentCard.front).toMatch(clozeQuestion1Card1); + await c.reviewSequencer.processReview(ReviewResponse.Good); + text = c.file.content; + expectedCard1Review = "2023-09-09,2,230"; + expect(text).toContain( + ``, + ); + expect(c.reviewSequencer.currentCard.front).toEqual("Q1"); + + // Simulate next day 2023-09-08 + // First card (rated as Good the previous day) is skipped; second sibling shown + // Post review of second sibling, third sibling skipped and subsequent question Q1 shown + c.clearQuestionPostponementList(); + daysAfterOrigin = 2; + await c.resetContext(text, daysAfterOrigin); + expect(c.reviewSequencer.currentCard.front).toMatch(clozeQuestion1Card2); + await c.reviewSequencer.processReview(ReviewResponse.Easy); + text = c.file.content; + expectedCard1Review = "2023-09-09,2,230"; + let expectedCard2Review: string = "2023-09-12,4,270"; + expect(text).toContain( + ``, + ); + expect(c.reviewSequencer.currentCard.front).toEqual("Q1"); + }); + }); }); describe("FlashcardReviewMode.Cram", () => { @@ -799,6 +969,15 @@ ${updatedStr} }); }); +function checkQuestionPostponementListCount(c: TestContext, expectedListLength: number) { + expect(c.questionPostponementList.list.length).toEqual(expectedListLength); +} + +function skipAndCheckNoRemainingCards(c: TestContext) { + c.reviewSequencer.skipCurrentCard(); + expect(c.reviewSequencer.hasCurrentCard).toEqual(false); +} + async function checkUpdateCurrentQuestionText( noteText: string, updatedQ: string, From b39b61d9142da27b5d1171e06e6f6c0fd41b25f4 Mon Sep 17 00:00:00 2001 From: Khoi Nguyen Date: Sat, 21 Oct 2023 00:49:54 +1100 Subject: [PATCH 071/155] doc: update note about the reversed card (#699) --- docs/en/flashcards.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/en/flashcards.md b/docs/en/flashcards.md index 1b48e286..a97aa425 100644 --- a/docs/en/flashcards.md +++ b/docs/en/flashcards.md @@ -22,6 +22,9 @@ The prompt and the answer are separated by `:::` (this can be configured in sett the question goes on this side:::answer goes here! ``` +Note: In the first review, the plugin will show non-reversed card and reversed card. +If **Bury sibling cards until the next day?** turn on, only non-reversed card will appear. + ### Multi-line Basic The front and the back of the card are separated by `?` (this can be configured in settings). @@ -66,6 +69,8 @@ same goes for the answer ``` +Note: The behaviour is same as single line reversed. + ### Cloze cards You can easily add cloze deletion cards using `==highlights==`, `**bolded text**`, or `{{text in curly braces}}`. From 6a58137e21fa1bf0d2ef6c24c216a2b7d2f94ff4 Mon Sep 17 00:00:00 2001 From: Stephen Mwangi Date: Mon, 23 Oct 2023 07:18:21 +0300 Subject: [PATCH 072/155] Bump version to v1.10.3 (#772) --- docs/changelog.md | 8 ++++++-- package.json | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index fd8578cc..89e684d6 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -90,12 +90,16 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fixed open the next note automatically after reviewing another [#582](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/582) - fixed sidebar doesn't show/update some files. [#393](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/393) #### Unreleased +#### [1.10.3](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.2...1.10.3) -- Fix: Bury Siblings Is Not Honored [`#759`](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/759) -- Fix: Skipping a card seems to permanently bury it and make it impossible to review again in the same day [`#760`](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/760) +- doc: update note about the reversed card [`#699`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/699) +- Fix bugs regarding bury sibling cards [`#763`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/763) #### [1.10.2](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.1...1.10.2) +> 9 October 2023 + +- Bump version to 1.10.2 [`#756`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/756) - refactor: Separate business logic from user interface code [`#751`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/751) - Remove the spaces before and after the question marks in the multi-line basic flashcards [`#719`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/719) - chore: Update dependencies [`44e9bb6`](https://github.com/st3v3nmw/obsidian-spaced-repetition/commit/44e9bb63dad5e8ab664f7582aa403386d341aa44) diff --git a/package.json b/package.json index 0d5d3895..c5dd9b82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.1.11", + "version": "1.10.2", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { From af15f8dc58fe51d08d5e83f5b9708904536d17ac Mon Sep 17 00:00:00 2001 From: Ronny Zulaikha <75528127+ronzulu@users.noreply.github.com> Date: Thu, 26 Oct 2023 14:41:43 +1100 Subject: [PATCH 073/155] Bug fix: questions now removed from postponement list; etc (#775) * Bug fix: questions now removed from postponement list; etc #774 * pnpm format --- docs/changelog.md | 4 +-- src/Deck.ts | 38 ++++++++++++++------- src/FlashcardReviewSequencer.ts | 14 ++++++-- src/QuestionPostponementList.ts | 2 +- src/main.ts | 3 ++ tests/unit/FlashcardReviewSequencer.test.ts | 29 ++++++++++++++-- 6 files changed, 71 insertions(+), 19 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 89e684d6..c194274b 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -91,9 +91,9 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fixed sidebar doesn't show/update some files. [#393](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/393) #### Unreleased #### [1.10.3](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.2...1.10.3) +#### Unreleased -- doc: update note about the reversed card [`#699`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/699) -- Fix bugs regarding bury sibling cards [`#763`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/763) +- Fix: Questions not removed from the card postponement list [`#774`](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/774) #### [1.10.2](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.1...1.10.2) diff --git a/src/Deck.ts b/src/Deck.ts index fceecb56..fe42fb14 100644 --- a/src/Deck.ts +++ b/src/Deck.ts @@ -17,6 +17,14 @@ export class Deck { public subdecks: Deck[]; public parent: Deck | null; + constructor(deckName: string, parent: Deck | null) { + this.deckName = deckName; + this.newFlashcards = []; + this.dueFlashcards = []; + this.subdecks = []; + this.parent = parent; + } + public getCardCount(cardListType: CardListType, includeSubdeckCounts: boolean): number { let result: number = 0; if (cardListType == CardListType.NewCard || cardListType == CardListType.All) @@ -32,12 +40,24 @@ export class Deck { return result; } - constructor(deckName: string, parent: Deck | null) { - this.deckName = deckName; - this.newFlashcards = []; - this.dueFlashcards = []; - this.subdecks = []; - this.parent = parent; + // + // Returns a count of the number of this question's cards are present in this deck. + // (The returned value would be <= question.cards.length) + // + public getQuestionCardCount(question: Question): number { + let result: number = 0; + result += this.getQuestionCardCountForCardListType(question, this.newFlashcards); + result += this.getQuestionCardCountForCardListType(question, this.dueFlashcards); + return result; + } + + private getQuestionCardCountForCardListType(question: Question, cards: Card[]): number { + let result: number = 0; + for (let i = 0; i < cards.length; i++) { + const card = cards[i]; + if (Object.is(question, cards[i].question)) result++; + } + return result; } static get emptyDeck(): Deck { @@ -124,12 +144,6 @@ export class Deck { cardList.splice(index, 1); } - deleteAllCardsForQuestion(question: Question): void { - for (let idx = question.cards.length - 1; idx >= 0; idx--) { - this.deleteCardAtIndex(idx, question.cards[idx].cardListType); - } - } - toDeckArray(): Deck[] { const result: Deck[] = []; result.push(this); diff --git a/src/FlashcardReviewSequencer.ts b/src/FlashcardReviewSequencer.ts index 871c72b0..072e43f8 100644 --- a/src/FlashcardReviewSequencer.ts +++ b/src/FlashcardReviewSequencer.ts @@ -144,8 +144,7 @@ export class FlashcardReviewSequencer implements IFlashcardReviewSequencer { this.cardSequencer.nextCard(); } else { if (this.settings.burySiblingCards) { - this.questionPostponementList.add(this.currentQuestion); - await this.questionPostponementList.write(); + await this.burySiblingCards(); this.cardSequencer.deleteCurrentQuestion(); } else { this.deleteCurrentCard(); @@ -153,6 +152,17 @@ export class FlashcardReviewSequencer implements IFlashcardReviewSequencer { } } + private async burySiblingCards(): Promise { + // We check if there are any sibling cards still in the deck, + // We do this because otherwise we would be adding every reviewed card to the postponement list, even for a + // question with a single card. That isn't consistent with the 1.10.1 behavior + const remaining = this.currentDeck.getQuestionCardCount(this.currentQuestion); + if (remaining > 1) { + this.questionPostponementList.add(this.currentQuestion); + await this.questionPostponementList.write(); + } + } + async processReview_CramMode(response: ReviewResponse): Promise { if (response == ReviewResponse.Easy) this.deleteCurrentCard(); else { diff --git a/src/QuestionPostponementList.ts b/src/QuestionPostponementList.ts index 54386169..cc0164c3 100644 --- a/src/QuestionPostponementList.ts +++ b/src/QuestionPostponementList.ts @@ -21,7 +21,7 @@ export class QuestionPostponementList implements IQuestionPostponementList { } clear(): void { - this.list = []; + this.list.splice(0); } add(question: Question): void { diff --git a/src/main.ts b/src/main.ts index 4559b7a8..e02576c2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -418,6 +418,9 @@ export default class SRPlugin extends Plugin { if (todayDate !== this.data.buryDate) { this.data.buryDate = todayDate; this.questionPostponementList.clear(); + + // The following isn't needed for plug-in functionality; but can aid during debugging + await this.savePluginData(); } const notes: TFile[] = this.app.vault.getMarkdownFiles(); diff --git a/tests/unit/FlashcardReviewSequencer.test.ts b/tests/unit/FlashcardReviewSequencer.test.ts index 923afdf1..dad014d9 100644 --- a/tests/unit/FlashcardReviewSequencer.test.ts +++ b/tests/unit/FlashcardReviewSequencer.test.ts @@ -534,7 +534,7 @@ Q1::A1 }); describe("Checking postponement list (after card reviewed, burySiblingCards=true)", () => { - test("reviewed question added to postponement list; sibling cards are buried", async () => { + test("Question with multiple cards; reviewed question added to postponement list; sibling cards are buried", async () => { let settings: SRSettings = { ...DEFAULT_SETTINGS }; settings.burySiblingCards = true; @@ -567,7 +567,7 @@ Q1::A1 checkQuestionPostponementListCount(c, 1); }); - test("card reviewed as hard, after restarting the review process, that question skipped and next question is shown", async () => { + test("Question with multiple cards; card reviewed as hard, after restarting the review process, that whole question skipped and next question is shown", async () => { let settings: SRSettings = { ...DEFAULT_SETTINGS }; settings.burySiblingCards = true; @@ -632,6 +632,31 @@ Q1::A1 ); expect(c.reviewSequencer.currentCard.front).toEqual("Q1"); }); + + test("Question with single cards; card reviewed as hard, the question is NOT added to the postponement list", async () => { + let settings: SRSettings = { ...DEFAULT_SETTINGS }; + settings.burySiblingCards = true; + + // Question with a single card + let text: string = `#flashcards Q1::A1`; + + // Create the test context + setupStaticDateProvider_OriginDatePlusDays(0); + const c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Review, + settings, + text, + ); + await c.setSequencerDeckTreeFromOriginalText(); + expect(c.reviewSequencer.currentCard.front).toEqual("Q1"); + + // Review the card + await c.reviewSequencer.processReview(ReviewResponse.Hard); + + // Check that there are no questions on the postponement list + checkQuestionPostponementListCount(c, 0); + }); }); }); From 6cd28787720205daf2d123b1d3c784bc3ca5f920 Mon Sep 17 00:00:00 2001 From: Ronny Zulaikha <75528127+ronzulu@users.noreply.github.com> Date: Mon, 30 Oct 2023 15:00:50 +1100 Subject: [PATCH 074/155] fix: multi-line tag ('$$') converted to single-line ('$') after card reviewed --- src/util/MultiLineTextFinder.ts | 4 +- src/util/utils.ts | 16 +++++ tests/unit/FlashcardReviewSequencer.test.ts | 24 +++++++ tests/unit/util/utils.test.ts | 74 +++++++++++++++++++++ 4 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 tests/unit/util/utils.test.ts diff --git a/src/util/MultiLineTextFinder.ts b/src/util/MultiLineTextFinder.ts index bd5a43a9..7977e6c6 100644 --- a/src/util/MultiLineTextFinder.ts +++ b/src/util/MultiLineTextFinder.ts @@ -1,4 +1,4 @@ -import { splitTextIntoLineArray } from "./utils"; +import { literalStringReplace, splitTextIntoLineArray } from "./utils"; export class MultiLineTextFinder { static findAndReplace( @@ -8,7 +8,7 @@ export class MultiLineTextFinder { ): string | null { let result: string = null; if (sourceText.includes(searchText)) { - result = sourceText.replace(searchText, replacementText); + result = literalStringReplace(sourceText, searchText, replacementText); } else { const sourceTextArray = splitTextIntoLineArray(sourceText); const searchTextArray = splitTextIntoLineArray(searchText); diff --git a/src/util/utils.ts b/src/util/utils.ts index 1debe429..caa28696 100644 --- a/src/util/utils.ts +++ b/src/util/utils.ts @@ -38,6 +38,22 @@ export const getKeysPreserveType = Object.keys as text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +export function literalStringReplace( + text: string, + searchStr: string, + replacementStr: string, +): string { + let result: string = text; + const startIdx: number = text.indexOf(searchStr); + if (startIdx >= 0) { + const startStr: string = text.substring(0, startIdx); + const endIdx: number = startIdx + searchStr.length; + const endStr: string = text.substring(endIdx); + result = startStr + replacementStr + endStr; + } + return result; +} + /** * Returns the cyrb53 hash (hex string) of the input string * Please see https://stackoverflow.com/a/52171480 for more details diff --git a/tests/unit/FlashcardReviewSequencer.test.ts b/tests/unit/FlashcardReviewSequencer.test.ts index dad014d9..13f70249 100644 --- a/tests/unit/FlashcardReviewSequencer.test.ts +++ b/tests/unit/FlashcardReviewSequencer.test.ts @@ -658,6 +658,30 @@ Q1::A1 checkQuestionPostponementListCount(c, 0); }); }); + + test("Answer includes MathJax within $$", async () => { + let fileText: string = `#flashcards +What is Newman's equation for gravitational force +? +$$\\huge F_g=\\frac {G m_1 m_2}{d^2}$$`; + + let c: TestContext = TestContext.Create( + order_DueFirst_Sequential, + FlashcardReviewMode.Review, + DEFAULT_SETTINGS, + fileText, + ); + await c.setSequencerDeckTreeFromOriginalText(); + expect(c.reviewSequencer.currentCard.front).toContain("What is Newman's equation"); + + // Reviewing the card doesn't change the question, only adds the schedule info + await c.reviewSequencer.processReview(ReviewResponse.Easy); + let expectedFileText: string = `${fileText} +`; + + let actual: string = await c.file.read(); + expect(actual).toEqual(expectedFileText); + }); }); describe("FlashcardReviewMode.Cram", () => { diff --git a/tests/unit/util/utils.test.ts b/tests/unit/util/utils.test.ts new file mode 100644 index 00000000..d9303160 --- /dev/null +++ b/tests/unit/util/utils.test.ts @@ -0,0 +1,74 @@ +import { literalStringReplace } from "src/util/utils"; + +describe("literalStringReplace", () => { + test("Replacement string doesn't have any dollar signs", async () => { + const actual: string = literalStringReplace( + "Original string without dollar signs", + "dollar", + "pound", + ); + expect(actual).toEqual("Original string without pound signs"); + }); + + test("Replacement string has double dollar signs", async () => { + const actual: string = literalStringReplace( + "Original string without dollar signs", + "dollar", + "$", + ); + expect(actual).toEqual("Original string without $ signs"); + }); + + test("Original and search strings has double dollar signs at the end", async () => { + const originalStr: string = `Some stuff at the start + +Something +? +$$\\huge F_g=\\frac {G m_1 m_2}{d^2}$$`; + + const searchStr: string = `Something +? +$$\\huge F_g=\\frac {G m_1 m_2}{d^2}$$`; + + const replacementStr: string = `Something +? +$$\\huge F_g=\\frac {G m_1 m_2}{d^2}$$ +`; + + const expectedStr: string = `Some stuff at the start + +Something +? +$$\\huge F_g=\\frac {G m_1 m_2}{d^2}$$ +`; + + const actual: string = literalStringReplace(originalStr, searchStr, replacementStr); + expect(actual).toEqual(expectedStr); + }); + + test("Original and search strings has double dollar signs at the end", async () => { + const originalStr: string = `Some stuff at the start $$`; + + const searchStr: string = `start $$`; + + const replacementStr: string = `start $$ and end`; + + const expectedStr: string = `Some stuff at the start $$ and end`; + + const actual: string = literalStringReplace(originalStr, searchStr, replacementStr); + expect(actual).toEqual(expectedStr); + }); + + test("Search string not found", async () => { + const originalStr: string = "A very boring string"; + + const searchStr: string = "missing"; + + const replacementStr: string = "replacement"; + + const expectedStr: string = originalStr; + + const actual: string = literalStringReplace(originalStr, searchStr, replacementStr); + expect(actual).toEqual(expectedStr); + }); +}); From 597aa5771051368f69ceeeaba8992f2678400fc0 Mon Sep 17 00:00:00 2001 From: Stephen Mwangi Date: Mon, 30 Oct 2023 07:04:25 +0300 Subject: [PATCH 075/155] Bump version to v1.10.4 (#780) --- docs/changelog.md | 12 +++++++++++- package.json | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index c194274b..2cb594ff 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -92,8 +92,18 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). #### Unreleased #### [1.10.3](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.2...1.10.3) #### Unreleased +#### [1.10.4](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.3...1.10.4) -- Fix: Questions not removed from the card postponement list [`#774`](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/774) +- Bug fix: questions now removed from postponement list; etc [`#775`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/775) +- fix: multi-line tag ('$$') converted to single-line ('$') after card reviewed [`b9c354d`](https://github.com/st3v3nmw/obsidian-spaced-repetition/commit/b9c354d6e48def1d90571378aa5ab7e1096bd725) + +#### [1.10.3](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.2...1.10.3) + +> 23 October 2023 + +- Bump version to v1.10.3 [`#772`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/772) +- doc: update note about the reversed card [`#699`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/699) +- Fix bugs regarding bury sibling cards [`#763`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/763) #### [1.10.2](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.1...1.10.2) diff --git a/package.json b/package.json index c5dd9b82..8cb6fb1d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.2", + "version": "1.10.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { From 353407a6a952d027103738acb03ba29928a3723f Mon Sep 17 00:00:00 2001 From: Ronny Zulaikha <75528127+ronzulu@users.noreply.github.com> Date: Sun, 12 Nov 2023 19:53:48 +1100 Subject: [PATCH 076/155] Bug note review invalid metadata 764 (#782) * Added logging to assist with debug * more debug; and likely fix * Bug fix ready for testing * Removed debugging * Update change log --- docs/changelog.md | 4 ++++ src/CardSchedule.ts | 5 ++++- src/NoteEaseList.ts | 6 +++--- src/main.ts | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 2cb594ff..388ca7a8 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -92,6 +92,10 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). #### Unreleased #### [1.10.3](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.2...1.10.3) #### Unreleased +#### [Unreleased] + +- Bug fix: Reviewing note as good makes new invalid metadata field [`#764`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/764) + #### [1.10.4](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.3...1.10.4) - Bug fix: questions now removed from postponement list; etc [`#775`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/775) diff --git a/src/CardSchedule.ts b/src/CardSchedule.ts index 151940b1..bfda1571 100644 --- a/src/CardSchedule.ts +++ b/src/CardSchedule.ts @@ -110,7 +110,10 @@ export class CardScheduleCalculator { } getNewCardSchedule(response: ReviewResponse, notePath: string): CardScheduleInfo { - const initial_ease: number = this.noteEaseList.getEaseByPath(notePath); + let initial_ease: number = this.settings.baseEase; + if (this.noteEaseList.hasEaseForPath(notePath)) { + initial_ease = Math.round(this.noteEaseList.getEaseByPath(notePath)); + } const delayBeforeReview = 0; const schedObj: Record = schedule( diff --git a/src/NoteEaseList.ts b/src/NoteEaseList.ts index d69d97bd..0424f3c7 100644 --- a/src/NoteEaseList.ts +++ b/src/NoteEaseList.ts @@ -2,7 +2,7 @@ import { SRSettings } from "./settings"; export interface INoteEaseList { hasEaseForPath(path: string): boolean; - getEaseByPath(path: string): number; + getEaseByPath(path: string): number | null; setEaseForPath(path: string, ease: number): void; } @@ -22,8 +22,8 @@ export class NoteEaseList implements INoteEaseList { return Object.prototype.hasOwnProperty.call(this.dict, path); } - getEaseByPath(path: string): number { - let ease: number = this.baseEase; + getEaseByPath(path: string): number | null { + let ease: number = null; if (this.hasEaseForPath(path)) { ease = Math.round(this.dict[path]); } diff --git a/src/main.ts b/src/main.ts index e02576c2..4dc93204 100644 --- a/src/main.ts +++ b/src/main.ts @@ -837,7 +837,7 @@ export default class SRPlugin extends Plugin { ? (linkContribution * linkTotal) / linkPGTotal : linkContribution * this.data.settings.baseEase); // add note's average flashcard ease if available - if (Object.prototype.hasOwnProperty.call(this.easeByPath, note.path)) { + if (this.easeByPath.hasEaseForPath(note.path)) { ease = (ease + this.easeByPath.getEaseByPath(note.path)) / 2; } ease = Math.round(ease); From cc642598d23e02757c0825879cd587ddfccb869a Mon Sep 17 00:00:00 2001 From: Ronny Zulaikha <75528127+ronzulu@users.noreply.github.com> Date: Sun, 12 Nov 2023 19:56:38 +1100 Subject: [PATCH 077/155] Bug edit flashcard sometimes corrupts question text in file (#784) * Fixed * Updated change log --------- Co-authored-by: Stephen Mwangi --- docs/changelog.md | 1 + src/gui/flashcards-edit-modal.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 388ca7a8..8370cb55 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -94,6 +94,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). #### Unreleased #### [Unreleased] +- Bug fix: Editing while reviewing flashcard can corrupt question text in note [`#783`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/783) - Bug fix: Reviewing note as good makes new invalid metadata field [`#764`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/764) #### [1.10.4](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.3...1.10.4) diff --git a/src/gui/flashcards-edit-modal.ts b/src/gui/flashcards-edit-modal.ts index 1330c811..a6c0c1e4 100644 --- a/src/gui/flashcards-edit-modal.ts +++ b/src/gui/flashcards-edit-modal.ts @@ -22,6 +22,7 @@ export class FlashcardEditModal extends Modal { this.titleEl.setText(t("EDIT_CARD")); this.titleEl.addClass("sr-centered"); this.modalText = existingText; + this.input = existingText; this.waitForClose = new Promise((resolve, reject) => { this.resolvePromise = resolve; @@ -68,7 +69,6 @@ export class FlashcardEditModal extends Modal { textComponent.inputEl.style.width = "100%"; textComponent .setValue(value ?? "") - .onChange((value) => (this.input = value)) .inputEl.addEventListener("keydown", this.submitEnterCallback); return textComponent; @@ -86,7 +86,7 @@ export class FlashcardEditModal extends Modal { private submit() { this.didSubmit = true; - + this.input = this.inputComponent.getValue(); this.close(); } From eb25a0abea1024a6b307bd133fd968b7c8b5c76e Mon Sep 17 00:00:00 2001 From: Stephen Mwangi Date: Sun, 12 Nov 2023 16:12:15 +0300 Subject: [PATCH 078/155] Bump version to v1.10.5 (#789) --- docs/changelog.md | 8 ++++++-- package.json | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 8370cb55..2f7c3797 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -93,12 +93,16 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). #### [1.10.3](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.2...1.10.3) #### Unreleased #### [Unreleased] +#### [1.10.5](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.4...1.10.5) -- Bug fix: Editing while reviewing flashcard can corrupt question text in note [`#783`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/783) -- Bug fix: Reviewing note as good makes new invalid metadata field [`#764`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/764) +- Bug edit flashcard sometimes corrupts question text in file [`#784`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/784) +- Bug note review invalid metadata 764 [`#782`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/782) #### [1.10.4](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.3...1.10.4) +> 30 October 2023 + +- Bump version to v1.10.4 [`#780`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/780) - Bug fix: questions now removed from postponement list; etc [`#775`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/775) - fix: multi-line tag ('$$') converted to single-line ('$') after card reviewed [`b9c354d`](https://github.com/st3v3nmw/obsidian-spaced-repetition/commit/b9c354d6e48def1d90571378aa5ab7e1096bd725) diff --git a/package.json b/package.json index 8cb6fb1d..f12fb2d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.4", + "version": "1.10.5", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { From 1dc9f7e0c57f92d9eb53c1db07fb67e422e2184a Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:19:31 +0800 Subject: [PATCH 079/155] Squashed commit of the following: Merge branch 'release/log' Merge branch 'upstream/master' Merge branch 'Feat/refactor' * create Object * use stats * keep itemId * getInstance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updateStats isNew and isDue trackFile card refactor LocationSwitch hide debug commands change save name close #26: Interval时间的展示 close [FEAT] Interval时间的展示 open-spaced-repetition/obsidian-spaced-repetition-recall#26 * add info * fix merge errors * update readme dummyDueDateForNewCard trackedNoteToDecks add test fix data load fix convert add info verifyItems fix revlog fix stats fix #21 review_state为0的情况 del debug msg openfileButton --- CHANGELOG.md | 2 +- CONTRIBUTING.md | 2 +- README.md | 4 +- docs/README_ZH.md | 4 +- docs/changelog.md | 18 +- docs/usage.md | 94 + ...77\347\224\250\346\225\231\347\250\213.md" | 96 + manifest.json | 3 +- package-lock.json | 15113 ---------------- package.json | 4 +- pnpm-lock.yaml | 3371 ++-- src/Card.ts | 2 +- src/CardSchedule.ts | 25 + src/Events/trackFileEvents.ts | 92 + src/FlashcardReviewSequencer.ts | 9 +- src/NoteQuestionParser.ts | 2 +- src/TopicPath.ts | 36 +- src/algorithms.ts | 20 - src/algorithms/algorithms.ts | 44 + src/algorithms/algorithms_switch.ts | 74 + src/algorithms/anki.ts | 79 +- src/algorithms/balance/balance.ts | 64 + src/algorithms/fsrs.ts | 162 +- src/algorithms/priorities/linkPageranks.ts | 87 + src/algorithms/scheduling_default.ts | 106 +- src/algorithms/supermemo.ts | 24 +- src/commands.ts | 175 +- src/constants.ts | 3 +- src/data.ts | 2558 --- src/dataStore/data.ts | 1034 ++ src/dataStore/dataSyncer.ts | 216 + src/dataStore/location_switch.ts | 620 + src/dataStore/queue.ts | 307 + src/dataStore/repetitionItem.ts | 204 + src/dataStore/trackedFile.ts | 270 + src/flashcard-modal-algo.tsx | 1144 -- src/{modals => gui}/ReleaseNotes.ts | 45 +- src/{modals => gui}/confirm.tsx | 16 +- src/gui/flashcard-modal.tsx | 152 +- src/gui/info.ts | 152 + src/gui/reviewresponse-modal.tsx | 283 + src/gui/sidebar.ts | 26 +- src/gui/stats-modal.tsx | 226 +- src/lang/locale/ar.ts | 5 + src/lang/locale/cz.ts | 5 + src/lang/locale/de.ts | 5 + src/lang/locale/en.ts | 5 + src/lang/locale/es.ts | 5 + src/lang/locale/ja.ts | 5 + src/lang/locale/ko.ts | 5 + src/lang/locale/pt-br.ts | 5 + src/lang/locale/ru.ts | 5 + src/lang/locale/zh-cn.ts | 5 + src/lang/locale/zh-tw.ts | 5 + src/main.ts | 1191 +- src/modals/reviewresponse-modal.tsx | 327 - src/reviewNote/review-note.ts | 228 + src/scheduling.ts | 20 +- src/settings.ts | 359 +- src/stats.ts | 97 + src/suggesters/FolderSuggester.ts | 2 +- src/tags.ts | 59 + src/util/NumberCountDict.ts | 6 + src/{ => util}/utils_recall.ts | 16 +- styles.css | 70 +- tests/unit/TopicPath.test.ts | 21 + tests/unit/location_switch.test.ts | 165 + 67 files changed, 7000 insertions(+), 22584 deletions(-) create mode 100644 docs/usage.md create mode 100644 "docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" delete mode 100644 package-lock.json create mode 100644 src/Events/trackFileEvents.ts delete mode 100644 src/algorithms.ts create mode 100644 src/algorithms/algorithms.ts create mode 100644 src/algorithms/algorithms_switch.ts create mode 100644 src/algorithms/balance/balance.ts create mode 100644 src/algorithms/priorities/linkPageranks.ts delete mode 100644 src/data.ts create mode 100644 src/dataStore/data.ts create mode 100644 src/dataStore/dataSyncer.ts create mode 100644 src/dataStore/location_switch.ts create mode 100644 src/dataStore/queue.ts create mode 100644 src/dataStore/repetitionItem.ts create mode 100644 src/dataStore/trackedFile.ts delete mode 100644 src/flashcard-modal-algo.tsx rename src/{modals => gui}/ReleaseNotes.ts (76%) rename src/{modals => gui}/confirm.tsx (61%) create mode 100644 src/gui/info.ts create mode 100644 src/gui/reviewresponse-modal.tsx delete mode 100644 src/modals/reviewresponse-modal.tsx create mode 100644 src/reviewNote/review-note.ts create mode 100644 src/tags.ts rename src/{ => util}/utils_recall.ts (92%) create mode 100644 tests/unit/location_switch.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cf57d4c..1bed66b3 120000 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1 @@ -./docs/changelog.md \ No newline at end of file +docs/changelog.md \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0ec6b81d..651dc17d 120000 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1 @@ -./docs/en/contributing.md \ No newline at end of file +docs/en/contributing.md \ No newline at end of file diff --git a/README.md b/README.md index 8d273f84..f0be1b9e 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ This is a modified version of [obsidian-spaced-repetition](https://github.com/st Since I am not a programmer, I don't know much about typescript programming, so I can only do some bug fixes and small feature updates. I can only do some bug fixes and small feature updates, but it is difficult to realize some of the proposed features. Welcome to join us if you are interested in this plugin, and work together to maintain and update this plugin. -You can join us by submitting an issue or PR directly. +You can join us by submitting an [issue](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues)/[PR](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/pulls)、或[论坛讨论](https://forum-zh.obsidian.md/t/topic/20551) directly. ## How to install the plugin @@ -37,7 +37,7 @@ OR USE BRAT pulgin; ## Usage -Check the [docs](https://www.stephenmwangi.com/obsidian-spaced-repetition/) for more details. +Check the [docs](./docs/usage.md) for more details. ## Thanks diff --git a/docs/README_ZH.md b/docs/README_ZH.md index 3cc13713..895dc328 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -24,7 +24,7 @@ 因我本人并不是程序员,对 typescript 编程有许多不懂的地方,目前只能做些 bug 修复、及小功能更新。而对一些好的功能建议就难以实现了,欢迎对这个插件感兴趣的朋友加入,一起维护更新这个插件。 -加入方式直接提 issue 或 PR 即可。 +加入方式直接提 [issue](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues)/[PR](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/pulls)、或[论坛讨论](https://forum-zh.obsidian.md/t/topic/20551) 。 ## 适用场景 @@ -32,7 +32,7 @@ 2. 渐进式总结; 3. 增量写作; -Check the [docs](https://www.stephenmwangi.com/obsidian-spaced-repetition/) for more details. +更详细内容请参考 [使用教程](使用教程.md). ## 下载 diff --git a/docs/changelog.md b/docs/changelog.md index 2f7c3797..f020f3c1 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,11 +4,21 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). -## [1.10.1.11] -- 修复: 多设备同步及保存 tracked_files.json 问题; -- 修复: 多标签选择问题 #15 -- 新增: 数据表中可查看笔记复习情况、当天复习情况; +## [1.10.5.1] +- 合并主分支; +- 代码重构; +- fix #21:review_state 为 0 无法使用 optimizer 的问题; +- fix: 数据位置更新失败的问题; +- close #26: [Interval时间的展示](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues/26) +- new: 查看数据item info,(效果不太好,暂时可用而已); +- update: [使用教程](./%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B.md); + +## [1.10.1.11] + +- 修复: 多设备同步及保存 tracked_files.json 问题; +- 修复: 多标签选择问题 #15 +- 新增: 数据表中可查看笔记复习情况、当天复习情况; ## [1.10.1.10] diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 00000000..634de5aa --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,94 @@ + +### Quick Guide + +#### CASE1: Not using the original SR plugin, directly using this plugin + +Recommended settings +![image](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/assets/9208450/a22d23df-5d11-4b19-9007-e1530e2808be) + +For the specific parameter settings of the algorithm, please refer to [FSRS v4](https://github.com/open-spaced-repetition/fsrs4anki/wiki/The-Algorithm#fsrs-v4). + +Other settings can be set according to the instructions. + +Review via command line +Or on the computer side, you can review the notes by clicking the notes in the status bar/right sidebar, and review the cards in the left side navigation bar by clicking + +For the rest, refer to [@st3v3nmw's ReadMe](https://github.com/st3v3nmw/obsidian-spaced-repetition#readme) & [recall plugin's ReadMe](https://github. com/martin-jw/obsidian-recall) + +#### CASE2: Transferred from the original SR plugin + +**backup the note vault** +**backup the note vault** +**backup the note vault !!!** + + It is possible that there are bugs which may delete data in the current note. **Please make backups!** +Suggestions: + +1. Close the original plugin first to avoid conflict. +2. backup the note vault (because after changing the DataLocation in the settings, the review information in the note content will be deleted and saved to a separate file tracked_files.json.) + +If you want to use FSRS algorithm, you need to set it as recommended [above CASE1](). + +--- + +### Features + +#### Adding notes + +Tabs corresponding to review notes can be added to the notes or via the command line/menu bar [tracking notes](https://github.com/martin-jw/obsidian-recall#tracking-notes). +Cancelable via command line/menu bar untrack Note. + +To add notes in a folder, right click on the folder, (un)track All Notes +![image](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/assets/9208450/163f397c-cc8f-49a6-ab6f-cb929cf91d2d) + +#### Adding Cards + +Add a label corresponding to a review card to your notes, or convert review notes to a card group in Settings, or convert a folder to a card group in Settings, and create a card according to [the following instructions](https://github.com/st3v3nmw/obsidian-spaced-repetition#features). + +- [Single-line style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#single-line-basic-remnote-style) (`) Question::Answer`) +- [Single-line reversed style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#single-line-reversed) (`Question:. :Answer`) +- [Multi-line style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#multi-line-basic) (Separated by `? `) +- [Multi-line reversed style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#multi-line-reversed) (Separated by `? Multi-line reversed style]() (Separated by `? `) +- [Cloze cards](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#cloze-cards) (`==highlight==` your cloze deletions! , `**bolded text**`, or `{{text in curly braces}}`) + +#### Review Notes + +Review notes can be opened from the command line, or from your computer by clicking Notes in the status bar/right sidebar. Feedback on memorization level is available via command line, hover bar or menu bar + +#### Review Cards + +Review is available via the command line, or on the computer by clicking on the cards in the left side navigation bar. +Centralized (CRAM) review/normal review of cards within the current/all notes (if any) via command line + +Centralized Review (CRAM) mode, no review data is updated. + +#### View data statistics + +Via command line, `SR view statistics` + +#### View review information + +Via command line, `SR Item Info`, you can view review information for current/all notes + +#### Algorithms + +Different algorithms have different parameters, please try to use one algorithm instead of switching algorithms repeatedly. +[Algorithms desc](. /en/algorithms.md) +default(Anki modified)、Anki: [Algorithms desc](./en/algorithms.md) +[FSRS](https://github.com/open-spaced-repetition/fsrs.js) + +#### Experimental function + +Not recommended!!! +Not recommended!!! +**Not recommended!!! ** + +Open Setup Logging --> Debugging Information to use the following functions from the command line (**not recommended to open for daily use**). + +Print Data: Output data in the debug window + +Reset Data: Delete all review data; + +Update Items: Updates invalid data in the data to the default data. + +Prune Data: Clear invalid data in the data, which will cause the data item id to be modified, which in turn will affect the optimizer of Fsrs to not be able to effectively process part of the data. diff --git "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" new file mode 100644 index 00000000..6bba166a --- /dev/null +++ "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" @@ -0,0 +1,96 @@ +## 教程 + +### 快速入手Quick Guide + +#### CASE1: 没有使用原SR插件,直接使用这个插件 + +推荐设置项 +![image](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/assets/9208450/a22d23df-5d11-4b19-9007-e1530e2808be) + +算法对应的具体参数设置,可参考[FSRS v4](https://github.com/open-spaced-repetition/fsrs4anki/wiki/The-Algorithm#fsrs-v4) + +其他设置项根据说明自行设置即可。 + +通过命令行进行复习 +或电脑端,点击状态栏/右侧边栏的笔记就可以复习笔记,点击左侧边导航栏的卡片就可以复习 + +其他,参照[@st3v3nmw's ReadMe](https://github.com/st3v3nmw/obsidian-spaced-repetition#readme) & [recall plugin's ReadMe](https://github.com/martin-jw/obsidian-recall) + +#### CASE2: 从原SR插件转入 + +**备份笔记库!!!** +**备份笔记库!!!** +**备份笔记库!!!** +自用是正常的,但也不清楚会出啥幺鹅子,还是先备份下吧。 + +建议: + +1. 先关闭原插件,避免冲突。 +2. 备份笔记库(因在设置中修改DataLocation后,会删除笔记内容中的复习信息,另存到 单独文件 tracked_files.json。 ) + +如果是想用FSRS算法,需要按上述CASE1推荐设置。 + +--- + +### 各功能 + +#### 添加笔记 + +可在笔记中添加复习笔记对应的标签,或通过命令行/菜单栏[tracking notes](https://github.com/martin-jw/obsidian-recall#tracking-notes)。 +通过命令行/菜单栏untrack Note可取消。 + +添加文件夹中的笔记,可在文件夹上右键, (un)track All Notes +![image](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/assets/9208450/163f397c-cc8f-49a6-ab6f-cb929cf91d2d) + +#### 添加卡片 + +在笔记中添加复习卡片对应的标签,或设置中将复习笔记转换为卡片组,或设置中将文件夹转换为卡片组,按照[以下说明](https://github.com/st3v3nmw/obsidian-spaced-repetition#features) 制作卡片。 + +- [Single-line style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#single-line-basic-remnote-style) (`Question::Answer`) +- [Single-line reversed style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#single-line-reversed) (`Question:::Answer`) +- [Multi-line style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#multi-line-basic) (Separated by `?`) +- [Multi-line reversed style](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#multi-line-reversed) (Separated by `??`) +- [Cloze cards](https://www.stephenmwangi.com/obsidian-spaced-repetition/flashcards/#cloze-cards) (`==highlight==` your cloze deletions!, `**bolded text**`, or `{{text in curly braces}}`) + +#### 复习笔记 + +通过命令行,或电脑端点击状态栏/右侧边栏的笔记就可以打开复习笔记。通过命令行、悬浮栏或菜单栏可反馈记忆程度 + +#### 复习卡片 + +通过命令行,或电脑端点击左侧边导航栏的卡片就可以复习。 +通过命令行,可集中(CRAM)复习/正常复习当前/所有笔记内的卡片(若有) + +集中复习(CRAM)模式,不更新复习数据。 + +#### 查看数据统计 + +通过命令行,`SR 查看数据` + +#### 查看复习信息 + +通过命令行,`SR Item Info`,可查看当前/所有笔记的复习信息 + +#### 算法Algorithms + +不同算法参数不同,请尽量使用一个算法,不要反复切换算法。 +默认的 Anki 优化算法、Anki 算法 : [Algorithms desc](./en/algorithms.md) +[Fsrs 算法](https://github.com/open-spaced-repetition/fsrs.js) + +#### 实验性功能 + +不建议使用!!! +不建议使用!!! +**不建议使用!!!** + +打开设置Logging-->调试信息,即可在命令行中使用以下功能(**日常使用不建议打开**)。 + +输出数据项Print Data: 在调试窗口中输出数据 + +重置数据Reset Data:删除所有复习数据; + +更新数据项Update Items: 更新数据中的无效数据为默认数据。 + +清除无效数据Prune Data: 清除数据中的无效数据,会导致数据项id修改,进而会影响Fsrs的optimizer无法有效处理部分数据。 + +_其它命令仅开发调试时使用,可不必关注。_ diff --git a/manifest.json b/manifest.json index 4c90e40e..b6761c53 100644 --- a/manifest.json +++ b/manifest.json @@ -1,11 +1,12 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.10.1.11", + "version": "1.10.5.1", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", "authorUrl": "https://github.com/Newdea", + "helpUrl": "https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/blob/dev-master/docs/README_ZH.md", "isDesktopOnly": false, "fundingUrl": { "支付宝Alipay": "https://github.com/Newdea/newdea/blob/main/.github/funding/QR_alipay.png", diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7959ba11..00000000 --- a/package-lock.json +++ /dev/null @@ -1,15113 +0,0 @@ -{ - "name": "obsidian-spaced-repetition", - "version": "1.10.1.11", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "obsidian-spaced-repetition", - "version": "1.10.1.11", - "license": "MIT", - "dependencies": { - "chart.js": "^4.3.3", - "pagerank.js": "^1.0.2" - }, - "devDependencies": { - "@popperjs/core": "^2.11.6", - "@types/jest": "^29.5.3", - "@types/node": "^20.4.10", - "@types/vhtml": "^2.2.4", - "@typescript-eslint/eslint-plugin": "^6.3.0", - "@typescript-eslint/parser": "^6.3.0", - "@wdio/cli": "^8.14.4", - "@wdio/local-runner": "^8.14.3", - "@wdio/mocha-framework": "^8.14.0", - "@wdio/selenium-standalone-service": "^8.14.0", - "@wdio/spec-reporter": "^8.14.0", - "auto-changelog": "^2.4.0", - "builtin-modules": "^3.3.0", - "chai": "^4.3.7", - "deepcopy": "^2.1.0", - "esbuild": "~0.19.1", - "eslint": "^8.47.0", - "fsrs.js": "^1.1.0", - "jest": "^29.6.2", - "jest-environment-jsdom": "^29.6.2", - "jest-expect-message": "^1.1.3", - "moment": "^2.29.4", - "obsidian": "^1.4.0", - "prettier": "^3.0.1", - "ts-jest": "^29.1.1", - "tslib": "2.6.1", - "typescript": "5.1.6", - "vhtml": "^2.2.0", - "wdio-chromedriver-service": "^8.1.1" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@assemblyscript/loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true - }, - "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.10", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/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/code-frame/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/code-frame/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/code-frame/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/code-frame/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/code-frame/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/code-frame/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/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", - "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/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/@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.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.21.0", - "@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/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "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/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "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/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-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-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.0.tgz", - "integrity": "sha512-eD/JQ21IG2i1FraJnTMbUarAUkA7G988ofehG5MDCRXaUU91rEBJuCeSoou2Sk1y4RbLYXzqEg1QLwEmRU4qcQ==", - "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.0", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "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-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.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "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/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.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "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.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz", - "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.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-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "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-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "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-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.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-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-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-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.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.0.tgz", - "integrity": "sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@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.0", - "@babel/types": "^7.21.0", - "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.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.0.tgz", - "integrity": "sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==", - "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/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@codemirror/state": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.0.tgz", - "integrity": "sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA==", - "dev": true, - "peer": true - }, - "node_modules/@codemirror/view": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.9.1.tgz", - "integrity": "sha512-bzfSjJn9dAADVpabLKWKNmMG4ibyTV2e3eOGowjElNPTdTkSbi6ixPYHm2u0ADcETfKsi2/R84Rkmi91dH9yEg==", - "dev": true, - "peer": true, - "dependencies": { - "@codemirror/state": "^6.1.4", - "style-mod": "^4.0.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", - "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", - "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", - "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", - "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", - "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", - "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", - "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", - "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", - "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", - "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", - "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", - "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", - "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", - "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", - "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", - "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", - "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", - "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", - "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", - "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", - "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", - "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", - "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.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "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/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "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/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/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/@isaacs/cliui/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/@isaacs/cliui/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/@isaacs/cliui/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/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", - "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", - "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.6.2", - "@jest/reporters": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-resolve-dependencies": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "jest-watcher": "^29.6.2", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", - "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "jest-mock": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", - "dev": true, - "dependencies": { - "expect": "^29.6.2", - "jest-snapshot": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", - "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.4.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", - "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.1", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", - "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/types": "^29.6.1", - "jest-mock": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", - "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", - "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", - "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", - "dev": true, - "dependencies": { - "@jest/console": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", - "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.6.2", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", - "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.1", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "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/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/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kurkle/color": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", - "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" - }, - "node_modules/@ljharb/through": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.9.tgz", - "integrity": "sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "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/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.3.0.tgz", - "integrity": "sha512-an3QdbNPkuU6qpxpbssxAbjRLJcF+eP4L8UqIY3+6n0sbaVxw5pz7PiCLy9g32XEZuoamUlV5ZQPnA6FxvkIHA==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "http-proxy-agent": "5.0.0", - "https-proxy-agent": "5.0.1", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@puppeteer/browsers/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, - "peer": 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/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/codemirror": { - "version": "5.60.8", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", - "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", - "dev": true, - "dependencies": { - "@types/tern": "*" - } - }, - "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/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.3", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", - "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", - "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==", - "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/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/tern": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", - "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", - "dev": true - }, - "node_modules/@types/vhtml": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@types/vhtml/-/vhtml-2.2.4.tgz", - "integrity": "sha512-H7/C7RZuaoc45JRPKNTsyVwgCMNY9u20QKs1fz4pKKjwpnQe5Jo+YhFq5UQI+h5orsHg+3OZ2tJlUkxkIHUa2w==", - "dev": true - }, - "node_modules/@types/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", - "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", - "dev": true - }, - "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.3.0.tgz", - "integrity": "sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/type-utils": "6.3.0", - "@typescript-eslint/utils": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.3.0.tgz", - "integrity": "sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/typescript-estree": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", - "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.3.0.tgz", - "integrity": "sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.3.0", - "@typescript-eslint/utils": "6.3.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", - "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", - "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.3.0.tgz", - "integrity": "sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/typescript-estree": "6.3.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", - "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.3.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@wdio/cli": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.14.6.tgz", - "integrity": "sha512-Uzc0wyoDo5sWwBKEy20pIOvr+D8RbDQ69WBAiPBDdQZIeCZoAfyXXLsdAcC0xbwpBgsW3DIb37Ww5JXrAS/ZFg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.1", - "@wdio/config": "8.14.6", - "@wdio/globals": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "async-exit-hook": "^2.0.1", - "chalk": "^5.2.0", - "chokidar": "^3.5.3", - "cli-spinners": "^2.9.0", - "dotenv": "^16.3.1", - "ejs": "^3.1.9", - "execa": "^7.1.1", - "import-meta-resolve": "^3.0.0", - "inquirer": "9.2.9", - "lodash.flattendeep": "^4.4.0", - "lodash.pickby": "^4.6.0", - "lodash.union": "^4.6.0", - "read-pkg-up": "10.0.0", - "recursive-readdir": "^2.2.3", - "webdriverio": "8.14.6", - "yargs": "^17.7.2", - "yarn-install": "^1.0.0" - }, - "bin": { - "wdio": "bin/wdio.js" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cli/node_modules/@puppeteer/browsers": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.6.0.tgz", - "integrity": "sha512-R2ib8j329427jtKB/qlz0MJbwfJE/6I8ocJLiajsRqJ2PPI8DbjiNzC3lQZeISXEcjOBVhbG2RafN8SlHdcT+A==", - "dev": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - } - }, - "node_modules/@wdio/cli/node_modules/@puppeteer/browsers/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/@wdio/cli/node_modules/@puppeteer/browsers/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/@wdio/cli/node_modules/@puppeteer/browsers/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/@wdio/cli/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@wdio/cli/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@wdio/cli/node_modules/@wdio/config": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.14.6.tgz", - "integrity": "sha512-yftLs+dNpTRdGPiS6Gk3Vt6YLnTd2rly4eOPTTBuuvp6akNl8z7DwoERfWjye72gnkwyulD6/PeHstuFGYTx4g==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^3.0.0", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cli/node_modules/@wdio/protocols": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.14.6.tgz", - "integrity": "sha512-KM2taEMUDEt1of0Na/6kIv/aNzX0pmr0etpKRci4QrWPQ1O11dXxWjkatFILQz6qOVKvQ0v+vkTPQRUllmH+uQ==", - "dev": true - }, - "node_modules/@wdio/cli/node_modules/@wdio/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.14.0.tgz", - "integrity": "sha512-Bhk3+3Sj47nnGwWjRMYSIp7pUFV/kOQ3o6ycwR4dKtUJpdMYLuQccWJNAp1AfM3g2mVZ07FindBgNkV5bED5zg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cli/node_modules/@wdio/utils": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.14.0.tgz", - "integrity": "sha512-T7Vh4exPsjm8QtxpLbOmb7MeZVOQSFjfTncc+5eEuoYlpbJeJOcp1DSfIoTeoU9ibYToIyWEfW3MSvlDeG5JrA==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "import-meta-resolve": "^3.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cli/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/@wdio/cli/node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@wdio/cli/node_modules/cacheable-request": { - "version": "10.2.13", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", - "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@wdio/cli/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/@wdio/cli/node_modules/chrome-launcher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.0.0.tgz", - "integrity": "sha512-74IMFVfgni/bQ4GotUNJpH2vDR+Sh9cXNPVhPXiedeiB0+5j7/8i8LAqS7WlyNSKqtxJ/CgbOpBDPLkzqDVhlw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^2.0.1" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@wdio/cli/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/@wdio/cli/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/devtools": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.14.6.tgz", - "integrity": "sha512-coXhj23bD7wqkpvHh8Cs+uMZK5w5AMWQudvUEIhGlAQ/WWju0knyy618LWEr4XDphP0EAgamvlx51P9JwE+23Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "chrome-launcher": "^1.0.0", - "edge-paths": "^3.0.5", - "import-meta-resolve": "^3.0.0", - "puppeteer-core": "20.3.0", - "query-selector-shadow-dom": "^1.0.0", - "ua-parser-js": "^1.0.1", - "uuid": "^9.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cli/node_modules/devtools-protocol": { - "version": "0.0.1170846", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1170846.tgz", - "integrity": "sha512-GFZiHgvL4JW7+8hIMQgwYNUaIRRCsqfXd11ZbOTdu2VzDeu0Le4l1c3u4FFRWCSvMg82OFip9k/sYyz4M/PJIA==", - "dev": true - }, - "node_modules/@wdio/cli/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/cli/node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/@wdio/cli/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/@wdio/cli/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/lighthouse-logger": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", - "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", - "dev": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/@wdio/cli/node_modules/lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wdio/cli/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/cli/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/@wdio/cli/node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/@wdio/cli/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/parse-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.0.0.tgz", - "integrity": "sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/read-pkg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.0.0.tgz", - "integrity": "sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^5.0.0", - "parse-json": "^7.0.0", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/read-pkg-up": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.0.0.tgz", - "integrity": "sha512-jgmKiS//w2Zs+YbX039CorlkOp8FIVbSAN8r8GJHDsGlmNPXo+VeHkqAwCiQVTTx5/LwLZTcEw59z3DvcLbr0g==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^8.0.0", - "type-fest": "^3.12.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/serialize-error": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.1.tgz", - "integrity": "sha512-B5yw3/Lg+Daspbs0f+iO3Qim0+lALnaLS8aZUAy8Y0tO92tkOoMEuwtKo4jpZ5XO16CTwMi4tYN8cZQI3QF2Qw==", - "dev": true, - "dependencies": { - "type-fest": "^2.12.2" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/serialize-error/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dev": true, - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/@wdio/cli/node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/@wdio/cli/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/cli/node_modules/webdriver": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.14.6.tgz", - "integrity": "sha512-IJxpV10cmYhl9ZlDyFGJDNBenzDwwo1HFN70PqT5UpyhFQ76VflgHAHCuFNs/z5AyFqjNojB9ERBuy6Fsxkn9A==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "^1.4.6", - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "chrome-launcher": "^1.0.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.2", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "got": "^ 12.6.1", - "ky": "^0.33.0", - "safaridriver": "^0.1.0", - "wait-port": "^1.0.4", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cli/node_modules/webdriverio": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.14.6.tgz", - "integrity": "sha512-MqT10xuVw4rHsuUmWcwk/AAzlnSQ53L8vpnce6tis6H9mxt3uFwR/UnfYW9LeUbXwPyZR7wicfsV0wVjaTQYCQ==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/repl": "8.10.1", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "archiver": "^5.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1170846", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^3.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.14.6" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "node_modules/@wdio/cli/node_modules/webdriverio/node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", - "dev": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/cli/node_modules/webdriverio/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/@wdio/cli/node_modules/webdriverio/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/@wdio/cli/node_modules/webdriverio/node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/cli/node_modules/webdriverio/node_modules/puppeteer-core/node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dev": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/@wdio/cli/node_modules/webdriverio/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true - }, - "node_modules/@wdio/cli/node_modules/webdriverio/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/@wdio/cli/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/config": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.11.0.tgz", - "integrity": "sha512-nBQXsXbPCjddtI/3rAK5yFs3eD3f0T3lZMivweTkLLR7GKBxGjiFoBjXtfqUrHJYa+2uwfXrwxo6y+dA6fVbuw==", - "dev": true, - "peer": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.10.4", - "@wdio/utils": "8.11.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^3.0.0", - "read-pkg-up": "^9.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/config/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, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/config/node_modules/glob": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.0.tgz", - "integrity": "sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg==", - "dev": true, - "peer": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/config/node_modules/minimatch": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz", - "integrity": "sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/globals": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.14.6.tgz", - "integrity": "sha512-G9ZisTdbC03bLKZHYysn82lcZydLAsz+L1RT3OvgWrw7ANVsHjE/a40mCRlR+RBcesAA5IsVi9zQ5RUTLfqraw==", - "dev": true, - "engines": { - "node": "^16.13 || >=18" - }, - "optionalDependencies": { - "expect-webdriverio": "^4.2.5", - "webdriverio": "8.14.6" - } - }, - "node_modules/@wdio/globals/node_modules/@puppeteer/browsers": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.6.0.tgz", - "integrity": "sha512-R2ib8j329427jtKB/qlz0MJbwfJE/6I8ocJLiajsRqJ2PPI8DbjiNzC3lQZeISXEcjOBVhbG2RafN8SlHdcT+A==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - } - }, - "node_modules/@wdio/globals/node_modules/@puppeteer/browsers/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, - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@wdio/globals/node_modules/@puppeteer/browsers/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, - "optional": true - }, - "node_modules/@wdio/globals/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@wdio/globals/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "optional": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@wdio/globals/node_modules/@wdio/config": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.14.6.tgz", - "integrity": "sha512-yftLs+dNpTRdGPiS6Gk3Vt6YLnTd2rly4eOPTTBuuvp6akNl8z7DwoERfWjye72gnkwyulD6/PeHstuFGYTx4g==", - "dev": true, - "optional": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^3.0.0", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/@wdio/protocols": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.14.6.tgz", - "integrity": "sha512-KM2taEMUDEt1of0Na/6kIv/aNzX0pmr0etpKRci4QrWPQ1O11dXxWjkatFILQz6qOVKvQ0v+vkTPQRUllmH+uQ==", - "dev": true, - "optional": true - }, - "node_modules/@wdio/globals/node_modules/@wdio/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.14.0.tgz", - "integrity": "sha512-Bhk3+3Sj47nnGwWjRMYSIp7pUFV/kOQ3o6ycwR4dKtUJpdMYLuQccWJNAp1AfM3g2mVZ07FindBgNkV5bED5zg==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/@wdio/utils": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.14.0.tgz", - "integrity": "sha512-T7Vh4exPsjm8QtxpLbOmb7MeZVOQSFjfTncc+5eEuoYlpbJeJOcp1DSfIoTeoU9ibYToIyWEfW3MSvlDeG5JrA==", - "dev": true, - "optional": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "import-meta-resolve": "^3.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/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, - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@wdio/globals/node_modules/cacheable-request": { - "version": "10.2.13", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", - "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@wdio/globals/node_modules/chrome-launcher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.0.0.tgz", - "integrity": "sha512-74IMFVfgni/bQ4GotUNJpH2vDR+Sh9cXNPVhPXiedeiB0+5j7/8i8LAqS7WlyNSKqtxJ/CgbOpBDPLkzqDVhlw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^2.0.1" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@wdio/globals/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "optional": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/@wdio/globals/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/devtools": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.14.6.tgz", - "integrity": "sha512-coXhj23bD7wqkpvHh8Cs+uMZK5w5AMWQudvUEIhGlAQ/WWju0knyy618LWEr4XDphP0EAgamvlx51P9JwE+23Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "chrome-launcher": "^1.0.0", - "edge-paths": "^3.0.5", - "import-meta-resolve": "^3.0.0", - "puppeteer-core": "20.3.0", - "query-selector-shadow-dom": "^1.0.0", - "ua-parser-js": "^1.0.1", - "uuid": "^9.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/devtools-protocol": { - "version": "0.0.1170846", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1170846.tgz", - "integrity": "sha512-GFZiHgvL4JW7+8hIMQgwYNUaIRRCsqfXd11ZbOTdu2VzDeu0Le4l1c3u4FFRWCSvMg82OFip9k/sYyz4M/PJIA==", - "dev": true, - "optional": true - }, - "node_modules/@wdio/globals/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "optional": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", - "dev": true, - "optional": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/globals/node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "optional": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/@wdio/globals/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "optional": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/@wdio/globals/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "optional": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/lighthouse-logger": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", - "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/@wdio/globals/node_modules/lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "optional": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wdio/globals/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "optional": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/globals/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "optional": true - }, - "node_modules/@wdio/globals/node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "optional": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/@wdio/globals/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "optional": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "optional": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/parse-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.0.0.tgz", - "integrity": "sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/read-pkg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.0.0.tgz", - "integrity": "sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^5.0.0", - "parse-json": "^7.0.0", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/read-pkg-up": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.0.0.tgz", - "integrity": "sha512-jgmKiS//w2Zs+YbX039CorlkOp8FIVbSAN8r8GJHDsGlmNPXo+VeHkqAwCiQVTTx5/LwLZTcEw59z3DvcLbr0g==", - "dev": true, - "optional": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^8.0.0", - "type-fest": "^3.12.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "optional": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/serialize-error": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.1.tgz", - "integrity": "sha512-B5yw3/Lg+Daspbs0f+iO3Qim0+lALnaLS8aZUAy8Y0tO92tkOoMEuwtKo4jpZ5XO16CTwMi4tYN8cZQI3QF2Qw==", - "dev": true, - "optional": true, - "dependencies": { - "type-fest": "^2.12.2" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/serialize-error/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dev": true, - "optional": true, - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/@wdio/globals/node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dev": true, - "optional": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/@wdio/globals/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/webdriver": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.14.6.tgz", - "integrity": "sha512-IJxpV10cmYhl9ZlDyFGJDNBenzDwwo1HFN70PqT5UpyhFQ76VflgHAHCuFNs/z5AyFqjNojB9ERBuy6Fsxkn9A==", - "dev": true, - "optional": true, - "dependencies": { - "@puppeteer/browsers": "^1.4.6", - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "chrome-launcher": "^1.0.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.2", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "got": "^ 12.6.1", - "ky": "^0.33.0", - "safaridriver": "^0.1.0", - "wait-port": "^1.0.4", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/webdriverio": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.14.6.tgz", - "integrity": "sha512-MqT10xuVw4rHsuUmWcwk/AAzlnSQ53L8vpnce6tis6H9mxt3uFwR/UnfYW9LeUbXwPyZR7wicfsV0wVjaTQYCQ==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/repl": "8.10.1", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "archiver": "^5.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1170846", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^3.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.14.6" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "node_modules/@wdio/globals/node_modules/webdriverio/node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/globals/node_modules/webdriverio/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, - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@wdio/globals/node_modules/webdriverio/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, - "optional": true - }, - "node_modules/@wdio/globals/node_modules/webdriverio/node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "optional": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/globals/node_modules/webdriverio/node_modules/puppeteer-core/node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dev": true, - "optional": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/@wdio/globals/node_modules/webdriverio/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true, - "optional": true - }, - "node_modules/@wdio/globals/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/globals/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, - "optional": 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/@wdio/globals/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/local-runner": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.14.6.tgz", - "integrity": "sha512-oOumTagKoXDAHDo+Z+yXDrDW7jNBKaXuJrMx+D25GhRhRQ7aCoHR7B4eagTScUlE2qOw+JKnwDJR0TvHQAKywQ==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/logger": "8.11.0", - "@wdio/repl": "8.10.1", - "@wdio/runner": "8.14.6", - "@wdio/types": "8.14.0", - "async-exit-hook": "^2.0.1", - "split2": "^4.1.0", - "stream-buffers": "^3.0.2" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/local-runner/node_modules/@wdio/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.14.0.tgz", - "integrity": "sha512-Bhk3+3Sj47nnGwWjRMYSIp7pUFV/kOQ3o6ycwR4dKtUJpdMYLuQccWJNAp1AfM3g2mVZ07FindBgNkV5bED5zg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/logger": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.11.0.tgz", - "integrity": "sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==", - "dev": true, - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/logger/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/@wdio/logger/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/@wdio/logger/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@wdio/mocha-framework": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.14.0.tgz", - "integrity": "sha512-j2ngUFGF0T+Zax3Tops6TxyWNy+OxvMRsloZaE+wIMrAMnp6ocGC+W4si2cW5ZuZlvaoM6j406XZOmxW//pUCA==", - "dev": true, - "dependencies": { - "@types/mocha": "^10.0.0", - "@types/node": "^20.1.0", - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "mocha": "^10.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/mocha-framework/node_modules/@wdio/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.14.0.tgz", - "integrity": "sha512-Bhk3+3Sj47nnGwWjRMYSIp7pUFV/kOQ3o6ycwR4dKtUJpdMYLuQccWJNAp1AfM3g2mVZ07FindBgNkV5bED5zg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/mocha-framework/node_modules/@wdio/utils": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.14.0.tgz", - "integrity": "sha512-T7Vh4exPsjm8QtxpLbOmb7MeZVOQSFjfTncc+5eEuoYlpbJeJOcp1DSfIoTeoU9ibYToIyWEfW3MSvlDeG5JrA==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "import-meta-resolve": "^3.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/protocols": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.11.0.tgz", - "integrity": "sha512-eXTMYt/XoaX53H/Q2qmsn1uWthIC5aSTGtX9YyXD/AkagG2hXeX3lLmzNWBaSIvKR+vWXRYbg3Y/7IvL2s25Wg==", - "dev": true, - "peer": true - }, - "node_modules/@wdio/repl": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.10.1.tgz", - "integrity": "sha512-VZ1WFHTNKjR8Ga97TtV2SZM6fvRjWbYI2i/f4pJB4PtusorKvONAMJf2LQcUBIyzbVobqr7KSrcjmSwRolI+yw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/reporter": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.14.0.tgz", - "integrity": "sha512-xzsHRlnb35vFB/zs04Zsuh2Y24DRDuLWTYA96PxDNqMIjhkqJbERTJWSlRwiBhyhz6N8NrwAQfghyh93d554eg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "diff": "^5.0.0", - "object-inspect": "^1.12.0", - "supports-color": "9.4.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/reporter/node_modules/@wdio/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.14.0.tgz", - "integrity": "sha512-Bhk3+3Sj47nnGwWjRMYSIp7pUFV/kOQ3o6ycwR4dKtUJpdMYLuQccWJNAp1AfM3g2mVZ07FindBgNkV5bED5zg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/reporter/node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@wdio/runner": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.14.6.tgz", - "integrity": "sha512-5NTnEQH+QLwJ9YX91IJKlF+k6v/1x0+FwKnC3BsK8OQHMY1bnbF7B2gqa7/wkJ0WuO+jAGqr8kQoSBorgmNL3w==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.14.6", - "@wdio/globals": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "deepmerge-ts": "^5.0.0", - "expect-webdriverio": "^4.2.5", - "gaze": "^1.1.2", - "webdriver": "8.14.6", - "webdriverio": "8.14.6" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/@puppeteer/browsers": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.6.0.tgz", - "integrity": "sha512-R2ib8j329427jtKB/qlz0MJbwfJE/6I8ocJLiajsRqJ2PPI8DbjiNzC3lQZeISXEcjOBVhbG2RafN8SlHdcT+A==", - "dev": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - } - }, - "node_modules/@wdio/runner/node_modules/@puppeteer/browsers/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/@wdio/runner/node_modules/@puppeteer/browsers/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/@wdio/runner/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@wdio/runner/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@wdio/runner/node_modules/@wdio/config": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.14.6.tgz", - "integrity": "sha512-yftLs+dNpTRdGPiS6Gk3Vt6YLnTd2rly4eOPTTBuuvp6akNl8z7DwoERfWjye72gnkwyulD6/PeHstuFGYTx4g==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^3.0.0", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/@wdio/protocols": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.14.6.tgz", - "integrity": "sha512-KM2taEMUDEt1of0Na/6kIv/aNzX0pmr0etpKRci4QrWPQ1O11dXxWjkatFILQz6qOVKvQ0v+vkTPQRUllmH+uQ==", - "dev": true - }, - "node_modules/@wdio/runner/node_modules/@wdio/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.14.0.tgz", - "integrity": "sha512-Bhk3+3Sj47nnGwWjRMYSIp7pUFV/kOQ3o6ycwR4dKtUJpdMYLuQccWJNAp1AfM3g2mVZ07FindBgNkV5bED5zg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/@wdio/utils": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.14.0.tgz", - "integrity": "sha512-T7Vh4exPsjm8QtxpLbOmb7MeZVOQSFjfTncc+5eEuoYlpbJeJOcp1DSfIoTeoU9ibYToIyWEfW3MSvlDeG5JrA==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "import-meta-resolve": "^3.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/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/@wdio/runner/node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@wdio/runner/node_modules/cacheable-request": { - "version": "10.2.13", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", - "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@wdio/runner/node_modules/chrome-launcher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.0.0.tgz", - "integrity": "sha512-74IMFVfgni/bQ4GotUNJpH2vDR+Sh9cXNPVhPXiedeiB0+5j7/8i8LAqS7WlyNSKqtxJ/CgbOpBDPLkzqDVhlw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^2.0.1" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@wdio/runner/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/@wdio/runner/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/devtools": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.14.6.tgz", - "integrity": "sha512-coXhj23bD7wqkpvHh8Cs+uMZK5w5AMWQudvUEIhGlAQ/WWju0knyy618LWEr4XDphP0EAgamvlx51P9JwE+23Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "chrome-launcher": "^1.0.0", - "edge-paths": "^3.0.5", - "import-meta-resolve": "^3.0.0", - "puppeteer-core": "20.3.0", - "query-selector-shadow-dom": "^1.0.0", - "ua-parser-js": "^1.0.1", - "uuid": "^9.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/devtools-protocol": { - "version": "0.0.1170846", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1170846.tgz", - "integrity": "sha512-GFZiHgvL4JW7+8hIMQgwYNUaIRRCsqfXd11ZbOTdu2VzDeu0Le4l1c3u4FFRWCSvMg82OFip9k/sYyz4M/PJIA==", - "dev": true - }, - "node_modules/@wdio/runner/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/runner/node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/@wdio/runner/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/@wdio/runner/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/lighthouse-logger": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", - "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", - "dev": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/@wdio/runner/node_modules/lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wdio/runner/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/runner/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/@wdio/runner/node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/@wdio/runner/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/parse-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.0.0.tgz", - "integrity": "sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/read-pkg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.0.0.tgz", - "integrity": "sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^5.0.0", - "parse-json": "^7.0.0", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/read-pkg-up": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.0.0.tgz", - "integrity": "sha512-jgmKiS//w2Zs+YbX039CorlkOp8FIVbSAN8r8GJHDsGlmNPXo+VeHkqAwCiQVTTx5/LwLZTcEw59z3DvcLbr0g==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^8.0.0", - "type-fest": "^3.12.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/serialize-error": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.1.tgz", - "integrity": "sha512-B5yw3/Lg+Daspbs0f+iO3Qim0+lALnaLS8aZUAy8Y0tO92tkOoMEuwtKo4jpZ5XO16CTwMi4tYN8cZQI3QF2Qw==", - "dev": true, - "dependencies": { - "type-fest": "^2.12.2" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/serialize-error/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dev": true, - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/@wdio/runner/node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/@wdio/runner/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/webdriver": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.14.6.tgz", - "integrity": "sha512-IJxpV10cmYhl9ZlDyFGJDNBenzDwwo1HFN70PqT5UpyhFQ76VflgHAHCuFNs/z5AyFqjNojB9ERBuy6Fsxkn9A==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "^1.4.6", - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "chrome-launcher": "^1.0.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.2", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "got": "^ 12.6.1", - "ky": "^0.33.0", - "safaridriver": "^0.1.0", - "wait-port": "^1.0.4", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/webdriverio": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.14.6.tgz", - "integrity": "sha512-MqT10xuVw4rHsuUmWcwk/AAzlnSQ53L8vpnce6tis6H9mxt3uFwR/UnfYW9LeUbXwPyZR7wicfsV0wVjaTQYCQ==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/repl": "8.10.1", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "archiver": "^5.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1170846", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^3.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.14.6" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "node_modules/@wdio/runner/node_modules/webdriverio/node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", - "dev": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/runner/node_modules/webdriverio/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/@wdio/runner/node_modules/webdriverio/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/@wdio/runner/node_modules/webdriverio/node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/runner/node_modules/webdriverio/node_modules/puppeteer-core/node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dev": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/@wdio/runner/node_modules/webdriverio/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true - }, - "node_modules/@wdio/runner/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/runner/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/@wdio/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/selenium-standalone-service": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-8.14.0.tgz", - "integrity": "sha512-lCtqZpKEGDU6WYcw0/wWMR0urgY6NB5x0geyR9xF2GcjzA5KKYWh4qgJPtG5fNu3NYecfY6/09aFe80oKB++rg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.14.0", - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "selenium-standalone": "^8.2.1" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/config": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.14.0.tgz", - "integrity": "sha512-p1bXsoljGuLrw8I2ZKbh6SkmBzyzDZykpHDpCsCsNASVQSVsL7e0PMykLCfKFWq3lQsg7aOX9DPYOtFlOykz/w==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^3.0.0", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.14.0.tgz", - "integrity": "sha512-Bhk3+3Sj47nnGwWjRMYSIp7pUFV/kOQ3o6ycwR4dKtUJpdMYLuQccWJNAp1AfM3g2mVZ07FindBgNkV5bED5zg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/utils": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.14.0.tgz", - "integrity": "sha512-T7Vh4exPsjm8QtxpLbOmb7MeZVOQSFjfTncc+5eEuoYlpbJeJOcp1DSfIoTeoU9ibYToIyWEfW3MSvlDeG5JrA==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "import-meta-resolve": "^3.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/selenium-standalone-service/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/@wdio/selenium-standalone-service/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/parse-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.0.0.tgz", - "integrity": "sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/read-pkg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.0.0.tgz", - "integrity": "sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^5.0.0", - "parse-json": "^7.0.0", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/read-pkg-up": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.0.0.tgz", - "integrity": "sha512-jgmKiS//w2Zs+YbX039CorlkOp8FIVbSAN8r8GJHDsGlmNPXo+VeHkqAwCiQVTTx5/LwLZTcEw59z3DvcLbr0g==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^8.0.0", - "type-fest": "^3.12.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/spec-reporter": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.14.0.tgz", - "integrity": "sha512-LmDXAcA1Xy5Yd+0lxhsULfZwr0hqxjjwLO4Uys6qUyGGSUJpL8psF26sO8kFYLHBpDN0DNxzvNm7iIvPAtE1dw==", - "dev": true, - "dependencies": { - "@wdio/reporter": "8.14.0", - "@wdio/types": "8.14.0", - "chalk": "^5.1.2", - "easy-table": "^1.2.0", - "pretty-ms": "^7.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/spec-reporter/node_modules/@wdio/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.14.0.tgz", - "integrity": "sha512-Bhk3+3Sj47nnGwWjRMYSIp7pUFV/kOQ3o6ycwR4dKtUJpdMYLuQccWJNAp1AfM3g2mVZ07FindBgNkV5bED5zg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/spec-reporter/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/@wdio/types": { - "version": "8.10.4", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.10.4.tgz", - "integrity": "sha512-aLJ1QQW+hhALeRK3bvMLjIrlUVyhOs3Od+91pR4Z4pLwyeNG1bJZCJRD5bAJK/mm7CnFa0NsdixPS9jJxZcRrw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/utils": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.11.0.tgz", - "integrity": "sha512-XBl1zalk5UPu8QKZ7LZIA82Ad363fpNHZHP5uI5OxUFnk4ZPWgY9eCWpeD+4f9a0DS0w2Dro15E4PORNX84pIw==", - "dev": true, - "peer": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.10.4", - "import-meta-resolve": "^3.0.0", - "p-iteration": "^1.1.8" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "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/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "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/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/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/archiver": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", - "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", - "dev": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.3", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/archiver/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "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/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "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-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "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/auto-changelog": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.4.0.tgz", - "integrity": "sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==", - "dev": true, - "dependencies": { - "commander": "^7.2.0", - "handlebars": "^4.7.7", - "node-fetch": "^2.6.1", - "parse-github-url": "^1.0.2", - "semver": "^7.3.5" - }, - "bin": { - "auto-changelog": "src/index.js" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dev": true - }, - "node_modules/babel-jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", - "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.6.2", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.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-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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/basic-ftp": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", - "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dev": true, - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, - "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/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "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/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "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/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true, - "engines": { - "node": ">=0.2.0" - } - }, - "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/cac": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/cac/-/cac-3.0.4.tgz", - "integrity": "sha512-hq4rxE3NT5PlaEiVV39Z45d6MoFcQZG5dsgJqtAUeOz3408LEQAElToDkf9i5IYSCOmK0If/81dLg7nKxqPR0w==", - "dev": true, - "dependencies": { - "camelcase-keys": "^3.0.0", - "chalk": "^1.1.3", - "indent-string": "^3.0.0", - "minimist": "^1.2.0", - "read-pkg-up": "^1.0.1", - "suffix": "^0.1.0", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cac/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/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/cac/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/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/cac/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/cac/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", - "dev": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", - "dev": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/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/cac/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/camaro": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camaro/-/camaro-6.2.0.tgz", - "integrity": "sha512-81zTKgZb2LnkZKtLbIqLqBzQ6stWSlWC3I/lZd5u4NJVljDgMcsZqn9zZ+Yij/yNyiVpko0EhOKdYa6YAbOWrA==", - "dev": true, - "dependencies": { - "piscina": "^3.2.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "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-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-3.0.0.tgz", - "integrity": "sha512-U4E6A6aFyYnNW+tDt5/yIUKQURKXe3WMFPfX4FxrQFcwZ/R08AUk1xWcUtlr7oq6CV07Ji+aa69V2g7BSpblnQ==", - "dev": true, - "dependencies": { - "camelcase": "^3.0.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001457", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz", - "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, - "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/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chart.js": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.3.tgz", - "integrity": "sha512-aTk7pBw+x6sQYhon/NR3ikfUJuym/LdgpTlgZRe2PaEhjUMKBKyNaFCMVRAyTEWYFNO7qRu7iQVqOw/OqzxZxQ==", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=7" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "peer": true - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chromium-bidi": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.9.tgz", - "integrity": "sha512-u3DC6XwgLCA9QJ5ak1voPslCmacQdulZNCPsI3qNXxSnEcZS7DFIbww+5RM2bznMEje7cc0oydavRLRvOIZtHw==", - "dev": true, - "peer": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "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/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "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-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "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/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/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "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/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": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/compress-commons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", - "dev": true, - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "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/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", - "dev": true, - "peer": true, - "dependencies": { - "node-fetch": "^2.6.11" - } - }, - "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/css-shorthand-properties": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz", - "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==", - "dev": true - }, - "node_modules/css-value": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", - "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==", - "dev": true - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/data-uri-to-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", - "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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/deepcopy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deepcopy/-/deepcopy-2.1.0.tgz", - "integrity": "sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.8" - } - }, - "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/deepmerge-ts": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz", - "integrity": "sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==", - "dev": true, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dev": true, - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "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/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/devtools": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.11.0.tgz", - "integrity": "sha512-j1wXFQyjswJ6doAV1+h4Bxl8+Oeb8SMpWTpBVa0DurGsxfft8sU2OhDlMo5tx/zbX82X5sGyJDMnKHqBJ2XRvQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.11.0", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.11.0", - "@wdio/types": "8.10.4", - "@wdio/utils": "8.11.0", - "chrome-launcher": "^0.15.0", - "edge-paths": "^3.0.5", - "import-meta-resolve": "^3.0.0", - "puppeteer-core": "20.3.0", - "query-selector-shadow-dom": "^1.0.0", - "ua-parser-js": "^1.0.1", - "uuid": "^9.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.1152884", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1152884.tgz", - "integrity": "sha512-9eP6OmCoU1cWArpXLuzyZQcBJ2PkINOh8Nwx8W5i8u6NDigDE5/mPlLLBAfshwn5YVvIz6ZQ9jbs0PZvKGccdQ==", - "dev": true, - "peer": true - }, - "node_modules/devtools/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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/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/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "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/easy-table": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.2.0.tgz", - "integrity": "sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "optionalDependencies": { - "wcwidth": "^1.0.1" - } - }, - "node_modules/edge-paths": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", - "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", - "dev": true, - "dependencies": { - "@types/which": "^2.0.1", - "which": "^2.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/shirshak55" - } - }, - "node_modules/edgedriver": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.3.3.tgz", - "integrity": "sha512-Gfb0gzBhpiXaVqLsIkua3RItwfiEGHVt9lXYG4bySoSluDtqIvwFBnMAEHKBS+j16ebEJSQh475e20X2lfzgjg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@wdio/logger": "^8.11.0", - "camaro": "^6.2.0", - "decamelize": "^6.0.0", - "edge-paths": "^3.0.5", - "node-fetch": "^3.3.2", - "unzipper": "^0.10.14", - "which": "^3.0.1" - }, - "bin": { - "edgedriver": "bin/edgedriver.js" - } - }, - "node_modules/edgedriver/node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/edgedriver/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/edgedriver/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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.305", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.305.tgz", - "integrity": "sha512-WETy6tG0CT5gm1O+xCbyapWNsCcmIvrn4NHViIGYo2AT8FV2qUCXdaB+WqYxSv/vS5mFqhBYnfZAAkVArjBmUg==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "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/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "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/esbuild": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", - "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.2", - "@esbuild/android-arm64": "0.19.2", - "@esbuild/android-x64": "0.19.2", - "@esbuild/darwin-arm64": "0.19.2", - "@esbuild/darwin-x64": "0.19.2", - "@esbuild/freebsd-arm64": "0.19.2", - "@esbuild/freebsd-x64": "0.19.2", - "@esbuild/linux-arm": "0.19.2", - "@esbuild/linux-arm64": "0.19.2", - "@esbuild/linux-ia32": "0.19.2", - "@esbuild/linux-loong64": "0.19.2", - "@esbuild/linux-mips64el": "0.19.2", - "@esbuild/linux-ppc64": "0.19.2", - "@esbuild/linux-riscv64": "0.19.2", - "@esbuild/linux-s390x": "0.19.2", - "@esbuild/linux-x64": "0.19.2", - "@esbuild/netbsd-x64": "0.19.2", - "@esbuild/openbsd-x64": "0.19.2", - "@esbuild/sunos-x64": "0.19.2", - "@esbuild/win32-arm64": "0.19.2", - "@esbuild/win32-ia32": "0.19.2", - "@esbuild/win32-x64": "0.19.2" - } - }, - "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/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "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.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.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", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "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.3", - "strip-ansi": "^6.0.1", - "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-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "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-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "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/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/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/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/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter-asyncresource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "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/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.6.2", - "@types/node": "*", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect-webdriverio": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.2.7.tgz", - "integrity": "sha512-ulNspQoTct5/0OBfNSNzBKldSgoQxzmHBi/TLtrsLZY5QCZ7svD7Csdtm+YEW6IBg/v8MI7ibiMcpWY9cjcG6A==", - "dev": true, - "dependencies": { - "expect": "^29.6.1", - "jest-matcher-utils": "^29.6.1" - }, - "engines": { - "node": ">=16 || >=18 || >=20" - }, - "optionalDependencies": { - "@wdio/globals": "^8.13.1", - "webdriverio": "^8.13.1" - } - }, - "node_modules/expect-webdriverio/node_modules/@puppeteer/browsers": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.6.0.tgz", - "integrity": "sha512-R2ib8j329427jtKB/qlz0MJbwfJE/6I8ocJLiajsRqJ2PPI8DbjiNzC3lQZeISXEcjOBVhbG2RafN8SlHdcT+A==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - } - }, - "node_modules/expect-webdriverio/node_modules/@puppeteer/browsers/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, - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/expect-webdriverio/node_modules/@puppeteer/browsers/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, - "optional": true - }, - "node_modules/expect-webdriverio/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/expect-webdriverio/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "optional": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/expect-webdriverio/node_modules/@wdio/config": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.14.6.tgz", - "integrity": "sha512-yftLs+dNpTRdGPiS6Gk3Vt6YLnTd2rly4eOPTTBuuvp6akNl8z7DwoERfWjye72gnkwyulD6/PeHstuFGYTx4g==", - "dev": true, - "optional": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^3.0.0", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/expect-webdriverio/node_modules/@wdio/protocols": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.14.6.tgz", - "integrity": "sha512-KM2taEMUDEt1of0Na/6kIv/aNzX0pmr0etpKRci4QrWPQ1O11dXxWjkatFILQz6qOVKvQ0v+vkTPQRUllmH+uQ==", - "dev": true, - "optional": true - }, - "node_modules/expect-webdriverio/node_modules/@wdio/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.14.0.tgz", - "integrity": "sha512-Bhk3+3Sj47nnGwWjRMYSIp7pUFV/kOQ3o6ycwR4dKtUJpdMYLuQccWJNAp1AfM3g2mVZ07FindBgNkV5bED5zg==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/expect-webdriverio/node_modules/@wdio/utils": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.14.0.tgz", - "integrity": "sha512-T7Vh4exPsjm8QtxpLbOmb7MeZVOQSFjfTncc+5eEuoYlpbJeJOcp1DSfIoTeoU9ibYToIyWEfW3MSvlDeG5JrA==", - "dev": true, - "optional": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.14.0", - "import-meta-resolve": "^3.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/expect-webdriverio/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, - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/expect-webdriverio/node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/expect-webdriverio/node_modules/cacheable-request": { - "version": "10.2.13", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", - "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/expect-webdriverio/node_modules/chrome-launcher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.0.0.tgz", - "integrity": "sha512-74IMFVfgni/bQ4GotUNJpH2vDR+Sh9cXNPVhPXiedeiB0+5j7/8i8LAqS7WlyNSKqtxJ/CgbOpBDPLkzqDVhlw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^2.0.1" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/expect-webdriverio/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "optional": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/expect-webdriverio/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expect-webdriverio/node_modules/devtools": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.14.6.tgz", - "integrity": "sha512-coXhj23bD7wqkpvHh8Cs+uMZK5w5AMWQudvUEIhGlAQ/WWju0knyy618LWEr4XDphP0EAgamvlx51P9JwE+23Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "chrome-launcher": "^1.0.0", - "edge-paths": "^3.0.5", - "import-meta-resolve": "^3.0.0", - "puppeteer-core": "20.3.0", - "query-selector-shadow-dom": "^1.0.0", - "ua-parser-js": "^1.0.1", - "uuid": "^9.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/expect-webdriverio/node_modules/devtools-protocol": { - "version": "0.0.1170846", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1170846.tgz", - "integrity": "sha512-GFZiHgvL4JW7+8hIMQgwYNUaIRRCsqfXd11ZbOTdu2VzDeu0Le4l1c3u4FFRWCSvMg82OFip9k/sYyz4M/PJIA==", - "dev": true, - "optional": true - }, - "node_modules/expect-webdriverio/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "optional": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", - "dev": true, - "optional": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/expect-webdriverio/node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "optional": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/expect-webdriverio/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/expect-webdriverio/node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "optional": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/expect-webdriverio/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "optional": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/expect-webdriverio/node_modules/lighthouse-logger": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", - "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/expect-webdriverio/node_modules/lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/expect-webdriverio/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "optional": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/expect-webdriverio/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "optional": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/expect-webdriverio/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "optional": true - }, - "node_modules/expect-webdriverio/node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "optional": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/expect-webdriverio/node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/expect-webdriverio/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "optional": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "optional": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/parse-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.0.0.tgz", - "integrity": "sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/expect-webdriverio/node_modules/read-pkg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.0.0.tgz", - "integrity": "sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^5.0.0", - "parse-json": "^7.0.0", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/read-pkg-up": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.0.0.tgz", - "integrity": "sha512-jgmKiS//w2Zs+YbX039CorlkOp8FIVbSAN8r8GJHDsGlmNPXo+VeHkqAwCiQVTTx5/LwLZTcEw59z3DvcLbr0g==", - "dev": true, - "optional": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^8.0.0", - "type-fest": "^3.12.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "optional": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/serialize-error": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.1.tgz", - "integrity": "sha512-B5yw3/Lg+Daspbs0f+iO3Qim0+lALnaLS8aZUAy8Y0tO92tkOoMEuwtKo4jpZ5XO16CTwMi4tYN8cZQI3QF2Qw==", - "dev": true, - "optional": true, - "dependencies": { - "type-fest": "^2.12.2" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/serialize-error/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dev": true, - "optional": true, - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/expect-webdriverio/node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dev": true, - "optional": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/expect-webdriverio/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expect-webdriverio/node_modules/webdriver": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.14.6.tgz", - "integrity": "sha512-IJxpV10cmYhl9ZlDyFGJDNBenzDwwo1HFN70PqT5UpyhFQ76VflgHAHCuFNs/z5AyFqjNojB9ERBuy6Fsxkn9A==", - "dev": true, - "optional": true, - "dependencies": { - "@puppeteer/browsers": "^1.4.6", - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "chrome-launcher": "^1.0.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.2", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "got": "^ 12.6.1", - "ky": "^0.33.0", - "safaridriver": "^0.1.0", - "wait-port": "^1.0.4", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/expect-webdriverio/node_modules/webdriverio": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.14.6.tgz", - "integrity": "sha512-MqT10xuVw4rHsuUmWcwk/AAzlnSQ53L8vpnce6tis6H9mxt3uFwR/UnfYW9LeUbXwPyZR7wicfsV0wVjaTQYCQ==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.14.6", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/repl": "8.10.1", - "@wdio/types": "8.14.0", - "@wdio/utils": "8.14.0", - "archiver": "^5.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1170846", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^3.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.14.6" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "node_modules/expect-webdriverio/node_modules/webdriverio/node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/expect-webdriverio/node_modules/webdriverio/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, - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/expect-webdriverio/node_modules/webdriverio/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, - "optional": true - }, - "node_modules/expect-webdriverio/node_modules/webdriverio/node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "optional": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/expect-webdriverio/node_modules/webdriverio/node_modules/puppeteer-core/node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dev": true, - "optional": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/expect-webdriverio/node_modules/webdriverio/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true, - "optional": true - }, - "node_modules/expect-webdriverio/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/expect-webdriverio/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, - "optional": 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/expect-webdriverio/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-fifo": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.2.0.tgz", - "integrity": "sha512-NcvQXt7Cky1cNau15FWy64IjuO8X0JijhTBBrJj1YlxlDfRkJXNaK9RFUjwpfDPzMdv7wB38jr53l9tkNLxnWg==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "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/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "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/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/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-extra/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/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/fsrs.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fsrs.js/-/fsrs.js-1.1.0.tgz", - "integrity": "sha512-DEihBx081nENpNjrSvCopPVi9Ilh+u+ELYOKQmshfSz+DgC/B0hxFFMQnqy2ibWAm9zjyR/bWvaz86xEA4MIcA==", - "dev": true, - "dependencies": { - "deepcopy": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "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/gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "dependencies": { - "globule": "^1.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/geckodriver": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.2.0.tgz", - "integrity": "sha512-I2BlybeMFMzpxHRrh8X4VwP4ys74JHszyUgfezOrbTR7PEybFneDcuEjKIQxKV6vFPmsdwhwF1x8AshdQo56xA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@wdio/logger": "^8.11.0", - "decamelize": "^6.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.1", - "tar-fs": "^3.0.4", - "unzipper": "^0.10.14", - "which": "^3.0.1" - }, - "bin": { - "geckodriver": "bin/geckodriver.js" - }, - "engines": { - "node": "^16.13 || >=18 || >=20" - } - }, - "node_modules/geckodriver/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/geckodriver/node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/geckodriver/node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/geckodriver/node_modules/https-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", - "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/geckodriver/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/geckodriver/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dev": true, - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/geckodriver/node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/geckodriver/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-port": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.0.0.tgz", - "integrity": "sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-uri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", - "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", - "dev": true, - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^5.0.1", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/get-uri/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/get-uri/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/get-uri/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "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/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/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/globule": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", - "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", - "dev": true, - "dependencies": { - "glob": "~7.1.1", - "lodash": "^4.17.21", - "minimatch": "~3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/globule/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "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/globule/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "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/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "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-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "dev": true, - "dependencies": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - } - }, - "node_modules/hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, - "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/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, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/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, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/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, - "peer": true - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "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/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, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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/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/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-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-meta-resolve": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", - "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/inquirer": { - "version": "9.2.9", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.9.tgz", - "integrity": "sha512-0VXHov2GGwWquYxwxlcIcm3yOHvFb2jh/+HkY8/AUXSTWShpo6QJMlSfHi5Xo74NO40UePBM3rQcI3OkzOF/7A==", - "dev": true, - "dependencies": { - "@ljharb/through": "^2.3.9", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.0.0", - "external-editor": "^3.0.3", - "figures": "^5.0.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.0.1" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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-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-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": "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/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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-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": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-port-reachable": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-3.1.0.tgz", - "integrity": "sha512-vjc0SSRNZ32s9SbZBzGaiP6YVB+xglLShhgZD/FHMZUXBvQWaV9CtzgeVhjccFJrI6RAMV+LX7NYxueW/A8W5A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "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/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is2": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", - "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "ip-regex": "^4.1.0", - "is-url": "^1.2.4" - }, - "engines": { - "node": ">=v0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "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/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/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/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", - "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", - "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.6.2", - "@jest/types": "^29.6.1", - "import-local": "^3.0.2", - "jest-cli": "^29.6.2" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-circus": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", - "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.2", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "p-limit": "^3.1.0", - "pretty-format": "^29.6.2", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", - "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", - "dev": true, - "dependencies": { - "@jest/core": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", - "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.2", - "@jest/types": "^29.6.1", - "babel-jest": "^29.6.2", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.2", - "jest-environment-node": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.6.2", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", - "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", - "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.6.2", - "pretty-format": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.2.tgz", - "integrity": "sha512-7oa/+266AAEgkzae8i1awNEfTfjwawWKLpiw2XesZmaoVVj9u9t8JOYx18cG29rbPNtkUlZ8V4b5Jb36y/VxoQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2", - "jsdom": "^20.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jest-environment-node": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", - "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-expect-message": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/jest-expect-message/-/jest-expect-message-1.1.3.tgz", - "integrity": "sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==", - "dev": true - }, - "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", - "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", - "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", - "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", - "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", - "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.1", - "@types/node": "*", - "jest-util": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", - "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", - "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", - "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", - "dev": true, - "dependencies": { - "@jest/console": "^29.6.2", - "@jest/environment": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-leak-detector": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-resolve": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-util": "^29.6.2", - "jest-watcher": "^29.6.2", - "jest-worker": "^29.6.2", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", - "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/globals": "^29.6.2", - "@jest/source-map": "^29.6.0", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", - "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.6.2", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^29.6.2", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", - "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", - "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "leven": "^3.1.0", - "pretty-format": "^29.6.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", - "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.6.2", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", - "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.6.2", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "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/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "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-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/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": "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/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/jsonfile/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/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ky": { - "version": "0.33.3", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", - "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" - } - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.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/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true - }, - "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/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", - "dev": true - }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "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.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "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.pickby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", - "integrity": "sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==", - "dev": true - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true - }, - "node_modules/lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loglevel": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", - "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/loglevel-plugin-prefix": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", - "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", - "dev": true - }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "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/marky": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "dev": true - }, - "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/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-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": "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/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "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/minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", - "dev": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/mocha/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "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/mocha/node_modules/glob/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/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/minimatch/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/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/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/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "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/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "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, - "peer": 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-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/npm-run-path/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/nwsapi": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", - "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", - "dev": true - }, - "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/obsidian": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.4.0.tgz", - "integrity": "sha512-fsZMPlxgflGSBSP6P4BjQi5+0MqZl3h6FEDEZ3CNnweNdDw0doyqN3FMO/PGWfuxPT77WicVwUxekuI3e6eCGg==", - "dev": true, - "dependencies": { - "@types/codemirror": "5.60.8", - "moment": "2.29.4" - }, - "peerDependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "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": "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/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-iteration": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/p-iteration/-/p-iteration-1.1.8.tgz", - "integrity": "sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8.0.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-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/pac-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz", - "integrity": "sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA==", - "dev": true, - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", - "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", - "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", - "dev": true, - "dependencies": { - "degenerator": "^5.0.0", - "ip": "^1.1.8", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pagerank.js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pagerank.js/-/pagerank.js-1.0.2.tgz", - "integrity": "sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw==" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "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-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true, - "bin": { - "parse-github-url": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "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.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.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.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "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/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "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/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/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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/piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", - "dev": true, - "dependencies": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" - }, - "optionalDependencies": { - "nice-napi": "^1.0.2" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/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/prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", - "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "dev": true, - "dependencies": { - "parse-ms": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", - "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "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/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "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/puppeteer-core": { - "version": "20.3.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.3.0.tgz", - "integrity": "sha512-264pBrIui5bO6NJeOcbJrLa0OCwmA4+WK00JMrLIKTfRiqe2gx8KWTzLsjyw/bizErp3TKS7vt/I0i5fTC+mAw==", - "dev": true, - "peer": true, - "dependencies": { - "@puppeteer/browsers": "1.3.0", - "chromium-bidi": "0.4.9", - "cross-fetch": "3.1.6", - "debug": "4.3.4", - "devtools-protocol": "0.0.1120988", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1120988", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1120988.tgz", - "integrity": "sha512-39fCpE3Z78IaIPChJsP6Lhmkbf4dWXOmzLk/KFTdRkNk/0JymRIfUynDVRndV9HoDz8PyalK1UH21ST/ivwW5Q==", - "dev": true, - "peer": true - }, - "node_modules/pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/query-selector-shadow-dom": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", - "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", - "dev": true - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "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/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true - }, - "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/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/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "peer": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-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/readdir-glob/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/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/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.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-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/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-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/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/resq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", - "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^2.0.1" - } - }, - "node_modules/resq/node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", - "dev": true - }, - "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/restore-cursor/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/restore-cursor/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/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/rgb2hex": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", - "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", - "dev": true - }, - "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/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safaridriver": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.0.tgz", - "integrity": "sha512-azzzIP3gR1TB9bVPv7QO4Zjw0rR1BWEU/s2aFdUMN48gxDjxEB13grAEuXDmkKPgE74cObymDxmAmZnL3clj4w==", - "dev": true - }, - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/selenium-standalone": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.3.0.tgz", - "integrity": "sha512-cQVWQGxumvPnyzFNtzFtBfDCbqBsdEnwiOwRyrAzeUqf5ltAp3Z3+2f6asSFbLUQJs2sFuF6PsEyNA+eOzXKxg==", - "dev": true, - "dependencies": { - "commander": "^10.0.0", - "cross-spawn": "^7.0.3", - "debug": "^4.3.1", - "fs-extra": "^10.0.0", - "got": "^11.8.2", - "is-port-reachable": "^3.0.0", - "lodash.mapvalues": "^4.6.0", - "lodash.merge": "^4.6.2", - "minimist": "^1.2.5", - "mkdirp": "^2.1.3", - "progress": "2.0.3", - "tar-stream": "3.0.0", - "which": "^2.0.2", - "yauzl": "^2.10.0" - }, - "bin": { - "selenium-standalone": "bin/selenium-standalone" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/selenium-standalone/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/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/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/semver/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/serialize-error": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", - "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "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/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/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "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/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz", - "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks/node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "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": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stream-buffers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", - "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/streamx": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz", - "integrity": "sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==", - "dev": true, - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, - "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-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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/string-width-cjs": { - "name": "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/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-ansi-cjs": { - "name": "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": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/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/style-mod": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", - "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==", - "dev": true, - "peer": true - }, - "node_modules/suffix": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/suffix/-/suffix-0.1.1.tgz", - "integrity": "sha512-j5uf6MJtMCfC4vBe5LFktSe4bGyNTBk7I2Kdri0jeLrcv5B9pWfxVa5JQpoxgtR8vaVB7bVxsWgnfQbX5wkhAA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "peer": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "peer": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.0.0.tgz", - "integrity": "sha512-O6OfUKBbQOqAhh6owTWmA730J/yZCYcpmZ1DBj2YX51ZQrt7d7NgzrR+CnO9wP6nt/viWZW2XeXLavX3/ZEbEg==", - "dev": true, - "dependencies": { - "b4a": "^1.6.1", - "bl": "^6.0.0", - "streamx": "^2.12.5" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.2.tgz", - "integrity": "sha512-/ivXMGCGDI0EB4JI4zCqppp79j03vUgZz/zakw7TworE2NVjIuPxpL1Ti0InSsarKqFG5NLFreCBcCCSjtrTQw==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^4.2.0" - } - }, - "node_modules/tar-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.0.tgz", - "integrity": "sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==", - "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/tcp-port-used": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", - "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", - "dev": true, - "dependencies": { - "debug": "4.3.1", - "is2": "^2.0.6" - } - }, - "node_modules/tcp-port-used/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "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/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/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "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/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "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-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ua-parser-js": { - "version": "1.0.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", - "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unzipper": { - "version": "0.10.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", - "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, - "node_modules/unzipper/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/unzipper/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/unzipper/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "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/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.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/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/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/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/vhtml": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vhtml/-/vhtml-2.2.0.tgz", - "integrity": "sha512-TPXrXrxBOslRUVnlVkiAqhoXneiertIg86bdvzionrUYhEuiROvyPZNiiP6GIIJ2Q7oPNVyEtIx8gMAZZE9lCQ==", - "dev": true - }, - "node_modules/w3c-keyname": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", - "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==", - "dev": true, - "peer": true - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/wait-port": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.0.4.tgz", - "integrity": "sha512-w8Ftna3h6XSFWWc2JC5gZEgp64nz8bnaTp5cvzbJSZ53j+omktWTDdwXxEF0jM8YveviLgFWvNGrSvRHnkyHyw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "commander": "^9.3.0", - "debug": "^4.3.4" - }, - "bin": { - "wait-port": "bin/wait-port.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/wait-port/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/wdio-chromedriver-service": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/wdio-chromedriver-service/-/wdio-chromedriver-service-8.1.1.tgz", - "integrity": "sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==", - "dev": true, - "dependencies": { - "@wdio/logger": "^8.1.0", - "fs-extra": "^11.1.0", - "split2": "^4.1.0", - "tcp-port-used": "^1.0.2" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "@wdio/types": "^7.0.0 || ^8.0.0-alpha.219", - "chromedriver": "*", - "webdriverio": "^7.0.0 || ^8.0.0-alpha.219" - }, - "peerDependenciesMeta": { - "@wdio/types": { - "optional": true - }, - "chromedriver": { - "optional": true - }, - "webdriverio": { - "optional": false - } - } - }, - "node_modules/wdio-chromedriver-service/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/wdio-chromedriver-service/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/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webdriver": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.11.1.tgz", - "integrity": "sha512-hSpUZYzUA65t4DDtKujCHUX6hpFTUleb7lWMcf5xjPz8sxWrK9R8NIw7pXt/GU6PVS331nGAaYkzoXrqz2VB8w==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.11.0", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.11.0", - "@wdio/types": "8.10.4", - "@wdio/utils": "8.11.0", - "deepmerge-ts": "^5.0.0", - "got": "^ 12.6.1", - "ky": "^0.33.0", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/webdriver/node_modules/@sindresorhus/is": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.4.1.tgz", - "integrity": "sha512-axlrvsHlHlFmKKMEg4VyvMzFr93JWJj4eIfXY1STVuO2fsImCa7ncaiG5gC8HKOX590AW5RtRsC41/B+OfrSqw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/webdriver/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "peer": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/webdriver/node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/webdriver/node_modules/cacheable-request": { - "version": "10.2.12", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.12.tgz", - "integrity": "sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/webdriver/node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "peer": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/webdriver/node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "peer": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/webdriver/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webdriver/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webdriver/node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webdriver/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/webdriver/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "peer": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webdriverio": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.11.2.tgz", - "integrity": "sha512-e/9WkdNTfWeoaSo2UzK0Giec/nQX3i7U9J8esimhozH/EpwSqIaEJ2pRRlxRVafEhe2OBG1QDhnLnDjdCC5Hxg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.11.0", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.11.0", - "@wdio/repl": "8.10.1", - "@wdio/types": "8.10.4", - "@wdio/utils": "8.11.0", - "archiver": "^5.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools": "8.11.0", - "devtools-protocol": "^0.0.1152884", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^3.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "20.3.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^8.0.0", - "webdriver": "8.11.1" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/webdriverio/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, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/webdriverio/node_modules/minimatch": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz", - "integrity": "sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "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/wrap-ansi-cjs": { - "name": "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/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/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": 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/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "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": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "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": "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/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yarn-install": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yarn-install/-/yarn-install-1.0.0.tgz", - "integrity": "sha512-VO1u181msinhPcGvQTVMnHVOae8zjX/NSksR17e6eXHRveDvHCF5mGjh9hkN8mzyfnCqcBe42LdTs7bScuTaeg==", - "dev": true, - "dependencies": { - "cac": "^3.0.3", - "chalk": "^1.1.3", - "cross-spawn": "^4.0.2" - }, - "bin": { - "yarn-install": "bin/yarn-install.js", - "yarn-remove": "bin/yarn-remove.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yarn-install/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yarn-install/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yarn-install/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yarn-install/node_modules/cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "node_modules/yarn-install/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/yarn-install/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/yarn-install/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yarn-install/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/yarn-install/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/yarn-install/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "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" - } - }, - "node_modules/zip-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "dev": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - } -} diff --git a/package.json b/package.json index f12fb2d9..0b154cf5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.5", + "version": "1.10.5.1", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { @@ -20,7 +20,7 @@ "author": "Stephen Mwangi", "license": "MIT", "devDependencies": { - "@popperjs/core": "^2.11.6", + "@popperjs/core": "^2.11.8", "@types/jest": "^29.5.3", "@types/node": "^20.4.10", "@types/vhtml": "^2.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6b9d94c..b4ba0f53 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,45 +7,45 @@ settings: dependencies: chart.js: specifier: ^4.3.3 - version: 4.3.3 + version: 4.4.0 pagerank.js: specifier: ^1.0.2 version: 1.0.2 devDependencies: '@popperjs/core': - specifier: ^2.11.6 - version: 2.11.6 + specifier: ^2.11.8 + version: 2.11.8 '@types/jest': specifier: ^29.5.3 - version: 29.5.3 + version: 29.5.8 '@types/node': specifier: ^20.4.10 - version: 20.4.10 + version: 20.9.0 '@types/vhtml': specifier: ^2.2.4 - version: 2.2.4 + version: 2.2.7 '@typescript-eslint/eslint-plugin': specifier: ^6.3.0 - version: 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.47.0)(typescript@5.1.6) + version: 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.1.6) '@typescript-eslint/parser': specifier: ^6.3.0 - version: 6.3.0(eslint@8.47.0)(typescript@5.1.6) + version: 6.10.0(eslint@8.53.0)(typescript@5.1.6) '@wdio/cli': specifier: ^8.14.4 - version: 8.14.4(typescript@5.1.6) + version: 8.22.1(typescript@5.1.6) '@wdio/local-runner': specifier: ^8.14.3 - version: 8.14.3(typescript@5.1.6) + version: 8.22.1(typescript@5.1.6) '@wdio/mocha-framework': specifier: ^8.14.0 - version: 8.14.0 + version: 8.22.0 '@wdio/selenium-standalone-service': specifier: ^8.14.0 - version: 8.14.0 + version: 8.15.0 '@wdio/spec-reporter': specifier: ^8.14.0 - version: 8.14.0 + version: 8.21.0 auto-changelog: specifier: ^2.4.0 version: 2.4.0 @@ -54,25 +54,25 @@ devDependencies: version: 3.3.0 chai: specifier: ^4.3.7 - version: 4.3.7 + version: 4.3.10 deepcopy: specifier: ^2.1.0 version: 2.1.0 esbuild: specifier: ~0.19.1 - version: 0.19.1 + version: 0.19.5 eslint: specifier: ^8.47.0 - version: 8.47.0 + version: 8.53.0 fsrs.js: specifier: ^1.1.0 - version: 1.1.0 + version: 1.1.1 jest: specifier: ^29.6.2 - version: 29.6.2(@types/node@20.4.10) + version: 29.7.0(@types/node@20.9.0) jest-environment-jsdom: specifier: ^29.6.2 - version: 29.6.2 + version: 29.7.0 jest-expect-message: specifier: ^1.1.3 version: 1.1.3 @@ -81,13 +81,13 @@ devDependencies: version: 2.29.4 obsidian: specifier: ^1.4.0 - version: 1.4.0(@codemirror/state@6.2.0)(@codemirror/view@6.11.1) + version: 1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0) prettier: specifier: ^3.0.1 - version: 3.0.1 + version: 3.0.3 ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.21.8)(esbuild@0.19.1)(jest@29.6.2)(typescript@5.1.6) + version: 29.1.1(@babel/core@7.23.3)(esbuild@0.19.5)(jest@29.7.0)(typescript@5.1.6) tslib: specifier: 2.6.1 version: 2.6.1 @@ -99,7 +99,7 @@ devDependencies: version: 2.2.0 wdio-chromedriver-service: specifier: ^8.1.1 - version: 8.1.1(webdriverio@8.14.3) + version: 8.1.1(webdriverio@8.22.1) packages: @@ -113,40 +113,37 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.20 dev: true - /@assemblyscript/loader@0.10.1: - resolution: {integrity: sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==} - dev: true - - /@babel/code-frame@7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.18.6 + '@babel/highlight': 7.22.20 + chalk: 2.4.2 dev: true - /@babel/compat-data@7.21.7: - resolution: {integrity: sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==} + /@babel/compat-data@7.23.3: + resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.21.8: - resolution: {integrity: sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==} + /@babel/core@7.23.3: + resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.5 - '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.21.8) - '@babel/helper-module-transforms': 7.21.5 - '@babel/helpers': 7.21.5 - '@babel/parser': 7.21.8 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.5 - '@babel/types': 7.21.5 - convert-source-map: 1.9.0 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.3 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/helpers': 7.23.2 + '@babel/parser': 7.23.3 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.3 + convert-source-map: 2.0.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 @@ -155,297 +152,292 @@ packages: - supports-color dev: true - /@babel/generator@7.21.5: - resolution: {integrity: sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==} + /@babel/generator@7.23.3: + resolution: {integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.23.3 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets@7.21.5(@babel/core@7.21.8): - resolution: {integrity: sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==} + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.21.7 - '@babel/core': 7.21.8 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.5 + '@babel/compat-data': 7.23.3 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 lru-cache: 5.1.1 - semver: 6.3.0 + semver: 6.3.1 dev: true - /@babel/helper-environment-visitor@7.21.5: - resolution: {integrity: sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==} + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.5 + '@babel/template': 7.22.15 + '@babel/types': 7.23.3 dev: true - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.23.3 dev: true - /@babel/helper-module-imports@7.21.4: - resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.23.3 dev: true - /@babel/helper-module-transforms@7.21.5: - resolution: {integrity: sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==} + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/helper-environment-visitor': 7.21.5 - '@babel/helper-module-imports': 7.21.4 - '@babel/helper-simple-access': 7.21.5 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.5 - '@babel/types': 7.21.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.23.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-plugin-utils@7.21.5: - resolution: {integrity: sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==} + /@babel/helper-environment-visitor@7.21.5: + resolution: {integrity: sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-simple-access@7.21.5: - resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==} + /@babel/helper-function-name@7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.23.3 dev: true - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + /@babel/helper-hoist-variables@7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.23.3 dev: true - /@babel/helper-string-parser@7.21.5: - resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.21.0: - resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.21.5: - resolution: {integrity: sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==} + /@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.5 - '@babel/types': 7.21.5 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.3 + '@babel/types': 7.23.3 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 dev: true - /@babel/parser@7.21.8: - resolution: {integrity: sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==} + /@babel/parser@7.23.3: + resolution: {integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.23.3 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.8): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.8): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.8): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.8): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.8): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.21.8): - resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==} + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.8): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.8): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.8): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.8): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.8): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.8): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.8): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.21.8): - resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==} + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.8 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.23.3 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/template@7.20.7: - resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.21.4 - '@babel/parser': 7.21.8 - '@babel/types': 7.21.5 + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 dev: true - /@babel/traverse@7.21.5: - resolution: {integrity: sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==} + /@babel/traverse@7.23.3: + resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.21.5 - '@babel/helper-environment-visitor': 7.21.5 - '@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.8 - '@babel/types': 7.21.5 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.21.5: - resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==} + /@babel/types@7.23.3: + resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.21.5 - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 dev: true @@ -453,20 +445,20 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@codemirror/state@6.2.0: - resolution: {integrity: sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA==} + /@codemirror/state@6.3.1: + resolution: {integrity: sha512-88e4HhMtKJyw6fKprGaN/yZfiaoGYOi2nM45YCUC6R/kex9sxFWBDGatS1vk4lMgnWmdIIB9tk8Gj1LmL8YfvA==} dev: true - /@codemirror/view@6.11.1: - resolution: {integrity: sha512-ffKhfty5XcadA2/QSmDCnG6ZQnDfKT4YsH9ACWluhoTpkHuW5gMAK07s9Y76j/OzUqyoUuF+/VISr9BuCWzPqw==} + /@codemirror/view@6.22.0: + resolution: {integrity: sha512-6zLj4YIoIpfTGKrDMTbeZRpa8ih4EymMCKmddEDcJWrCdp/N1D46B38YEz4creTb4T177AVS9EyXkLeC/HL2jA==} dependencies: - '@codemirror/state': 6.2.0 - style-mod: 4.0.3 - w3c-keyname: 2.2.6 + '@codemirror/state': 6.3.1 + style-mod: 4.1.0 + w3c-keyname: 2.2.8 dev: true - /@esbuild/android-arm64@0.19.1: - resolution: {integrity: sha512-CqhrKvDSt76I0so/5afqgKrMv41FjbfUKFrcZddMnrZKqJU70I1MWLVJrImJuYMaY4Yb9rn4UKfF7oZ0BOleVw==} + /@esbuild/android-arm64@0.19.5: + resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -474,8 +466,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.1: - resolution: {integrity: sha512-yjTucwcOua52z14RL30JMwmCdylsQ5WrErGkAb6VL0MWPbnwJyLejydaRcUqkPO6g0MowlzavdxrR7AcfCW+yA==} + /@esbuild/android-arm@0.19.5: + resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -483,8 +475,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.1: - resolution: {integrity: sha512-VA29h01MrPkymIL1bFtvL2L4WPogiMGW2N/M+vXZHHOv6LgA9vjzVskTt0v5LjeCjx1PFDcR0ASKy8Y7Gm+iIA==} + /@esbuild/android-x64@0.19.5: + resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -492,8 +484,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.1: - resolution: {integrity: sha512-Be4Cf6WDH7QkLHEpfzQOlBOFdqmqYTSqw2yG3SVmzB3++wy3K7wiNGedezL+q6Jb4weqT9tchO5kkLDC08Jnzg==} + /@esbuild/darwin-arm64@0.19.5: + resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -501,8 +493,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.1: - resolution: {integrity: sha512-SewtenJi6zCEfZRSUchb+LgJ/IQw8QvnKECPu/qHII1fLQKnVPUVR+VH2IuS03DD9WWnAi3yfOvBNwtrp3WXtg==} + /@esbuild/darwin-x64@0.19.5: + resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -510,8 +502,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.1: - resolution: {integrity: sha512-TadKO0AaTDAPV2RyGZQ0AaiDTVYg7RsgNaA6OJjXXmoLbTs++NwHtzAmVFBq8Q/P9A11wgkv36HeyAYhWHbW1w==} + /@esbuild/freebsd-arm64@0.19.5: + resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -519,8 +511,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.1: - resolution: {integrity: sha512-DrFMGLF0/aAcZgwhtZr1cby7aHlalpFjLCe5CiI8mm0Kqhhc8gyNZKreaZzvir8CQe0H17p9xx6M9ben5R3r0g==} + /@esbuild/freebsd-x64@0.19.5: + resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -528,8 +520,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.1: - resolution: {integrity: sha512-6ku/R2EzsdjyBaqQn+xGOPbv+BBYBXQYzlA04/46YQLmXkdApi0GYyUwiCXYBxm578iyywzGmM0rep1/q8tuFQ==} + /@esbuild/linux-arm64@0.19.5: + resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -537,8 +529,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.1: - resolution: {integrity: sha512-lCWDVPpQO/Dt5MEqctKujgtUVmwQx7J2Q83EqX/9BejN7BIX4fGJ0QKMiIyy21PFh+/64ArN+Ovh1tzYkTt2wg==} + /@esbuild/linux-arm@0.19.5: + resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -546,8 +538,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.1: - resolution: {integrity: sha512-8AKFBk9v/zBDsADvK/0BWZUxkjEc0QDwO8rvbHJKqAZx6DF/VSeBxTRmqWeecrJmx+n3kemEwML9z0eD9IHweQ==} + /@esbuild/linux-ia32@0.19.5: + resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -555,8 +547,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.1: - resolution: {integrity: sha512-6mOS5CxTGD8qOymp2y4KoM4ir+/REgjdJQFYpwP+WqjrWBo+PUevDGeHHjzCdw/R19PkFqS1bRzv8cTCmB/5kA==} + /@esbuild/linux-loong64@0.19.5: + resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -564,8 +556,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.1: - resolution: {integrity: sha512-Bzmv6rRMzR4ErG2k/jwfj5jKNzVMVEI1tThuirFdAoE+duUv+jlDnlwxsN3s1eqMzADTOV2sSIcUUOfgv++Dgg==} + /@esbuild/linux-mips64el@0.19.5: + resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -573,8 +565,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.1: - resolution: {integrity: sha512-mPOxA7bd3nmx8TkuO/9M/tE0fnvmuX0wlpwnTL6DPLgkb/Z/KkupexSIw4cLfznn/fPzD89y17VWBjlVNyrpCQ==} + /@esbuild/linux-ppc64@0.19.5: + resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -582,8 +574,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.1: - resolution: {integrity: sha512-znYb2Mhe9xKIDeIYuTD6vCcUltvYzRT5Yq6sVcdhPrGu8DRdsNZS04B2tSeM+j7T03jL4yY+7/G/jxSJJ9LX2A==} + /@esbuild/linux-riscv64@0.19.5: + resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -591,8 +583,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.1: - resolution: {integrity: sha512-BBIE32cyqAYhMOQ42/jnecoF5P/S5lMob2vXSUiFpD3xCFbXOFkjP1OjfFKnalSO9+B5emvPTQFfNQXuLeVGEw==} + /@esbuild/linux-s390x@0.19.5: + resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -600,8 +592,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.1: - resolution: {integrity: sha512-PoCvKdHTIbnHmVJ5OEdewGMSw40HDFRTrC/imwh8vrp695RbSUpOqBqNBT45neK0FQleGFbSE/A9X6HlXPDhqA==} + /@esbuild/linux-x64@0.19.5: + resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -609,8 +601,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.1: - resolution: {integrity: sha512-4OrGMPorHCq9h52VLtyyyAmPjC2ZlANx54VDYyCrqXUOi+k0qxnPKXKKprVES67w2mE7TZJx9qZmT+jHeiZbHQ==} + /@esbuild/netbsd-x64@0.19.5: + resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -618,8 +610,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.1: - resolution: {integrity: sha512-3a7ZYMjBC4P3FKdTmUZHJw7Mhzp71m+iSFFhX1PnLZ03qmyaB2K+vJZCk4PjRjAvm5lSupJQQtM/AFMyLgKlxQ==} + /@esbuild/openbsd-x64@0.19.5: + resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -627,8 +619,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.1: - resolution: {integrity: sha512-29yWBN5XfEjXT8yoeVb8cXfN1jAQLB+uskog1vBMhFR+YWOYvsrwPnh4hspETC/JnF95J+iETrvxgOUlICTWIw==} + /@esbuild/sunos-x64@0.19.5: + resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -636,8 +628,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.1: - resolution: {integrity: sha512-9Hb/WUXgyXlL55w3iNVyLkN9gq9x+agv3kk80foWbfpOwe7Qw4Vx6JGB+XQdsIfvvP1kShVQPIvBgVj0TxLlVw==} + /@esbuild/win32-arm64@0.19.5: + resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -645,8 +637,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.1: - resolution: {integrity: sha512-VGdtEcXX/f01NgoM8emDnpdOyrZCQ7VTwLv89MOl3mvJ5fbCOBMNCa8t7RZS4lf12RS87qOuJFX7Bh9aLTbSxg==} + /@esbuild/win32-ia32@0.19.5: + resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -654,8 +646,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.1: - resolution: {integrity: sha512-H6u8OHmJkKJubLbukVOyi9yA5lzK8VE4TFEkZj2vgusTUPvFeMQ8YnWviVc9F6PuKS6ZIpOvi2/sfiW8tQZQ2g==} + /@esbuild/win32-x64@0.19.5: + resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -663,34 +655,29 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.47.0 + eslint: 8.53.0 eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.5.1: - resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint-community/regexpp@4.6.2: - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4(supports-color@8.1.1) espree: 9.6.1 - globals: 13.20.0 + globals: 13.23.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -700,16 +687,16 @@ packages: - supports-color dev: true - /@eslint/js@8.47.0: - resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} + /@eslint/js@8.53.0: + resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: @@ -721,8 +708,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true /@isaacs/cliui@8.0.2: @@ -753,20 +740,20 @@ packages: engines: {node: '>=8'} dev: true - /@jest/console@29.6.2: - resolution: {integrity: sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==} + /@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.1 - '@types/node': 20.4.10 + '@jest/types': 29.6.3 + '@types/node': 20.9.0 chalk: 4.1.2 - jest-message-util: 29.6.2 - jest-util: 29.6.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 slash: 3.0.0 dev: true - /@jest/core@29.6.2: - resolution: {integrity: sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==} + /@jest/core@29.7.0: + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -774,32 +761,32 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.6.2 - '@jest/reporters': 29.6.2 - '@jest/test-result': 29.6.2 - '@jest/transform': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.10 + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.9.0 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 - jest-changed-files: 29.5.0 - jest-config: 29.6.2(@types/node@20.4.10) - jest-haste-map: 29.6.2 - jest-message-util: 29.6.2 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.2 - jest-resolve-dependencies: 29.6.2 - jest-runner: 29.6.2 - jest-runtime: 29.6.2 - jest-snapshot: 29.6.2 - jest-util: 29.6.2 - jest-validate: 29.6.2 - jest-watcher: 29.6.2 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.9.0) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 micromatch: 4.0.5 - pretty-format: 29.6.2 + pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: @@ -808,66 +795,59 @@ packages: - ts-node dev: true - /@jest/environment@29.6.2: - resolution: {integrity: sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==} + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/fake-timers': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.10 - jest-mock: 29.6.2 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.9.0 + jest-mock: 29.7.0 dev: true - /@jest/expect-utils@29.5.0: - resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.4.3 + jest-get-type: 29.6.3 dev: true - /@jest/expect-utils@29.6.2: - resolution: {integrity: sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==} + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.4.3 - dev: true - - /@jest/expect@29.6.2: - resolution: {integrity: sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.6.2 - jest-snapshot: 29.6.2 + expect: 29.7.0 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color dev: true - /@jest/fake-timers@29.6.2: - resolution: {integrity: sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==} + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.1 - '@sinonjs/fake-timers': 10.0.2 - '@types/node': 20.4.10 - jest-message-util: 29.6.2 - jest-mock: 29.6.2 - jest-util: 29.6.2 + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.9.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 dev: true - /@jest/globals@29.6.2: - resolution: {integrity: sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==} + /@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.6.2 - '@jest/expect': 29.6.2 - '@jest/types': 29.6.1 - jest-mock: 29.6.2 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 transitivePeerDependencies: - supports-color dev: true - /@jest/reporters@29.6.2: - resolution: {integrity: sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==} + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -876,91 +856,84 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.6.2 - '@jest/test-result': 29.6.2 - '@jest/transform': 29.6.2 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 - '@types/node': 20.4.10 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.20 + '@types/node': 20.9.0 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 - istanbul-lib-report: 3.0.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.1 + istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - jest-message-util: 29.6.2 - jest-util: 29.6.2 - jest-worker: 29.6.2 + istanbul-reports: 3.1.6 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 + v8-to-istanbul: 9.1.3 transitivePeerDependencies: - supports-color dev: true - /@jest/schemas@29.4.3: - resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.25.24 dev: true - /@jest/schemas@29.6.0: - resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jest/source-map@29.6.0: - resolution: {integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==} + /@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.20 callsites: 3.1.0 graceful-fs: 4.2.11 dev: true - /@jest/test-result@29.6.2: - resolution: {integrity: sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==} + /@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.6.2 - '@jest/types': 29.6.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 dev: true - /@jest/test-sequencer@29.6.2: - resolution: {integrity: sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==} + /@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.6.2 + '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 - jest-haste-map: 29.6.2 + jest-haste-map: 29.7.0 slash: 3.0.0 dev: true - /@jest/transform@29.6.2: - resolution: {integrity: sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==} + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.8 - '@jest/types': 29.6.1 - '@jridgewell/trace-mapping': 0.3.18 + '@babel/core': 7.23.3 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.20 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 29.6.2 - jest-regex-util: 29.4.3 - jest-util: 29.6.2 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 micromatch: 4.0.5 pirates: 4.0.5 slash: 3.0.0 @@ -969,15 +942,15 @@ packages: - supports-color dev: true - /@jest/types@29.6.1: - resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.6.0 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.4.10 - '@types/yargs': 17.0.24 + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.9.0 + '@types/yargs': 17.0.31 chalk: 4.1.2 dev: true @@ -987,7 +960,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.20 dev: true /@jridgewell/resolve-uri@3.1.0: @@ -1008,8 +981,8 @@ packages: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 @@ -1019,9 +992,11 @@ packages: resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} dev: false - /@ljharb/through@2.3.9: - resolution: {integrity: sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ==} + /@ljharb/through@2.3.11: + resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==} engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 dev: true /@nodelib/fs.scandir@2.1.5: @@ -1052,8 +1027,8 @@ packages: dev: true optional: true - /@popperjs/core@2.11.6: - resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: true /@puppeteer/browsers@1.4.6(typescript@5.1.6): @@ -1078,26 +1053,22 @@ packages: - supports-color dev: true - /@puppeteer/browsers@1.6.0: - resolution: {integrity: sha512-R2ib8j329427jtKB/qlz0MJbwfJE/6I8ocJLiajsRqJ2PPI8DbjiNzC3lQZeISXEcjOBVhbG2RafN8SlHdcT+A==} + /@puppeteer/browsers@1.8.0: + resolution: {integrity: sha512-TkRHIV6k2D8OlUe8RtG+5jgOF/H98Myx0M6AOafC8DdNVOFiBSFa5cpRDtpm8LXOa9sVwe0+e6Q3FC56X/DZfg==} engines: {node: '>=16.3.0'} hasBin: true dependencies: debug: 4.3.4(supports-color@8.1.1) extract-zip: 2.0.1 progress: 2.0.3 - proxy-agent: 6.3.0 + proxy-agent: 6.3.1 tar-fs: 3.0.4 unbzip2-stream: 1.4.3 - yargs: 17.7.1 + yargs: 17.7.2 transitivePeerDependencies: - supports-color dev: true - /@sinclair/typebox@0.25.24: - resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} - dev: true - /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true @@ -1147,175 +1118,177 @@ packages: resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} dev: true - /@types/babel__core@7.20.0: - resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} + /@types/babel__core@7.20.4: + resolution: {integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==} dependencies: - '@babel/parser': 7.21.8 - '@babel/types': 7.21.5 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.5 + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 + '@types/babel__generator': 7.6.7 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.4 dev: true - /@types/babel__generator@7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + /@types/babel__generator@7.6.7: + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.23.3 dev: true - /@types/babel__template@7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.21.8 - '@babel/types': 7.21.5 + '@babel/parser': 7.23.3 + '@babel/types': 7.23.3 dev: true - /@types/babel__traverse@7.18.5: - resolution: {integrity: sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==} + /@types/babel__traverse@7.20.4: + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.23.3 dev: true /@types/cacheable-request@6.0.3: resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} dependencies: - '@types/http-cache-semantics': 4.0.1 + '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.4.10 - '@types/responselike': 1.0.0 + '@types/node': 20.9.0 + '@types/responselike': 1.0.3 dev: true /@types/codemirror@5.60.8: resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} dependencies: - '@types/tern': 0.23.4 + '@types/tern': 0.23.7 dev: true - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true - /@types/graceful-fs@4.1.6: - resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.4.10 + '@types/node': 20.9.0 dev: true - /@types/http-cache-semantics@4.0.1: - resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} dev: true - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} dev: true - /@types/istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} dependencies: - '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-lib-coverage': 2.0.6 dev: true - /@types/istanbul-reports@3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} dependencies: - '@types/istanbul-lib-report': 3.0.0 + '@types/istanbul-lib-report': 3.0.3 dev: true - /@types/jest@29.5.3: - resolution: {integrity: sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==} + /@types/jest@29.5.8: + resolution: {integrity: sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==} dependencies: - expect: 29.5.0 - pretty-format: 29.5.0 + expect: 29.7.0 + pretty-format: 29.7.0 dev: true /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 20.4.10 - '@types/tough-cookie': 4.0.2 + '@types/node': 20.9.0 + '@types/tough-cookie': 4.0.5 parse5: 7.1.2 dev: true - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.4.10 + '@types/node': 20.9.0 dev: true - /@types/mocha@10.0.1: - resolution: {integrity: sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==} + /@types/mocha@10.0.4: + resolution: {integrity: sha512-xKU7bUjiFTIttpWaIZ9qvgg+22O1nmbA+HRxdlR+u6TWsGfmFdXrheJoK4fFxrHNVIOBDvDNKZG+LYBpMHpX3w==} dev: true - /@types/node@20.4.10: - resolution: {integrity: sha512-vwzFiiy8Rn6E0MtA13/Cxxgpan/N6UeNYR9oUu6kuJWxu6zCk98trcDp8CBhbtaeuq9SykCmXkFr2lWLoPcvLg==} + /@types/node@20.9.0: + resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==} + dependencies: + undici-types: 5.26.5 dev: true - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: true - /@types/responselike@1.0.0: - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: - '@types/node': 20.4.10 + '@types/node': 20.9.0 dev: true - /@types/semver@7.5.0: - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + /@types/semver@7.5.5: + resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} dev: true - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} dev: true - /@types/tern@0.23.4: - resolution: {integrity: sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==} + /@types/tern@0.23.7: + resolution: {integrity: sha512-0YS9XCZ0LAhlP11HV9SqncUYyz9Ggsgc7Om/AmchKvoeFyj0qPaJmX6rJ93mJVExizWDzUMb49gAtVpI1uHd8Q==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 dev: true - /@types/tough-cookie@4.0.2: - resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} + /@types/tough-cookie@4.0.5: + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} dev: true - /@types/vhtml@2.2.4: - resolution: {integrity: sha512-H7/C7RZuaoc45JRPKNTsyVwgCMNY9u20QKs1fz4pKKjwpnQe5Jo+YhFq5UQI+h5orsHg+3OZ2tJlUkxkIHUa2w==} + /@types/vhtml@2.2.7: + resolution: {integrity: sha512-9WOgwGrAz4E0af+8a8O5I0jv4rStzBtv34wU5FxQz90H8uGszuuAdLyaJJ7NF6T30ihA7vBE/LSO9IsINgR3Fw==} dev: true /@types/which@2.0.2: resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} dev: true - /@types/ws@8.5.4: - resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} + /@types/ws@8.5.9: + resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==} dependencies: - '@types/node': 20.4.10 + '@types/node': 20.9.0 dev: true - /@types/yargs-parser@21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} dev: true - /@types/yargs@17.0.24: - resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + /@types/yargs@17.0.31: + resolution: {integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==} dependencies: - '@types/yargs-parser': 21.0.0 + '@types/yargs-parser': 21.0.3 dev: true - /@types/yauzl@2.10.0: - resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 20.4.10 + '@types/node': 20.9.0 dev: true optional: true - /@typescript-eslint/eslint-plugin@6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==} + /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.1.6): + resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -1325,27 +1298,26 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 6.3.0(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 6.3.0 - '@typescript-eslint/type-utils': 6.3.0(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/utils': 6.3.0(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.3.0 + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.1.6) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4(supports-color@8.1.1) - eslint: 8.47.0 + eslint: 8.53.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 - natural-compare-lite: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) + ts-api-utils: 1.0.3(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.3.0(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==} + /@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.1.6): + resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1354,27 +1326,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.3.0 - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.3.0 + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4(supports-color@8.1.1) - eslint: 8.47.0 + eslint: 8.53.0 typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.3.0: - resolution: {integrity: sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==} + /@typescript-eslint/scope-manager@6.10.0: + resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/visitor-keys': 6.3.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/visitor-keys': 6.10.0 dev: true - /@typescript-eslint/type-utils@6.3.0(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==} + /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.1.6): + resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1383,23 +1355,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.1.6) - '@typescript-eslint/utils': 6.3.0(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.1.6) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.1.6) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.47.0 - ts-api-utils: 1.0.1(typescript@5.1.6) + eslint: 8.53.0 + ts-api-utils: 1.0.3(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.3.0: - resolution: {integrity: sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==} + /@typescript-eslint/types@6.10.0: + resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.3.0(typescript@5.1.6): - resolution: {integrity: sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==} + /@typescript-eslint/typescript-estree@6.10.0(typescript@5.1.6): + resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -1407,73 +1379,78 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/visitor-keys': 6.3.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) + ts-api-utils: 1.0.3(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.3.0(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==} + /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.1.6): + resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.3.0 - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.1.6) - eslint: 8.47.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.5 + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.1.6) + eslint: 8.53.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.3.0: - resolution: {integrity: sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==} + /@typescript-eslint/visitor-keys@6.10.0: + resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.3.0 + '@typescript-eslint/types': 6.10.0 eslint-visitor-keys: 3.4.3 dev: true - /@wdio/cli@8.14.4(typescript@5.1.6): - resolution: {integrity: sha512-67a/DhDr2jm/mnH+Asvn0vvY9eT9vK4lLecBv20X0hMkLAS2qKLEbJz1+JfewP2ScArlSluG4R7Zq/qU0F+i3g==} + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@wdio/cli@8.22.1(typescript@5.1.6): + resolution: {integrity: sha512-OgqsSFtMyfyOC9qMwS9YKjlLN/TwybQHnMIm9G3EZIGYKnAffzC6xXhgjyTqeHIyGieotH52mR0kHE0XIubw+A==} engines: {node: ^16.13 || >=18} hasBin: true dependencies: - '@types/node': 20.4.10 - '@wdio/config': 8.14.0 - '@wdio/globals': 8.14.3(typescript@5.1.6) - '@wdio/logger': 8.11.0 - '@wdio/protocols': 8.11.0 - '@wdio/types': 8.14.0 - '@wdio/utils': 8.14.0 + '@types/node': 20.9.0 + '@wdio/config': 8.22.1 + '@wdio/globals': 8.22.1(typescript@5.1.6) + '@wdio/logger': 8.16.17 + '@wdio/protocols': 8.22.0 + '@wdio/types': 8.21.0 + '@wdio/utils': 8.22.0 async-exit-hook: 2.0.1 chalk: 5.2.0 chokidar: 3.5.3 - cli-spinners: 2.9.0 + cli-spinners: 2.9.1 + detect-package-manager: 3.0.1 + dotenv: 16.3.1 ejs: 3.1.9 - execa: 7.1.1 - import-meta-resolve: 3.0.0 - inquirer: 9.2.9 + execa: 8.0.1 + import-meta-resolve: 3.1.1 + inquirer: 9.2.11 lodash.flattendeep: 4.4.0 lodash.pickby: 4.6.0 lodash.union: 4.6.0 - read-pkg-up: 10.0.0 + read-pkg-up: 10.1.0 recursive-readdir: 2.2.3 - webdriverio: 8.14.3(typescript@5.1.6) + webdriverio: 8.22.1(typescript@5.1.6) yargs: 17.7.2 - yarn-install: 1.0.0 transitivePeerDependencies: - bufferutil - devtools @@ -1492,17 +1469,32 @@ packages: '@wdio/utils': 8.14.0 decamelize: 6.0.0 deepmerge-ts: 5.1.0 - glob: 10.2.3 - import-meta-resolve: 3.0.0 - read-pkg-up: 10.0.0 + glob: 10.3.10 + import-meta-resolve: 3.1.1 + read-pkg-up: 10.1.0 dev: true - /@wdio/globals@8.14.3(typescript@5.1.6): - resolution: {integrity: sha512-CKQeYnWa8umh7UrSSZWBqHUDIaB/j55xEY0m6lw57kjAAmh6XJxfnqfkddo64EPICZuEHRWrwLJVSRXRCBRxrA==} + /@wdio/config@8.22.1: + resolution: {integrity: sha512-ttxvtKFaOB5BJ6eDl1Lcq8STLN3V+yOEEkVXIrNqOdFOrAaljqzX20vaEmNtj9pQIoTZs2WoX8K2cmXdyxw+DA==} + engines: {node: ^16.13 || >=18} + dependencies: + '@wdio/logger': 8.16.17 + '@wdio/types': 8.21.0 + '@wdio/utils': 8.22.0 + decamelize: 6.0.0 + deepmerge-ts: 5.1.0 + glob: 10.3.10 + import-meta-resolve: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@wdio/globals@8.22.1(typescript@5.1.6): + resolution: {integrity: sha512-Wf9D9ejiwArsAr80y7UZB0AsGLNgCWUoIbulK4vbzUU50RAymxbXeJEQgfwQ231+eHv8wIViQ45N0FoRJsHVcA==} engines: {node: ^16.13 || >=18} optionalDependencies: - expect-webdriverio: 4.2.7(typescript@5.1.6) - webdriverio: 8.14.3(typescript@5.1.6) + expect-webdriverio: 4.5.1(typescript@5.1.6) + webdriverio: 8.22.1(typescript@5.1.6) transitivePeerDependencies: - bufferutil - devtools @@ -1512,15 +1504,15 @@ packages: - utf-8-validate dev: true - /@wdio/local-runner@8.14.3(typescript@5.1.6): - resolution: {integrity: sha512-y4pHl8xphE0fEuDI1JXBVH7FQo8YAyEk32lmpOD7rsI/+M+b+ukYcSQtfHfVPVYGNVvipFbiavi8yJPho0jF+w==} + /@wdio/local-runner@8.22.1(typescript@5.1.6): + resolution: {integrity: sha512-bEWkU/6GKS9NIgTO4OyxOlWjr4lL22P0wg8ShmDX4qY2nStu5B/2tpl3sqLcmtFiCpsjdINIYRla4lz9xOUy1Q==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.4.10 - '@wdio/logger': 8.11.0 + '@types/node': 20.9.0 + '@wdio/logger': 8.16.17 '@wdio/repl': 8.10.1 - '@wdio/runner': 8.14.3(typescript@5.1.6) - '@wdio/types': 8.14.0 + '@wdio/runner': 8.22.1(typescript@5.1.6) + '@wdio/types': 8.21.0 async-exit-hook: 2.0.1 split2: 4.2.0 stream-buffers: 3.0.2 @@ -1537,14 +1529,14 @@ packages: resolution: {integrity: sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==} engines: {node: ^16.13 || >=18} dependencies: - chalk: 5.2.0 + chalk: 5.3.0 loglevel: 1.8.1 loglevel-plugin-prefix: 0.8.4 strip-ansi: 7.1.0 dev: true - /@wdio/logger@8.6.6: - resolution: {integrity: sha512-MS+Y5yqFGx2zVXMOfuBQAVdFsP4DuYz+/hM552xwiDWjGg6EZHoccqUYgH3J5zpu3JFpYV3R/a5jExFiGGck6g==} + /@wdio/logger@8.16.17: + resolution: {integrity: sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==} engines: {node: ^16.13 || >=18} dependencies: chalk: 5.2.0 @@ -1553,56 +1545,57 @@ packages: strip-ansi: 6.0.1 dev: true - /@wdio/mocha-framework@8.14.0: - resolution: {integrity: sha512-j2ngUFGF0T+Zax3Tops6TxyWNy+OxvMRsloZaE+wIMrAMnp6ocGC+W4si2cW5ZuZlvaoM6j406XZOmxW//pUCA==} + /@wdio/mocha-framework@8.22.0: + resolution: {integrity: sha512-kkgoNNXHiR/D48dB+dEQ0nmP5u1NFiUllOLK91z5x5+mwzCh17GpyakhUXLIyVdciiU7T1grJQC5pxqdvPLBkQ==} engines: {node: ^16.13 || >=18} dependencies: - '@types/mocha': 10.0.1 - '@types/node': 20.4.10 - '@wdio/logger': 8.11.0 - '@wdio/types': 8.14.0 - '@wdio/utils': 8.14.0 + '@types/mocha': 10.0.4 + '@types/node': 20.9.0 + '@wdio/logger': 8.16.17 + '@wdio/types': 8.21.0 + '@wdio/utils': 8.22.0 mocha: 10.2.0 + transitivePeerDependencies: + - supports-color dev: true - /@wdio/protocols@8.11.0: - resolution: {integrity: sha512-eXTMYt/XoaX53H/Q2qmsn1uWthIC5aSTGtX9YyXD/AkagG2hXeX3lLmzNWBaSIvKR+vWXRYbg3Y/7IvL2s25Wg==} + /@wdio/protocols@8.22.0: + resolution: {integrity: sha512-2y5lTYAAzQWvExL1FGCe6gujVpOpTxk+czT0Qx0j0iUlfdOwp9gWVLYl8ochTJHzfeM45GHvuZ/ndT52grsTtg==} dev: true /@wdio/repl@8.10.1: resolution: {integrity: sha512-VZ1WFHTNKjR8Ga97TtV2SZM6fvRjWbYI2i/f4pJB4PtusorKvONAMJf2LQcUBIyzbVobqr7KSrcjmSwRolI+yw==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.4.10 + '@types/node': 20.9.0 dev: true - /@wdio/reporter@8.14.0: - resolution: {integrity: sha512-xzsHRlnb35vFB/zs04Zsuh2Y24DRDuLWTYA96PxDNqMIjhkqJbERTJWSlRwiBhyhz6N8NrwAQfghyh93d554eg==} + /@wdio/reporter@8.21.0: + resolution: {integrity: sha512-noZX04lP7WvoaEAwhOTy0C/ddyVTEHQe/AGMTzgKgoQclEM3I2nZ1PjEwe/ACfIm0880EGIDW7ssN2pf/4ZNDQ==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.4.10 - '@wdio/logger': 8.11.0 - '@wdio/types': 8.14.0 + '@types/node': 20.9.0 + '@wdio/logger': 8.16.17 + '@wdio/types': 8.21.0 diff: 5.1.0 - object-inspect: 1.12.3 - supports-color: 9.4.0 + object-inspect: 1.13.1 dev: true - /@wdio/runner@8.14.3(typescript@5.1.6): - resolution: {integrity: sha512-jjDSyQQ+65219E9DAOKNNQ37YHYHpYCJztdfoT6twnA7+KhT/+Or4P9c23TxWNv7KH2CU7HThJKHmmZpHfd7OA==} + /@wdio/runner@8.22.1(typescript@5.1.6): + resolution: {integrity: sha512-VHX0l9q6WvDnvf89Q29xAgYBkBUo9ggzrpUA9VGntj+q7ey7Kv7CPBTzv4HVBX9Hp45xwSEl03lqFVcwn5NvTg==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.4.10 - '@wdio/config': 8.14.0 - '@wdio/globals': 8.14.3(typescript@5.1.6) - '@wdio/logger': 8.11.0 - '@wdio/types': 8.14.0 - '@wdio/utils': 8.14.0 + '@types/node': 20.9.0 + '@wdio/config': 8.22.1 + '@wdio/globals': 8.22.1(typescript@5.1.6) + '@wdio/logger': 8.16.17 + '@wdio/types': 8.21.0 + '@wdio/utils': 8.22.0 deepmerge-ts: 5.1.0 - expect-webdriverio: 4.2.7(typescript@5.1.6) + expect-webdriverio: 4.5.1(typescript@5.1.6) gaze: 1.1.3 - webdriver: 8.14.3 - webdriverio: 8.14.3(typescript@5.1.6) + webdriver: 8.22.1 + webdriverio: 8.22.1(typescript@5.1.6) transitivePeerDependencies: - bufferutil - devtools @@ -1612,26 +1605,27 @@ packages: - utf-8-validate dev: true - /@wdio/selenium-standalone-service@8.14.0: - resolution: {integrity: sha512-lCtqZpKEGDU6WYcw0/wWMR0urgY6NB5x0geyR9xF2GcjzA5KKYWh4qgJPtG5fNu3NYecfY6/09aFe80oKB++rg==} + /@wdio/selenium-standalone-service@8.15.0: + resolution: {integrity: sha512-Zg5mbbrCSnsgQ+kQArzZdyaWsoTZJH+Vp20aQR75DJWOW9PN/5MIro4TSaQvnqpQk0GFaRqf6PchC41CF3kLmQ==} engines: {node: ^16.13 || >=18} + deprecated: Invalid release dependencies: - '@types/node': 20.4.10 + '@types/node': 20.9.0 '@wdio/config': 8.14.0 '@wdio/logger': 8.11.0 '@wdio/types': 8.14.0 - selenium-standalone: 8.3.0 + selenium-standalone: 9.3.0 transitivePeerDependencies: - supports-color dev: true - /@wdio/spec-reporter@8.14.0: - resolution: {integrity: sha512-LmDXAcA1Xy5Yd+0lxhsULfZwr0hqxjjwLO4Uys6qUyGGSUJpL8psF26sO8kFYLHBpDN0DNxzvNm7iIvPAtE1dw==} + /@wdio/spec-reporter@8.21.0: + resolution: {integrity: sha512-Lb6MTjISlaZJx5/2kjJC/E9FM55BZUy3HPbhYbbWUSWqi9Yk8I7n6e90c8uHwDOK5zMyRof9501lUtLyIHY9Og==} engines: {node: ^16.13 || >=18} dependencies: - '@wdio/reporter': 8.14.0 - '@wdio/types': 8.14.0 - chalk: 5.2.0 + '@wdio/reporter': 8.21.0 + '@wdio/types': 8.21.0 + chalk: 5.3.0 easy-table: 1.2.0 pretty-ms: 7.0.1 dev: true @@ -1640,7 +1634,14 @@ packages: resolution: {integrity: sha512-Bhk3+3Sj47nnGwWjRMYSIp7pUFV/kOQ3o6ycwR4dKtUJpdMYLuQccWJNAp1AfM3g2mVZ07FindBgNkV5bED5zg==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.4.10 + '@types/node': 20.9.0 + dev: true + + /@wdio/types@8.21.0: + resolution: {integrity: sha512-mZFOipmu541z0BXBW7mBAUjM4zZWhNnP/w321OSYx082Jy4d0UHMFXYWaOC98DIMBPahJu/yLX2WH5iCrazKSA==} + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': 20.9.0 dev: true /@wdio/utils@8.14.0: @@ -1649,42 +1650,57 @@ packages: dependencies: '@wdio/logger': 8.11.0 '@wdio/types': 8.14.0 - import-meta-resolve: 3.0.0 + import-meta-resolve: 3.1.1 dev: true - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + /@wdio/utils@8.22.0: + resolution: {integrity: sha512-n09ZLfe6NADQ7XyeO45nPBtNHi8nwu1RpOI18c94SrRS7gmO0CQWpjSilJCoHvu10ekUPJE7Oh/1Nw28w7ceVg==} + engines: {node: ^16.13 || >=18} + dependencies: + '@puppeteer/browsers': 1.8.0 + '@wdio/logger': 8.16.17 + '@wdio/types': 8.21.0 + decamelize: 6.0.0 + deepmerge-ts: 5.1.0 + edgedriver: 5.3.8 + geckodriver: 4.2.1 + get-port: 7.0.0 + got: 13.0.0 + import-meta-resolve: 3.1.1 + locate-app: 2.1.0 + safaridriver: 0.1.0 + split2: 4.2.0 + wait-port: 1.1.0 + transitivePeerDependencies: + - supports-color dev: true - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.10.0 - acorn-walk: 8.2.0 + acorn: 8.11.2 + acorn-walk: 8.3.0 dev: true - /acorn-jsx@5.3.2(acorn@8.10.0): + /acorn-jsx@5.3.2(acorn@8.11.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.10.0 + acorn: 8.11.2 dev: true - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} engines: {node: '>=0.4.0'} dev: true - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -1707,6 +1723,14 @@ packages: - supports-color dev: true + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -1728,11 +1752,6 @@ packages: type-fest: 0.21.3 dev: true - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: true - /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1743,11 +1762,6 @@ packages: engines: {node: '>=12'} dev: true - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: true - /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -1780,33 +1794,29 @@ packages: picomatch: 2.3.1 dev: true - /archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} + /archiver-utils@4.0.1: + resolution: {integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==} + engines: {node: '>= 12.0.0'} dependencies: - glob: 7.2.3 + glob: 8.1.0 graceful-fs: 4.2.11 lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 + lodash: 4.17.21 normalize-path: 3.0.0 - readable-stream: 2.3.8 + readable-stream: 3.6.2 dev: true - /archiver@5.3.1: - resolution: {integrity: sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==} - engines: {node: '>= 10'} + /archiver@6.0.1: + resolution: {integrity: sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==} + engines: {node: '>= 12.0.0'} dependencies: - archiver-utils: 2.1.0 - async: 3.2.4 + archiver-utils: 4.0.1 + async: 3.2.5 buffer-crc32: 0.2.13 readable-stream: 3.6.2 readdir-glob: 1.1.3 - tar-stream: 2.2.0 - zip-stream: 4.1.0 + tar-stream: 3.1.6 + zip-stream: 5.0.1 dev: true /argparse@1.0.10: @@ -1837,6 +1847,11 @@ packages: engines: {node: '>=8'} dev: true + /arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + dev: true + /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true @@ -1853,8 +1868,8 @@ packages: engines: {node: '>=0.12.0'} dev: true - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} dev: true /asynckit@0.4.0: @@ -1867,34 +1882,38 @@ packages: hasBin: true dependencies: commander: 7.2.0 - handlebars: 4.7.7 - node-fetch: 2.6.11 + handlebars: 4.7.8 + node-fetch: 2.7.0 parse-github-url: 1.0.2 semver: 7.5.0 transitivePeerDependencies: - encoding dev: true - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} + /axios@0.27.2(debug@4.3.4): + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.3(debug@4.3.4) + form-data: 4.0.0 + transitivePeerDependencies: + - debug dev: true /b4a@1.6.4: resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} dev: true - /babel-jest@29.6.2(@babel/core@7.21.8): - resolution: {integrity: sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==} + /babel-jest@29.7.0(@babel/core@7.23.3): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.21.8 - '@jest/transform': 29.6.2 - '@types/babel__core': 7.20.0 + '@babel/core': 7.23.3 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.4 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0(@babel/core@7.21.8) + babel-preset-jest: 29.6.3(@babel/core@7.23.3) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -1915,45 +1934,45 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist@29.5.0: - resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.5 - '@types/babel__core': 7.20.0 - '@types/babel__traverse': 7.18.5 + '@babel/template': 7.22.15 + '@babel/types': 7.23.3 + '@types/babel__core': 7.20.4 + '@types/babel__traverse': 7.20.4 dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.8): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.8 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.8) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.8) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.8) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.8) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.8) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.8) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.8) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.8) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.8) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.8) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.8) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.8) - dev: true - - /babel-preset-jest@29.5.0(@babel/core@7.21.8): - resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} + '@babel/core': 7.23.3 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.3) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.3) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.23.3): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.8 - babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.8) + '@babel/core': 7.23.3 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.3) dev: true /balanced-match@1.0.2: @@ -1994,14 +2013,6 @@ packages: readable-stream: 3.6.2 dev: true - /bl@6.0.1: - resolution: {integrity: sha512-zk1P1eAEBHhhB+4NfGxqmuV6NgwECnIoRgsOq2ObdEsmoFVIYzJ/Jjcgaj7JOY/8ekH27bIHSV4Si2T+evqu+Q==} - dependencies: - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 4.4.0 - dev: true - /bluebird@3.4.7: resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} dev: true @@ -2030,15 +2041,15 @@ packages: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001486 - electron-to-chromium: 1.4.392 - node-releases: 2.0.10 - update-browserslist-db: 1.0.11(browserslist@4.21.5) + caniuse-lite: 1.0.30001561 + electron-to-chromium: 1.4.581 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true /bs-logger@0.2.6: @@ -2074,13 +2085,6 @@ packages: ieee754: 1.2.1 dev: true - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - /buffers@0.1.1: resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} engines: {node: '>=0.2.0'} @@ -2091,19 +2095,6 @@ packages: engines: {node: '>=6'} dev: true - /cac@3.0.4: - resolution: {integrity: sha512-hq4rxE3NT5PlaEiVV39Z45d6MoFcQZG5dsgJqtAUeOz3408LEQAElToDkf9i5IYSCOmK0If/81dLg7nKxqPR0w==} - engines: {node: '>=4'} - dependencies: - camelcase-keys: 3.0.0 - chalk: 1.1.3 - indent-string: 3.2.0 - minimist: 1.2.8 - read-pkg-up: 1.0.1 - suffix: 0.1.1 - text-table: 0.2.0 - dev: true - /cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -2114,14 +2105,14 @@ packages: engines: {node: '>=14.16'} dev: true - /cacheable-request@10.2.10: - resolution: {integrity: sha512-v6WB+Epm/qO4Hdlio/sfUn69r5Shgh39SsE9DSd4bIezP0mblOlObI+I0kUEM7J0JFc+I7pSeMeYaOYtX1N/VQ==} + /cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} dependencies: - '@types/http-cache-semantics': 4.0.1 + '@types/http-cache-semantics': 4.0.4 get-stream: 6.0.1 http-cache-semantics: 4.1.1 - keyv: 4.5.2 + keyv: 4.5.4 mimic-response: 4.0.0 normalize-url: 8.0.0 responselike: 3.0.0 @@ -2134,17 +2125,18 @@ packages: clone-response: 1.0.3 get-stream: 5.2.0 http-cache-semantics: 4.1.1 - keyv: 4.5.2 + keyv: 4.5.4 lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 dev: true - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 dev: true /callsites@3.1.0: @@ -2152,26 +2144,6 @@ packages: engines: {node: '>=6'} dev: true - /camaro@6.2.0: - resolution: {integrity: sha512-81zTKgZb2LnkZKtLbIqLqBzQ6stWSlWC3I/lZd5u4NJVljDgMcsZqn9zZ+Yij/yNyiVpko0EhOKdYa6YAbOWrA==} - engines: {node: '>= 12.0.0'} - dependencies: - piscina: 3.2.0 - dev: true - - /camelcase-keys@3.0.0: - resolution: {integrity: sha512-U4E6A6aFyYnNW+tDt5/yIUKQURKXe3WMFPfX4FxrQFcwZ/R08AUk1xWcUtlr7oq6CV07Ji+aa69V2g7BSpblnQ==} - engines: {node: '>=0.10.0'} - dependencies: - camelcase: 3.0.0 - map-obj: 1.0.1 - dev: true - - /camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - dev: true - /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -2182,19 +2154,19 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001486: - resolution: {integrity: sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==} + /caniuse-lite@1.0.30001561: + resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==} dev: true - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + /chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 - check-error: 1.0.2 + check-error: 1.0.3 deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 + get-func-name: 2.0.2 + loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 dev: true @@ -2205,17 +2177,6 @@ packages: traverse: 0.3.9 dev: true - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: true - /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2238,11 +2199,6 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -2252,15 +2208,21 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /chart.js@4.3.3: - resolution: {integrity: sha512-aTk7pBw+x6sQYhon/NR3ikfUJuym/LdgpTlgZRe2PaEhjUMKBKyNaFCMVRAyTEWYFNO7qRu7iQVqOw/OqzxZxQ==} + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: true + + /chart.js@4.4.0: + resolution: {integrity: sha512-vQEj6d+z0dcsKLlQvbKIMYFHd3t8W/7L2vfJIbYcfyPcRx92CsHqECpueN8qVGNlKyDcr5wBrYAYKnfu/9Q1hQ==} engines: {pnpm: '>=7'} dependencies: '@kurkle/color': 0.3.2 dev: false - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 dev: true /chokidar@3.5.3: @@ -2275,20 +2237,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chrome-launcher@1.0.0: - resolution: {integrity: sha512-74IMFVfgni/bQ4GotUNJpH2vDR+Sh9cXNPVhPXiedeiB0+5j7/8i8LAqS7WlyNSKqtxJ/CgbOpBDPLkzqDVhlw==} - engines: {node: '>=12.13.0'} - hasBin: true - dependencies: - '@types/node': 20.4.10 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 2.0.1 - transitivePeerDependencies: - - supports-color + fsevents: 2.3.3 dev: true /chromium-bidi@0.4.16(devtools-protocol@0.0.1147663): @@ -2300,8 +2249,8 @@ packages: mitt: 3.0.0 dev: true - /ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} dev: true @@ -2309,6 +2258,11 @@ packages: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -2316,8 +2270,8 @@ packages: restore-cursor: 3.1.0 dev: true - /cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} + /cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} engines: {node: '>=6'} dev: true @@ -2352,6 +2306,7 @@ packages: /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + requiresBuild: true dev: true /co@4.6.0: @@ -2391,9 +2346,9 @@ packages: delayed-stream: 1.0.0 dev: true - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + /commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} dev: true /commander@7.2.0: @@ -2401,17 +2356,22 @@ packages: engines: {node: '>= 10'} dev: true + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} dev: true - /compress-commons@4.1.1: - resolution: {integrity: sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==} - engines: {node: '>= 10'} + /compress-commons@5.0.1: + resolution: {integrity: sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==} + engines: {node: '>= 12.0.0'} dependencies: - buffer-crc32: 0.2.13 - crc32-stream: 4.0.2 + crc-32: 1.2.2 + crc32-stream: 5.0.0 normalize-path: 3.0.0 readable-stream: 3.6.2 dev: true @@ -2420,10 +2380,6 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true @@ -2438,27 +2394,39 @@ packages: hasBin: true dev: true - /crc32-stream@4.0.2: - resolution: {integrity: sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==} - engines: {node: '>= 10'} + /crc32-stream@5.0.0: + resolution: {integrity: sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==} + engines: {node: '>= 12.0.0'} dependencies: crc-32: 1.2.2 readable-stream: 3.6.2 dev: true - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + /create-jest@29.7.0(@types/node@20.9.0): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true dependencies: - node-fetch: 2.6.12 + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.9.0) + jest-util: 29.7.0 + prompts: 2.4.2 transitivePeerDependencies: - - encoding + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node dev: true - /cross-spawn@4.0.2: - resolution: {integrity: sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==} + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} dependencies: - lru-cache: 4.1.5 - which: 1.3.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding dev: true /cross-spawn@7.0.3: @@ -2470,6 +2438,10 @@ packages: which: 2.0.2 dev: true + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: true + /css-shorthand-properties@1.1.1: resolution: {integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==} dev: true @@ -2498,8 +2470,8 @@ packages: engines: {node: '>= 12'} dev: true - /data-uri-to-buffer@5.0.1: - resolution: {integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==} + /data-uri-to-buffer@6.0.1: + resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==} engines: {node: '>= 14'} dev: true @@ -2512,17 +2484,6 @@ packages: whatwg-url: 11.0.0 dev: true - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - /debug@4.3.1: resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} engines: {node: '>=6.0'} @@ -2630,6 +2591,7 @@ packages: /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + requiresBuild: true dependencies: clone: 1.0.4 dev: true @@ -2639,12 +2601,13 @@ packages: engines: {node: '>=10'} dev: true - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 dev: true /degenerator@5.0.1: @@ -2666,16 +2629,23 @@ packages: engines: {node: '>=8'} dev: true + /detect-package-manager@3.0.1: + resolution: {integrity: sha512-qoHDH6+lMcpJPAScE7+5CYj91W0mxZNXTwZPrCqi1KMk+x+AoQScQ2V1QyqTln1rHU5Haq5fikvOGHv+leKD8A==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + /devtools-protocol@0.0.1147663: resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} dev: true - /devtools-protocol@0.0.1170846: - resolution: {integrity: sha512-GFZiHgvL4JW7+8hIMQgwYNUaIRRCsqfXd11ZbOTdu2VzDeu0Le4l1c3u4FFRWCSvMg82OFip9k/sYyz4M/PJIA==} + /devtools-protocol@0.0.1213968: + resolution: {integrity: sha512-o4n/beY+3CcZwFctYapjGelKptR4AuQT5gXS1Kvgbig+ArwkxK7f8wDVuD1wsoswiJWCwV6OK+Qb7vhNzNmABQ==} dev: true - /diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true @@ -2710,6 +2680,11 @@ packages: webidl-conversions: 7.0.0 dev: true + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: true + /duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: @@ -2736,18 +2711,17 @@ packages: which: 2.0.2 dev: true - /edgedriver@5.3.3: - resolution: {integrity: sha512-Gfb0gzBhpiXaVqLsIkua3RItwfiEGHVt9lXYG4bySoSluDtqIvwFBnMAEHKBS+j16ebEJSQh475e20X2lfzgjg==} + /edgedriver@5.3.8: + resolution: {integrity: sha512-FWLPDuwJDeGGgtmlqTXb4lQi/HV9yylLo1F9O1g9TLqSemA5T6xH28seUIfyleVirLFtDQyKNUxKsMhMT4IfnA==} hasBin: true requiresBuild: true dependencies: - '@wdio/logger': 8.11.0 - camaro: 6.2.0 + '@wdio/logger': 8.16.17 decamelize: 6.0.0 edge-paths: 3.0.5 node-fetch: 3.3.2 unzipper: 0.10.14 - which: 3.0.1 + which: 4.0.0 dev: true /ejs@3.1.9: @@ -2758,8 +2732,8 @@ packages: jake: 10.8.5 dev: true - /electron-to-chromium@1.4.392: - resolution: {integrity: sha512-TXQOMW9tnhIms3jGy/lJctLjICOgyueZFJ1KUtm6DTQ+QpxX3p7ZBwB6syuZ9KBuT5S4XX7bgY1ECPgfxKUdOg==} + /electron-to-chromium@1.4.581: + resolution: {integrity: sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==} dev: true /emittery@0.13.1: @@ -2792,48 +2766,34 @@ packages: is-arrayish: 0.2.1 dev: true - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true - - /esbuild@0.19.1: - resolution: {integrity: sha512-IknHHwV4B/H4imOAu+416fuCvPfRjdncoyGi7eunhSvHuHkdNs50sLWan2LEG2Mym07TuW6gJUIyRS9G1miHEg==} + /esbuild@0.19.5: + resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.19.1 - '@esbuild/android-arm64': 0.19.1 - '@esbuild/android-x64': 0.19.1 - '@esbuild/darwin-arm64': 0.19.1 - '@esbuild/darwin-x64': 0.19.1 - '@esbuild/freebsd-arm64': 0.19.1 - '@esbuild/freebsd-x64': 0.19.1 - '@esbuild/linux-arm': 0.19.1 - '@esbuild/linux-arm64': 0.19.1 - '@esbuild/linux-ia32': 0.19.1 - '@esbuild/linux-loong64': 0.19.1 - '@esbuild/linux-mips64el': 0.19.1 - '@esbuild/linux-ppc64': 0.19.1 - '@esbuild/linux-riscv64': 0.19.1 - '@esbuild/linux-s390x': 0.19.1 - '@esbuild/linux-x64': 0.19.1 - '@esbuild/netbsd-x64': 0.19.1 - '@esbuild/openbsd-x64': 0.19.1 - '@esbuild/sunos-x64': 0.19.1 - '@esbuild/win32-arm64': 0.19.1 - '@esbuild/win32-ia32': 0.19.1 - '@esbuild/win32-x64': 0.19.1 + '@esbuild/android-arm': 0.19.5 + '@esbuild/android-arm64': 0.19.5 + '@esbuild/android-x64': 0.19.5 + '@esbuild/darwin-arm64': 0.19.5 + '@esbuild/darwin-x64': 0.19.5 + '@esbuild/freebsd-arm64': 0.19.5 + '@esbuild/freebsd-x64': 0.19.5 + '@esbuild/linux-arm': 0.19.5 + '@esbuild/linux-arm64': 0.19.5 + '@esbuild/linux-ia32': 0.19.5 + '@esbuild/linux-loong64': 0.19.5 + '@esbuild/linux-mips64el': 0.19.5 + '@esbuild/linux-ppc64': 0.19.5 + '@esbuild/linux-riscv64': 0.19.5 + '@esbuild/linux-s390x': 0.19.5 + '@esbuild/linux-x64': 0.19.5 + '@esbuild/netbsd-x64': 0.19.5 + '@esbuild/openbsd-x64': 0.19.5 + '@esbuild/sunos-x64': 0.19.5 + '@esbuild/win32-arm64': 0.19.5 + '@esbuild/win32-ia32': 0.19.5 + '@esbuild/win32-x64': 0.19.5 dev: true /escalade@3.1.1: @@ -2874,18 +2834,6 @@ packages: source-map: 0.6.1 dev: true - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - dev: true - /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2899,18 +2847,19 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.47.0: - resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} + /eslint@8.53.0: + resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - '@eslint-community/regexpp': 4.6.2 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.47.0 - '@humanwhocodes/config-array': 0.11.10 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.53.0 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -2926,7 +2875,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.23.0 graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 @@ -2949,8 +2898,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 dev: true @@ -2984,18 +2933,20 @@ packages: engines: {node: '>=0.10.0'} dev: true - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: true - - /eventemitter-asyncresource@1.0.0: - resolution: {integrity: sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==} - dev: true - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + /execa@3.4.0: + resolution: {integrity: sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==} + engines: {node: ^8.12.0 || >=9.7.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 dev: true /execa@5.1.1: @@ -3013,18 +2964,18 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa@7.1.1: - resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} dependencies: cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 + get-stream: 8.0.1 + human-signals: 5.0.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 + signal-exit: 4.1.0 strip-final-newline: 3.0.0 dev: true @@ -3033,15 +2984,16 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /expect-webdriverio@4.2.7(typescript@5.1.6): - resolution: {integrity: sha512-ulNspQoTct5/0OBfNSNzBKldSgoQxzmHBi/TLtrsLZY5QCZ7svD7Csdtm+YEW6IBg/v8MI7ibiMcpWY9cjcG6A==} + /expect-webdriverio@4.5.1(typescript@5.1.6): + resolution: {integrity: sha512-fwcMpPV/+e0bS+F7+bC1UoQsZYjJTcbA1XhU4VVB2pEZDhNmeuaPrCanA0tLVP8nDya75oegXK7LgPzP3zZR9w==} engines: {node: '>=16 || >=18 || >=20'} dependencies: - expect: 29.6.2 - jest-matcher-utils: 29.6.2 + expect: 29.7.0 + jest-matcher-utils: 29.7.0 + lodash.isequal: 4.5.0 optionalDependencies: - '@wdio/globals': 8.14.3(typescript@5.1.6) - webdriverio: 8.14.3(typescript@5.1.6) + '@wdio/globals': 8.22.1(typescript@5.1.6) + webdriverio: 8.22.1(typescript@5.1.6) transitivePeerDependencies: - bufferutil - devtools @@ -3051,27 +3003,15 @@ packages: - utf-8-validate dev: true - /expect@29.5.0: - resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.5.0 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.6.2 - dev: true - - /expect@29.6.2: - resolution: {integrity: sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==} + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 29.6.2 - '@types/node': 20.4.10 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.2 - jest-message-util: 29.6.2 - jest-util: 29.6.2 + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 dev: true /external-editor@3.1.0: @@ -3092,7 +3032,7 @@ packages: get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.10.0 + '@types/yauzl': 2.10.3 transitivePeerDependencies: - supports-color dev: true @@ -3105,12 +3045,12 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-fifo@1.2.0: - resolution: {integrity: sha512-NcvQXt7Cky1cNau15FWy64IjuO8X0JijhTBBrJj1YlxlDfRkJXNaK9RFUjwpfDPzMdv7wB38jr53l9tkNLxnWg==} + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} dev: true - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3166,7 +3106,7 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.0.4 + flat-cache: 3.1.1 dev: true /filelist@1.0.4: @@ -3182,12 +3122,15 @@ packages: to-regex-range: 5.0.1 dev: true - /find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} + /find-process@1.4.7: + resolution: {integrity: sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==} + hasBin: true dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 + chalk: 4.1.2 + commander: 5.1.0 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color dev: true /find-up@4.1.0: @@ -3214,11 +3157,25 @@ packages: path-exists: 5.0.0 dev: true - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + /fkill@7.2.1: + resolution: {integrity: sha512-eN9cmsIlRdq06wu3m01OOEgQf5Xh/M7REm0jfZ4eL3V3XisjXzfRq3iyqtKS+FhO6wB36FvWRiRGdeSx5KpLAQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + arrify: 2.0.1 + execa: 5.1.1 + pid-port: 0.1.1 + process-exists: 4.1.0 + ps-list: 7.2.0 + taskkill: 3.1.0 + dev: true + + /flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} + engines: {node: '>=12.0.0'} dependencies: - flatted: 3.2.7 + flatted: 3.2.9 + keyv: 4.5.4 rimraf: 3.0.2 dev: true @@ -3227,8 +3184,20 @@ packages: hasBin: true dev: true - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /follow-redirects@1.15.3(debug@4.3.4): + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4(supports-color@8.1.1) dev: true /for-each@0.3.3: @@ -3266,26 +3235,13 @@ packages: fetch-blob: 3.2.0 dev: true - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true - - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - /fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: true /fs-extra@8.1.0: @@ -3301,19 +3257,17 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true dev: true optional: true - /fsrs.js@1.1.0: - resolution: {integrity: sha512-DEihBx081nENpNjrSvCopPVi9Ilh+u+ELYOKQmshfSz+DgC/B0hxFFMQnqy2ibWAm9zjyR/bWvaz86xEA4MIcA==} + /fsrs.js@1.1.1: + resolution: {integrity: sha512-qYHR6v2ngL2IxO1663VZBf1bFQ82Qh1B0Xf+HM2HQ6/xeC3tdGIiw/ZBfKnjTdlJgBxq9m/ozcmfc/8T1ZgFlQ==} engines: {node: '>=10'} - dependencies: - deepcopy: 2.1.0 dev: true /fstream@1.0.12: @@ -3326,12 +3280,8 @@ packages: rimraf: 2.7.1 dev: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true /gaze@1.1.3: @@ -3341,20 +3291,20 @@ packages: globule: 1.3.4 dev: true - /geckodriver@4.2.0: - resolution: {integrity: sha512-I2BlybeMFMzpxHRrh8X4VwP4ys74JHszyUgfezOrbTR7PEybFneDcuEjKIQxKV6vFPmsdwhwF1x8AshdQo56xA==} + /geckodriver@4.2.1: + resolution: {integrity: sha512-4m/CRk0OI8MaANRuFIahvOxYTSjlNAO2p9JmE14zxueknq6cdtB5M9UGRQ8R9aMV0bLGNVHHDnDXmoXdOwJfWg==} engines: {node: ^16.13 || >=18 || >=20} hasBin: true requiresBuild: true dependencies: - '@wdio/logger': 8.11.0 + '@wdio/logger': 8.16.17 decamelize: 6.0.0 http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.1 + https-proxy-agent: 7.0.2 node-fetch: 3.3.2 tar-fs: 3.0.4 unzipper: 0.10.14 - which: 3.0.1 + which: 4.0.0 transitivePeerDependencies: - supports-color dev: true @@ -3369,8 +3319,17 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 dev: true /get-intrinsic@1.2.0: @@ -3403,12 +3362,17 @@ packages: engines: {node: '>=10'} dev: true - /get-uri@6.0.1: - resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /get-uri@6.0.2: + resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==} engines: {node: '>= 14'} dependencies: basic-ftp: 5.0.3 - data-uri-to-buffer: 5.0.1 + data-uri-to-buffer: 6.0.1 debug: 4.3.4(supports-color@8.1.1) fs-extra: 8.1.0 transitivePeerDependencies: @@ -3429,16 +3393,16 @@ packages: is-glob: 4.0.3 dev: true - /glob@10.2.3: - resolution: {integrity: sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==} + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.2.0 - minimatch: 9.0.0 - minipass: 5.0.0 - path-scurry: 1.8.0 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 dev: true /glob@7.1.7: @@ -3474,13 +3438,24 @@ packages: path-is-absolute: 1.0.1 dev: true + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -3492,7 +3467,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.2 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -3510,7 +3485,7 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 dev: true /got@11.8.6: @@ -3520,7 +3495,7 @@ packages: '@sindresorhus/is': 4.6.0 '@szmarczak/http-timer': 4.0.6 '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.0 + '@types/responselike': 1.0.3 cacheable-lookup: 5.0.4 cacheable-request: 7.0.2 decompress-response: 6.0.0 @@ -3537,11 +3512,28 @@ packages: '@sindresorhus/is': 5.3.0 '@szmarczak/http-timer': 5.0.1 cacheable-lookup: 7.0.0 - cacheable-request: 10.2.10 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: true + + /got@13.0.0: + resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} + engines: {node: '>=16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 decompress-response: 6.0.0 form-data-encoder: 2.1.4 get-stream: 6.0.1 - http2-wrapper: 2.2.0 + http2-wrapper: 2.2.1 lowercase-keys: 3.0.0 p-cancelable: 3.0.0 responselike: 3.0.0 @@ -3559,8 +3551,8 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /handlebars@4.7.7: - resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} hasBin: true dependencies: @@ -3572,17 +3564,6 @@ packages: uglify-js: 3.17.4 dev: true - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -3593,41 +3574,27 @@ packages: engines: {node: '>=8'} dev: true - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 dev: true - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: true - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 dev: true - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /hdr-histogram-js@2.0.3: - resolution: {integrity: sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==} + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} dependencies: - '@assemblyscript/loader': 0.10.1 - base64-js: 1.5.1 - pako: 1.0.11 - dev: true - - /hdr-histogram-percentiles-obj@3.0.0: - resolution: {integrity: sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==} + function-bind: 1.1.2 dev: true /he@1.2.0: @@ -3635,15 +3602,11 @@ packages: hasBin: true dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - - /hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /hosted-git-info@7.0.1: + resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - lru-cache: 7.18.3 + lru-cache: 10.0.2 dev: true /html-encoding-sniffer@3.0.0: @@ -3690,8 +3653,8 @@ packages: resolve-alpn: 1.2.1 dev: true - /http2-wrapper@2.2.0: - resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} + /http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} dependencies: quick-lru: 5.1.1 @@ -3708,8 +3671,8 @@ packages: - supports-color dev: true - /https-proxy-agent@7.0.1: - resolution: {integrity: sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==} + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 @@ -3718,14 +3681,19 @@ packages: - supports-color dev: true + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} dev: true /iconv-lite@0.4.24: @@ -3768,8 +3736,8 @@ packages: resolve-cwd: 3.0.0 dev: true - /import-meta-resolve@3.0.0: - resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} + /import-meta-resolve@3.1.1: + resolution: {integrity: sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==} dev: true /imurmurhash@0.1.4: @@ -3777,9 +3745,9 @@ packages: engines: {node: '>=0.8.19'} dev: true - /indent-string@3.2.0: - resolution: {integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==} - engines: {node: '>=4'} + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} dev: true /inflight@1.0.6: @@ -3793,11 +3761,11 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /inquirer@9.2.9: - resolution: {integrity: sha512-0VXHov2GGwWquYxwxlcIcm3yOHvFb2jh/+HkY8/AUXSTWShpo6QJMlSfHi5Xo74NO40UePBM3rQcI3OkzOF/7A==} + /inquirer@9.2.11: + resolution: {integrity: sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==} engines: {node: '>=14.18.0'} dependencies: - '@ljharb/through': 2.3.9 + '@ljharb/through': 2.3.11 ansi-escapes: 4.3.2 chalk: 5.3.0 cli-cursor: 3.1.0 @@ -3836,22 +3804,6 @@ packages: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} dev: true - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-typed-array: 1.1.10 - dev: true - /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true @@ -3869,36 +3821,14 @@ packages: binary-extensions: 2.2.0 dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-core-module@2.12.0: - resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} - dependencies: - has: 1.0.3 - dev: true - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true + hasown: 2.0.0 dev: true /is-extglob@2.1.1: @@ -4035,28 +3965,6 @@ packages: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} dev: true - /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - dev: true - - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - /is2@2.0.9: resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} engines: {node: '>=v0.10.0'} @@ -4078,8 +3986,13 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + /isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} dev: true @@ -4087,21 +4000,34 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.21.8 - '@babel/parser': 7.21.8 + '@babel/core': 7.23.3 + '@babel/parser': 7.23.3 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} + /istanbul-lib-instrument@6.0.1: + resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.3 + '@babel/parser': 7.23.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 supports-color: 7.2.0 dev: true @@ -4110,7 +4036,7 @@ packages: engines: {node: '>=10'} dependencies: debug: 4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color @@ -4124,8 +4050,8 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jackspeak@2.2.0: - resolution: {integrity: sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==} + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 @@ -4138,42 +4064,43 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - async: 3.2.4 + async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 dev: true - /jest-changed-files@29.5.0: - resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: 5.1.1 + jest-util: 29.7.0 p-limit: 3.1.0 dev: true - /jest-circus@29.6.2: - resolution: {integrity: sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==} + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.6.2 - '@jest/expect': 29.6.2 - '@jest/test-result': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.10 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.9.0 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 is-generator-fn: 2.1.0 - jest-each: 29.6.2 - jest-matcher-utils: 29.6.2 - jest-message-util: 29.6.2 - jest-runtime: 29.6.2 - jest-snapshot: 29.6.2 - jest-util: 29.6.2 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 p-limit: 3.1.0 - pretty-format: 29.6.2 - pure-rand: 6.0.2 + pretty-format: 29.7.0 + pure-rand: 6.0.4 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: @@ -4181,8 +4108,8 @@ packages: - supports-color dev: true - /jest-cli@29.6.2(@types/node@20.4.10): - resolution: {integrity: sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==} + /jest-cli@29.7.0(@types/node@20.9.0): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -4191,17 +4118,16 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.6.2 - '@jest/test-result': 29.6.2 - '@jest/types': 29.6.1 + '@jest/core': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.9.0) exit: 0.1.2 - graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.6.2(@types/node@20.4.10) - jest-util: 29.6.2 - jest-validate: 29.6.2 - prompts: 2.4.2 + jest-config: 29.7.0(@types/node@20.9.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -4210,8 +4136,8 @@ packages: - ts-node dev: true - /jest-config@29.6.2(@types/node@20.4.10): - resolution: {integrity: sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==} + /jest-config@29.7.0(@types/node@20.9.0): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -4222,27 +4148,27 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.21.8 - '@jest/test-sequencer': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.10 - babel-jest: 29.6.2(@babel/core@7.21.8) + '@babel/core': 7.23.3 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.9.0 + babel-jest: 29.7.0(@babel/core@7.23.3) chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.6.2 - jest-environment-node: 29.6.2 - jest-get-type: 29.4.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.2 - jest-runner: 29.6.2 - jest-util: 29.6.2 - jest-validate: 29.6.2 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.6.2 + pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -4250,46 +4176,36 @@ packages: - supports-color dev: true - /jest-diff@29.5.0: - resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.6.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 dev: true - /jest-diff@29.6.2: - resolution: {integrity: sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.6.2 - dev: true - - /jest-docblock@29.4.3: - resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each@29.6.2: - resolution: {integrity: sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==} + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.1 + '@jest/types': 29.6.3 chalk: 4.1.2 - jest-get-type: 29.4.3 - jest-util: 29.6.2 - pretty-format: 29.6.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 dev: true - /jest-environment-jsdom@29.6.2: - resolution: {integrity: sha512-7oa/+266AAEgkzae8i1awNEfTfjwawWKLpiw2XesZmaoVVj9u9t8JOYx18cG29rbPNtkUlZ8V4b5Jb36y/VxoQ==} + /jest-environment-jsdom@29.7.0: + resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: canvas: ^2.5.0 @@ -4297,13 +4213,13 @@ packages: canvas: optional: true dependencies: - '@jest/environment': 29.6.2 - '@jest/fake-timers': 29.6.2 - '@jest/types': 29.6.1 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.4.10 - jest-mock: 29.6.2 - jest-util: 29.6.2 + '@types/node': 20.9.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 jsdom: 20.0.3 transitivePeerDependencies: - bufferutil @@ -4311,114 +4227,89 @@ packages: - utf-8-validate dev: true - /jest-environment-node@29.6.2: - resolution: {integrity: sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==} + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.6.2 - '@jest/fake-timers': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.10 - jest-mock: 29.6.2 - jest-util: 29.6.2 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.9.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 dev: true /jest-expect-message@1.1.3: resolution: {integrity: sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==} dev: true - /jest-get-type@29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map@29.6.2: - resolution: {integrity: sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==} + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.1 - '@types/graceful-fs': 4.1.6 - '@types/node': 20.4.10 + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.9.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 - jest-regex-util: 29.4.3 - jest-util: 29.6.2 - jest-worker: 29.6.2 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-leak-detector@29.6.2: - resolution: {integrity: sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.4.3 - pretty-format: 29.6.2 - dev: true - - /jest-matcher-utils@29.5.0: - resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.5.0 - jest-get-type: 29.4.3 - pretty-format: 29.6.2 + fsevents: 2.3.3 dev: true - /jest-matcher-utils@29.6.2: - resolution: {integrity: sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==} + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - chalk: 4.1.2 - jest-diff: 29.6.2 - jest-get-type: 29.4.3 - pretty-format: 29.6.2 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 dev: true - /jest-message-util@29.5.0: - resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.21.4 - '@jest/types': 29.6.1 - '@types/stack-utils': 2.0.1 chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.6.2 - slash: 3.0.0 - stack-utils: 2.0.6 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 dev: true - /jest-message-util@29.6.2: - resolution: {integrity: sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==} + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.21.4 - '@jest/types': 29.6.1 - '@types/stack-utils': 2.0.1 + '@babel/code-frame': 7.22.13 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.5 - pretty-format: 29.6.2 + pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 dev: true - /jest-mock@29.6.2: - resolution: {integrity: sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==} + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.1 - '@types/node': 20.4.10 - jest-util: 29.6.2 + '@jest/types': 29.6.3 + '@types/node': 20.9.0 + jest-util: 29.7.0 dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.6.2): + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -4427,176 +4318,176 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 29.6.2 + jest-resolve: 29.7.0 dev: true - /jest-regex-util@29.4.3: - resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies@29.6.2: - resolution: {integrity: sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==} + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.6.2 + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color dev: true - /jest-resolve@29.6.2: - resolution: {integrity: sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==} + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 29.6.2 - jest-pnp-resolver: 1.2.3(jest-resolve@29.6.2) - jest-util: 29.6.2 - jest-validate: 29.6.2 - resolve: 1.22.2 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 resolve.exports: 2.0.2 slash: 3.0.0 dev: true - /jest-runner@29.6.2: - resolution: {integrity: sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==} + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.6.2 - '@jest/environment': 29.6.2 - '@jest/test-result': 29.6.2 - '@jest/transform': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.10 + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.9.0 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 - jest-docblock: 29.4.3 - jest-environment-node: 29.6.2 - jest-haste-map: 29.6.2 - jest-leak-detector: 29.6.2 - jest-message-util: 29.6.2 - jest-resolve: 29.6.2 - jest-runtime: 29.6.2 - jest-util: 29.6.2 - jest-watcher: 29.6.2 - jest-worker: 29.6.2 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color dev: true - /jest-runtime@29.6.2: - resolution: {integrity: sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==} + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.6.2 - '@jest/fake-timers': 29.6.2 - '@jest/globals': 29.6.2 - '@jest/source-map': 29.6.0 - '@jest/test-result': 29.6.2 - '@jest/transform': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.10 + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.9.0 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-haste-map: 29.6.2 - jest-message-util: 29.6.2 - jest-mock: 29.6.2 - jest-regex-util: 29.4.3 - jest-resolve: 29.6.2 - jest-snapshot: 29.6.2 - jest-util: 29.6.2 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /jest-snapshot@29.6.2: - resolution: {integrity: sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==} + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.8 - '@babel/generator': 7.21.5 - '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.8) - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.8) - '@babel/types': 7.21.5 - '@jest/expect-utils': 29.6.2 - '@jest/transform': 29.6.2 - '@jest/types': 29.6.1 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.8) + '@babel/core': 7.23.3 + '@babel/generator': 7.23.3 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.3) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.3) + '@babel/types': 7.23.3 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.3) chalk: 4.1.2 - expect: 29.6.2 + expect: 29.7.0 graceful-fs: 4.2.11 - jest-diff: 29.6.2 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.6.2 - jest-message-util: 29.6.2 - jest-util: 29.6.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 natural-compare: 1.4.0 - pretty-format: 29.6.2 + pretty-format: 29.7.0 semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true - /jest-util@29.6.2: - resolution: {integrity: sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==} + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.1 - '@types/node': 20.4.10 + '@jest/types': 29.6.3 + '@types/node': 20.9.0 chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 dev: true - /jest-validate@29.6.2: - resolution: {integrity: sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==} + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.1 + '@jest/types': 29.6.3 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 29.4.3 + jest-get-type: 29.6.3 leven: 3.1.0 - pretty-format: 29.6.2 + pretty-format: 29.7.0 dev: true - /jest-watcher@29.6.2: - resolution: {integrity: sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==} + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.6.2 - '@jest/types': 29.6.1 - '@types/node': 20.4.10 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.9.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.6.2 + jest-util: 29.7.0 string-length: 4.0.2 dev: true - /jest-worker@29.6.2: - resolution: {integrity: sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==} + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.4.10 - jest-util: 29.6.2 + '@types/node': 20.9.0 + jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.6.2(@types/node@20.4.10): - resolution: {integrity: sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==} + /jest@29.7.0(@types/node@20.9.0): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -4605,10 +4496,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.6.2 - '@jest/types': 29.6.1 + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.6.2(@types/node@20.4.10) + jest-cli: 29.7.0(@types/node@20.9.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4645,7 +4536,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.10.0 + acorn: 8.11.2 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -4668,7 +4559,7 @@ packages: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.13.0 + ws: 8.14.2 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -4718,13 +4609,13 @@ packages: /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 dev: true - /keyv@4.5.2: - resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 dev: true @@ -4767,21 +4658,12 @@ packages: type-check: 0.4.0 dev: true - /lighthouse-logger@2.0.1: - resolution: {integrity: sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==} - dependencies: - debug: 2.6.9 - marky: 1.2.5 - transitivePeerDependencies: - - supports-color - dev: true - /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lines-and-columns@2.0.3: - resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + /lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true @@ -4789,15 +4671,12 @@ packages: resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} dev: true - /load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} + /locate-app@2.1.0: + resolution: {integrity: sha512-rcVo/iLUxrd9d0lrmregK/Z5Y5NCpSwf9KlMbPpOHmKmdxdQY1Fj8NDQ5QymJTryCsBLqwmniFv2f3JKbk9Bvg==} dependencies: - graceful-fs: 4.2.11 - parse-json: 2.2.0 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 + n12: 0.4.0 + type-fest: 2.13.0 + userhome: 1.0.0 dev: true /locate-path@5.0.0: @@ -4825,24 +4704,13 @@ packages: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} dev: true - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: true - - /lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - dev: true - - /lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: true - /lodash.flattendeep@4.4.0: resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} dev: true - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + requiresBuild: true dev: true /lodash.mapvalues@4.6.0: @@ -4890,10 +4758,10 @@ packages: engines: {node: '>= 0.6.0'} dev: true - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: - get-func-name: 2.0.0 + get-func-name: 2.0.2 dev: true /lowercase-keys@2.0.0: @@ -4906,11 +4774,11 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + /lru-cache@10.0.2: + resolution: {integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==} + engines: {node: 14 || >=16.14} dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 + semver: 7.5.4 dev: true /lru-cache@5.1.1: @@ -4931,14 +4799,9 @@ packages: engines: {node: '>=12'} dev: true - /lru-cache@9.1.1: - resolution: {integrity: sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==} - engines: {node: 14 || >=16.14} - dev: true - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} dependencies: semver: 6.3.0 dev: true @@ -4953,13 +4816,12 @@ packages: tmpl: 1.0.5 dev: true - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true - - /marky@1.2.5: - resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + /md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 dev: true /merge-stream@2.0.0: @@ -5053,9 +4915,9 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} dev: true /mitt@3.0.0: @@ -5111,10 +4973,6 @@ packages: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} dev: true - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -5128,16 +4986,16 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true + /n12@0.4.0: + resolution: {integrity: sha512-p/hj4zQ8d3pbbFLQuN1K9honUxiDDhueOWyFLw/XgBv+wZCE44bcLH4CIcsolOceJQduh4Jf7m/LfaTxyGmGtQ==} + dev: true + /nanoid@3.3.3: resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -5151,41 +5009,13 @@ packages: engines: {node: '>= 0.4.0'} dev: true - /nice-napi@1.0.2: - resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} - os: ['!win32'] - requiresBuild: true - dependencies: - node-addon-api: 3.2.1 - node-gyp-build: 4.6.0 - dev: true - optional: true - - /node-addon-api@3.2.1: - resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} - requiresBuild: true - dev: true - optional: true - /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} dev: true - /node-fetch@2.6.11: - resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -5205,13 +5035,6 @@ packages: formdata-polyfill: 4.0.10 dev: true - /node-gyp-build@4.6.0: - resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} - hasBin: true - requiresBuild: true - dev: true - optional: true - /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true @@ -5220,21 +5043,12 @@ packages: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + /normalize-package-data@6.0.0: + resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.2 - semver: 5.7.1 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data@5.0.0: - resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - hosted-git-info: 6.1.1 - is-core-module: 2.12.0 + hosted-git-info: 7.0.1 + is-core-module: 2.13.1 semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -5272,41 +5086,18 @@ packages: resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==} dev: true - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true - - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /obsidian@1.4.0(@codemirror/state@6.2.0)(@codemirror/view@6.11.1): - resolution: {integrity: sha512-fsZMPlxgflGSBSP6P4BjQi5+0MqZl3h6FEDEZ3CNnweNdDw0doyqN3FMO/PGWfuxPT77WicVwUxekuI3e6eCGg==} + /obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0): + resolution: {integrity: sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==} peerDependencies: '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 dependencies: - '@codemirror/state': 6.2.0 - '@codemirror/view': 6.11.1 + '@codemirror/state': 6.3.1 + '@codemirror/view': 6.22.0 '@types/codemirror': 5.60.8 moment: 2.29.4 dev: true @@ -5331,18 +5122,6 @@ packages: mimic-fn: 4.0.0 dev: true - /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - dev: true - /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -5362,7 +5141,7 @@ packages: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.9.0 + cli-spinners: 2.9.1 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -5385,6 +5164,11 @@ packages: engines: {node: '>=12.20'} dev: true + /p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + dev: true + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -5432,18 +5216,18 @@ packages: engines: {node: '>=6'} dev: true - /pac-proxy-agent@7.0.0: - resolution: {integrity: sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA==} + /pac-proxy-agent@7.0.1: + resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} engines: {node: '>= 14'} dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.0 debug: 4.3.4(supports-color@8.1.1) - get-uri: 6.0.1 + get-uri: 6.0.2 http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.1 + https-proxy-agent: 7.0.2 pac-resolver: 7.0.0 - socks-proxy-agent: 8.0.1 + socks-proxy-agent: 8.0.2 transitivePeerDependencies: - supports-color dev: true @@ -5461,10 +5245,6 @@ packages: resolution: {integrity: sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw==} dev: false - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: true - /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -5478,31 +5258,24 @@ packages: hasBin: true dev: true - /parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - dependencies: - error-ex: 1.3.2 - dev: true - /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 dev: true - /parse-json@7.0.0: - resolution: {integrity: sha512-kP+TQYAzAiVnzOlWOe0diD6L35s9bJh0SCn95PIbZFKrOYuIRQsQkeWEYxzVDuHTt9V9YqvYCJ2Qo4z9wdfZPw==} + /parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} engines: {node: '>=16'} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.13 error-ex: 1.3.2 json-parse-even-better-errors: 3.0.0 - lines-and-columns: 2.0.3 + lines-and-columns: 2.0.4 type-fest: 3.13.1 dev: true @@ -5517,13 +5290,6 @@ packages: entities: 4.5.0 dev: true - /path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie-promise: 2.0.1 - dev: true - /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -5557,17 +5323,8 @@ packages: resolution: {integrity: sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 9.1.1 - minipass: 5.0.0 - dev: true - - /path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - pinkie-promise: 2.0.1 + lru-cache: 10.0.2 + minipass: 7.0.4 dev: true /path-type@4.0.0: @@ -5592,21 +5349,11 @@ packages: engines: {node: '>=8.6'} dev: true - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true - - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + /pid-port@0.1.1: + resolution: {integrity: sha512-boqPJtSgZC6KOgXKNPC+/XR3xwVtpOtaLa7JLcdf8jfVe0ZM2TwllBXxxLUO8GQbOLJ4/hEtf2+L1QCKbaoHUg==} + engines: {node: '>=10'} dependencies: - pinkie: 2.0.4 - dev: true - - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} + execa: 5.1.1 dev: true /pirates@4.0.5: @@ -5614,16 +5361,6 @@ packages: engines: {node: '>= 6'} dev: true - /piscina@3.2.0: - resolution: {integrity: sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==} - dependencies: - eventemitter-asyncresource: 1.0.0 - hdr-histogram-js: 2.0.3 - hdr-histogram-percentiles-obj: 3.0.0 - optionalDependencies: - nice-napi: 1.0.2 - dev: true - /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -5641,26 +5378,17 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier@3.0.1: - resolution: {integrity: sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==} + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} engines: {node: '>=14'} hasBin: true dev: true - /pretty-format@29.5.0: - resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.4.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /pretty-format@29.6.2: - resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.0 + '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 dev: true @@ -5672,13 +5400,15 @@ packages: parse-ms: 2.1.0 dev: true - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /process-exists@4.1.0: + resolution: {integrity: sha512-BBJoiorUKoP2AuM5q/yKwIfT1YWRHsaxjW+Ayu9erLhqKOfnXzzVVML0XTYoQZuI1YvcWKmc1dh06DEy4+KzfA==} + engines: {node: '>=10'} + dependencies: + ps-list: 6.3.0 dev: true - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true /progress@2.0.3: @@ -5701,11 +5431,27 @@ packages: agent-base: 7.1.0 debug: 4.3.4(supports-color@8.1.1) http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.1 + https-proxy-agent: 7.0.2 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.1 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /proxy-agent@6.3.1: + resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4(supports-color@8.1.1) + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 lru-cache: 7.18.3 - pac-proxy-agent: 7.0.0 + pac-proxy-agent: 7.0.1 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.1 + socks-proxy-agent: 8.0.2 transitivePeerDependencies: - supports-color dev: true @@ -5714,8 +5460,14 @@ packages: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: true - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + /ps-list@6.3.0: + resolution: {integrity: sha512-qau0czUSB0fzSlBOQt0bo+I2v6R+xiQdj78e1BR/Qjfl5OHWJ/urXi8+ilw1eHe+5hSeDI1wrwVTgDp2wst4oA==} + engines: {node: '>=8'} + dev: true + + /ps-list@7.2.0: + resolution: {integrity: sha512-v4Bl6I3f2kJfr5o80ShABNHAokIgY+wFDTQfE+X3zWYgSGQOCBeYptLZUpoOALBqO5EawmDN/tjTldJesd0ujQ==} + engines: {node: '>=10'} dev: true /psl@1.9.0: @@ -5729,8 +5481,8 @@ packages: once: 1.4.0 dev: true - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} dev: true @@ -5757,8 +5509,8 @@ packages: - utf-8-validate dev: true - /pure-rand@6.0.2: - resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} + /pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} dev: true /query-selector-shadow-dom@1.0.1: @@ -5792,40 +5544,23 @@ packages: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} - dependencies: - find-up: 1.1.2 - read-pkg: 1.1.0 - dev: true - - /read-pkg-up@10.0.0: - resolution: {integrity: sha512-jgmKiS//w2Zs+YbX039CorlkOp8FIVbSAN8r8GJHDsGlmNPXo+VeHkqAwCiQVTTx5/LwLZTcEw59z3DvcLbr0g==} + /read-pkg-up@10.1.0: + resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} engines: {node: '>=16'} dependencies: find-up: 6.3.0 - read-pkg: 8.0.0 - type-fest: 3.13.1 - dev: true - - /read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.5.0 - path-type: 1.1.0 + read-pkg: 8.1.0 + type-fest: 4.7.1 dev: true - /read-pkg@8.0.0: - resolution: {integrity: sha512-Ajb9oSjxXBw0YyOiwtQ2dKbAA/vMnUPnY63XcCk+mXo0BwIdQEMgZLZiMWGttQHcUhUgbK0mH85ethMPKXxziw==} + /read-pkg@8.1.0: + resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} engines: {node: '>=16'} dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 5.0.0 - parse-json: 7.0.0 - type-fest: 3.13.1 + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.0 + parse-json: 7.1.1 + type-fest: 4.7.1 dev: true /readable-stream@2.3.8: @@ -5849,16 +5584,6 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream@4.4.0: - resolution: {integrity: sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - dev: true - /readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} dependencies: @@ -5923,11 +5648,11 @@ packages: engines: {node: '>=10'} dev: true - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.12.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -6022,36 +5747,35 @@ packages: xmlchars: 2.2.0 dev: true - /selenium-standalone@8.3.0: - resolution: {integrity: sha512-cQVWQGxumvPnyzFNtzFtBfDCbqBsdEnwiOwRyrAzeUqf5ltAp3Z3+2f6asSFbLUQJs2sFuF6PsEyNA+eOzXKxg==} - engines: {node: '>=12.0.0', npm: '>=6.0.0'} + /selenium-standalone@9.3.0: + resolution: {integrity: sha512-Otl+FxKR0lYLu9P8zViRbFhRpS865BtS6FAuLEV1P9LhfA5igZ5HlOlngwLBew5I92MRH2y5mjdcyAmYFsB1DQ==} + engines: {node: '>=12'} hasBin: true dependencies: - commander: 10.0.1 + axios: 0.27.2(debug@4.3.4) + commander: 8.3.0 cross-spawn: 7.0.3 debug: 4.3.4(supports-color@8.1.1) - fs-extra: 10.1.0 + execa: 5.1.1 + find-process: 1.4.7 + fkill: 7.2.1 got: 11.8.6 is-port-reachable: 3.1.0 lodash.mapvalues: 4.6.0 lodash.merge: 4.6.2 + md5: 2.3.0 minimist: 1.2.8 mkdirp: 2.1.6 progress: 2.0.3 - tar-stream: 3.0.0 + tar-stream: 3.1.6 which: 2.0.2 yauzl: 2.10.0 transitivePeerDependencies: - supports-color dev: true - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true @@ -6063,19 +5787,11 @@ packages: lru-cache: 6.0.0 dev: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /serialize-error@8.1.0: - resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} - engines: {node: '>=10'} + /serialize-error@11.0.3: + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} + engines: {node: '>=14.16'} dependencies: - type-fest: 0.20.2 + type-fest: 2.19.0 dev: true /serialize-javascript@6.0.0: @@ -6084,6 +5800,16 @@ packages: randombytes: 2.1.0 dev: true + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: true @@ -6131,8 +5857,8 @@ packages: engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} dev: true - /socks-proxy-agent@8.0.1: - resolution: {integrity: sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==} + /socks-proxy-agent@8.0.2: + resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 @@ -6166,7 +5892,7 @@ packages: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.16 dev: true /spdx-exceptions@2.3.0: @@ -6177,11 +5903,11 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.16 dev: true - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} dev: true /split2@4.2.0: @@ -6212,17 +5938,10 @@ packages: engines: {node: '>= 0.10.0'} dev: true - /streamx@2.13.2: - resolution: {integrity: sha512-+TWqixPhGDXEG9L/XczSbhfkmwAtGs3BJX5QNU6cvno+pOLKeszByWcnaTu6dg8efsTYqR8ZZuXWHhZfgrxMvA==} + /streamx@2.15.4: + resolution: {integrity: sha512-uSXKl88bibiUCQ1eMpItRljCzDENcDx18rsfDmV79r0e/ThfrAwxG4Y2FarQZ2G4/21xcOKmFFd1Hue+ZIDwHw==} dependencies: - fast-fifo: 1.2.0 - queue-tick: 1.0.1 - dev: true - - /streamx@2.15.1: - resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==} - dependencies: - fast-fifo: 1.2.0 + fast-fifo: 1.3.2 queue-tick: 1.0.1 dev: true @@ -6264,13 +5983,6 @@ packages: safe-buffer: 5.2.1 dev: true - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -6285,13 +5997,6 @@ packages: ansi-regex: 6.0.1 dev: true - /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} - dependencies: - is-utf8: 0.2.1 - dev: true - /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} @@ -6312,18 +6017,8 @@ packages: engines: {node: '>=8'} dev: true - /style-mod@4.0.3: - resolution: {integrity: sha512-78Jv8kYJdjbvRwwijtCevYADfsI0lGzYJe4mMFdceO8l75DFFDoqBhR1jVDicDRRaX4//g1u9wKeo+ztc2h1Rw==} - dev: true - - /suffix@0.1.1: - resolution: {integrity: sha512-j5uf6MJtMCfC4vBe5LFktSe4bGyNTBk7I2Kdri0jeLrcv5B9pWfxVa5JQpoxgtR8vaVB7bVxsWgnfQbX5wkhAA==} - engines: {node: '>=4'} - dev: true - - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} + /style-mod@4.1.0: + resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==} dev: true /supports-color@5.5.0: @@ -6347,11 +6042,6 @@ packages: has-flag: 4.0.0 dev: true - /supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - dev: true - /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -6369,31 +6059,20 @@ packages: tar-stream: 3.1.6 dev: true - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true - - /tar-stream@3.0.0: - resolution: {integrity: sha512-O6OfUKBbQOqAhh6owTWmA730J/yZCYcpmZ1DBj2YX51ZQrt7d7NgzrR+CnO9wP6nt/viWZW2XeXLavX3/ZEbEg==} + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} dependencies: b4a: 1.6.4 - bl: 6.0.1 - streamx: 2.13.2 + fast-fifo: 1.3.2 + streamx: 2.15.4 dev: true - /tar-stream@3.1.6: - resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + /taskkill@3.1.0: + resolution: {integrity: sha512-5KcOFzPvd1nGFVrmB7H4+QAWVjYOf//+QTbOj0GpXbqtqbKGWVczG+rq6VhXAtdtlKLTs16NAmHRyF5vbggQ2w==} + engines: {node: '>=8'} dependencies: - b4a: 1.6.4 - fast-fifo: 1.2.0 - streamx: 2.15.1 + arrify: 2.0.1 + execa: 3.4.0 dev: true /tcp-port-used@1.0.2: @@ -6450,7 +6129,7 @@ packages: engines: {node: '>=6'} dependencies: psl: 1.9.0 - punycode: 2.3.0 + punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 dev: true @@ -6463,15 +6142,15 @@ packages: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 dev: true /traverse@0.3.9: resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} dev: true - /ts-api-utils@1.0.1(typescript@5.1.6): - resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} + /ts-api-utils@1.0.3(typescript@5.1.6): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' @@ -6479,7 +6158,7 @@ packages: typescript: 5.1.6 dev: true - /ts-jest@29.1.1(@babel/core@7.21.8)(esbuild@0.19.1)(jest@29.6.2)(typescript@5.1.6): + /ts-jest@29.1.1(@babel/core@7.23.3)(esbuild@0.19.5)(jest@29.7.0)(typescript@5.1.6): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -6500,12 +6179,12 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.21.8 + '@babel/core': 7.23.3 bs-logger: 0.2.6 - esbuild: 0.19.1 + esbuild: 0.19.5 fast-json-stable-stringify: 2.1.0 - jest: 29.6.2(@types/node@20.4.10) - jest-util: 29.6.2 + jest: 29.7.0(@types/node@20.9.0) + jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -6518,13 +6197,6 @@ packages: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} dev: true - /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - dev: true - /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -6547,11 +6219,26 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@2.13.0: + resolution: {integrity: sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==} + engines: {node: '>=12.20'} + dev: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: true + /type-fest@3.13.1: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} dev: true + /type-fest@4.7.1: + resolution: {integrity: sha512-iWr8RUmzAJRfhZugX9O7nZE6pCxDU8CZ3QxsLuTnGcBLJpCaP2ll3s4eMTBoFnU/CeXY/5rfQSuAEsTGJO4y8A==} + engines: {node: '>=16'} + dev: true + /typescript@5.1.6: resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} engines: {node: '>=14.17'} @@ -6573,6 +6260,10 @@ packages: through: 2.3.8 dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -6583,8 +6274,8 @@ packages: engines: {node: '>= 4.0.0'} dev: true - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} dev: true @@ -6603,13 +6294,13 @@ packages: setimmediate: 1.0.5 dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.5): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.5 + browserslist: 4.22.1 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -6617,7 +6308,7 @@ packages: /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 dev: true /url-parse@1.5.10: @@ -6627,17 +6318,22 @@ packages: requires-port: 1.0.0 dev: true + /userhome@1.0.0: + resolution: {integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==} + engines: {node: '>= 0.8.0'} + dev: true + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + /v8-to-istanbul@9.1.3: + resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.18 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 + '@jridgewell/trace-mapping': 0.3.20 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 dev: true /validate-npm-package-license@3.0.4: @@ -6662,8 +6358,8 @@ packages: xml-name-validator: 4.0.0 dev: true - /wait-port@1.0.4: - resolution: {integrity: sha512-w8Ftna3h6XSFWWc2JC5gZEgp64nz8bnaTp5cvzbJSZ53j+omktWTDdwXxEF0jM8YveviLgFWvNGrSvRHnkyHyw==} + /wait-port@1.1.0: + resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} engines: {node: '>=10'} hasBin: true dependencies: @@ -6686,7 +6382,7 @@ packages: defaults: 1.0.4 dev: true - /wdio-chromedriver-service@8.1.1(webdriverio@8.14.3): + /wdio-chromedriver-service@8.1.1(webdriverio@8.22.1): resolution: {integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==} engines: {node: ^16.13 || >=18} peerDependencies: @@ -6699,11 +6395,11 @@ packages: chromedriver: optional: true dependencies: - '@wdio/logger': 8.6.6 + '@wdio/logger': 8.16.17 fs-extra: 11.1.1 split2: 4.2.0 tcp-port-used: 1.0.2 - webdriverio: 8.14.3(typescript@5.1.6) + webdriverio: 8.22.1(typescript@5.1.6) transitivePeerDependencies: - supports-color dev: true @@ -6713,37 +6409,29 @@ packages: engines: {node: '>= 8'} dev: true - /webdriver@8.14.3: - resolution: {integrity: sha512-7hAhzXHuNKkowa2yN0KgNiHVxOOWpBjt0Ql7EBQadlF6wWzSFX8qTdtEBuDk9VcR/ijDE2X9UyptNCU1j83TvQ==} + /webdriver@8.22.1: + resolution: {integrity: sha512-EQY2YjbOZInuvYAqEEP7w7voWSy9cPMt3UB1o1+obKhrD8dkIDZNkPocpZUI59PokqHTXk4zIclV50k1KpyyiA==} engines: {node: ^16.13 || >=18} dependencies: - '@puppeteer/browsers': 1.6.0 - '@types/node': 20.4.10 - '@types/ws': 8.5.4 - '@wdio/config': 8.14.0 - '@wdio/logger': 8.11.0 - '@wdio/protocols': 8.11.0 - '@wdio/types': 8.14.0 - '@wdio/utils': 8.14.0 - chrome-launcher: 1.0.0 - decamelize: 6.0.0 + '@types/node': 20.9.0 + '@types/ws': 8.5.9 + '@wdio/config': 8.22.1 + '@wdio/logger': 8.16.17 + '@wdio/protocols': 8.22.0 + '@wdio/types': 8.21.0 + '@wdio/utils': 8.22.0 deepmerge-ts: 5.1.0 - edgedriver: 5.3.3 - geckodriver: 4.2.0 - get-port: 7.0.0 got: 12.6.1 ky: 0.33.3 - safaridriver: 0.1.0 - wait-port: 1.0.4 - ws: 8.13.0 + ws: 8.14.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /webdriverio@8.14.3(typescript@5.1.6): - resolution: {integrity: sha512-NMVap664xbbPKrVWpcxyTEVmkUadS8wu2eBtT8uMhesLCtaCZjxTF5andHpIEFitKhgHf22SeP++1ZrQpMoRCA==} + /webdriverio@8.22.1(typescript@5.1.6): + resolution: {integrity: sha512-SFqCKM93DPZU5Vn2r9OMi5EFbJHmWnIf8KXZvdzVOkGzQxFDtJ8LDgzwH1/LZxjG9nO+D7y+4wyQl7V24b8L+Q==} engines: {node: ^16.13 || >=18} peerDependencies: devtools: ^8.14.0 @@ -6751,30 +6439,30 @@ packages: devtools: optional: true dependencies: - '@types/node': 20.4.10 - '@wdio/config': 8.14.0 - '@wdio/logger': 8.11.0 - '@wdio/protocols': 8.11.0 + '@types/node': 20.9.0 + '@wdio/config': 8.22.1 + '@wdio/logger': 8.16.17 + '@wdio/protocols': 8.22.0 '@wdio/repl': 8.10.1 - '@wdio/types': 8.14.0 - '@wdio/utils': 8.14.0 - archiver: 5.3.1 - aria-query: 5.1.3 + '@wdio/types': 8.21.0 + '@wdio/utils': 8.22.0 + archiver: 6.0.1 + aria-query: 5.3.0 css-shorthand-properties: 1.1.1 css-value: 0.0.1 - devtools-protocol: 0.0.1170846 + devtools-protocol: 0.0.1213968 grapheme-splitter: 1.0.4 - import-meta-resolve: 3.0.0 + import-meta-resolve: 3.1.1 is-plain-obj: 4.1.0 lodash.clonedeep: 4.5.0 lodash.zip: 4.2.0 - minimatch: 9.0.0 + minimatch: 9.0.3 puppeteer-core: 20.9.0(typescript@5.1.6) query-selector-shadow-dom: 1.0.1 resq: 1.11.0 rgb2hex: 0.2.5 - serialize-error: 8.1.0 - webdriver: 8.14.3 + serialize-error: 11.0.3 + webdriver: 8.22.1 transitivePeerDependencies: - bufferutil - encoding @@ -6819,44 +6507,6 @@ packages: webidl-conversions: 3.0.1 dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - dev: true - - /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} - 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 - dev: true - - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -6865,12 +6515,12 @@ packages: isexe: 2.0.0 dev: true - /which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + /which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} hasBin: true dependencies: - isexe: 2.0.0 + isexe: 3.1.1 dev: true /word-wrap@1.2.3: @@ -6938,6 +6588,19 @@ packages: optional: true dev: true + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -6952,10 +6615,6 @@ packages: engines: {node: '>=10'} dev: true - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true - /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true @@ -7023,16 +6682,6 @@ packages: yargs-parser: 21.1.1 dev: true - /yarn-install@1.0.0: - resolution: {integrity: sha512-VO1u181msinhPcGvQTVMnHVOae8zjX/NSksR17e6eXHRveDvHCF5mGjh9hkN8mzyfnCqcBe42LdTs7bScuTaeg==} - engines: {node: '>=6'} - hasBin: true - dependencies: - cac: 3.0.4 - chalk: 1.1.3 - cross-spawn: 4.0.2 - dev: true - /yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} dependencies: @@ -7050,11 +6699,11 @@ packages: engines: {node: '>=12.20'} dev: true - /zip-stream@4.1.0: - resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==} - engines: {node: '>= 10'} + /zip-stream@5.0.1: + resolution: {integrity: sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==} + engines: {node: '>= 12.0.0'} dependencies: - archiver-utils: 2.1.0 - compress-commons: 4.1.1 + archiver-utils: 4.0.1 + compress-commons: 5.0.1 readable-stream: 3.6.2 dev: true diff --git a/src/Card.ts b/src/Card.ts index b95ce6c6..43a0e338 100644 --- a/src/Card.ts +++ b/src/Card.ts @@ -5,7 +5,7 @@ import { CardListType } from "./Deck"; export class Card { question: Question; cardIdx: number; - + Id?: number; // scheduling get hasSchedule(): boolean { return this.scheduleInfo != null; diff --git a/src/CardSchedule.ts b/src/CardSchedule.ts index bfda1571..3da99a77 100644 --- a/src/CardSchedule.ts +++ b/src/CardSchedule.ts @@ -157,6 +157,10 @@ export class NoteCardScheduleParser { if (scheduling.length === 0) scheduling = [...questionText.matchAll(LEGACY_SCHEDULING_EXTRACTOR)]; + return this.createInfoList(scheduling); + } + + static createInfoList(scheduling: RegExpMatchArray[]) { const result: CardScheduleInfo[] = []; for (let i = 0; i < scheduling.length; i++) { const match: RegExpMatchArray = scheduling[i]; @@ -178,6 +182,27 @@ export class NoteCardScheduleParser { return result; } + static createInfoList_algo(scheduling: RegExpMatchArray[]) { + const result: CardScheduleInfo[] = []; + for (let i = 0; i < scheduling.length; i++) { + const match: RegExpMatchArray = scheduling[i]; + const dueDateNum = parseInt(match[1]); + const interval = parseInt(match[2]); + const ease = parseInt(match[3]); + const dueDate: Moment = window.moment(dueDateNum); + const delayBeforeReviewTicks: number = dueDateNum - globalDateProvider.today.valueOf(); + + const info: CardScheduleInfo = new CardScheduleInfo( + dueDate, + interval, + ease, + delayBeforeReviewTicks, + ); + result.push(info); + } + return result; + } + static removeCardScheduleInfo(questionText: string): string { return questionText.replace(//gm, ""); } diff --git a/src/Events/trackFileEvents.ts b/src/Events/trackFileEvents.ts new file mode 100644 index 00000000..c0d95f9c --- /dev/null +++ b/src/Events/trackFileEvents.ts @@ -0,0 +1,92 @@ +import { Menu, TAbstractFile, TFile, TFolder } from "obsidian"; +import { DataLocation } from "src/dataStore/location_switch"; +import SRPlugin from "src/main"; + +export function registerTrackFileEvents(plugin: SRPlugin) { + plugin.registerEvent( + plugin.app.vault.on("rename", (file, old) => { + const trackFile = plugin.store.getTrackedFile(old); + if (trackFile != null) { + trackFile.rename(file.path); + plugin.store.save(); + } + }), + ); + + plugin.registerEvent( + plugin.app.vault.on("delete", (file) => { + plugin.store.untrackFile(file.path); + plugin.store.save(); + }), + ); + + plugin.registerEvent( + plugin.app.vault.on("modify", async (file: TFile) => { + if (file.extension === "md") { + if (plugin.data.settings.dataLocation === DataLocation.SaveOnNoteFile) { + return; + } + if (plugin.store.isTrackedCardfile(file.path)) { + const trackFile = plugin.store.getTrackedFile(file.path); + const fileText = await plugin.app.vault.read(file); + trackFile.syncNoteCardsIndex(fileText, plugin.data.settings); + } + } + }), + ); +} + +export function addFileMenuEvt(plugin: SRPlugin, menu: Menu, fileish: TAbstractFile) { + const store = plugin.store; + if (plugin.data.settings.dataLocation === DataLocation.SaveOnNoteFile) { + return; + } + if (fileish instanceof TFolder) { + const folder = fileish as TFolder; + + menu.addItem((item) => { + item.setIcon("plus-with-circle"); + item.setTitle("Track All Notes"); + item.onClick(async (_evt) => { + store.trackFilesInFolder(folder); + await store.save(); + plugin.sync(); + }); + }); + + menu.addItem((item) => { + item.setIcon("minus-with-circle"); + item.setTitle("Untrack All Notes"); + item.onClick(async (_evt) => { + store.untrackFilesInFolder(folder); + await store.save(); + plugin.sync(); + }); + }); + } else if (fileish instanceof TFile) { + if (store.isTracked(fileish.path)) { + menu.addItem((item) => { + item.setIcon("minus-with-circle"); + item.setTitle("Untrack Note"); + item.onClick(async (_evt) => { + store.untrackFile(fileish.path); + await store.save(); + if (plugin.reviewFloatBar.isDisplay() && plugin.data.settings.autoNextNote) { + plugin.reviewNextNote(plugin.lastSelectedReviewDeck); + } + // plugin.sync(); + }); + }); + } else { + menu.addItem((item) => { + item.setIcon("plus-with-circle"); + item.setTitle("Track Note"); + item.onClick(async (_evt) => { + store.trackFile(fileish.path); + await store.save(); + plugin.sync(); + }); + }); + } + } +} diff --git a/src/FlashcardReviewSequencer.ts b/src/FlashcardReviewSequencer.ts index 072e43f8..82bd026b 100644 --- a/src/FlashcardReviewSequencer.ts +++ b/src/FlashcardReviewSequencer.ts @@ -8,6 +8,7 @@ import { CardScheduleInfo, ICardScheduleCalculator } from "./CardSchedule"; import { Note } from "./Note"; import { IDeckTreeIterator } from "./DeckTreeIterator"; import { IQuestionPostponementList } from "./QuestionPostponementList"; +import { DataLocation } from "src/dataStore/location_switch"; export interface IFlashcardReviewSequencer { get hasCurrentCard(): boolean; @@ -133,10 +134,12 @@ export class FlashcardReviewSequencer implements IFlashcardReviewSequencer { } async processReview_ReviewMode(response: ReviewResponse): Promise { - this.currentCard.scheduleInfo = this.determineCardSchedule(response, this.currentCard); + if (this.settings.dataLocation === DataLocation.SaveOnNoteFile) { + this.currentCard.scheduleInfo = this.determineCardSchedule(response, this.currentCard); - // Update the source file with the updated schedule - await this.currentQuestion.writeQuestion(this.settings); + // Update the source file with the updated schedule + await this.currentQuestion.writeQuestion(this.settings); + } // Move/delete the card if (response == ReviewResponse.Reset) { diff --git a/src/NoteQuestionParser.ts b/src/NoteQuestionParser.ts index fdd63bc2..40e8219b 100644 --- a/src/NoteQuestionParser.ts +++ b/src/NoteQuestionParser.ts @@ -33,7 +33,7 @@ export class NoteQuestionParser { this.noteFile = noteFile; const noteText: string = await noteFile.read(); let noteTopicPath: TopicPath; - if (this.settings.convertFoldersToDecks) { + if (this.settings.convertFoldersToDecks || this.settings.trackedNoteToDecks) { noteTopicPath = folderTopicPath; } else { const tagList: string[] = noteFile.getAllTags(); diff --git a/src/TopicPath.ts b/src/TopicPath.ts index 23914066..d09c62e2 100644 --- a/src/TopicPath.ts +++ b/src/TopicPath.ts @@ -1,6 +1,8 @@ import { SRSettings } from "src/settings"; import { OBSIDIAN_TAG_AT_STARTOFLINE_REGEX } from "./constants"; import { ISRFile } from "./SRFile"; +import { DataStore } from "src/dataStore/data"; +import { DataLocation } from "src/dataStore/location_switch"; export class TopicPath { path: string[]; @@ -38,7 +40,11 @@ export class TopicPath { return result; } - static getTopicPathOfFile(noteFile: ISRFile, settings: SRSettings): TopicPath { + static getTopicPathOfFile( + noteFile: ISRFile, + settings: SRSettings, + store?: DataStore, + ): TopicPath { let deckPath: string[] = []; let result: TopicPath = TopicPath.emptyPath; @@ -61,8 +67,34 @@ export class TopicPath { } } } - } + if (result.isEmptyPath && settings.trackedNoteToDecks) { + outer: for (const tagToReview of this.getTopicPathsFromTagList( + settings.tagsToReview, + )) { + for (const tag of tagList) { + if (tagToReview.isSameOrAncestorOf(tag)) { + result = tag; + break outer; + } + } + } + if (settings.dataLocation !== DataLocation.SaveOnNoteFile && store != undefined) { + if (result.isEmptyPath) { + if (store.isTracked(noteFile.path)) { + let deckName = store.getFileLasTag(noteFile.path); + if (deckName == null) { + deckName = store.defaultDackName; + } else if (TopicPath.isValidTag(deckName)) { + deckName = deckName.slice(1); + } + deckPath = deckName.split("/"); + result = new TopicPath(deckPath); + } + } + } + } + } return result; } diff --git a/src/algorithms.ts b/src/algorithms.ts deleted file mode 100644 index 38d09037..00000000 --- a/src/algorithms.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { RepetitionItem, ReviewResult } from "./data"; -import SRPlugin from "./main"; -import { MiscUtils } from "./utils_recall"; - -export default abstract class SrsAlgorithm { - settings: any; - plugin: SRPlugin; - - updateSettings(plugin: SRPlugin, settings: any) { - this.settings = MiscUtils.assignOnly(this.defaultSettings(), settings); - this.plugin = plugin; - } - - abstract defaultSettings(): any; - abstract defaultData(): any; - abstract onSelection(item: RepetitionItem, option: string, repeat: boolean): ReviewResult; - abstract calcAllOptsIntervals(item: RepetitionItem): number[]; - abstract srsOptions(): string[]; - abstract displaySettings(containerEl: HTMLElement, update: (settings: any) => void): void; -} diff --git a/src/algorithms/algorithms.ts b/src/algorithms/algorithms.ts new file mode 100644 index 00000000..bc15bc40 --- /dev/null +++ b/src/algorithms/algorithms.ts @@ -0,0 +1,44 @@ +import { algorithmNames } from "./algorithms_switch"; +import { RPITEMTYPE, ReviewResult } from "src/dataStore/data"; +import SRPlugin from "../main"; +import { MiscUtils } from "src/util/utils_recall"; +import { RepetitionItem } from "src/dataStore/repetitionItem"; + +export default abstract class SrsAlgorithm { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + settings: any; + plugin: SRPlugin; + public static instance: SrsAlgorithm; + + public static getInstance(): SrsAlgorithm { + if (!SrsAlgorithm.instance) { + // SrsAlgorithm.instance = new SrsAlgorithm(); + throw Error("there is not algorithm instance."); + } + return SrsAlgorithm.instance; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + updateSettings(plugin: SRPlugin, settings: any) { + this.settings = MiscUtils.assignOnly(this.defaultSettings(), settings); + this.plugin = plugin; + SrsAlgorithm.instance = plugin.algorithm; + } + + getDueDates(itemType: RPITEMTYPE) { + const dueDates = + itemType === RPITEMTYPE.NOTE + ? this.plugin.noteStats.delayedDays.dict + : this.plugin.cardStats.delayedDays.dict; + return dueDates; + } + + abstract defaultSettings(): unknown; + abstract defaultData(): unknown; + abstract onSelection(item: RepetitionItem, option: string, repeat: boolean): ReviewResult; + abstract calcAllOptsIntervals(item: RepetitionItem): number[]; + abstract srsOptions(): string[]; + abstract importer(fromAlgo: algorithmNames, items: RepetitionItem[]): void; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + abstract displaySettings(containerEl: HTMLElement, update: (settings: any) => void): void; +} diff --git a/src/algorithms/algorithms_switch.ts b/src/algorithms/algorithms_switch.ts new file mode 100644 index 00000000..a7bf1311 --- /dev/null +++ b/src/algorithms/algorithms_switch.ts @@ -0,0 +1,74 @@ +import { Notice } from "obsidian"; +import SrsAlgorithm from "src/algorithms/algorithms"; +import SRPlugin from "src/main"; +import { AnkiAlgorithm } from "./anki"; +import { FsrsAlgorithm } from "./fsrs"; +import { DefaultAlgorithm } from "./scheduling_default"; +import { Sm2Algorithm } from "./supermemo"; + +export const algorithms: Record = { + Default: new DefaultAlgorithm(), + Anki: new AnkiAlgorithm(), + Fsrs: new FsrsAlgorithm(), + SM2: new Sm2Algorithm(), +}; + +export enum algorithmNames { + Default = "Default", + Anki = "Anki", + Fsrs = "Fsrs", + SM2 = "SM2", +} + +/** + * algorithmSwitchData + * @param fromAlgo + * @param toAlgo + * @returns Promise return true if switchData success. + */ +export async function algorithmSwitchData( + plugin: SRPlugin, + fromAlgo: algorithmNames, + toAlgo: algorithmNames, +): Promise { + // const plugin = this.plugin; + const store = plugin.store; + const items = store.data.items; + + const old_path = store.dataPath; + const bak_path = old_path + "." + fromAlgo + ".bak"; + + await store.save(bak_path); + await store.pruneData(); + await store.verifyItems(); + const fromTo = " from " + fromAlgo + " to: " + toAlgo; + try { + const algo = algorithms[toAlgo]; + algo.updateSettings(plugin, plugin.data.settings.algorithmSettings[toAlgo]); + algo.importer(fromAlgo, items); + if (toAlgo === algorithmNames.Fsrs) { + store.data.items.find((item) => { + if (Object.prototype.hasOwnProperty.call(item.data, "ease")) { + throw new Error("conv to fsrs failed"); + } + }); + } else if (fromAlgo === algorithmNames.Fsrs) { + store.data.items.find((item) => { + if (Object.prototype.hasOwnProperty.call(item.data, "state")) { + throw new Error("conv to fsrs failed"); + } + }); + } + + await store.save(); + const msg = fromTo + "转换完成,因算法参数不同,会导致后续复习间隔调整"; + new Notice(msg); + console.debug(msg); + return true; + } catch (error) { + await store.load(bak_path); + new Notice(error + fromTo + "转换失败,已恢复旧算法及数据" + "please issue it."); + console.log(error); + return false; + } +} diff --git a/src/algorithms/anki.ts b/src/algorithms/anki.ts index bf670b54..aa08a546 100644 --- a/src/algorithms/anki.ts +++ b/src/algorithms/anki.ts @@ -1,8 +1,12 @@ import { Setting, Notice } from "obsidian"; -import { DateUtils, MiscUtils } from "src/utils_recall"; -import SrsAlgorithm from "./../algorithms"; -import { RepetitionItem, ReviewResult } from "./../data"; +import { DateUtils, MiscUtils } from "src/util/utils_recall"; +import SrsAlgorithm from "./algorithms"; +import { ReviewResult } from "src/dataStore/data"; import deepcopy from "deepcopy"; +import { algorithmNames } from "./algorithms_switch"; +import { FsrsData } from "./fsrs"; +import { balance } from "./balance/balance"; +import { RepetitionItem } from "src/dataStore/repetitionItem"; export interface AnkiData { ease: number; @@ -10,9 +14,9 @@ export interface AnkiData { iteration: number; } -interface AnkiSettings { +export interface AnkiSettings { easyBonus: number; - startingEase: number; + baseEase: number; lapseInterval: number; graduatingInterval: number; easyInterval: number; @@ -25,10 +29,11 @@ const AnkiOptions: string[] = ["Again", "Hard", "Good", "Easy"]; * https://faqs.ankiweb.net/what-spaced-repetition-algorithm.html */ export class AnkiAlgorithm extends SrsAlgorithm { + settings: AnkiSettings; defaultSettings(): AnkiSettings { return { easyBonus: 1.3, - startingEase: 2.5, + baseEase: 2.5, lapseInterval: 0.5, graduatingInterval: 1, easyInterval: 4, @@ -37,7 +42,7 @@ export class AnkiAlgorithm extends SrsAlgorithm { defaultData(): AnkiData { return { - ease: this.settings.startingEase, + ease: this.settings.baseEase, lastInterval: 0, iteration: 1, }; @@ -100,12 +105,18 @@ export class AnkiAlgorithm extends SrsAlgorithm { // Graduation! nextInterval = this.settings.easyInterval; } else { + if (data.lastInterval < 1) { + data.lastInterval += 1; + } else if (data.lastInterval - this.settings.easyInterval < 1) { + data.lastInterval = this.settings.easyInterval; + } nextInterval = data.lastInterval * data.ease * this.settings.easyBonus; } } data.ease = MiscUtils.fixed(data.ease, 3); data.iteration += 1; + nextInterval = balance(nextInterval, this.getDueDates(item.itemType)); data.lastInterval = nextInterval; return { @@ -114,6 +125,56 @@ export class AnkiAlgorithm extends SrsAlgorithm { }; } + importer(fromAlgo: algorithmNames, items: RepetitionItem[]): void { + switch (fromAlgo) { + case algorithmNames.Default: + this.importer_Defualt(items); + break; + case algorithmNames.Anki: + case algorithmNames.SM2: + console.log("use same data, don't have to convert."); + break; + case algorithmNames.Fsrs: + this.importer_Fsrs(items); + break; + default: + throw Error(fromAlgo + "can't import to Anki"); + break; + } + } + private importer_Defualt(items: RepetitionItem[]): void { + items.map((item) => { + if (item != null && item.data != null) { + const data = item.data as AnkiData; + data.ease /= 100; + } + }); + } + + private importer_Fsrs(items: RepetitionItem[]): void { + // const plugin = this.plugin; + // this.updateSettings( + // plugin, + // plugin.data.settings.algorithmSettings[algorithmNames.Anki], + // ); + items.forEach((item) => { + if (item != null && item.data != null) { + const data = item.data as FsrsData; + const lastitval = data.scheduled_days; + const iter = data.reps; + const newdata = this.defaultData() as AnkiData; + newdata.lastInterval = + lastitval > newdata.lastInterval + ? lastitval + : iter > 1 + ? this.settings.graduatingInterval + : newdata.lastInterval; + newdata.iteration = iter; + item.data = deepcopy(newdata); + } + }); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any displaySettings(containerEl: HTMLElement, update: (settings: any) => void) { containerEl.createDiv().innerHTML = @@ -124,7 +185,7 @@ export class AnkiAlgorithm extends SrsAlgorithm { .addText((text) => text .setPlaceholder("Starting Ease") - .setValue(this.settings.startingEase.toString()) + .setValue(this.settings.baseEase.toString()) .onChange((newValue) => { const ease = Number(newValue); @@ -137,7 +198,7 @@ export class AnkiAlgorithm extends SrsAlgorithm { new Notice("Starting ease lower than 1.3 is not recommended."); } - this.settings.startingEase = ease; + this.settings.baseEase = ease; update(this.settings); }), ); diff --git a/src/algorithms/balance/balance.ts b/src/algorithms/balance/balance.ts new file mode 100644 index 00000000..856fe34f --- /dev/null +++ b/src/algorithms/balance/balance.ts @@ -0,0 +1,64 @@ +import { Notice } from "obsidian"; + +/** + * balance review counts in a day, return new interval day. + * @param interval days till next review + * @param dueDates + * @param maximumInterval default = 36525 + * @returns + */ +export function balance( + interval: number, + dueDates: Record, + maximumInterval: number = 36525, + lowestCount: number = 10, + tolerance: number = 5, +): number { + // replaces random fuzz with load balancing over the fuzz interval + const beforeIntvl = interval; + let isChange = false; + if (dueDates !== undefined) { + interval = Math.round(interval); + // const due = window.moment().add(interval,"days"); + // const nowToday = window.moment().endOf("day").valueOf(); + // interval= Math.ceil((due.valueOf() - nowToday) / DateUtils.DAYS_TO_MILLIS); + if (!Object.prototype.hasOwnProperty.call(dueDates, interval)) { + dueDates[interval] = 0; + } else if (dueDates[interval] >= lowestCount) { + // disable fuzzing for small intervals + if (interval > 4) { + let fuzz = 0; + if (interval < 7) fuzz = 1; + else if (interval < 30) fuzz = Math.max(2, Math.floor(interval * 0.15)); + else fuzz = Math.max(4, Math.floor(interval * 0.05)); + + const originalInterval = interval; + outer: for (let i = 1; i <= fuzz; i++) { + for (const ivl of [originalInterval - i, originalInterval + i]) { + if (!Object.prototype.hasOwnProperty.call(dueDates, ivl)) { + dueDates[ivl] = 0; + interval = ivl; + isChange = true; + break outer; + } + if (dueDates[ivl] < dueDates[interval] - tolerance) { + interval = ivl; + isChange = true; + } + } + } + } + } + + dueDates[interval]++; + } + interval = Math.min(interval, maximumInterval); + if (isChange) { + const msg = `balance: interval from ${beforeIntvl} balance to ${interval} days.`; + console.debug(msg); + new Notice(msg); + } else { + interval = beforeIntvl; + } + return interval; +} diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index 16ecd264..578f5bb7 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -1,11 +1,16 @@ import { Setting, Notice } from "obsidian"; -import { DateUtils } from "src/utils_recall"; -import SrsAlgorithm from "../algorithms"; -import { RepetitionItem, ReviewResult } from "../data"; +import { DateUtils } from "src/util/utils_recall"; +import SrsAlgorithm from "./algorithms"; +import { ReviewResult } from "../dataStore/data"; import * as fsrsjs from "fsrs.js"; import { t } from "src/lang/helpers"; import deepcopy from "deepcopy"; +import { algorithmNames } from "./algorithms_switch"; +import { AnkiData } from "./anki"; +import { Rating, ReviewLog } from "fsrs.js"; +import { balance } from "./balance/balance"; +import { RepetitionItem } from "src/dataStore/repetitionItem"; // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/Settings.ts let applyDebounceTimer = 0; @@ -25,7 +30,17 @@ export class RevLog { review_duration = 0; tag = ""; - constructor() { + constructor(item: RepetitionItem = null, reviewLog: ReviewLog = null, duration: number = 0) { + if (item) { + this.card_id = item.ID; + this.tag = item.deckName; + } + if (reviewLog) { + this.review_time = reviewLog.review.getTime(); + this.review_rating = reviewLog.rating; + this.review_state = reviewLog.state; + } + this.review_duration = duration; return; } @@ -50,6 +65,7 @@ const FsrsOptions: string[] = ["Again", "Hard", "Good", "Easy"]; * https://github.com/open-spaced-repetition/fsrs.js */ export class FsrsAlgorithm extends SrsAlgorithm { + settings: FsrsSettings; fsrs = new fsrsjs.FSRS(); card = new fsrsjs.Card(); @@ -86,7 +102,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { } getLogfilepath() { - const filepath = this.plugin.store.getStorePath(); + const filepath = this.plugin.store.dataPath; const fder_index = filepath.lastIndexOf("/"); this.logfilepath = filepath.substring(0, fder_index + 1) + this.filename; } @@ -123,7 +139,12 @@ export class FsrsAlgorithm extends SrsAlgorithm { this.review_duration = new Date().getTime(); return intvls; } - onSelection(item: RepetitionItem, optionStr: string, repeat: boolean): ReviewResult { + onSelection( + item: RepetitionItem, + optionStr: string, + repeat: boolean, + log: boolean = true, + ): ReviewResult { let data = item.data as FsrsData; data.due = new Date(data.due); data.last_review = new Date(data.last_review); @@ -160,12 +181,18 @@ export class FsrsAlgorithm extends SrsAlgorithm { //Get the state for card: // state = card.state; - //Get the review log after rating `Good`: - // review_log = scheduling_cards[2].review_log; - - const nextInterval = data.due.valueOf() - data.last_review.valueOf(); + // Get the review log after rating : + if (log) { + const review_log = scheduling_cards[response].review_log; + this.appendRevlog(item, review_log); + } - this.appendRevlog(now, item, response); + let nextInterval = data.due.valueOf() - data.last_review.valueOf(); + // not sure should use balance or not. + let days = nextInterval / DateUtils.DAYS_TO_MILLIS; + days = balance(days, this.getDueDates(item.itemType)); + nextInterval = days * DateUtils.DAYS_TO_MILLIS; + data.due = new Date(nextInterval + now.getTime()); return { correct, @@ -179,7 +206,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { * @param cid 对应数据项ID * @param rating */ - async appendRevlog(now: Date, item: RepetitionItem, rating: number) { + async appendRevlog(item: RepetitionItem, reviewLog: ReviewLog) { if (this.settings.revlog_tags.length > 0) { if (item.deckName.includes("/")) { if ( @@ -195,18 +222,10 @@ export class FsrsAlgorithm extends SrsAlgorithm { } } - const plugin = this.plugin; - const adapter = plugin.app.vault.adapter; - const rlog = new RevLog(); - rlog.card_id = item.ID; - rlog.review_time = now.getTime(); - rlog.review_rating = rating; - const carddata = item.data as FsrsData; - rlog.review_duration = - this.review_duration > 0 ? new Date().getTime() - this.review_duration : 0; + const adapter = app.vault.adapter; + const duration = this.review_duration > 0 ? new Date().getTime() - this.review_duration : 0; this.review_duration = 0; - rlog.review_state = carddata.state; - rlog.tag = item.deckName; + const rlog = new RevLog(item, reviewLog, duration); let data = Object.values(rlog).join(this.REVLOG_sep); data += "\n"; @@ -224,8 +243,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { * @param rating */ reWriteRevlog(data: string, withTitle = false) { - const plugin = this.plugin; - const adapter = plugin.app.vault.adapter; + const adapter = app.vault.adapter; if (withTitle) { data = this.REVLOG_TITLE + data; @@ -234,8 +252,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { } async readRevlog() { - const plugin = this.plugin; - const adapter = plugin.app.vault.adapter; + const adapter = app.vault.adapter; let data = ""; if (await adapter.exists(this.logfilepath)) { data = await adapter.read(this.logfilepath); @@ -243,6 +260,69 @@ export class FsrsAlgorithm extends SrsAlgorithm { return data; } + importer(fromAlgo: algorithmNames, items: RepetitionItem[]): void { + // const plugin = this.plugin; + // const store = plugin.store; + const options = this.srsOptions(); + // this.updateSettings(plugin, plugin.data.settings.algorithmSettings[algorithmNames.Fsrs]); + const initItvl = this.settings.w[4]; + items.forEach((item) => { + if (item != null && item.data != null) { + const reps = item.timesReviewed; + let card = this.defaultData() as FsrsData; + if (reps > 0) { + const data = item.data as AnkiData; + const due = new Date(item.nextReview); + const interval = data.lastInterval; + const lastview = new Date( + item.nextReview - data.lastInterval * DateUtils.DAYS_TO_MILLIS, + ); + + let opt: string; + item.data = card; + if (interval > initItvl * 3) { + // card.state = State.Learning; + // in case the param is to big. + opt = options[Rating.Easy - 1]; + this.onSelection(item, opt, false, false); + } + if (interval > initItvl) { + opt = options[Rating.Easy - 1]; + this.onSelection(item, opt, false, false); + } + opt = options[Rating.Good - 1]; + this.onSelection(item, opt, false, false); + + card = item.data as FsrsData; + card.due = due; + card.scheduled_days = interval; + card.reps = reps; + card.last_review = lastview; + } else { + item.data = card; + } + // item.data = deepcopy(card); + if ( + card.difficulty === 0 || + card.difficulty == null || + card.stability === 0 || + card.stability == null + ) { + if (reps > 0) { + const show = [item.ID, card, reps]; + console.warn("data switch: d, s" + card.difficulty + ", " + card.stability); + console.warn(...show); + } + } + } + }); + items.some((item) => { + if (Object.prototype.hasOwnProperty.call(item.data, "ease")) { + throw new Error("conv to fsrs failed"); + } + }); + } + displaySettings(containerEl: HTMLElement, update: (settings: FsrsSettings) => void) { if (!this.initFlag) { this.getLogfilepath(); @@ -287,10 +367,13 @@ export class FsrsAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.request_retention = this.defaultSettings().request_retention; - this.fsrs.p.request_retention = this.settings.request_retention; - update(this.settings); - this.plugin.settingTab.display(); + applySettingsUpdate(async () => { + this.settings.request_retention = + this.defaultSettings().request_retention; + this.fsrs.p.request_retention = this.settings.request_retention; + update(this.settings); + // this.plugin.settingTab.display(); + }); }); }); @@ -323,10 +406,11 @@ export class FsrsAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.maximum_interval = this.fsrs.p.maximum_interval = - this.defaultSettings().maximum_interval; - update(this.settings); - this.plugin.settingTab.display(); + applySettingsUpdate(async () => { + this.settings.maximum_interval = this.fsrs.p.maximum_interval = + this.defaultSettings().maximum_interval; + update(this.settings); + }); }); }); @@ -358,9 +442,11 @@ export class FsrsAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.w = this.fsrs.p.w = this.defaultSettings().w; - update(this.settings); - this.plugin.settingTab.display(); + applySettingsUpdate(async () => { + this.settings.w = this.fsrs.p.w = this.defaultSettings().w; + update(this.settings); + // this.plugin.settingTab.display(); + }); }); }) .settingEl.querySelector(".setting-item-description").innerHTML = diff --git a/src/algorithms/priorities/linkPageranks.ts b/src/algorithms/priorities/linkPageranks.ts new file mode 100644 index 00000000..16a1a795 --- /dev/null +++ b/src/algorithms/priorities/linkPageranks.ts @@ -0,0 +1,87 @@ +import { TFile } from "obsidian"; +import { NoteEaseList } from "src/NoteEaseList"; +import * as graph from "pagerank.js"; +import { LinkStat } from "src/main"; +import { SRSettings } from "src/settings"; + +export function updategraphLink(incomingLinks: Record, noteFile: TFile) { + if (incomingLinks[noteFile.path] === undefined) { + incomingLinks[noteFile.path] = []; + } + + const links = app.metadataCache.resolvedLinks[noteFile.path] || {}; + for (const targetPath in links) { + if (incomingLinks[targetPath] === undefined) incomingLinks[targetPath] = []; + + // markdown files only + if (targetPath.split(".").pop().toLowerCase() === "md") { + incomingLinks[targetPath].push({ + sourcePath: noteFile.path, + linkCount: links[targetPath], + }); + + graph.link(noteFile.path, targetPath, links[targetPath]); + } + } +} + +export function calcLinkContribution( + note: TFile, + easeByPath: NoteEaseList, + incomingLinks: Record, + pageranks: Record, + settings: SRSettings, +) { + const algoSettings = settings.algorithmSettings[settings.algorithm]; + const baseEase = algoSettings.baseEase; + let linkTotal = 0, + linkPGTotal = 0, + totalLinkCount = 0; + + for (const statObj of incomingLinks[note.path] || []) { + const ease: number = easeByPath.getEaseByPath(statObj.sourcePath); + if (ease) { + linkTotal += statObj.linkCount * pageranks[statObj.sourcePath] * ease; + linkPGTotal += pageranks[statObj.sourcePath] * statObj.linkCount; + totalLinkCount += statObj.linkCount; + } + } + + const outgoingLinks = app.metadataCache.resolvedLinks[note.path] || {}; + for (const linkedFilePath in outgoingLinks) { + const ease: number = easeByPath.getEaseByPath(linkedFilePath); + if (ease) { + const prank = outgoingLinks[linkedFilePath] * pageranks[linkedFilePath]; + linkTotal += prank * ease; + linkPGTotal += prank; + totalLinkCount += outgoingLinks[linkedFilePath]; + } + } + + // fix: settings.maxLinkFactor will be used in three algorithm, but not show in settings. + const linkContribution: number = + settings.maxLinkFactor * Math.min(1.0, Math.log(totalLinkCount + 0.5) / Math.log(64)); + + let ease: number = baseEase; + ease = + (1.0 - linkContribution) * baseEase + + (totalLinkCount > 0 + ? (linkContribution * linkTotal) / linkPGTotal + : linkContribution * baseEase); + // add note's average flashcard ease if available + if (Object.prototype.hasOwnProperty.call(easeByPath, note.path)) { + ease = (ease + easeByPath.getEaseByPath(note.path)) / 2; + } + ease = Math.round(ease * 100) / 100; + if (isNaN(ease)) { + throw new Error("ease: NaN."); + } + + return { + linkContribution, + totalLinkCount, + linkTotal, + linkPGTotal, + ease, + }; +} diff --git a/src/algorithms/scheduling_default.ts b/src/algorithms/scheduling_default.ts index 44a737d0..1a4c5d8d 100644 --- a/src/algorithms/scheduling_default.ts +++ b/src/algorithms/scheduling_default.ts @@ -1,12 +1,16 @@ import { Notice, Setting } from "obsidian"; -import { DEFAULT_SETTINGS, SRSettings } from "src/settings"; import { t } from "src/lang/helpers"; -import { DateUtils } from "src/utils_recall"; -import SrsAlgorithm from "./../algorithms"; -import { RPITEMTYPE, RepetitionItem, ReviewResult } from "./../data"; +import { DateUtils } from "src/util/utils_recall"; +import SrsAlgorithm from "./algorithms"; +import { ReviewResult } from "src/dataStore/data"; import deepcopy from "deepcopy"; +import { algorithmNames } from "./algorithms_switch"; +import { AnkiData } from "./anki"; +import { FsrsData } from "./fsrs"; +import { balance } from "./balance/balance"; +import { RepetitionItem } from "src/dataStore/repetitionItem"; // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/Settings.ts let applyDebounceTimer = 0; @@ -43,7 +47,7 @@ export function schedule( interval: number, ease: number, delayBeforeReview: number, - settingsObj: SRSettings, + settingsObj: DefaultAlgoSettings, dueDates?: Record, ): Record { delayBeforeReview = Math.max(0, Math.floor(delayBeforeReview / (24 * 3600 * 1000))); @@ -63,41 +67,14 @@ export function schedule( } // replaces random fuzz with load balancing over the fuzz interval - if (dueDates !== undefined) { - interval = Math.round(interval); - if (!Object.prototype.hasOwnProperty.call(dueDates, interval)) { - dueDates[interval] = 0; - } else { - // disable fuzzing for small intervals - if (interval > 4) { - let fuzz = 0; - if (interval < 7) fuzz = 1; - else if (interval < 30) fuzz = Math.max(2, Math.floor(interval * 0.15)); - else fuzz = Math.max(4, Math.floor(interval * 0.05)); - - const originalInterval = interval; - outer: for (let i = 1; i <= fuzz; i++) { - for (const ivl of [originalInterval - i, originalInterval + i]) { - if (!Object.prototype.hasOwnProperty.call(dueDates, ivl)) { - dueDates[ivl] = 0; - interval = ivl; - break outer; - } - if (dueDates[ivl] < dueDates[interval]) interval = ivl; - } - } - } - } - dueDates[interval]++; - } - - interval = Math.min(interval, settingsObj.maximumInterval); + interval = balance(interval, dueDates, settingsObj.maximumInterval); return { interval: Math.round(interval * 10) / 10, ease }; } export class DefaultAlgorithm extends SrsAlgorithm { + settings: DefaultAlgoSettings; defaultSettings(): DefaultAlgoSettings { return { // algorithm @@ -127,10 +104,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { const now: number = Date.now(); const delayBeforeReview = due === 0 ? 0 : now - due; //just in case. // console.log("item.data:", item.data); - const dueDatesNotesorCards = - item.itemType === RPITEMTYPE.NOTE - ? this.plugin.dueDatesNotes - : this.plugin.dueDatesFlashcards; + const dueDatesNotesorCards = this.getDueDates(item.itemType); const intvls: number[] = []; this.srsOptions().forEach((opt, ind) => { @@ -176,7 +150,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { data.ease, delayBeforeReview, this.settings, - this.plugin.dueDatesNotes, + this.getDueDates(item.itemType), ); const nextReview = schedObj.interval; @@ -198,6 +172,47 @@ export class DefaultAlgorithm extends SrsAlgorithm { } } + importer(fromAlgo: algorithmNames, items: RepetitionItem[]): void { + if (fromAlgo === algorithmNames.Anki || fromAlgo === algorithmNames.SM2) { + this.importer_Anki(items); + } else if (fromAlgo === algorithmNames.Fsrs) { + this.importer_Fsrs(items); + } else { + throw Error(fromAlgo + "can't import to Default"); + } + } + + private importer_Anki(items: RepetitionItem[]) { + items.forEach((item) => { + if (item != null && item.data != null) { + const data: AnkiData = item.data as AnkiData; + data.ease *= 100; + if (data.lastInterval === 0) { + data.lastInterval = 1; + } else { + data.lastInterval *= 1; + } + } + }); + } + + private importer_Fsrs(items: RepetitionItem[]) { + // const plugin = this.plugin; + // this.updateSettings(plugin, plugin.data.settings.algorithmSettings[algorithmNames.Default]); + items.forEach((item) => { + if (item != null && item.data != null) { + const data = item.data as FsrsData; + const lastitval = data.scheduled_days; + const iter = data.reps; + const newdata = this.defaultData() as AnkiData; + newdata.lastInterval = + lastitval > newdata.lastInterval ? lastitval : newdata.lastInterval; + newdata.iteration = iter; + item.data = deepcopy(newdata); + } + }); + } + displaySettings( containerEl: HTMLElement, update: (settings: DefaultAlgoSettings) => void, @@ -207,6 +222,9 @@ export class DefaultAlgorithm extends SrsAlgorithm { }); containerEl.createDiv().innerHTML = '用于间隔重复的算法. 更多信息请查阅 anki修改算法.'; + + const DEFAULTSETTINGS = this.defaultSettings(); + new Setting(containerEl) .setName(t("BASE_EASE")) .setDesc(t("BASE_EASE_DESC")) @@ -234,7 +252,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.baseEase = DEFAULT_SETTINGS.baseEase; + this.settings.baseEase = DEFAULTSETTINGS.baseEase; update(this.settings); this.plugin.settingTab.display(); }); @@ -258,7 +276,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.lapsesIntervalChange = DEFAULT_SETTINGS.lapsesIntervalChange; + this.settings.lapsesIntervalChange = DEFAULTSETTINGS.lapsesIntervalChange; update(this.settings); this.plugin.settingTab.display(); }); @@ -291,7 +309,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.easyBonus = DEFAULT_SETTINGS.easyBonus; + this.settings.easyBonus = DEFAULTSETTINGS.easyBonus; update(this.settings); this.plugin.settingTab.display(); }); @@ -324,7 +342,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.maximumInterval = DEFAULT_SETTINGS.maximumInterval; + this.settings.maximumInterval = DEFAULTSETTINGS.maximumInterval; update(this.settings); this.plugin.settingTab.display(); }); @@ -348,7 +366,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.maxLinkFactor = DEFAULT_SETTINGS.maxLinkFactor; + this.settings.maxLinkFactor = DEFAULTSETTINGS.maxLinkFactor; update(this.settings); this.plugin.settingTab.display(); }); diff --git a/src/algorithms/supermemo.ts b/src/algorithms/supermemo.ts index d58924ff..8d3db215 100644 --- a/src/algorithms/supermemo.ts +++ b/src/algorithms/supermemo.ts @@ -1,8 +1,11 @@ -import { DateUtils, MiscUtils } from "src/utils_recall"; -import SrsAlgorithm from "./../algorithms"; -import { RepetitionItem, ReviewResult } from "./../data"; +import { DateUtils, MiscUtils } from "src/util/utils_recall"; +import SrsAlgorithm from "./algorithms"; +import { ReviewResult } from "src/dataStore/data"; import deepcopy from "deepcopy"; -import { AnkiAlgorithm } from "./anki"; +import { AnkiAlgorithm, AnkiSettings } from "./anki"; +import { algorithmNames } from "./algorithms_switch"; +import { balance } from "./balance/balance"; +import { RepetitionItem } from "src/dataStore/repetitionItem"; interface Sm2Data { ease: number; @@ -17,8 +20,8 @@ const Sm2Options: string[] = ["Blackout", "Incorrect", "Incorrect (Easy)", "Hard * https://www.supermemo.com/en/archives1990-2015/english/ol/sm2 */ export class Sm2Algorithm extends SrsAlgorithm { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - defaultSettings(): any { + settings: AnkiSettings; + defaultSettings(): AnkiSettings { return new AnkiAlgorithm().defaultSettings(); } @@ -77,7 +80,7 @@ export class Sm2Algorithm extends SrsAlgorithm { nextReview: nextReview * DateUtils.DAYS_TO_MILLIS, }; } else { - const nextReview = interval(data.iteration); + let nextReview = interval(data.iteration); data.iteration += 1; data.ease = data.ease + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02)); if (data.ease < 1.3) { @@ -85,6 +88,7 @@ export class Sm2Algorithm extends SrsAlgorithm { } data.ease = MiscUtils.fixed(data.ease, 3); + nextReview = balance(nextReview, this.getDueDates(item.itemType)); data.lastInterval = nextReview; // console.log("item.data:", item.data); // console.log("smdata:", data); @@ -95,6 +99,12 @@ export class Sm2Algorithm extends SrsAlgorithm { } } + importer(fromAlgo: algorithmNames, items: RepetitionItem[]): void { + const anki = new AnkiAlgorithm(); + anki.updateSettings(this.plugin, this.settings); + anki.importer(fromAlgo, items); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any displaySettings(containerEl: HTMLElement, update: (settings: any) => void): void { containerEl.createDiv().innerHTML = diff --git a/src/commands.ts b/src/commands.ts index ddd31027..43df3ec1 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -1,5 +1,8 @@ +import { MarkdownView } from "obsidian"; import ObsidianSrsPlugin from "./main"; -// import { ItemInfoModal } from "./modals/info"; +import { ReviewNote } from "src/reviewNote/review-note"; +import { ItemInfoModal } from "src/gui/info"; +import { Queue } from "./dataStore/queue"; export default class Commands { plugin: ObsidianSrsPlugin; @@ -12,16 +15,14 @@ export default class Commands { const plugin = this.plugin; plugin.addCommand({ - id: "track-file", - name: "Track Note", + id: "view-item-info", + name: "Item Info", checkCallback: (checking: boolean) => { const file = plugin.app.workspace.getActiveFile(); - if (file != null) { - if (!plugin.store.isTracked(file.path)) { + if (file) { + if (plugin.store.isTracked(file.path)) { if (!checking) { - plugin.store.trackFile(file.path, "default"); - plugin.store.save(); - // plugin.updateStatusBar(); + new ItemInfoModal(plugin.data.settings, file).open(); } return true; } @@ -31,14 +32,14 @@ export default class Commands { }); plugin.addCommand({ - id: "untrack-file", - name: "Untrack Note", + id: "track-file", + name: "Track Note", checkCallback: (checking: boolean) => { const file = plugin.app.workspace.getActiveFile(); if (file != null) { - if (plugin.store.isTracked(file.path)) { + if (!plugin.store.isTracked(file.path)) { if (!checking) { - plugin.store.untrackFile(file.path); + plugin.store.trackFile(file.path); plugin.store.save(); // plugin.updateStatusBar(); } @@ -50,14 +51,14 @@ export default class Commands { }); plugin.addCommand({ - id: "update-file", - name: "Update Note", + id: "untrack-file", + name: "Untrack Note", checkCallback: (checking: boolean) => { const file = plugin.app.workspace.getActiveFile(); if (file != null) { if (plugin.store.isTracked(file.path)) { if (!checking) { - plugin.store.updateItems(file.path); + plugin.store.untrackFile(file.path); plugin.store.save(); // plugin.updateStatusBar(); } @@ -68,11 +69,30 @@ export default class Commands { }, }); + // plugin.addCommand({ + // id: "update-file", + // name: "Update Note", + // checkCallback: (checking: boolean) => { + // const file = plugin.app.workspace.getActiveFile(); + // if (file != null) { + // if (plugin.store.isTracked(file.path)) { + // if (!checking) { + // plugin.store.updateItems(file.path); + // plugin.store.save(); + // // plugin.updateStatusBar(); + // } + // return true; + // } + // } + // return false; + // }, + // }); + plugin.addCommand({ id: "build-queue", name: "Build Queue", callback: () => { - plugin.store.buildQueue(); + Queue.getInstance().buildQueue(); }, }); @@ -80,41 +100,12 @@ export default class Commands { id: "review-view", name: "Review", callback: () => { - this.recallReviewNote(); + Queue.getInstance().buildQueue(); + ReviewNote.recallReviewNote(this.plugin.data.settings); }, }); } - recallReviewNote() { - const plugin = this.plugin; - this.plugin.store.buildQueue(); - const item = this.plugin.store.getNext(); - const state: any = { mode: "empty" }; - if (item != null) { - const path = this.plugin.store.getFilePath(item); - if (path != null) { - state.file = path; - state.item = this.plugin.store.getNextId(); - // state.mode = "note"; - // state.mode = "question"; - const fid = plugin.store.getFileId(path); - const item = plugin.store.data.items[fid]; - plugin.reviewNoteFloatBar.algoDisplay( - true, - plugin.algorithm.calcAllOptsIntervals(item), - ); - // plugin.reviewNoteFloatBar.algoDisplay(true, plugin.store.calcReviewInterval(fid)); - } - } - const leaf = this.plugin.app.workspace.getLeaf(); - leaf.setViewState({ - type: "markdown", - state: state, - }); - - this.plugin.app.workspace.setActiveLeaf(leaf); - } - addDebugCommands() { console.log("Injecting debug commands..."); const plugin = this.plugin; @@ -123,7 +114,8 @@ export default class Commands { id: "debug-print-view-state", name: "Print View State", callback: () => { - console.log(plugin.app.workspace.activeLeaf.getViewState()); + const state = plugin.app.workspace.getActiveViewOfType(MarkdownView).getState(); + console.log(state); }, }); @@ -135,38 +127,35 @@ export default class Commands { }, }); - plugin.addCommand({ - id: "debug-print-queue", - name: "Print Queue", - callback: () => { - console.log(plugin.store.data.queue); - console.log("There are " + plugin.store.data.queue.length + " items in queue."); - console.log(plugin.store.data.newAdded + " new where added to today."); - console.log("repeatQueue: " + plugin.store.data.repeatQueue); - console.log("cardQueue: " + plugin.store.data.cardQueue); - console.log("cardRepeatQueue: " + plugin.store.data.cardRepeatQueue); - }, - }); - - plugin.addCommand({ - id: "debug-clear-queue", - name: "Clear Queue", - callback: () => { - plugin.store.clearQueue(); - }, - }); + // plugin.addCommand({ + // id: "debug-print-queue", + // name: "Print Queue", + // callback: () => { + // console.log(plugin.store.data); + // console.log(plugin.store.data.queue); + // console.log("There are " + plugin.store.data.queue.length + " items in queue."); + // console.log(plugin.store.data.newAdded + " new where added to today."); + // console.log("repeatQueue: " + plugin.store.data.repeatQueue); + // console.log("cardQueue: " + plugin.store.data.cardQueue); + // console.log("cardRepeatQueue: " + plugin.store.data.cardRepeatQueue); + // }, + // }); + + // plugin.addCommand({ + // id: "debug-clear-queue", + // name: "Clear Queue", + // callback: () => { + // Queue.getInstance().clearQueue(); + // }, + // }); plugin.addCommand({ id: "debug-queue-all", name: "Queue All", callback: () => { - plugin.store.data.queue = []; - for (let i = 0; i < plugin.store.data.items.length; i++) { - if (plugin.store.data.items[i] != null) { - plugin.store.data.queue.push(i); - } - } - console.log("Queue Size: " + plugin.store.queueSize()); + const que = Queue.getInstance(); + que.buildQueueAll(); + console.log("Queue Size: " + que.queueSize()); }, }); @@ -178,23 +167,31 @@ export default class Commands { }, }); - plugin.addCommand({ - id: "debug-reset-data", - name: "Reset Data", - callback: () => { - console.log("Resetting data..."); - plugin.store.resetData(); - console.log(plugin.store.data); - }, - }); + // plugin.addCommand({ + // id: "debug-reset-data", + // name: "Reset Data", + // callback: () => { + // console.log("Resetting data..."); + // plugin.store.resetData(); + // console.log(plugin.store.data); + // }, + // }); + + // plugin.addCommand({ + // id: "debug-prune-data", + // name: "Prune Data", + // callback: () => { + // console.log("Pruning data..."); + // plugin.store.pruneData(); + // console.log(plugin.store.data); + // }, + // }); plugin.addCommand({ - id: "debug-prune-data", - name: "Prune Data", + id: "update-dataItems", + name: "Update Items", callback: () => { - console.log("Pruning data..."); - plugin.store.pruneData(); - console.log(plugin.store.data); + plugin.store.verifyItems(); }, }); } diff --git a/src/constants.ts b/src/constants.ts index e3752c0c..e85f0846 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,6 +1,7 @@ export const SCHEDULING_INFO_REGEX = - /^---\n((?:.*\n)*)sr-due: (.+)\nsr-interval: (\d+)\nsr-ease: (\d+)\n((?:.*\n)?)---\n/; + /^---\n((?:.*\n)*)sr-due: (.+)\nsr-interval: (\d+)\nsr-ease: (\d+)\n((?:.*\n)*)---\n/; export const YAML_FRONT_MATTER_REGEX = /^---\n((?:.*\n)*?)---/; +export const YAML_TAGS_REGEX = /^---\n((?:.*\n)*?)tags?:(.*?(?:\n\s+- .*)*)\n((?:.*\n)*?)---/; export const MULTI_SCHEDULING_EXTRACTOR = /!([\d-]+),(\d+),(\d+)/gm; export const LEGACY_SCHEDULING_EXTRACTOR = //gm; diff --git a/src/data.ts b/src/data.ts deleted file mode 100644 index 367b7563..00000000 --- a/src/data.ts +++ /dev/null @@ -1,2558 +0,0 @@ -import SRPlugin from "./main"; -import { BlockUtils, DateUtils } from "./utils_recall"; -import { DataLocation, SRSettings, algorithmNames, algorithms } from "./settings"; - -import { TFile, TFolder, Notice, getAllTags, FrontMatterCache } from "obsidian"; - -import { ReviewDeck } from "src/review-deck"; -import { CardType, ReviewResponse } from "./scheduling"; -import { parse } from "./parser"; -import { escapeRegexString } from "./utils"; -import deepcopy from "deepcopy"; -import { isArray } from "src/utils_recall"; -import { FsrsData } from "./algorithms/fsrs"; -import { AnkiData } from "./algorithms/anki"; -import { Rating } from "fsrs.js"; -import { - LEGACY_SCHEDULING_EXTRACTOR, - MULTI_SCHEDULING_EXTRACTOR, - SCHEDULING_INFO_REGEX, - YAML_FRONT_MATTER_REGEX, -} from "./constants"; - -const ROOT_DATA_PATH = "./tracked_files.json"; -// const PLUGIN_DATA_PATH = "./.obsidian/plugins/obsidian-spaced-repetition-recall/tracked_files.json"; - -/** - * SrsData. - */ -interface SrsData { - /** - * @type {number[]} - */ - queue: number[]; - /** - * @type {number[]} - */ - repeatQueue: number[]; - /** - * @type {number[]} - */ - cardQueue: number[]; - /** - * @type {number[]} - */ - cardRepeatQueue: number[]; - toDayAllQueue: Record; - toDayLatterQueue: Record; - - /** - * @type {ReviewedCounts} - */ - reviewedCounts: ReviewedCounts; - /** - * @type {ReviewedCounts} - */ - reviewedCardCounts: ReviewedCounts; - /** - * @type {RepetitionItem[]} - */ - items: RepetitionItem[]; - /** - * @type {TrackedFile[]} - */ - trackedFiles: TrackedFile[]; - /** - * @type {number} - */ - lastQueue: number; - /** - * @type {number} - */ - mtime: number; - /** - * @type {0} - */ - newAdded: 0; -} - -export enum RPITEMTYPE { - NOTE = "note", - CARD = "card", -} - -export type ReviewedCounts = Record; - -/** - * RepetitionItem. - */ -export interface RepetitionItem { - /** - * @type {number} - */ - nextReview: number; - /** - * @type {number} - */ - ID: number; - /** - * @type {number} - */ - fileIndex: number; - /** - * @type {RPITEMTYPE} - */ - itemType: RPITEMTYPE; - /** - * @type {string} - */ - deckName: string; - /** - * @type {number} - */ - timesReviewed: number; - /** - * @type {number} - */ - timesCorrect: number; - /** - * @type {number} - */ - errorStreak: number; // Needed to calculate leeches later on. - /** - * @type {any} - */ - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - data: unknown; // Additional data, determined by the selected algorithm. -} - -/** - * TrackedFile. - */ -interface TrackedFile { - /** - * @type {string} - */ - path: string; - /** - * @type {Record} - */ - items: Record; - /** - * @type {CardInfo[]} - */ - cardItems?: CardInfo[]; - /** - * @type {string[]} - */ - tags?: string[]; -} - -/** - * CardInfo - */ -interface CardInfo { - /** - * @type {number} - */ - lineNo: number; - /** - * @type {string} - */ - cardTextHash: string; - /** - * @type {number[]} - */ - itemIds: number[]; -} - -/** - * ReviewResult. - */ -export interface ReviewResult { - /** - * @type {boolean} - */ - correct: boolean; - /** - * @type {number} - */ - nextReview: number; -} - -const DEFAULT_SRS_DATA: SrsData = { - queue: [], - repeatQueue: [], - cardQueue: [], - cardRepeatQueue: [], - toDayAllQueue: {}, - toDayLatterQueue: {}, - reviewedCounts: {}, - reviewedCardCounts: {}, - items: [], - trackedFiles: [], - lastQueue: 0, - mtime: 0, - newAdded: 0, -}; - -const NEW_ITEM: RepetitionItem = { - nextReview: 0, - ID: -1, - fileIndex: -1, - itemType: RPITEMTYPE.NOTE, - deckName: "default", - timesReviewed: 0, - timesCorrect: 0, - errorStreak: 0, - data: {}, -}; - -const DEFAULT_NEW_CARDINFO: CardInfo = { - lineNo: 0, - cardTextHash: "", - itemIds: [], -}; - -/** - * DataStore. - */ -export class DataStore { - /** - * @type {SrsData} - */ - data: SrsData; - /** - * @type {SRPlugin} - */ - plugin: SRPlugin; - /** - * @type {string} - */ - dataPath: string; - - /** - * ms - * @type {number} - */ - EndofToday: number; - /** - * @type {string} - */ - private defaultDeckname = "default"; - - /** - * constructor. - * - * @param {SRPlugin} plugin - */ - constructor(plugin: SRPlugin) { - this.plugin = plugin; - this.dataPath = this.getStorePath(); - this.EndofToday = this._EndofToday(); - } - - /** - * getStorePath. - * - * @returns {string} - */ - getStorePath(): string { - const dir = this.plugin.manifest.dir; - const dataLocation = this.plugin.data.settings.dataLocation; - if (dataLocation == DataLocation.PluginFolder) { - // return PLUGIN_DATA_PATH; - return dir + ROOT_DATA_PATH.substring(1); - } else if (dataLocation == DataLocation.RootFolder) { - return ROOT_DATA_PATH; - } else if (dataLocation == DataLocation.SpecifiedFolder) { - return this.plugin.data.settings.customFolder; - } else if (dataLocation == DataLocation.SaveOnNoteFile) { - // return PLUGIN_DATA_PATH; - return dir + ROOT_DATA_PATH.substring(1); - } - } - - getDefaultDackName() { - return this.defaultDeckname; - } - - /** - * moveStoreLocation. - * - * @returns {boolean} - */ - moveStoreLocation(): boolean { - const adapter = this.plugin.app.vault.adapter; - const plugin = this.plugin; - - const newPath = this.getStorePath(); - if (newPath === this.dataPath) { - return false; - } - let exist = false; - plugin.store.verify(newPath).then((v) => { - exist = v; - if (exist) { - const adapter = this.plugin.app.vault.adapter; - const suffix = "-" + new Date().toISOString().replace(/[:.]/g, ""); - adapter.rename(newPath, newPath + suffix).then(() => { - console.debug("orginal file: " + newPath + " renamed to: " + newPath + suffix); - }); - } - }); - - try { - this.save(newPath); - adapter.remove(this.dataPath).then( - () => { - this.dataPath = newPath; - new Notice("Successfully moved data file!"); - return true; - }, - (e) => { - this.dataPath = newPath; - new Notice("Unable to delete old data file, please delete it manually."); - console.log(e); - return true; - }, - ); - } catch (e) { - new Notice("Unable to move data file!"); - console.log(e); - return false; - } - } - - /** - * load. - */ - async load(path = this.dataPath) { - const adapter = this.plugin.app.vault.adapter; - if (this.plugin.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { - if (await adapter.exists(path)) { - const data = await adapter.read(path); - if (data == null) { - console.log("Unable to read SRS data!"); - this.data = Object.assign({}, DEFAULT_SRS_DATA); - } else { - console.log("Reading tracked files..."); - this.data = Object.assign( - Object.assign({}, DEFAULT_SRS_DATA), - JSON.parse(data), - ); - this.data.mtime = await this.getmtime(); - } - } else { - console.log("Tracked files not found! Creating new file..."); - this.data = Object.assign({}, DEFAULT_SRS_DATA); - await this.save(); - } - } - } - - /** - * re load if tracked_files.json updated by other device. - */ - reLoad() { - // const now: Date = new Date().getTime(); - this.getmtime().then((mtime) => { - if (mtime - this.data.mtime > 10) { - this.load(); - } - }); - } - - /** - * save. - */ - async save(path = this.dataPath) { - await this.plugin.app.vault.adapter.write(path, JSON.stringify(this.data)).catch((e) => { - new Notice("Unable to save data file!"); - console.log(e); - return; - }); - } - - /** - * get file modified time. should only set to data.mtime when load. - * @param path - * @returns - */ - async getmtime(path = this.dataPath) { - const adapter = this.plugin.app.vault.adapter; - const stat = await adapter.stat(path.normalize()); - if (stat != null) { - return stat.mtime; - } else { - return 0; - } - } - - private _EndofToday() { - // end of today - const offsetMinutes = new Date().getTimezoneOffset(); - const nowToday = - Math.ceil(Date.now() / DateUtils.DAYS_TO_MILLIS) * DateUtils.DAYS_TO_MILLIS + - offsetMinutes * 60 * 1000 - - 1; - return nowToday; - } - - /** - * Returns total number of items tracked by the SRS. - * @returns {number} - */ - items(): number { - return this.data.items.length; - } - - /** - * Returns the size of the current queue. - */ - /** - * queueSize. - * - * @returns {number} - */ - queueSize(): number { - return this.data.queue.length; - } - - /** - * repeatQueueSize. - * - * @returns {number} - */ - repeatQueueSize(): number { - return this.data.repeatQueue.length; - } - - /** - * getFileIndex. - * - * @param {string} path - * @returns {number} - */ - getFileIndex(path: string): number { - return this.data.trackedFiles.findIndex((val, _ind, _obj) => { - return val != null && val.path == path; - }); - } - - getFileId(path: string): number { - if (this.getFileIndex(path) == -1) { - return -1; - } - const fileInd = this.getFileIndex(path); - const fileId = this.data.trackedFiles[fileInd].items["file"]; - return fileId; - } - - getTrackedFile(path: string): TrackedFile { - const ind = this.getFileIndex(path); - if (ind < 0) { - return null; - } - return this.data.trackedFiles[ind]; - } - - /** - * getAndSyncCardInfoIndex - * @param note: TFile - * @param lineNo - * @param cardTextHash - * @returns {CardInfo} cardinfo | null: didn't have cardInfo - */ - getAndSyncCardInfo(note: TFile, lineNo: number, cardTextHash?: string): CardInfo { - let cardind = -2; - const trackedFile = this.getTrackedFile(note.path); - if (trackedFile != null && Object.prototype.hasOwnProperty.call(trackedFile, "cardItems")) { - cardind = trackedFile.cardItems.findIndex((cinfo: CardInfo, _ind, _obj) => { - let res = false; - if (cardTextHash != null && cinfo.cardTextHash === cardTextHash) { - cinfo.lineNo = lineNo; - res = true; - } else if (cinfo.lineNo === lineNo) { - cinfo.cardTextHash = cardTextHash; - res = true; - } - return res; - }); - } - return cardind >= 0 ? trackedFile.cardItems[cardind] : null; - } - - /** - * Returns whether or not the given file path is tracked by the SRS. - * @param {string} path - * @returns {boolean} - */ - isTracked(path: string): boolean { - const ind = this.getFileIndex(path); - const fid = this.getFileId(path); - - return ind >= 0 && fid >= 0; - } - - /** - * Returns whether or not the given file path is tracked by the SRS. - * work for cards query. - * @param {string} path - * @returns {boolean} - */ - isTrackedCardfile(path: string): boolean { - const ind = this.getFileIndex(path); - let cardLen = 0; - if (ind >= 0) { - const file = this.getTrackedFileByIndex(ind); - if (Object.keys(file).includes("cardItems")) { - cardLen = this.getTrackedFileByIndex(ind).cardItems.length; - } - } - - return cardLen > 0; - } - - /** - * isQueued. - * - * @param {number} item - * @returns {boolean} - */ - isQueued(item: number): boolean { - return this.data.queue.includes(item); - } - - /** - * isQueued. - * - * @param {number} item - * @returns {boolean} - */ - isCardQueued(item: number): boolean { - return this.data.cardQueue.includes(item); - } - - /** - * isInRepeatQueue. - * - * @param {number} item - * @returns {boolean} - */ - isInRepeatQueue(item: number): boolean { - return this.data.repeatQueue.includes(item) || this.data.cardRepeatQueue.includes(item); - } - - /** - * check if file id is just new add. - * @param id Item id, can get by: - * findex = this.store.getFileIndex(note.path); - * id = this.data.trackedFiles[findex].items["file"] - * @returns boolean - */ - isNewAdd(id: number): boolean { - try { - if (this.data.items[id]["nextReview"] > 0) { - return false; - } else if ( - this.data.items[id]["nextReview"] === 0 || - this.data.items[id]["timesReviewed"] === 0 - ) { - // This is a new item. - return true; - } else { - return false; - } - } catch (error) { - return false; - } - } - - isDue(id: number) { - try { - if (this.data.items[id]["nextReview"] > 0 || this.data.items[id]["timesReviewed"] > 0) { - // This is a new item. - return true; - } else { - return false; - } - } catch (error) { - return false; - } - } - - isCardItem(id: number) { - const item = this.getItembyID(id); - const file = this.data.trackedFiles[item.fileIndex]; - return file.items.file !== id; - } - - /** - * Returns when the given item is reviewed next (in hours). - */ - /** - * nextReview. - * - * @param {number} itemId - * @returns {number} - */ - nextReview(itemId: number): number { - const item = this.data.items[itemId]; - if (item == null) { - return -1; - } - - const now: Date = new Date(); - return (item.nextReview - now.getTime()) / (1000 * 60 * 60); - } - - getItembyID(id: number): RepetitionItem { - return this.data.items[id]; - } - - getTrackedFileByIndex(idx: number): TrackedFile { - return this.data.trackedFiles[idx]; - } - - /** - * getItemsOfFile. - * - * @param {string} path - * @returns {RepetitionItem[]} - */ - getItemsOfFile(path: string): RepetitionItem[] { - const result: RepetitionItem[] = []; - const file = this.data.trackedFiles[this.getFileIndex(path)]; - Object.values(file.items).forEach((item) => { - result.push(this.data.items[item]); - }); - return result; - } - - getFileForItem(item: RepetitionItem): TrackedFile { - if (item != null) { - return this.data.trackedFiles[item.fileIndex]; - } - return null; - } - - /** - * getNext. RepetitionItem - * - * @returns {RepetitionItem | null} - */ - getNext(): RepetitionItem | null { - const id = this.getNextId(); - if (id != null) { - return this.data.items[id]; - } - - return null; - } - - /** - * getNextId. - * - * @returns {number | null} - */ - getNextId(): number | null { - if (this.queueSize() > 0) { - return this.data.queue[0]; - } else if (this.data.repeatQueue.length > 0) { - return this.data.repeatQueue[0]; - } else { - return null; - } - } - - /** - * getFilePath. - * - * @param {RepetitionItem} item - * @returns {string | null} - */ - getFilePath(item: RepetitionItem): string | null { - const trackedFile = this.data.trackedFiles[item.fileIndex]; - if (trackedFile != null) { - return trackedFile.path; - } - return null; - } - - getReviewedCounts() { - return this.data.reviewedCounts; - } - getReviewedCardCounts(): ReviewedCounts { - return this.data.reviewedCardCounts; - } - - /** - * reviewId. - * update data according to response opt - * @param {number} itemId - * @param {string} option - */ - reviewId(itemId: number, option: string) { - const item = this.data.items[itemId]; - if (item == null) { - return -1; - } - - if (this.isInRepeatQueue(itemId)) { - const result = this.plugin.algorithm.onSelection(item, option, true); - - this.data.repeatQueue.remove(itemId); - if (!result.correct) { - this.data.repeatQueue.push(itemId); // Re-add until correct. - } - } else { - const result = this.plugin.algorithm.onSelection(item, option, false); - - item.nextReview = DateUtils.fromNow(result.nextReview).getTime(); - item.timesReviewed += 1; - this.data.queue.remove(itemId); - if (result.correct) { - item.timesCorrect += 1; - item.errorStreak = 0; - } else { - item.errorStreak += 1; - - if (this.plugin.data.settings.repeatItems) { - this.data.repeatQueue.push(itemId); - } - } - } - } - - /** - * calcReviewInterval. - * just calc data according to response opt for showing on button, not update, - * @param {number} itemId - */ - calcReviewInterval(itemId: number): number[] { - const plugin = this.plugin; - const item = this.data.items[itemId]; - console.debug("item:", item); - if (item == null) { - return null; - } - if (plugin.algorithm != null) { - return plugin.algorithm.calcAllOptsIntervals(item); - } - const intervals: number[] = []; - for (const opt of this.plugin.algorithm.srsOptions()) { - // const tempitem = MiscUtils.assignObjFully({}, item); - const tempitem = deepcopy(item); - let result: ReviewResult = null; - if (this.isInRepeatQueue(itemId)) { - result = this.plugin.algorithm.onSelection(tempitem, opt, true); - } else { - result = this.plugin.algorithm.onSelection(tempitem, opt, false); - } - const intvl = Math.round((result.nextReview / DateUtils.DAYS_TO_MILLIS) * 100) / 100; - intervals.push(intvl); - } - - return intervals; - } - - /** - * untrackFilesInFolderPath. - * - * @param {string} path - * @param {boolean} recursive - */ - untrackFilesInFolderPath(path: string, recursive?: boolean) { - const folder: TFolder = this.plugin.app.vault.getAbstractFileByPath(path) as TFolder; - - if (folder != null) { - this.untrackFilesInFolder(folder, recursive); - } - } - - /** - * untrackFilesInFolder. - * - * @param {TFolder} folder - * @param {boolean} recursive - */ - untrackFilesInFolder(folder: TFolder, recursive?: boolean) { - let firstCalled = false; - if (recursive == null) { - recursive = true; - firstCalled = true; - } - - let totalRemoved = 0; - folder.children.forEach((child) => { - if (child instanceof TFolder) { - if (recursive) { - totalRemoved += this.untrackFilesInFolder(child, recursive); - } - } else if (child instanceof TFile) { - if (this.isTracked(child.path)) { - const removed = this.untrackFile(child.path, false); - totalRemoved += removed; - } - } - }); - if (firstCalled) { - const msg = `在文件夹 ${folder.path} 下,共有 ${totalRemoved} 个文件不再跟踪重复了`; - new Notice(msg); - console.log(msg); - } - return totalRemoved; - } - - /** - * trackFilesInFolderPath. - * - * @param {string} path - * @param {boolean} recursive - */ - trackFilesInFolderPath(path: string, recursive?: boolean) { - const folder: TFolder = this.plugin.app.vault.getAbstractFileByPath(path) as TFolder; - - if (folder != null) { - this.trackFilesInFolder(folder, recursive); - } - } - - /** - * trackFilesInFolder. - * - * @param {TFolder} folder - * @param {boolean} recursive - */ - trackFilesInFolder(folder: TFolder, recursive?: boolean) { - if (recursive == null) recursive = true; - - let totalAdded = 0; - let totalRemoved = 0; - folder.children.forEach((child) => { - if (child instanceof TFolder) { - if (recursive) { - this.trackFilesInFolder(child, recursive); - } - } else if (child instanceof TFile && child.extension === "md") { - if (!this.isTracked(child.path)) { - const { added, removed } = this.trackFile(child.path, RPITEMTYPE.NOTE, false); - totalAdded += added; - totalRemoved += removed; - } - } - }); - - new Notice("Added " + totalAdded + " new items, removed " + totalRemoved + " items."); - } - - /** - * trackFile. - * - * @param {string} path - * @param {string} tag? "default" , "card" - * @param {boolean} notice - * @returns {{ added: number; removed: number } | null} - */ - trackFile( - path: string, - type?: RPITEMTYPE | string, - notice?: boolean, - ): { added: number; removed: number } | null { - const trackedFile: TrackedFile = { - path: path, - items: {}, - tags: [], - }; - const itemtype = RPITEMTYPE.NOTE; - let dname = this.getDefaultDackName(); - if (type != null) { - trackedFile.tags = [type]; - if (type === RPITEMTYPE.CARD) { - // itemtype = RPITEMTYPE.CARD; - trackedFile.cardItems = []; - } else if (type !== RPITEMTYPE.NOTE) { - dname = type as string; - } - } - this.data.trackedFiles.push(trackedFile); - const data = this.updateItems(path, itemtype, dname, notice); - console.log("Tracked: " + path); - // this.plugin.updateStatusBar(); - return data; - } - - /** - * trackFileCard - * 添加笔记中特定行的卡片(组) - * @param note - * @param lineNo - * @param cardTextHash - * @returns {CardInfo} cardInfo of new add. - */ - trackFileCard(note: TFile, lineNo: number, cardTextHash: string): CardInfo { - if (!this.isTracked(note.path)) { - console.log("Attempt to add card in untracked file: " + note.path); - this.trackFile(note.path, RPITEMTYPE.CARD, false); - } - const carditem = this.getAndSyncCardInfo(note, lineNo, cardTextHash); - if (carditem != null) { - return carditem; - } - const trackedFile = this.getTrackedFile(note.path); - - // const newcardItem: CardInfo = { lineNo: lineNo, cardTextHash: cardTextHash, itemIds: [] }; - const newcardItem: CardInfo = deepcopy(DEFAULT_NEW_CARDINFO); - newcardItem.lineNo = lineNo; - newcardItem.cardTextHash = cardTextHash; - - if (!Object.prototype.hasOwnProperty.call(trackedFile, "cardItems")) { - // didn't have cardItems - trackedFile.cardItems = []; - } - - const _cind = trackedFile.cardItems.push(newcardItem) - 1; - // const data = this.updateCardItems(note, trackedFile.cardItems[cind], count, deckName,notice); - trackedFile.cardItems.sort((a, b) => { - return a.lineNo - b.lineNo; - }); - // this.save(); - - console.log("Tracked: " + note.path + ", lineNo:" + lineNo + 1); // +1 just for better read. - - return newcardItem; - } - - /** - * untrackFile. - * - * @param {string} path - * @param {boolean} notice - * @returns {number} - */ - untrackFile(path: string, notice?: boolean): number { - if (notice == null) notice = true; - - const index = this.getFileIndex(path); - - if (index == -1) { - return 0; - } - - const trackedFile = this.data.trackedFiles[index]; - const file = this.plugin.app.vault.getAbstractFileByPath(path) as TFile; - - if ( - file != null && - "tags" in trackedFile && - trackedFile.tags.length > 0 && - trackedFile.tags.last() !== this.getDefaultDackName() && - trackedFile.tags.last() !== RPITEMTYPE.NOTE - ) { - // it's taged file, can't untrack by this. - console.log(path + " is taged file, can't untrack by this."); - new Notice( - "it is taged file, can't untrack by this. You can delete the #review tag in note file.", - ); - return 0; - } - - const numItems = Object.keys(trackedFile.items).length; - - for (const key in trackedFile.items) { - const ind = trackedFile.items[key]; - if (this.isQueued(ind)) { - this.data.queue.remove(ind); - } - if (this.isInRepeatQueue(ind)) { - this.data.repeatQueue.remove(ind); - } - this.data.items[ind] = null; - } - - if (notice) { - new Notice("Untracked " + numItems + " items!"); - } - - // when file not exist, or doesn't have carditems, del it. - let nulrstr: string; - if (!file || !Object.prototype.hasOwnProperty.call(trackedFile, "cardItems")) { - this.data.trackedFiles[index] = null; - nulrstr = file == null ? ", because it not exist." : ""; - } else { - this.data.trackedFiles[index].items.file = -1; - } - // this.save(); // will be used when plugin.sync_Algo(), which shouldn't - // this.plugin.updateStatusBar(); - console.log("Untracked: " + path + nulrstr); - return 1; - } - - /** - * updateItems. - * - * @param {string} path - * @param {string} type? RPITEMTYPE - * @param {string} dname? "default" , deckName - * @param {boolean} notice - * @returns {{ added: number; removed: number } | null} - */ - updateItems( - path: string, - type?: RPITEMTYPE, - dname?: string, - notice?: boolean, - ): { added: number; removed: number } | null { - if (notice == null) notice = true; - if (type == null) type = RPITEMTYPE.NOTE; - if (dname == null) dname = this.getDefaultDackName(); - - const ind = this.getFileIndex(path); - if (ind == -1) { - console.log("Attempt to update untracked file: " + path); - return; - } - const trackedFile = this.data.trackedFiles[ind]; - - const file = this.plugin.app.vault.getAbstractFileByPath(path) as TFile; - if (!file) { - console.log("Could not find file: " + path); - return; - } - - let added = 0; - let removed = 0; - - const newItems: Record = {}; - if ("file" in trackedFile.items) { - newItems["file"] = trackedFile.items["file"]; - } else { - const newItem: RepetitionItem = Object.assign({}, NEW_ITEM); - newItem.data = Object.assign(this.plugin.algorithm.defaultData()); - // newItem.data = Object.assign(this.algorithmdefaultData()); - newItem.fileIndex = ind; - newItem.itemType = type; - newItem.deckName = Object.values(RPITEMTYPE).includes(type) - ? this.getDefaultDackName() - : type; - newItem.ID = this.data.items.push(newItem) - 1; - newItems["file"] = newItem.ID; - added += 1; - } - - for (const key in trackedFile.items) { - if (!(key in newItems)) { - const itemInd = trackedFile.items[key]; - if (this.isQueued(itemInd)) { - this.data.queue.remove(itemInd); - } - if (this.isInRepeatQueue(itemInd)) { - this.data.repeatQueue.remove(itemInd); - } - this.data.items[itemInd] = null; - console.debug("null item:" + itemInd); - removed += 1; - } - } - trackedFile.items = newItems; - // this.save(); // will be used when plugin.sync_Algo(), which shouldn't - - // if (notice) { - // new Notice("Added " + added + " new items, removed " + removed + " items."); - // } - return { added, removed }; - } - - updateCardItems( - note: TFile, - cardinfo: CardInfo, - count: number, - deckName: string = this.getDefaultDackName(), - notice?: boolean, - ): { added: number; removed: number } | null { - if (notice == null) notice = false; - const len = cardinfo.itemIds.length; - if (len === count) { - for (const id of cardinfo.itemIds) { - this.updateItemDeckName(id, deckName); - } - return; - } - - if (!this.isTrackedCardfile(note.path)) { - console.log("Attempt to update cards in untracked file: " + note.path); - return; - } - const ind = this.getFileIndex(note.path); - const trackedFile = this.getTrackedFile(note.path); - let added = 0; - let removed = 0; - - const newitemIds: number[] = cardinfo.itemIds.slice(); - - //delete extra items data - if (count < len) { - newitemIds.slice(count).forEach((id) => { - this.data.items[id] = null; - removed++; - }); - console.debug("delete %d ids:", removed, newitemIds.slice(count)); - newitemIds.splice(count, len - count); - // len = newitemIds.length; - } else { - // if (count > len) - // add new card data - for (let i = 0; i < count - len; i++) { - const newItem: RepetitionItem = Object.assign({}, NEW_ITEM); - newItem.data = Object.assign(this.plugin.algorithm.defaultData()); - newItem.fileIndex = ind; - newItem.itemType = RPITEMTYPE.CARD; - newItem.deckName = deckName; - const cardId = this.data.items.push(newItem) - 1; - newItem.ID = cardId; - newitemIds.push(cardId); - added += 1; - } - console.debug("add %d ids:", added, newitemIds); - } - - // delete unused iid items. - for (const iid of cardinfo.itemIds) { - if (!newitemIds.includes(iid)) { - if (this.isCardQueued(iid)) { - this.data.cardQueue.remove(iid); - } - if (this.isInRepeatQueue(iid)) { - this.data.cardRepeatQueue.remove(iid); - } - this.data.items[iid] = null; - console.debug("removed", iid); - removed += 1; - } else { - this.updateItemDeckName(iid, deckName); - } - } - newitemIds.sort((a: number, b: number) => a - b); - cardinfo.itemIds = newitemIds; - // this.save(); - - console.log( - trackedFile.path + - " update - lineNo:" + - cardinfo.lineNo + - "\n Added: " + - added + - " new card items, removed " + - removed + - " card items.", - ); - if (notice) { - new Notice( - trackedFile.path + - " update - lineNo:" + - cardinfo.lineNo + - "\n Added: " + - added + - " new card items, removed " + - removed + - " card items.", - ); - } - return { added, removed }; - } - - /** - * updateItemDeckName, if different, uupdate. Else do none thing. - * @param id - * @param deckName - */ - updateItemDeckName(id: number, deckName: string) { - const item = this.data.items[id]; - if (item.deckName !== deckName) { - item.deckName = deckName; - } - } - - /** - * updateItemById - * @param id - * @param fileIndex - * @returns - */ - updateItemById(id: number, fileIndex?: number): void { - if (id < 0) return; - const item = this.data.items[id]; - if (item == null && fileIndex != null) { - const newItem: RepetitionItem = Object.assign({}, NEW_ITEM); - newItem.data = Object.assign(this.plugin.algorithm.defaultData()); - newItem.fileIndex = fileIndex; - newItem.itemType = - this.data.trackedFiles[fileIndex].items.file === id - ? RPITEMTYPE.NOTE - : RPITEMTYPE.CARD; - - this.data.items[id] = newItem; - // this.save(); - console.debug("update item[%d]:", id, item); - return; - } - if (item == null) { - console.debug("update item[${id}] lack fileIndex"); - } - } - - /** - * updateItem AlgorithmData. - * @param id - * @param key - * @param value - */ - updateItemAlgorithmData(id: number, key: string, value: unknown) { - try { - const data = this.data.items[id].data as AnkiData | FsrsData; - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - data[key] = value; - } catch (error) { - console.log(error); - } - } - - updateReviewedCounts(id: number, type: RPITEMTYPE = RPITEMTYPE.NOTE) { - let rc =this.data.reviewedCounts; - if(type === RPITEMTYPE.NOTE){ - rc = this.data.reviewedCounts; - }else{ - rc = this.data.reviewedCardCounts; - } - // const date = new Date().toLocaleDateString(); - const date = window.moment(new Date()).format("YYYY-MM-DD"); - if (!(date in rc)) { - rc[date] = { due: 0, new: 0 }; - } - if (this.isDue(id)) { - const item = this.getItembyID(id); - if (this.plugin.data.settings.algorithm === algorithmNames.Fsrs) { - const data: FsrsData = item.data as FsrsData; - if (data.scheduled_days >= 1) { - rc[date].due++; - } - } else { - const data: AnkiData = item.data as AnkiData; - if (data.lastInterval >= 1) { - rc[date].due++; - } - } - } else { - rc[date].new++; - } - } - - /** - * renameTrackedFile. - * - * @param {string} old - * @param {string} newPath - */ - renameTrackedFile(old: string, newPath: string) { - const index = this.getFileIndex(old); - // Sanity check - if (index == -1) { - console.log("Renamed file is not tracked!"); - return; - } - - const fileData = this.data.trackedFiles[index]; - fileData.path = newPath; - this.data.trackedFiles[index] = fileData; - - console.log("Updated tracking: " + old + " -> " + newPath); - } - - findMovedFile(path: string): TFile | null { - const pathArr = path.split("/"); - const name = pathArr[pathArr.length - 1]; - const newTfile = this.plugin.app.metadataCache.getFirstLinkpathDest(name, ""); - return newTfile; - } - - /** - * buildQueue. indexlist of items - */ - async buildQueue() { - // console.log("Building queue..."); - const data = this.data; - const maxNew = this.plugin.data.settings.maxNewPerDay; - const now: Date = new Date(); - - if (now.getDate() != new Date(this.data.lastQueue).getDate()) { - this.data.newAdded = 0; - this.clearQueue(); - } - - let oldAdd = 0; - let newAdd = 0; - let oldAdd_card = 0; - let newAdd_card = 0; - - let untrackedFiles = 0; - let removedItems = 0; - - await Promise.all( - this.data.items.map(async (item, id) => { - if (item != null) { - const file = this.getFileForItem(item); - if (file?.path == undefined) return; - return this.verify(file.path).then((exists) => { - if (!exists) { - if (file != null) { - // in case file moved away. - const newfile = this.findMovedFile(file.path); - if (newfile != null) { - file.path = newfile.path; - exists = true; - console.debug("a file has been moved: " + newfile.path); - } - } - } - if (!exists) { - console.debug("untrackfile by buildqueue:", file); - // new Notice("untrackfile by buildqueue:" + file); - // removedItems += this.untrackFile(file.path, false); - // // item = null; - removedItems += 1; - untrackedFiles += 1; - } else if (file.items.file !== id) { - // card Queue - if (item.timesReviewed == 0) { - // This is a new item. - if (maxNew == -1 || data.newAdded < maxNew) { - data.newAdded += 1; - data.cardQueue.push(id); - newAdd_card += 1; - } - } else if (item.nextReview <= now.getTime()) { - if (this.isInRepeatQueue(id)) { - data.cardRepeatQueue.remove(id); - } - if (!this.isCardQueued(id)) { - data.cardQueue.push(id); - oldAdd_card += 1; - } - } - } else { - // note Queue - if (item.timesReviewed == 0) { - // This is a new item. - if (!this.isQueued(id) && (maxNew == -1 || newAdd < maxNew)) { - // data.newAdded += 1; - data.queue.push(id); - newAdd += 1; - } - } else if (item.nextReview <= now.getTime()) { - if (this.isInRepeatQueue(id)) { - data.repeatQueue.remove(id); - } - if (!this.isQueued(id)) { - data.queue.push(id); - oldAdd += 1; - } - } - } - }); - } - }), - ); - - this.data.lastQueue = now.getTime(); - // if (this.plugin.data.settings.shuffleQueue && oldAdd + newAdd > 0) { - // MiscUtils.shuffle(data.queue); - // } - - // console.log( - // "Added " + (oldAdd + newAdd) + " notes to review queue, with " + newAdd + " new!", - // ); - // console.log( - // "Added " + - // (oldAdd_card + newAdd_card) + - // " cards to review queue, with " + - // newAdd_card + - // " new!", - // ); - - // if (untrackedFiles > 0) { - // console.log( - // "Recall: Untracked " + - // untrackedFiles + - // " files with a total of " + - // removedItems + - // " items while building queue!", - // ); - // } - } - - loadRepeatQueue(rvdecks: { [deckKey: string]: ReviewDeck }) { - if (this.repeatQueueSize() > 0) { - // const repeatDeckCounts: Record = {}; - this.data.repeatQueue.forEach((id) => { - const dname: string = this.getItembyID(id).deckName; - // this.data.toDayAllQueue[id] = dname; - // if (!Object.keys(repeatDeckCounts).includes(dname)) { - // repeatDeckCounts[dname] = 0; - // } - rvdecks[dname].dueNotesCount++; - this.plugin.dueNotesCount++; - }); - // return repeatDeckCounts; - } - } - - /** - * Verify that the file of this item still exists. - * - * @param {string}path - */ - async verify(path: string): Promise { - const adapter = this.plugin.app.vault.adapter; - if (path != null) { - return await adapter.exists(path).catch((_reason) => { - console.error("Unable to verify file: ", path); - return false; - }); - } - return false; - } - - clearQueue(queue: unknown = null) { - if (queue == null) { - this.data.queue = []; - this.data.repeatQueue = []; - this.data.cardQueue = []; - this.data.cardRepeatQueue = []; - this.data.toDayAllQueue = {}; - this.data.toDayLatterQueue = {}; - console.debug("all queue are cleared!"); - } else if (isArray(queue)) { - queue = []; - } else { - queue = {}; - } - } - - /** - * resetData. - */ - resetData() { - this.data = Object.assign({}, DEFAULT_SRS_DATA); - } - - /** - * pruneData: delete unused storedata, fsrs's optimizer/writeRevlog() will be affected if using this func. - * NulltFiles/NullItems - * @returns - */ - async pruneData() { - const items = this.data.items; - const tracked_files = this.data.trackedFiles; - let removedNulltFiles = 0; - let removedNullItems = 0; - const nullFileList: number[] = []; - const nullFileList_del: number[] = []; - const nullItemList: number[] = []; - const nullItemList_del: number[] = []; - - if (this.plugin.data.settings.algorithm === "Fsrs") { - new Notice("因涉及到revlog.csv, 暂不可精简清除无效数据"); - return; - //todo: 后续通过正则替换的方式,同步修改revlog.csv中的数据 - } - tracked_files.map((tf, ind) => { - if (tf == null) { - nullFileList.push(ind); - nullFileList_del.push(ind - nullFileList_del.length); - removedNulltFiles++; - } - }); - for (let i = 0; i < nullFileList_del.length; i++) { - tracked_files.splice(nullFileList_del[i], 1); - } - const nflMin = Math.min(...nullFileList); - items.map((item, id) => { - if (item != null && item.fileIndex >= nflMin) { - const ifind = item.fileIndex; - for (let nli = nullFileList.length - 1; nli >= 0; nli--) { - if (ifind > nullFileList[nli]) { - item.fileIndex -= nli + 1; - break; - } else if (ifind === nullFileList[nli]) { - item = null; - console.debug("pruneData: item null: " + ifind); - break; - } - } - } - if (item == null) { - nullItemList.push(id); - nullItemList_del.push(id - nullItemList_del.length); - removedNullItems++; - } - }); - - for (let i = 0; i < nullItemList_del.length; i++) { - items.splice(nullItemList_del[i], 1); - } - - const nlMin = Math.min(...nullItemList); - for (const trackedFile of tracked_files) { - if (trackedFile == null) continue; - const oldId = trackedFile.items.file; - let newId = -1; - if (oldId >= nlMin) { - for (let nli = nullItemList.length - 1; nli >= 0; nli--) { - if (oldId >= nullItemList[nli]) { - newId = oldId > nullItemList[nli] ? oldId - (nli + 1) : -1; - trackedFile.items.file = newId; - this.getItembyID(newId).ID = newId; - // console.debug("change file: id%d to id%d", oldId, newId, trackedFile); - break; - } - } - } - - // loop itemIds, if has some id point to null, change it. - if (!Object.prototype.hasOwnProperty.call(trackedFile, "cardItems")) { - continue; - } - for (const carditem of trackedFile.cardItems) { - if (Math.max(...carditem.itemIds) >= nlMin) { - for (let idi = 0; idi < carditem.itemIds.length; idi++) { - const oldId = carditem.itemIds[idi]; - let newId = -1; - if (oldId >= nlMin) { - nlfor: for (let nli = nullItemList.length - 1; nli >= 0; nli--) { - if (oldId >= nullItemList[nli]) { - newId = oldId > nullItemList[nli] ? oldId - (nli + 1) : newId; - carditem.itemIds.splice(idi, 1, newId); - this.getItembyID(newId).ID = newId; - break nlfor; - } - } - } - } - console.debug("changed card:%s by %s", carditem.itemIds, nullFileList); - } - } - } - - // console.debug("after delete nullitems:", items); - this.clearQueue(); - this.save(); - - console.log( - "removed " + - removedNulltFiles + - " nullTrackedfile(s), removed " + - removedNullItems + - " nullitem(s).", - ); - return; - } - - /** - * sync RCsrsDataTo SRreviewDecks - * - * @param rdeck - * @returns - */ - syncRCsrsDataToSRreviewDecks(rdeck: ReviewDeck) { - // graph.reset(); - this.buildQueue(); - const now = new Date().getTime(); - for (let i = 0; i < this.data.queue.length; i++) { - const item = this.data.items[this.data.queue[i]]; - if (item == null) { - console.log("syncRCsrsDataToSRreviewDecks: null item"); - continue; - } - const path = this.getFilePath(item); - const trackedFile = this.getFileForItem(item); - const file = this.plugin.app.vault.getAbstractFileByPath(path) as TFile; - if (!file) { - console.log("Could not find file: ", path); - continue; - } - - let shouldIgnore = false; - if (!Object.prototype.hasOwnProperty.call(trackedFile, "tags")) { - trackedFile["tags"] = [this.getDefaultDackName()]; - // this.save(); - } - for (const tag of trackedFile.tags) { - if ( - this.plugin.data.settings.tagsToReview.some( - (tagToReview) => tag === tagToReview || tag.startsWith(tagToReview + "/"), - ) - ) { - shouldIgnore = true; - break; - } - } - if ( - trackedFile.tags.length > 0 && - trackedFile.tags.last() !== this.getDefaultDackName() - ) { - // had other tags that user currently doesn't want to review. - shouldIgnore = true; - } - if (shouldIgnore) { - continue; - } // already add to other tagDeck. - - if (this.isNewAdd(this.data.queue[i])) { - rdeck.newNotes.push(file); - this.plugin.newNotesCount++; - console.debug("syncRCsrsDataToSRreviewDecks: newadd"); - continue; - } else { - rdeck.scheduledNotes.push({ note: file, dueUnix: item.nextReview }); - if (item.nextReview <= now.valueOf()) { - rdeck.dueNotesCount++; - this.plugin.dueNotesCount++; - } - } - - const [, due, _interval, ease] = this.getItemSched(item); - if (Object.prototype.hasOwnProperty.call(this.plugin.easeByPath, path)) { - this.plugin.easeByPath[path] = (this.plugin.easeByPath[path] + ease) / 2; - } else { - this.plugin.easeByPath[path] = ease; - } - const nDays: number = Math.ceil((due - now.valueOf()) / (24 * 3600 * 1000)); - if (!Object.prototype.hasOwnProperty.call(this.plugin.dueDatesNotes, nDays)) { - this.plugin.dueDatesNotes[nDays] = 0; - } - this.plugin.dueDatesNotes[nDays]++; - } - return rdeck; - } - - /** - * syncRCDataToSR ReviewDeck , - * and update deckName to trackedfile.tags; - * @param rdeck - * @returns - */ - syncRCDataToSRrevDeck(rdeck: ReviewDeck, note: TFile, now?: number) { - const fileid = this.getFileId(note.path); - const item = this.data.items[fileid]; - const trackedFile = this.getTrackedFile(note.path); - const ind = this.getFileIndex(note.path); - let now_number: number = now; - const nowToday: number = this.EndofToday; - - if (item == null) { - this.updateItemById(fileid, ind); - console.debug("syncRCDataToSRrevDeck update item:", item); - } - if (now == null) { - now_number = nowToday; - } else { - delete this.data.toDayLatterQueue[fileid]; - - Object.keys(this.data.toDayLatterQueue).forEach((fileid) => { - const id = Number.parseInt(fileid); - if (now - this.data.items[id].nextReview > 0) { - const dname = this.data.items[id].deckName; - this.plugin.reviewDecks[dname].dueNotesCount++; - delete this.data.toDayLatterQueue[id]; - } - }); - } - - if (this.isNewAdd(fileid)) { - rdeck.newNotes.push(note); - this.plugin.newNotesCount++; - // console.debug("syncRCDataToSRrevDeck : addNew", fileid); - } else { - rdeck.scheduledNotes.push({ note: note, dueUnix: item.nextReview }); - if (item.nextReview <= now_number) { - rdeck.dueNotesCount++; - this.plugin.dueNotesCount++; - } - - const nDays: number = Math.ceil( - (item.nextReview - now_number) / DateUtils.DAYS_TO_MILLIS, - ); - if (!Object.prototype.hasOwnProperty.call(this.plugin.dueDatesNotes, nDays)) { - this.plugin.dueDatesNotes[nDays] = 0; - } - this.plugin.dueDatesNotes[nDays]++; - } - // update this.trackFile - if (!Object.prototype.hasOwnProperty.call(trackedFile, "tags")) { - trackedFile["tags"] = [rdeck.deckName]; - // this.save(); - } else { - if (!trackedFile.tags.includes(rdeck.deckName)) { - trackedFile.tags.push(rdeck.deckName); - // this.save(); - } - } - - // update item - this.updateItemDeckName(fileid, rdeck.deckName); - if (!Object.prototype.hasOwnProperty.call(item, "itemType")) { - item.itemType = this.isCardItem(fileid) ? RPITEMTYPE.CARD : RPITEMTYPE.NOTE; - // this.save(); - } - - return; - } - - /** - * syncheadertoDataItems - * @param note Tfile - * @param sched ["due-interval-ease00", dueString, interval, ease] - * @param response - */ - syncheadertoDataItems(note: TFile, sched: number[], response?: ReviewResponse) { - const fileId = this.getFileId(note.path); - let correct = null; - if (response != null) { - if (!(response == ReviewResponse.Easy || response == ReviewResponse.Good)) { - correct = false; - } else { - correct = true; - } - } - if (sched[1] == null) { - console.debug("%s response sched wrong: null ", note.path, fileId); - new Notice(note.path + "%s %s response sched wrong: null " + fileId.toString()); - } - this.setSchedbyId(fileId, sched, correct); - } - - getItemSched(item: RepetitionItem) { - try { - const data = item.data as AnkiData; - const ease = data.ease; - const interval = data.lastInterval; - // const interval = item.data.iteration; - const due = item.nextReview; - const sched = [item.ID, due, interval, ease]; - console.debug("getItemSched:", sched); - return sched; - } catch (error) { - console.log("getItemSched:", error); - return null; - } - } - - /** - * get ReviewNote frontmatter Data from notefile. - * - * @param frontmatter - * @returns number[] | [0, due, interval, ease]; - */ - getReviewNoteHeaderData(frontmatter: FrontMatterCache): number[] { - // file has scheduling information - if ( - Object.prototype.hasOwnProperty.call(frontmatter, "sr-due") && - Object.prototype.hasOwnProperty.call(frontmatter, "sr-interval") && - Object.prototype.hasOwnProperty.call(frontmatter, "sr-ease") - ) { - const dueUnix: number = window - .moment(frontmatter["sr-due"], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) - .valueOf(); - const interval: number = frontmatter["sr-interval"] as number; - const ease: number = frontmatter["sr-ease"] as number; - const sched = [null, dueUnix, interval, ease]; - return sched; - } else { - console.log("getReviewNoteHeaderData --> note: %s doesn't have sr frontmatter. "); - return null; - } - } - - /** - * @description: getSchedbyId , give returns to scheduling - * @param {number} id - * @return {[]} ["due-interval-ease00", dueString, interval, ease] | null for new - */ - getSchedbyId(id: number): RegExpMatchArray { - const item: RepetitionItem = this.data.items[id]; - if ( - item == null || - item.nextReview === 0 || - item.nextReview === null || - item.timesReviewed === 0 - ) { - return null; // new card doesn't need schedinfo - } - - let ease: number; - let interval: number; - if (this.plugin.data.settings.algorithm !== algorithmNames.Fsrs) { - const data: AnkiData = item.data as AnkiData; - ease = data.ease; - interval = data.lastInterval; - // const interval = item.data.iteration; - } else { - const data = item.data as FsrsData; - interval = data.scheduled_days; - // ease just used for StatsChart, not review scheduling. - ease = data.state; - } - - const due = window.moment(item.nextReview); - const dueString: string = due.format("YYYY-MM-DD"); - return [id, dueString, interval, ease] as unknown as RegExpMatchArray; - } - - /** - * setSchedbyId: set sched into items[id] - * @param id - * @param sched RegExpMatchArray - * @param correct user response - * @returns - */ - setSchedbyId(id: number, sched: RegExpMatchArray | number[] | string[], correct?: boolean) { - const item: RepetitionItem = this.data.items[id]; - if (item == null) { - console.warn("setSchedbyId failed: item === null"); - // this.updateItemById(id); //not work well yet. - return; - } - sched[0] = id; - // console.debug("setSchedbyId:", sched); - const data: AnkiData = item.data as AnkiData; - item.nextReview = - typeof sched[1] == "number" - ? Number(sched[1]) - : window - .moment(sched[1], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) - .valueOf(); - data.lastInterval = Number(sched[2]); - data.ease = Number(sched[3]); - - if (correct != null) { - item.timesReviewed += 1; - if (correct) { - item.timesCorrect += 1; - item.errorStreak = 0; - } else { - item.errorStreak += 1; - } - } - } - - /** - * syncNoteCardsIndex - * only check and sync index, not add/remove cardinfo/ids/items. - * @param note - * @returns - */ - async syncNoteCardsIndex( - note: TFile, - callback?: (cardText: string, cardinfo: CardInfo) => void, - ): Promise { - if (callback == null) { - if (!this.isTaged(note, RPITEMTYPE.CARD) && !this.isTrackedCardfile(note.path)) { - return; - } - } - - const trackedFile = this.getTrackedFile(note.path); - const fileText: string = await this.plugin.app.vault.read(note); - const settings: SRSettings = this.plugin.data.settings; - let negIndFlag = false; - const lines: number[] = []; - const cardHashList: Record = {}; - - const parsedCards: [CardType, string, number][] = parse( - fileText, - settings.singleLineCardSeparator, - settings.singleLineReversedCardSeparator, - settings.multilineCardSeparator, - settings.multilineReversedCardSeparator, - settings.convertHighlightsToClozes, - settings.convertBoldTextToClozes, - settings.convertCurlyBracketsToClozes, - ); - - for (const parsedCard of parsedCards) { - // deckPath = noteDeckPath; - const lineNo: number = parsedCard[2]; - let cardText: string = parsedCard[1]; - - if (cardText.includes(settings.editLaterTag)) { - continue; - } - - if (!settings.convertFoldersToDecks) { - const tagInCardRegEx = /^#[^\s#]+/gi; - const cardDeckPath = cardText - .match(tagInCardRegEx) - ?.slice(-1)[0] - .replace("#", "") - .split("/"); - if (cardDeckPath) { - // deckPath = cardDeckPath; - cardText = cardText.replaceAll(tagInCardRegEx, ""); - } - } - - const cardTextHash: string = BlockUtils.getTxtHash(cardText); - - const cardinfo = this.getAndSyncCardInfo(note, lineNo, cardTextHash); - if (callback != null) { - callback(cardText, { - lineNo: lineNo, - cardTextHash: cardTextHash, - itemIds: cardinfo?.itemIds, - }); - } - lines.push(lineNo); - cardHashList[lineNo] = cardTextHash; - if (cardinfo == null) { - negIndFlag = true; - continue; - } - } - // console.debug("cardHashList: ", cardHashList); - - // sync by total parsedCards.length - const carditems = trackedFile?.cardItems; - if (carditems == null) { - return; - } - if (lines.length === carditems.length && negIndFlag) { - for (let i = 0; i < lines.length; i++) { - if (lines[i] !== carditems[i].lineNo) { - carditems[i].lineNo = lines[i]; - this.getAndSyncCardInfo(note, lines[i], cardHashList[lines[i]]); - } - } - } - - return; - } - - /** - * check if note taged for sr. - * @param note - * @param tagtype "note", "card", "all" - * @returns boolean - */ - isTaged(note: TFile, tagtype?: string) { - if (tagtype == null) { - tagtype = RPITEMTYPE.NOTE; - } - // on tracked notfile changed. - const fileCachedData = this.plugin.app.metadataCache.getFileCache(note) || {}; - - const tags = getAllTags(fileCachedData) || []; - if ( - this.plugin.data.settings.noteFoldersToIgnore.some((folder) => - note.path.contains(folder), - ) - ) { - return false; - } - - if (tagtype === RPITEMTYPE.NOTE) { - if (this.getNoteDeckName(tags) != null) { - return true; - } - } else if (tagtype === RPITEMTYPE.CARD) { - for (const tag of tags) { - if (this.isTagedDeckName(tag)) { - return true; - } - } - } else { - if (this.getNoteDeckName(tags) != null) { - return true; - } - for (const tag of tags) { - if (this.isTagedDeckName(tag)) { - return true; - } - } - } - - return false; - } - - /** - * if deckName of a note is in tagsToReview, return true. - * @param deckName - * @returns boolean - */ - isTagedNoteDeckName(deckName: string) { - if ( - this.plugin.data.settings.tagsToReview.some( - (tagToReview) => deckName === tagToReview || deckName.startsWith(tagToReview + "/"), - ) - ) { - return true; - } - return false; - } - - /** - * isTagedDeckName, if deckName is in flashcardTags, return true. - * @param deckName - * @returns - */ - isTagedDeckName(deckName: string): boolean { - if ( - this.plugin.data.settings.flashcardTags.some( - (flashcardTag) => - deckName === flashcardTag || deckName.startsWith(flashcardTag + "/"), - ) - ) { - return true; - } - return false; - } - - /** - * select a tag in tags, which is also in tagsToReview. If not, return null. - * @param tags - * @returns - */ - getNoteDeckName(tags: string[]): string | null { - for (const tagToReview of this.plugin.data.settings.tagsToReview) { - if (tags.some((tag) => tag === tagToReview || tag.startsWith(tagToReview + "/"))) { - return tagToReview; - } - } - return null; - } - - /** - * syncTrackfileCardSched - * @param note - * @param deckName - * @param lineNo - * @param cardTextHash - * @param count - * @param scheduling RegExpMatchArray[] - */ - getTrackfileCardSched( - note: TFile, - deckName: string, - lineNo: number, - cardTextHash: string, - count: number, - scheduling?: RegExpMatchArray[], - ): RegExpMatchArray[] | null { - if (scheduling == null) { - scheduling = []; - } - - let carditem = this.getAndSyncCardInfo(note, lineNo, cardTextHash); - if (carditem != null) { - carditem.itemIds.forEach((id) => { - const sched = this.getSchedbyId(id); - // ignore new add card - if (sched != null) { - scheduling.push(sched); - } - }); - } else { - carditem = this.trackFileCard(note, lineNo, cardTextHash); - } - if (!this.isTagedDeckName(deckName) && !this.isTagedNoteDeckName(deckName)) { - deckName = this.getDefaultDackName(); - } - this.updateCardItems(note, carditem, count, deckName); - return scheduling; - } - - setTrackfileCardSched( - note: TFile, - deckName: string, - lineNo: number, - cardTextHash: string, - count: number, - scheduling?: RegExpMatchArray[], - ): CardInfo { - if (scheduling == null || scheduling.length == 0) { - return; - } - - const carditem = this.trackFileCard(note, lineNo, cardTextHash); - - // if (!this.isTagedDeckName(deckName) && !this.isTagedNoteDeckName(deckName)) { - // deckName = this.getDefaultDackName(); - // } - this.updateCardItems(note, carditem, count, deckName); - - carditem.itemIds.forEach((id: number, index) => { - this.setSchedbyId(id, scheduling[index], true); - }); - return carditem; - } - - /** - * algorithmSwitchData - * @param fromAlgo - * @param toAlgo - * @returns Promise return true if switchData success. - */ - async algorithmSwitchData(fromAlgo: algorithmNames, toAlgo: algorithmNames): Promise { - const plugin = this.plugin; - const items = plugin.store.data.items; - - const old_path = plugin.store.dataPath; - - await plugin.store.save(old_path + ".bak"); - plugin.store.pruneData(); - const fromTo = "(from " + fromAlgo + " to: " + toAlgo; - try { - if ( - fromAlgo === algorithmNames.Anki || - fromAlgo === algorithmNames.Default || - fromAlgo === algorithmNames.SM2 - ) { - if (toAlgo === algorithmNames.Fsrs) { - const options = this.plugin.algorithm.srsOptions(); - const fsrs = algorithms[algorithmNames.Fsrs]; - fsrs.updateSettings( - plugin, - plugin.data.settings.algorithmSettings[algorithmNames.Fsrs], - ); - const initItvl = fsrs.settings.w[4]; - items.forEach((item) => { - if (item != null && item.data != null) { - const reps = item.timesReviewed; - let card = fsrs.defaultData() as FsrsData; - if (reps > 0) { - const data = item.data as AnkiData; - const due = new Date(item.nextReview); - const interval = data.lastInterval; - const lastview = new Date( - item.nextReview - data.lastInterval * DateUtils.DAYS_TO_MILLIS, - ); - - let opt: string; - item.data = card; - if (interval > initItvl * 3) { - // card.state = State.Learning; - // in case the param is to big. - opt = options[Rating.Easy - 1]; - fsrs.onSelection(item, opt, false); - } - if (interval > initItvl) { - opt = options[Rating.Easy - 1]; - fsrs.onSelection(item, opt, false); - } - opt = options[Rating.Good - 1]; - fsrs.onSelection(item, opt, false); - - // item.data = deepcopy(card); - const tempitem = this.getItembyID(item.ID); - card = tempitem.data as FsrsData; - - card.due = due; - card.scheduled_days = interval; - card.reps = reps; - card.last_review = lastview; - } else { - item.data = card; - } - // item.data = deepcopy(card); - if ( - card.difficulty === 0 || - card.difficulty == null || - card.stability === 0 || - card.stability == null - ) { - if (reps > 0) { - const show = [item.ID, card, reps]; - console.warn( - "data switch: d, s" + - card.difficulty + - ", " + - card.stability, - ); - console.warn(...show); - } - } - } - }); - } else if ( - (fromAlgo === algorithmNames.Anki || fromAlgo === algorithmNames.SM2) && - toAlgo === algorithmNames.Default - ) { - items.forEach((item) => { - if (item != null && item.data != null) { - const data: AnkiData = item.data as AnkiData; - data.ease *= 100; - if (data.lastInterval === 0) { - data.lastInterval = 1; - } else { - data.lastInterval *= 1; - } - } - }); - } else if ( - fromAlgo === algorithmNames.Default && - (toAlgo === algorithmNames.Anki || toAlgo === algorithmNames.SM2) - ) { - items.forEach((item) => { - if (item != null && item.data != null) { - const data = item.data as AnkiData; - data.ease /= 100; - } - }); - } else if ( - (fromAlgo === algorithmNames.Anki && toAlgo === algorithmNames.SM2) || - (toAlgo === algorithmNames.Anki && fromAlgo === algorithmNames.SM2) - ) { - console.log("use same data, don't have to convert."); - } else { - const msg = - "algorithmSwithchData logic is not implement in this case" + - fromTo + - ", please issue it."; - new Notice(msg); - console.error(msg); - throw new Error(msg); - } - } else if ( - fromAlgo === algorithmNames.Fsrs && - (toAlgo === algorithmNames.Anki || toAlgo === algorithmNames.SM2) - ) { - algorithms[algorithmNames.Anki].updateSettings( - plugin, - plugin.data.settings.algorithmSettings[algorithmNames.Anki], - ); - items.forEach((item) => { - if (item != null && item.data != null) { - const data = item.data as FsrsData; - const lastitval = data.scheduled_days; - const iter = data.reps; - const newdata = algorithms[algorithmNames.Anki].defaultData() as AnkiData; - newdata.lastInterval = - lastitval > newdata.lastInterval ? lastitval : newdata.lastInterval; - newdata.iteration = iter; - item.data = deepcopy(newdata); - } - }); - } else if (fromAlgo === algorithmNames.Fsrs && toAlgo === algorithmNames.Default) { - algorithms[algorithmNames.Default].updateSettings( - plugin, - plugin.data.settings.algorithmSettings[algorithmNames.Default], - ); - items.forEach((item) => { - if (item != null && item.data != null) { - const data = item.data as FsrsData; - const lastitval = data.scheduled_days; - const iter = data.reps; - const newdata = algorithms[ - algorithmNames.Default - ].defaultData() as AnkiData; - newdata.lastInterval = - lastitval > newdata.lastInterval ? lastitval : newdata.lastInterval; - newdata.iteration = iter; - item.data = deepcopy(newdata); - } - }); - } else { - const msg = - "algorithmSwithchData logic is not implement in this case " + - fromTo + - "please issue it."; - new Notice(msg); - console.error(msg); - throw new Error(msg); - } - await this.save(); - const msg = fromTo + "转换完成,因算法参数不同,会导致后续复习间隔调整"; - new Notice(msg); - console.debug(msg); - return true; - } catch (error) { - await plugin.store.load(old_path + ".bak"); - new Notice(error + fromTo + "转换失败,已恢复旧算法及数据"); - console.log(error); - return false; - } - } - - /** - * converteNoteSchedToTrackfile - * - */ - async converteNoteSchedToTrackfile() { - const plugin = this.plugin; - const store = plugin.store; - - // if (plugin.syncLock) { - // return; - // } - plugin.syncLock = true; - - await store.load(); - // const algo = plugin.algorithm; - // const opts = algo.srsOptions(); - const notes: TFile[] = plugin.app.vault.getMarkdownFiles(); - for (const note of notes) { - if ( - plugin.data.settings.noteFoldersToIgnore.some((folder) => - note.path.contains(folder), - ) - ) { - continue; - } - - const deckPath: string[] = plugin.findDeckPath(note); - if (deckPath.length !== 0) { - // await plugin.findFlashcardsInNote(note, deckPath, false, false); - let fileText: string = await plugin.app.vault.read(note); - let fileChanged = false; - await this.syncNoteCardsIndex(note, (cardText, cardinfo) => { - let scheduling: RegExpMatchArray[] = [ - ...cardText.matchAll(MULTI_SCHEDULING_EXTRACTOR), - ]; - if (scheduling.length === 0) - scheduling = [...cardText.matchAll(LEGACY_SCHEDULING_EXTRACTOR)]; - if (scheduling.length > 0) { - this.setTrackfileCardSched( - note, - "#" + deckPath[0], - cardinfo.lineNo, - cardinfo.cardTextHash, - scheduling.length, - scheduling, - ); - // console.debug(cardinfo.lineNo, scheduling); - - const newCardText = this.updateCardSchedXml(cardText); - const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); - fileText = fileText.replace(replacementRegex, () => newCardText); - fileChanged = true; - } - }).then(async () => { - if (fileChanged) { - await plugin.app.vault.modify(note, fileText); - } - }); - } - - const fileCachedData = plugin.app.metadataCache.getFileCache(note) || {}; - - const frontmatter: FrontMatterCache | Record = - fileCachedData.frontmatter || {}; - const tags = getAllTags(fileCachedData) || []; - - const deckname = this.getNoteDeckName(tags); - if (deckname != null) { - const sched = this.getReviewNoteHeaderData(frontmatter); - if (sched != null) { - // console.debug("converteNoteSchedToTrackfile find:", note.path); - if (!store.isTracked(note.path)) { - store.trackFile(note.path, deckname); - } - const id = store.getFileId(note.path); - // store.reviewId(id, opts[1]); - - this.setSchedbyId(id, sched, true); - await this.updateNoteSchedFrontHeader(note); - } - } - } - - this.save(); - plugin.syncLock = false; - const msg = "converteNoteSchedToTrackfile success!"; - new Notice(msg); - console.log(msg); - } - - /** - *converteTrackfileToNoteSched - */ - async converteTrackfileToNoteSched() { - const plugin = this.plugin; - const store = plugin.store; - - plugin.syncLock = true; - - const tracked_files = this.data.trackedFiles; - for (const tkfile of tracked_files) { - if (tkfile == null) { - continue; - } - if ( - plugin.data.settings.noteFoldersToIgnore.some((folder) => - tkfile.path.contains(folder), - ) - ) { - continue; - } - - let exists = await this.verify(tkfile.path); - if (!exists) { - // in case file moved away. - const newfile = this.findMovedFile(tkfile.path); - if (newfile != null) { - tkfile.path = newfile.path; - exists = true; - console.debug("a file has been moved: " + newfile.path); - } - } - if (exists) { - const id = tkfile.items["file"]; - const note = this.plugin.app.vault.getAbstractFileByPath(tkfile.path) as TFile; - const deckPath: string[] = plugin.findDeckPath(note); - if (deckPath.length !== 0) { - // await plugin.findFlashcardsInNote(note, deckPath, false, false); - let fileText: string = await plugin.app.vault.read(note); - let fileChanged = false; - await this.syncNoteCardsIndex(note, (cardText, cardinfo) => { - if (cardinfo == null || cardinfo?.itemIds == null) { - return; - } - const ids = cardinfo.itemIds; - ids.sort((a: number, b: number) => a - b); - const scheduling: RegExpMatchArray[] = []; - ids.forEach((id: number) => { - const sched = this.getSchedbyId(id); - // ignore new add card - if (sched != null) { - scheduling.push(sched); - } - }); - const newCardText = this.updateCardSchedXml(cardText, scheduling); - const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); - fileText = fileText.replace(replacementRegex, () => newCardText); - fileChanged = true; - }).then(async () => { - if (fileChanged) { - await plugin.app.vault.modify(note, fileText); - } - }); - } - if (this.isDue(id)) { - // let due: number, ease: number, interval: number; - - const ret = store.getSchedbyId(id); - if (ret != null) { - // console.debug("converteTrackfileToNoteSched: " + tkfile.path); - await this.updateNoteSchedFrontHeader(note, ret); - } - } - } - } - plugin.syncLock = false; - const msg = "converteTrackfileToNoteSched success!"; - new Notice(msg); - console.log(msg); - } - - /** - * updateNoteSchedFrontHeader, if sched == null, delete sched info in frontmatter. - * @param note TFile - * @param sched [, due, interval, ease] | null - */ - async updateNoteSchedFrontHeader(note: TFile, sched?: RegExpMatchArray) { - // update yaml schedule - const plugin = this.plugin; - let schedString = ""; - if (sched != null) { - const [, dueString, interval, ease] = sched; - // const dueString: string = window.moment(due).format("YYYY-MM-DD"); - schedString = `sr-due: ${dueString}\nsr-interval: ${interval}\n` + `sr-ease: ${ease}\n`; - } else { - schedString = ""; - } - - let fileText: string = await plugin.app.vault.read(note); - - // check if scheduling info exists - if (SCHEDULING_INFO_REGEX.test(fileText)) { - const schedulingInfo = SCHEDULING_INFO_REGEX.exec(fileText); - if (schedulingInfo[1].length || schedulingInfo[5].length) { - fileText = fileText.replace( - SCHEDULING_INFO_REGEX, - `---\n${schedulingInfo[1]}${schedString}` + `${schedulingInfo[5]}---\n`, - ); - } else { - fileText = fileText.replace(SCHEDULING_INFO_REGEX, ""); - } - } else if (YAML_FRONT_MATTER_REGEX.test(fileText)) { - // new note with existing YAML front matter - const existingYaml = YAML_FRONT_MATTER_REGEX.exec(fileText); - fileText = fileText.replace( - YAML_FRONT_MATTER_REGEX, - `---\n${existingYaml[1]}${schedString}---`, - ); - } else { - fileText = `---\n${schedString}---\n${fileText}`; - } - await plugin.app.vault.modify(note, fileText); - } - - /** - * updateCardSchedXml, if have scheduling, update card sched in note. else delete it. - * @param cardText - * @param scheduling - * @param cardCount - * @returns - */ - updateCardSchedXml(cardText: string, scheduling?: RegExpMatchArray[], cardCount?: number) { - const plugin = this.plugin; - let schedString = ""; - let sep: string = plugin.data.settings.cardCommentOnSameLine ? " " : "\n"; - const headerReg = /."; - } else { - schedString = ""; - } - - // const idxSched: number = cardText.lastIndexOf(sep + " note: %s doesn't have sr frontmatter. ", + frontmatter, + ); + return null; + } +} + +/** + * updateNoteSchedFrontHeader, if sched == null, delete sched info in frontmatter. + * @param note TFile + * @param fileText: string + * @param sched [, due, interval, ease] | null + */ +export function updateNoteSchedFrontHeader(fileText: string, sched?: RegExpMatchArray) { + // update yaml schedule + // const plugin = this.plugin; + let schedString = ""; + if (sched != null) { + const [, dueString, interval, ease] = sched; + // const dueString: string = window.moment(due).format("YYYY-MM-DD"); + schedString = `sr-due: ${dueString}\nsr-interval: ${interval}\n` + `sr-ease: ${ease}\n`; + } else { + schedString = ""; + } + + // check if scheduling info exists + if (SCHEDULING_INFO_REGEX.test(fileText)) { + const schedulingInfo = SCHEDULING_INFO_REGEX.exec(fileText); + if (schedulingInfo[1].length || schedulingInfo[5].length) { + fileText = fileText.replace( + SCHEDULING_INFO_REGEX, + `---\n${schedulingInfo[1]}${schedString}` + `${schedulingInfo[5]}---\n`, + ); + } else if (schedString.length > 0) { + fileText = fileText.replace(SCHEDULING_INFO_REGEX, `---\n${schedString}---\n`); + } else { + fileText = fileText.replace(SCHEDULING_INFO_REGEX, ""); + } + } else if (YAML_FRONT_MATTER_REGEX.test(fileText)) { + // new note with existing YAML front matter + const existingYaml = YAML_FRONT_MATTER_REGEX.exec(fileText); + fileText = fileText.replace( + YAML_FRONT_MATTER_REGEX, + `---\n${existingYaml[1]}${schedString}---`, + ); + } else { + fileText = `---\n${schedString}---\n${fileText}`; + } + return fileText; +} + +/** + * updateCardSchedXml, if have scheduling, update card sched in note. else delete it. + * @param cardText + * @param scheduling + * @param cardCount + * @returns + */ +export function updateCardSchedXml( + cardText: string, + cardCommentOnSameLine: boolean = true, + scheduling?: RegExpMatchArray[], + cardCount?: number, +) { + let sep: string = cardCommentOnSameLine ? " " : "\n"; + let schedString = sep + ""; + } else { + schedString = ""; + } + + // const idxSched: number = cardText.lastIndexOf(sep + "`; - } else { - scheduling = [...this.currentCard.cardText.matchAll(MULTI_SCHEDULING_EXTRACTOR)]; - if (scheduling.length === 0) { - scheduling = [ - ...this.currentCard.cardText.matchAll(LEGACY_SCHEDULING_EXTRACTOR), - ]; - } - - const currCardSched: string[] = [ - "0", - dueString, - interval.toString(), - ease.toString(), - ]; - if (this.currentCard.isDue) { - scheduling[this.currentCard.siblingIdx] = currCardSched; - } else { - scheduling.push(currCardSched); - } - - this.currentCard.cardText = this.currentCard.cardText.replace(//gm, ""); - this.currentCard.cardText += ""; - } - - fileText = fileText.replace(replacementRegex, () => this.currentCard.cardText); - - await this.app.vault.modify(this.currentCard.note, fileText); - } else { - const store = this.plugin.store; - const lineNo: number = this.currentCard.lineNo; - const hash: string = cyrb53(this.currentCard.cardText); - const cardinfo = store.getAndSyncCardInfo(this.currentCard.note, lineNo, hash); - if (this.plugin.data.settings.algorithm === algorithmNames.Default) { - const due = new Date(); - store.setSchedbyId(cardinfo.itemIds[this.currentCard.siblingIdx], [ - 0, - due.valueOf(), - currSchedintvl_ease_old[0], - currSchedintvl_ease_old[1], - ]); - } - const id = cardinfo.itemIds[this.currentCard.siblingIdx]; - store.updateReviewedCounts(id, RPITEMTYPE.CARD); - store.reviewId(id, opt); - store.save(); - } - - for (const sibling of this.currentCard.siblings) { - sibling.cardText = this.currentCard.cardText; - } - if (this.plugin.data.settings.burySiblingCards) { - this.burySiblingCards(true); - } - - this.currentDeck.nextCard(this); - } - - private async burySiblingCards(tillNextDay: boolean): Promise { - if (tillNextDay) { - this.plugin.data.buryList.push(cyrb53(this.currentCard.cardText)); - await this.plugin.savePluginData(); - } - - for (const sibling of this.currentCard.siblings) { - if (sibling === this.currentCard) { - // already delete at processReview - continue; - } - - const dueIdx = this.currentDeck.dueFlashcards.indexOf(sibling); - const newIdx = this.currentDeck.newFlashcards.indexOf(sibling); - - if (dueIdx !== -1) { - this.currentDeck.deleteFlashcardAtIndex( - dueIdx, - this.currentDeck.dueFlashcards[dueIdx].isDue, - ); - } else if (newIdx !== -1) { - this.currentDeck.deleteFlashcardAtIndex( - newIdx, - this.currentDeck.newFlashcards[newIdx].isDue, - ); - } - } - } - - private skipCurrentCard(): void { - this.currentDeck.deleteFlashcardAtIndex(this.currentCardIdx, this.currentCard.isDue); - this.burySiblingCards(false); - this.currentDeck.nextCard(this); - } - - // slightly modified version of the renderMarkdown function in - // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/KanbanView.tsx - async renderMarkdownWrapper( - markdownString: string, - containerEl: HTMLElement, - recursiveDepth = 0, - ): Promise { - if (recursiveDepth > 4) return; - - MarkdownRenderer.renderMarkdown( - markdownString, - containerEl, - this.currentCard.note.path, - this.plugin, - ); - - containerEl.findAll(".internal-embed").forEach((el) => { - const link = this.parseLink(el.getAttribute("src")); - - // file does not exist, display dead link - if (!link.target) { - el.innerText = link.text; - } else if (link.target instanceof TFile) { - if (link.target.extension !== "md") { - this.embedMediaFile(el, link.target); - } else { - el.innerText = ""; - this.renderTransclude(el, link, recursiveDepth); - } - } - }); - } - - private parseLink(src: string) { - const linkComponentsRegex = - /^(?[^#^]+)?(?:#(?!\^)(?.+)|#\^(?.+)|#)?$/; - const matched = typeof src === "string" && src.match(linkComponentsRegex); - const file = matched.groups.file || this.currentCard.note.path; - const target = this.plugin.app.metadataCache.getFirstLinkpathDest( - file, - this.currentCard.note.path, - ); - return { - text: matched[0], - file: matched.groups.file, - heading: matched.groups.heading, - blockId: matched.groups.blockId, - target: target, - }; - } - - private embedMediaFile(el: HTMLElement, target: TFile) { - el.innerText = ""; - if (IMAGE_FORMATS.includes(target.extension)) { - el.createEl( - "img", - { - attr: { - src: this.plugin.app.vault.getResourcePath(target), - }, - }, - (img) => { - if (el.hasAttribute("width")) - img.setAttribute("width", el.getAttribute("width")); - else img.setAttribute("width", "100%"); - if (el.hasAttribute("alt")) img.setAttribute("alt", el.getAttribute("alt")); - el.addEventListener( - "click", - (ev) => - ((ev.target as HTMLElement).style.minWidth = - (ev.target as HTMLElement).style.minWidth === "100%" - ? null - : "100%"), - ); - }, - ); - el.addClasses(["image-embed", "is-loaded"]); - } else if ( - AUDIO_FORMATS.includes(target.extension) || - VIDEO_FORMATS.includes(target.extension) - ) { - el.createEl( - AUDIO_FORMATS.includes(target.extension) ? "audio" : "video", - { - attr: { - controls: "", - src: this.plugin.app.vault.getResourcePath(target), - }, - }, - (audio) => { - if (el.hasAttribute("alt")) audio.setAttribute("alt", el.getAttribute("alt")); - }, - ); - el.addClasses(["media-embed", "is-loaded"]); - } else { - el.innerText = target.path; - } - } - - private async renderTransclude( - el: HTMLElement, - link: { - text: string; - file: string; - heading: string; - blockId: string; - target: TFile; - }, - recursiveDepth: number, - ) { - const cache = this.app.metadataCache.getCache(link.target.path); - const text = await this.app.vault.cachedRead(link.target); - let blockText; - if (link.heading) { - const clean = (s: string) => s.replace(/[\W\s]/g, ""); - const headingIndex = cache.headings?.findIndex( - (h) => clean(h.heading) === clean(link.heading), - ); - const heading = cache.headings[headingIndex]; - - const startAt = heading.position.start.offset; - const endAt = - cache.headings.slice(headingIndex + 1).find((h) => h.level <= heading.level) - ?.position?.start?.offset || text.length; - - blockText = text.substring(startAt, endAt); - } else if (link.blockId) { - const block = cache.blocks[link.blockId]; - const startAt = block.position.start.offset; - const endAt = block.position.end.offset; - blockText = text.substring(startAt, endAt); - } else { - blockText = text; - } - - this.renderMarkdownWrapper(blockText, el, recursiveDepth + 1); - } -} - -export class Deck { - public deckName: string; - public newFlashcards: Card[]; - public newFlashcardsCount = 0; // counts those in subdecks too - public dueFlashcards: Card[]; - public dueFlashcardsCount = 0; // counts those in subdecks too - public totalFlashcards = 0; // counts those in subdecks too - public subdecks: Deck[]; - public parent: Deck | null; - - constructor(deckName: string, parent: Deck | null) { - this.deckName = deckName; - this.newFlashcards = []; - this.newFlashcardsCount = 0; - this.dueFlashcards = []; - this.dueFlashcardsCount = 0; - this.totalFlashcards = 0; - this.subdecks = []; - this.parent = parent; - } - - createDeck(deckPath: string[]): void { - if (deckPath.length === 0) { - return; - } - - const deckName: string = deckPath.shift(); - for (const deck of this.subdecks) { - if (deckName === deck.deckName) { - deck.createDeck(deckPath); - return; - } - } - - const deck: Deck = new Deck(deckName, this); - this.subdecks.push(deck); - deck.createDeck(deckPath); - } - - insertFlashcard(deckPath: string[], cardObj: Card): void { - if (cardObj.isDue) { - this.dueFlashcardsCount++; - } else { - this.newFlashcardsCount++; - } - this.totalFlashcards++; - - if (deckPath.length === 0) { - if (cardObj.isDue) { - this.dueFlashcards.push(cardObj); - } else { - this.newFlashcards.push(cardObj); - } - return; - } - - const deckName: string = deckPath.shift(); - for (const deck of this.subdecks) { - if (deckName === deck.deckName) { - deck.insertFlashcard(deckPath, cardObj); - return; - } - } - } - - // count flashcards that have either been buried - // or aren't due yet - countFlashcard(deckPath: string[], n = 1): void { - this.totalFlashcards += n; - - const deckName: string = deckPath.shift(); - for (const deck of this.subdecks) { - if (deckName === deck.deckName) { - deck.countFlashcard(deckPath, n); - return; - } - } - } - - deleteFlashcardAtIndex(index: number, cardIsDue: boolean): void { - if (cardIsDue) { - this.dueFlashcards.splice(index, 1); - this.dueFlashcardsCount--; - } else { - this.newFlashcards.splice(index, 1); - this.newFlashcardsCount--; - } - - let deck: Deck = this.parent; - while (deck !== null) { - if (cardIsDue) { - deck.dueFlashcardsCount--; - } else { - deck.newFlashcardsCount--; - } - deck = deck.parent; - } - } - - sortSubdecksList(): void { - this.subdecks.sort((a, b) => { - if (a.deckName < b.deckName) { - return -1; - } else if (a.deckName > b.deckName) { - return 1; - } - return 0; - }); - - for (const deck of this.subdecks) { - deck.sortSubdecksList(); - } - } - - render(containerEl: HTMLElement, modal: FlashcardModal): void { - const deckView: HTMLElement = containerEl.createDiv("tree-item"); - - const deckViewSelf: HTMLElement = deckView.createDiv( - "tree-item-self tag-pane-tag is-clickable", - ); - const shouldBeInitiallyExpanded: boolean = - modal.plugin.data.settings.initiallyExpandAllSubdecksInTree; - let collapsed = !shouldBeInitiallyExpanded; - let collapseIconEl: HTMLElement | null = null; - if (this.subdecks.length > 0) { - collapseIconEl = deckViewSelf.createDiv("tree-item-icon collapse-icon"); - collapseIconEl.innerHTML = COLLAPSE_ICON; - (collapseIconEl.childNodes[0] as HTMLElement).style.transform = collapsed - ? "rotate(-90deg)" - : ""; - } - - const deckViewInner: HTMLElement = deckViewSelf.createDiv("tree-item-inner"); - deckViewInner.addEventListener("click", () => { - modal.plugin.data.historyDeck = this.deckName; - modal.currentDeck = this; - modal.checkDeck = this.parent; - modal.setupCardsView(); - this.nextCard(modal); - }); - const deckViewInnerText: HTMLElement = deckViewInner.createDiv("tag-pane-tag-text"); - deckViewInnerText.innerHTML += {this.deckName}; - const deckViewOuter: HTMLElement = deckViewSelf.createDiv("tree-item-flair-outer"); - deckViewOuter.innerHTML += ( - - - {this.dueFlashcardsCount.toString()} - - - {this.newFlashcardsCount.toString()} - - - {this.totalFlashcards.toString()} - - - ); - - const deckViewChildren: HTMLElement = deckView.createDiv("tree-item-children"); - deckViewChildren.style.display = collapsed ? "none" : "block"; - if (this.subdecks.length > 0) { - collapseIconEl.addEventListener("click", () => { - if (collapsed) { - (collapseIconEl.childNodes[0] as HTMLElement).style.transform = ""; - deckViewChildren.style.display = "block"; - } else { - (collapseIconEl.childNodes[0] as HTMLElement).style.transform = - "rotate(-90deg)"; - deckViewChildren.style.display = "none"; - } - collapsed = !collapsed; - }); - } - for (const deck of this.subdecks) { - deck.render(deckViewChildren, modal); - } - } - - nextCard(modal: FlashcardModal): void { - if (this.newFlashcards.length + this.dueFlashcards.length === 0) { - if (this.dueFlashcardsCount + this.newFlashcardsCount > 0) { - for (const deck of this.subdecks) { - if (deck.dueFlashcardsCount + deck.newFlashcardsCount > 0) { - modal.currentDeck = deck; - deck.nextCard(modal); - return; - } - } - } - - if (this.parent == modal.checkDeck) { - modal.plugin.data.historyDeck = ""; - modal.decksList(); - } else { - this.parent.nextCard(modal); - } - return; - } - - modal.responseDiv.style.display = "none"; - modal.resetButton.disabled = true; - modal.titleEl.setText( - `${this.deckName}: ${this.dueFlashcardsCount + this.newFlashcardsCount}`, - ); - - modal.answerBtn.style.display = "initial"; - modal.flashcardView.empty(); - modal.mode = FlashcardModalMode.Front; - - let interval = 1.0, - ease: number = modal.plugin.data.settings.baseEase, - delayBeforeReview = 0; - if (this.dueFlashcards.length > 0) { - if (modal.plugin.data.settings.randomizeCardOrder) { - modal.currentCardIdx = Math.floor(Math.random() * this.dueFlashcards.length); - } else { - modal.currentCardIdx = 0; - } - modal.currentCard = this.dueFlashcards[modal.currentCardIdx]; - modal.renderMarkdownWrapper(modal.currentCard.front, modal.flashcardView); - - interval = modal.currentCard.interval; - ease = modal.currentCard.ease; - delayBeforeReview = modal.currentCard.delayBeforeReview; - } else if (this.newFlashcards.length > 0) { - if (modal.plugin.data.settings.randomizeCardOrder) { - const pickedCardIdx = Math.floor(Math.random() * this.newFlashcards.length); - modal.currentCardIdx = pickedCardIdx; - - // look for first unscheduled sibling - const pickedCard: Card = this.newFlashcards[pickedCardIdx]; - let idx = pickedCardIdx; - while (idx >= 0 && pickedCard.siblings.includes(this.newFlashcards[idx])) { - if (!this.newFlashcards[idx].isDue) { - modal.currentCardIdx = idx; - } - idx--; - } - } else { - modal.currentCardIdx = 0; - } - - modal.currentCard = this.newFlashcards[modal.currentCardIdx]; - modal.renderMarkdownWrapper(modal.currentCard.front, modal.flashcardView); - - if ( - Object.prototype.hasOwnProperty.call( - modal.plugin.easeByPath, - modal.currentCard.note.path, - ) - ) { - ease = modal.plugin.easeByPath[modal.currentCard.note.path]; - } - } - const intervals: number[] = []; - const settings = modal.plugin.data.settings; - const algo = settings.algorithm; - const btnTexts = modal.plugin.data.settings.responseOptionBtnsText[algo]; - const opts = modal.plugin.algorithm.srsOptions(); - if (settings.dataLocation === DataLocation.SaveOnNoteFile) { - opts.forEach((v, _idx) => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - const resp = ReviewResponse[v] as ReviewResponse; - const itv = schedule(resp, interval, ease, delayBeforeReview, settings).interval; - intervals.push(itv); - }); - } else { - const store = modal.plugin.store; - const lineNo: number = modal.currentCard.lineNo; - const hash: string = cyrb53(modal.currentCard.cardText); - const cardinfo = store.getAndSyncCardInfo(modal.currentCard.note, lineNo, hash); - const cardId = cardinfo.itemIds[modal.currentCard.siblingIdx]; - const cardItem = store.getItembyID(cardId); - // console.debug("item:", cardItem); - intervals.push(...modal.plugin.algorithm.calcAllOptsIntervals(cardItem)); - } - - if (modal.ignoreStats) { - // Same for mobile/desktop - modal.hardBtn.setText(`${btnTexts[1]}`); - modal.easyBtn.setText(`${btnTexts[btnTexts.length - 1]}`); - } else if (!modal.plugin.data.settings.intervalShowHide) { - for (let i = 1; i < modal.responseBtns.length; i++) { - modal.responseBtns[i].setText(`${btnTexts[i]}`); - } - } else if (Platform.isMobile) { - for (let i = 1; i < modal.responseBtns.length; i++) { - modal.responseBtns[i].setText( - textInterval(Math.round(intervals[i] * 100) / 100, true), - ); - } - // modal.hardBtn.setText(textInterval(hardInterval, true)); - // modal.goodBtn.setText(textInterval(goodInterval, true)); - // modal.easyBtn.setText(textInterval(easyInterval, true)); - } else { - for (let i = 1; i < modal.responseBtns.length; i++) { - modal.responseBtns[i].setText( - `${btnTexts[i]} - ${textInterval(Math.round(intervals[i] * 100) / 100, false)}`, - ); - } - /* modal.hardBtn.setText( - `${modal.plugin.data.settings.flashcardHardText} - ${textInterval( - hardInterval, - false - )}` - ); - modal.goodBtn.setText( - `${modal.plugin.data.settings.flashcardGoodText} - ${textInterval( - goodInterval, - false - )}` - ); - modal.easyBtn.setText( - `${modal.plugin.data.settings.flashcardEasyText} - ${textInterval( - easyInterval, - false - )}` - ); */ - } - - if (modal.plugin.data.settings.showContextInCards) - modal.contextView.setText(modal.currentCard.context); - } -} diff --git a/src/modals/ReleaseNotes.ts b/src/gui/ReleaseNotes.ts similarity index 76% rename from src/modals/ReleaseNotes.ts rename to src/gui/ReleaseNotes.ts index dd814f5a..ab582008 100644 --- a/src/modals/ReleaseNotes.ts +++ b/src/gui/ReleaseNotes.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { App, MarkdownRenderer, Modal, Notice, moment, request } from "obsidian"; -import { errorlog, isVersionNewerThanOther } from "src/utils_recall"; -import SRPlugin from "../main"; +import { errorlog, isVersionNewerThanOther } from "src/util/utils_recall"; +import SRPlugin from "src/main"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore @@ -12,21 +12,22 @@ import README_ZH from "docs/README_ZH.md"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import RELEASE_changelog from "docs/changelog.md"; +import { buildDonation } from "src/settings"; // const fmd = fs.readFileSync("CHANGELOG.md", "utf8"); const local = moment.locale(); let README_LOC: string; let readme: string[]; -let readme_tks: string[]; +// let readme_tks: string[]; if (local === "zh-cn" || local === "zh-tw") { README_LOC = README_ZH; readme = README_LOC.match(/^(.|\r?\n)*(?=\r?\n## 下载)/gm); - readme_tks = README_LOC.match(/^(## Thanks(?:.|\r?\n)*)$/gm); + // readme_tks = README_LOC.match(/^(## Thanks(?:.|\r?\n)*)$/gm); } else { README_LOC = README; readme = README_LOC.match(/^(.|\r?\n)*(?=\r?\n## How)/gm); - readme_tks = README_LOC.match(/^(## Thanks(?:.|\r?\n)*)$/gm); + // readme_tks = README_LOC.match(/^(## Thanks(?:.|\r?\n)*)$/gm); } const latestRelease = RELEASE_changelog.match(/## \[(?:.|\r?\n)*?(?=\r?\n## \[)/gm); let PLUGIN_VERSION: string; @@ -60,16 +61,17 @@ export class ReleaseNotes extends Modal { } async createForm() { - const FIRST_RUN = [readme[0], readme_tks[0]].join("\n\n---\n"); - const release_note = await this.getReleaseNote(); - const notes: string[] = []; - if (release_note == null) { - notes.push(...FIRST_RUN, latestRelease[0]); - } else { - release_note.slice(0, 9).forEach((el: { release_note: any }) => { - notes.push(el.release_note); - }); - } + const FIRST_RUN = [readme[0]].join("\n\n---\n"); + let instro: string = FIRST_RUN.match(/^(?:.|\r?\n)+?(?=\r\n## Feat)/gm).join("\n\n---\n"); + // const release_note = await this.getReleaseNote(); + // const notes: string[] = []; + // if (release_note == null) { + // notes.push(...FIRST_RUN, latestRelease[0]); + // } else { + // release_note.slice(0, 9).forEach((el: { release_note: any }) => { + // notes.push(el.release_note); + // }); + // } let prevRelease = this.plugin.data.settings.previousRelease; prevRelease = this.version === prevRelease ? "0.0.0" : prevRelease; // const message = this.version ? notes.join("\n\n---\n") : FIRST_RUN; @@ -82,9 +84,12 @@ export class ReleaseNotes extends Modal { // .map((key: string) => `${key==="Intro" ? "" : `# ${key}\n`}${RELEASE_NOTES[key]}`) .slice(0, 10) .join("\n\n---\n") - : FIRST_RUN; - message = this.version ? FIRST_RUN + message : message; - await MarkdownRenderer.renderMarkdown(message, this.contentEl, "", this.plugin); + : ""; + instro = this.version ? instro : FIRST_RUN; + message = this.version ? "## What's New:\n---\n" + message : message; + await MarkdownRenderer.render(this.plugin.app, instro, this.contentEl, "", this.plugin); + buildDonation(this.contentEl); + await MarkdownRenderer.render(this.plugin.app, message, this.contentEl, "", this.plugin); this.contentEl.createEl("p", { text: "" }, (el) => { //files manually follow one of two options: @@ -97,8 +102,8 @@ export class ReleaseNotes extends Modal { async getReleaseNote(): Promise { const release_url = "https://api.github.com/repos/open-spaced-repetiton/obsidian-spaced-repetition-recall/releases?per_page=5&page=1"; - const readMe_url = - "https://api.github.com/repos/open-spaced-repetiton/obsidian-spaced-repetition-recall/readme"; + // const readMe_url = + // "https://api.github.com/repos/open-spaced-repetiton/obsidian-spaced-repetition-recall/readme"; // "content": "encoding": "base64" diff --git a/src/modals/confirm.tsx b/src/gui/confirm.tsx similarity index 61% rename from src/modals/confirm.tsx rename to src/gui/confirm.tsx index 053f9692..7d203da4 100644 --- a/src/modals/confirm.tsx +++ b/src/gui/confirm.tsx @@ -1,26 +1,28 @@ -import { App, Modal, ButtonComponent } from "obsidian"; +import { App, Modal, ButtonComponent, MarkdownRenderer } from "obsidian"; +import SRPlugin from "src/main"; type ConfirmCallback = (confirmed: boolean) => void; export default class ConfirmModal { + private plugin: SRPlugin; message: string; callback: ConfirmCallback; modal: Modal; - constructor(app: App, message: string, callback: ConfirmCallback) { - // super(app); + constructor(plugin: SRPlugin, message: string, callback: ConfirmCallback) { + this.plugin = plugin; this.message = message; - this.modal = new Modal(app); + this.modal = new Modal(plugin.app); this.callback = callback; } open() { const { contentEl } = this.modal; - - contentEl.createEl("p").setText(this.message); + MarkdownRenderer.render(this.plugin.app, this.message, contentEl, "", this.plugin); + // contentEl.createEl("p").setText(this.message); const buttonDiv = contentEl.createDiv("srs-flex-row"); - buttonDiv.setAttribute("align", "center"); + // buttonDiv.setAttribute("align", "center"); new ButtonComponent(buttonDiv) .setButtonText("Confirm") diff --git a/src/gui/flashcard-modal.tsx b/src/gui/flashcard-modal.tsx index a574de4d..3bfa1893 100644 --- a/src/gui/flashcard-modal.tsx +++ b/src/gui/flashcard-modal.tsx @@ -1,4 +1,4 @@ -import { Modal, App, Notice, Platform, setIcon } from "obsidian"; +import { Modal, App, Notice, Platform, setIcon, MarkdownView } from "obsidian"; // eslint-disable-next-line @typescript-eslint/no-unused-vars import h from "vhtml"; @@ -20,6 +20,10 @@ import { Note } from "src/Note"; import { RenderMarkdownWrapper } from "src/util/RenderMarkdownWrapper"; import { CardScheduleInfo } from "src/CardSchedule"; import { TopicPath } from "src/TopicPath"; +import { RPITEMTYPE } from "src/dataStore/data"; +import { DataLocation } from "src/dataStore/location_switch"; +import { SrTFile } from "src/SRFile"; +import { RepetitionItem } from "src/dataStore/repetitionItem"; export enum FlashcardModalMode { DecksList, @@ -33,12 +37,14 @@ export class FlashcardModal extends Modal { public answerBtn: HTMLElement; public flashcardView: HTMLElement; private flashCardMenu: HTMLDivElement; + public responseBtns: HTMLElement[]; public hardBtn: HTMLElement; public goodBtn: HTMLElement; public easyBtn: HTMLElement; public nextBtn: HTMLElement; public responseDiv: HTMLElement; public resetButton: HTMLButtonElement; + public openNoteFileButton: HTMLElement; public editButton: HTMLElement; public contextView: HTMLElement; public mode: FlashcardModalMode; @@ -46,6 +52,9 @@ export class FlashcardModal extends Modal { private settings: SRSettings; private reviewMode: FlashcardReviewMode; + public cardItem: RepetitionItem; + public options: string[]; + private get currentCard(): Card { return this.reviewSequencer.currentCard; } @@ -68,6 +77,7 @@ export class FlashcardModal extends Modal { super(app); this.plugin = plugin; + this.options = this.plugin.algorithm.srsOptions(); this.settings = settings; this.reviewSequencer = reviewSequencer; this.reviewMode = reviewMode; @@ -78,6 +88,7 @@ export class FlashcardModal extends Modal { if (Platform.isMobile) { this.contentEl.style.display = "block"; } + this.modalEl.style.position = "relative"; this.modalEl.style.height = this.settings.flashcardHeightPercentage + "%"; this.modalEl.style.width = this.settings.flashcardWidthPercentage + "%"; @@ -261,6 +272,7 @@ export class FlashcardModal extends Modal { this.flashCardMenu = this.contentEl.createDiv("sr-flashcard-menu"); this.createBackButton(); + this.createOpenFileButton(); this.createEditButton(); this.createResetButton(); this.createCardInfoButton(); @@ -280,6 +292,9 @@ export class FlashcardModal extends Modal { if (this.reviewMode == FlashcardReviewMode.Cram) { this.goodBtn.style.display = "none"; + for (let i = 2; i < this.responseBtns.length - 1; i++) { + this.responseBtns[i].style.display = "none"; + } this.responseDiv.addClass("sr-ignorestats-response"); this.easyBtn.addClass("sr-ignorestats-btn"); @@ -298,30 +313,30 @@ export class FlashcardModal extends Modal { createResponseButtons() { this.responseDiv = this.contentEl.createDiv("sr-flashcard-response"); + const optBtnCounts = this.plugin.algorithm.srsOptions().length; + let btnCols = 4; + if (!Platform.isMobile && optBtnCounts > btnCols) { + btnCols = optBtnCounts; + } + this.responseDiv.setAttribute( + "style", + `grid-template-columns: ${"1fr ".repeat(btnCols - 1)}`, + ); - this.hardBtn = document.createElement("button"); - this.hardBtn.setAttribute("id", "sr-hard-btn"); - this.hardBtn.setText(this.settings.flashcardHardText); - this.hardBtn.addEventListener("click", () => { - this.processReview(ReviewResponse.Hard); - }); - this.responseDiv.appendChild(this.hardBtn); - - this.goodBtn = document.createElement("button"); - this.goodBtn.setAttribute("id", "sr-good-btn"); - this.goodBtn.setText(this.settings.flashcardGoodText); - this.goodBtn.addEventListener("click", () => { - this.processReview(ReviewResponse.Good); - }); - this.responseDiv.appendChild(this.goodBtn); + for (let i = 1; i < this.options.length; i++) { + this.responseBtns.push(document.createElement("button")); + this.responseBtns[i].setAttribute("id", "sr-" + this.options[i].toLowerCase() + "-btn"); + this.responseBtns[i].setAttribute("class", "ResponseFloatBarCommandItem"); + this.responseBtns[i].setText(this.plugin.data.settings.flashcardHardText); + this.responseBtns[i].addEventListener("click", () => { + this.processReview(i); + }); + this.responseDiv.appendChild(this.responseBtns[i]); + } + this.hardBtn = this.responseBtns[1]; + this.goodBtn = this.responseBtns.at(-2); + this.easyBtn = this.responseBtns.last(); - this.easyBtn = document.createElement("button"); - this.easyBtn.setAttribute("id", "sr-easy-btn"); - this.easyBtn.setText(this.settings.flashcardEasyText); - this.easyBtn.addEventListener("click", () => { - this.processReview(ReviewResponse.Easy); - }); - this.responseDiv.appendChild(this.easyBtn); this.responseDiv.style.display = "none"; } @@ -375,6 +390,8 @@ export class FlashcardModal extends Modal { this.resetButton.addEventListener("click", () => { this.processReview(ReviewResponse.Reset); }); + this.responseBtns = []; + this.responseBtns.push(this.resetButton); } createEditButton() { @@ -387,6 +404,38 @@ export class FlashcardModal extends Modal { }); } + createOpenFileButton() { + this.openNoteFileButton = this.flashCardMenu.createEl("button"); + this.openNoteFileButton.addClass("sr-flashcard-menu-item"); + setIcon(this.openNoteFileButton, "file-edit"); + this.openNoteFileButton.setAttribute("aria-label", t("OPEN_NOTE")); + this.openNoteFileButton.addEventListener("click", async () => { + const activeLeaf = this.plugin.app.workspace.getLeaf("tab"); + const noteFile = this.currentCard.question.note.file as SrTFile; + await activeLeaf.openFile(noteFile.file); + if (activeLeaf.view instanceof MarkdownView) { + const activeView = activeLeaf.view; + const pos = { + line: this.currentCard.question.lineNo, + ch: 0, + }; + // const posEnd = {} + activeView.editor.setCursor(pos); + if (activeView.getMode() === "preview") { + activeView.currentMode.applyScroll(pos.line); + } else { + activeView.editor.scrollIntoView( + { + from: pos, + to: pos, + }, + true, + ); + } + } + }); + } + async doEditQuestionText(): Promise { const currentQ: Question = this.reviewSequencer.currentQuestion; @@ -428,11 +477,25 @@ export class FlashcardModal extends Modal { } private async processReview(response: ReviewResponse): Promise { + if (this.settings.dataLocation !== DataLocation.SaveOnNoteFile) { + // just update storedata + this.processReviewbyAlgo(response); + } await this.reviewSequencer.processReview(response); // console.log(`processReview: ${response}: ${this.currentCard?.front ?? 'None'}`) await this.handleNextCard(); } + private processReviewbyAlgo(response: ReviewResponse) { + const opt = this.plugin.algorithm.srsOptions()[response]; + const store = this.plugin.store; + const id = this.currentCard.Id; + + store.updateReviewedCounts(id, RPITEMTYPE.CARD); + store.reviewId(id, opt); + store.save(); + } + private async skipCurrentCard(): Promise { this.reviewSequencer.skipCurrentCard(); // console.log(`skipCurrentCard: ${this.currentCard?.front ?? 'None'}`) @@ -462,10 +525,22 @@ export class FlashcardModal extends Modal { ); await wrapper.renderMarkdownWrapper(this.currentCard.front, this.flashcardView); + // const intervals: number[] = []; + const settings = this.plugin.data.settings; + const algo = settings.algorithm; + const btnTexts = settings.responseOptionBtnsText[algo]; + // const opts = this.plugin.algorithm.srsOptions(); + // todo: opts and ReviewResponse if (this.reviewMode == FlashcardReviewMode.Cram) { // Same for mobile/desktop - this.hardBtn.setText(`${this.settings.flashcardHardText}`); - this.easyBtn.setText(`${this.settings.flashcardEasyText}`); + this.hardBtn.setText(`${btnTexts[1]}`); + this.easyBtn.setText(`${btnTexts.last()}`); + } else if (!settings.intervalShowHide) { + for (let i = 1; i < this.responseBtns.length; i++) { + this.responseBtns[i].setText(`${btnTexts[i]}`); + } + } else if (settings.dataLocation !== DataLocation.SaveOnNoteFile) { + this.setupResponseBtns(btnTexts); } else { this.setupEaseButton( this.hardBtn, @@ -495,6 +570,33 @@ export class FlashcardModal extends Modal { return result; } + private setupResponseBtns(btnTexts: string[]) { + const store = this.plugin.store; + // const lineNo: number = this.currentCard.question.lineNo; + // const hash: string = BlockUtils.getTxtHash( + // this.currentCard.question.questionText.actualQuestion, + // ); + // const file: SrTFile = this.currentCard.question.note.file as SrTFile; + // const cardinfo = store.getSyncCardInfo(file.file, lineNo, hash); + // const cardId = cardinfo.itemIds[this.currentCard.cardIdx]; + // const cardItem = store.getItembyID(cardId); + const cardItem = store.getItembyID(this.currentCard.Id); + // console.debug("item:", cardItem); + const intervals = this.plugin.algorithm.calcAllOptsIntervals(cardItem); + + if (Platform.isMobile) { + for (let i = 1; i < this.responseBtns.length; i++) { + this.responseBtns[i].setText(textInterval(intervals[i], true)); + } + } else { + for (let i = 1; i < this.responseBtns.length; i++) { + this.responseBtns[i].setText( + `${btnTexts[i]} - ${textInterval(intervals[i], false)}`, + ); + } + } + } + private setupEaseButton( button: HTMLElement, buttonName: string, diff --git a/src/gui/info.ts b/src/gui/info.ts new file mode 100644 index 00000000..1af794b4 --- /dev/null +++ b/src/gui/info.ts @@ -0,0 +1,152 @@ +import { ButtonComponent, Modal, Setting, TFile } from "obsidian"; +import { algorithmNames } from "src/algorithms/algorithms_switch"; +import { AnkiData } from "src/algorithms/anki"; +import { FsrsData } from "src/algorithms/fsrs"; +import { DataStore } from "src/dataStore/data"; +import { RepetitionItem } from "src/dataStore/repetitionItem"; +import { SRSettings } from "src/settings"; + +export class ItemInfoModal extends Modal { + // plugin: ObsidianSrsPlugin; + store: DataStore; + settings: SRSettings; + file: TFile; + nextReview: number; + lastInterval: number; + + constructor(settings: SRSettings, file: TFile) { + super(app); + // this.plugin = plugin; + this.store = DataStore.getInstance(); + this.settings = settings; + this.file = file; + } + + onOpen() { + const { contentEl } = this; + //TODO: Implement Item info. + const item = this.store.getItemsOfFile(this.file.path)[0]; + // const path = this.store.getFilePath(item); + // contentEl.createEl("p").setText("Item info of " + this.file.path); + const buttonDivAll = contentEl.createDiv("srs-flex-row"); + const contentdiv = contentEl.createEl("div"); + + this.displayitem(contentdiv, item); + + // new ButtonComponent(buttonDivAll).setButtonText("Current").onClick(() => { + // this.displayitem(contentdiv, item); + // }); + // new ButtonComponent(buttonDivAll).setButtonText("All").onClick(() => { + // this.displayAllitems(contentdiv, this.store.data.items); + // // this.close(); + // }); + + const buttonDiv = contentEl.createDiv("srs-flex-row"); + + new ButtonComponent(buttonDiv) + .setButtonText("Save") + .setTooltip("only save current note's item info") + .onClick(() => { + this.submit(); + this.close(); + }); + new ButtonComponent(buttonDiv).setButtonText("Close").onClick(() => { + // this.callback(false); + this.close(); + }); + } + + displayAllitems(contentEl: HTMLElement, items: RepetitionItem[]) { + contentEl.empty(); + items.forEach((item) => { + this.displayitemWithSummary(contentEl, item); + }); + } + + displayitemWithSummary(contentEl: HTMLElement, item: RepetitionItem) { + const details = contentEl.createEl("details"); + const summary = details.createEl("summary"); + const div = details.createDiv(); + + // const plugin = this.plugin; + const path = this.store.getFilePath(item); + // details.createEl("p").setText("Item info of "+path); + summary.setText(path); + + this.displayitem(div, item); + } + + displayitem(contentEl: HTMLElement, item: RepetitionItem) { + const path = this.store.getFilePath(item); + contentEl.empty(); + contentEl.createEl("p").setText("Item info of " + path); + const contentdiv = contentEl.createEl("div"); + + console.debug("item: ", item); + // Object.keys(item).forEach(key => { + // contentEl.createDiv("li").setText(key+ ": "+ item[key]) + // }); + // type dataType = typeof plugin.algorithm.defaultData; + Object.keys(item).forEach((key) => { + if (key != "data") { + new Setting(contentdiv).setDesc(key).addText((text) => { + if (key === "nextReview") { + this.nextReview = undefined; + const dt = window.moment(item.nextReview).format("YYYY-MM-DD HH:mm:ss"); + text.setValue(dt).onChange((value) => { + const nr = window.moment(value).valueOf(); + this.nextReview = nr ?? 0; + }); + } else { + text.setDisabled(true); + text.setValue(item[key as keyof typeof item]?.toString()); + } + }); + } + }); + contentdiv.createEl("p").setText("Item.data info"); + + const data = item.data as AnkiData; + Object.keys(item.data).forEach((key) => { + new Setting(contentdiv).setDesc(key).addText((text) => { + key = key as keyof typeof item.data; + if (key === "lastInterval") { + this.lastInterval = undefined; + text.setValue(data[key]?.toString()).onChange((value) => { + this.lastInterval = Number(value) ?? 0; + }); + } else { + text.setDisabled(true); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + text.setValue(data[key]?.toString()); + } + }); + }); + } + + submit() { + const item = this.store.getItemsOfFile(this.file.path)[0]; + console.debug(this); + const algo = this.settings.algorithm; + if (this.nextReview) { + const nr = window.moment(this.nextReview).valueOf(); + this.nextReview = nr ?? 0; + item.nextReview = this.nextReview > 0 ? this.nextReview : item.nextReview; + if (algo === algorithmNames.Fsrs) { + const data = item.data as FsrsData; + data.due = new Date(item.nextReview); + } + } + // item.nextReview= this.nextReview?this.nextReview:item.nextReview; + if (algo !== algorithmNames.Fsrs) { + const data = item.data as AnkiData; + data.lastInterval = this.lastInterval ? this.lastInterval : data.lastInterval; + } + } + + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +} diff --git a/src/gui/reviewresponse-modal.tsx b/src/gui/reviewresponse-modal.tsx new file mode 100644 index 00000000..3c1d3b93 --- /dev/null +++ b/src/gui/reviewresponse-modal.tsx @@ -0,0 +1,283 @@ +// https://img.shields.io/github/v/release/chetachiezikeuzor/cMenu-Plugin +import { MarkdownView, Platform, TFile, setIcon } from "obsidian"; +import { textInterval } from "src/scheduling"; +import { SRSettings } from "src/settings"; +import { t } from "src/lang/helpers"; +// import { FlashcardModalMode } from "src/gui/flashcard-modal"; +import SrsAlgorithm from "src/algorithms/algorithms"; +import { RepetitionItem } from "src/dataStore/repetitionItem"; + +export class reviewResponseModal { + private static instance: reviewResponseModal; + // public plugin: SRPlugin; + public settings: SRSettings; + public submitCallback: (note: TFile, resp: number) => void; + private algorithm: SrsAlgorithm; + containerEl: HTMLElement; + contentEl: HTMLElement; + + id = "reviewResponseModalBar"; + // mode: FlashcardModalMode; + public answerBtn: HTMLElement; + buttons: HTMLButtonElement[]; + responseDiv: HTMLElement; + responseInterval: number[]; + showInterval = true; + buttonTexts: string[]; + options: string[]; + + static getInstance() { + return reviewResponseModal.instance; + } + + constructor(settings: SRSettings, options: string[]) { + this.settings = settings; + const algo = settings.algorithm; + this.buttonTexts = settings.responseOptionBtnsText[algo]; + this.options = options; + this.algorithm = SrsAlgorithm.getInstance(); + reviewResponseModal.instance = this; + // this.display(show, responseInterval); + } + + public algoDisplay( + show = true, + item?: RepetitionItem, + callback?: (opt: string) => void, + // mode?: FlashcardModalMode, + ): void { + const settings = this.settings; + // this.mode = mode; + + if (!settings.reviewResponseFloatBar || !settings.autoNextNote) return; + if (item) { + this.responseInterval = this.algorithm.calcAllOptsIntervals(item); + } else { + this.responseInterval = null; + } + const reviewResponseModalBar = document.getElementById(this.id); + if (!show) { + this.selfDestruct(); + return; + } else if (!reviewResponseModalBar) { + const buttonClick = (s: string) => { + // this.mode = FlashcardModalMode.Front; + + if (callback) { + callback(s); + return; + } + + const openFile: TFile | null = app.workspace.getActiveFile(); + if (openFile && openFile.extension === "md") { + if (this.submitCallback) { + this.submitCallback(openFile, this.options.indexOf(s)); + } + } + }; + + this.build(buttonClick); + } + + // update show text + // if (this.mode == null || this.mode == FlashcardModalMode.Front) { + this.showAnswer(); + // } else if (this.mode == FlashcardModalMode.Back) { + // this.showQuestion(); + // } + + /* const bar = document.getElementById("reviewResponseModalBar"); + const Markdown = app.workspace.getActiveViewOfType(MarkdownView); + + document.body.onkeydown = (e) => { + if ( + bar && + bar.checkVisibility && + (Markdown.getMode() === "preview" || + document.activeElement.hasClass("ResponseFloatBarCommandItem")) + ) { + const consume = () => { + e.preventDefault(); + e.stopPropagation(); + }; + for (let i = 0; i < options.length; i++) { + const num = "Numpad" + i; + const dig = "Digit" + i; + if (e.code === num || e.code === dig) { + buttonClick(options[0]); + break; + } + } + consume(); + } + }; + */ + } + + private build(buttonClick: (opt: string) => void) { + // const options = this.plugin.algorithm.srsOptions(); + const optBtnCounts = this.options.length; + let btnCols = 4; + if (!Platform.isMobile && optBtnCounts > btnCols) { + btnCols = optBtnCounts; + } + this.containerEl = createEl("div"); + this.containerEl.setAttribute("id", this.id); + this.containerEl.addClass("ResponseFloatBarDefaultAesthetic"); + // this.containerEl.setAttribute("style", `grid-template-columns: ${"1fr ".repeat(btnCols)}`); + this.containerEl.setAttribute("style", `grid-template-rows: ${"1fr ".repeat(2)}`); + this.containerEl.style.visibility = "visible"; // : "hidden" + document.body + .querySelector(".mod-vertical.mod-root") + .insertAdjacentElement("afterbegin", this.containerEl); + + this.contentEl = this.containerEl.createDiv("sr-show-response"); + this.responseDiv = this.contentEl.createDiv("sr-flashcard-response"); + this.responseDiv.setAttribute("style", `grid-template-columns: ${"1fr ".repeat(btnCols)}`); + + this.buttons = []; + this.options.forEach((opt: string, index) => { + const btn = document.createElement("button"); + btn.setAttribute("id", "sr-" + opt.toLowerCase() + "-btn"); + btn.setAttribute("class", "ResponseFloatBarCommandItem"); + // btn.setAttribute("aria-label", "Hotkey: " + (index + 1)); + // btn.setAttribute("style", `width: calc(95%/${buttonCounts});`); + // setIcon(btn, item.icon); + // let text = btnText[algo][index]; + const text = this.getTextWithInterval(index); + btn.setText(text); + btn.addEventListener("click", () => buttonClick(opt)); + this.buttons.push(btn); + this.responseDiv.appendChild(btn); + }); + // this.responseDiv.style.display = "none"; + + this.answerBtn = this.contentEl.createDiv(); + this.answerBtn.setAttribute("id", "sr-show-answer"); + this.answerBtn.setText(t("SHOW_ANSWER")); + this.answerBtn.addEventListener("click", () => { + this.showAnswer(); + }); + // this.answerBtn.style.display = "block"; + + const showCloseDiv = this.containerEl.createDiv("sr-show-close"); + showCloseDiv.setAttribute("style", "display: flex; width: 64px"); // position:relative; + + const showIntvlBtn = document.createElement("button"); + const showcb = () => { + if (this.showInterval) { + this.showInterval = false; + setIcon(showIntvlBtn, "alarm-clock-off"); + } else { + this.showInterval = true; + setIcon(showIntvlBtn, "alarm-clock"); + } + this.showAnswer(); + }; + addButton_showInterval(this, showIntvlBtn, showcb); + this.buttons.push(showIntvlBtn); + // this.containerEl.appendChild(showIntvlBtn); + showCloseDiv.appendChild(showIntvlBtn); + + const closeBtn = document.createElement("button"); + addButton_close(this, closeBtn); + this.buttons.push(closeBtn); + this.containerEl.appendChild(closeBtn); + showCloseDiv.appendChild(closeBtn); + } + + private showAnswer() { + // this.mode = FlashcardModalMode.Back; + + this.answerBtn.style.display = "none"; + this.responseDiv.style.display = "grid"; + + this.options.forEach((opt, index) => { + const btn = document.getElementById("sr-" + opt.toLowerCase() + "-btn"); + // let text = btnText[algo][index]; + const text = this.getTextWithInterval(index); + btn.setText(text); + }); + } + + private showQuestion() { + // this.mode = FlashcardModalMode.Front; + + this.answerBtn.style.display = "block"; + this.responseDiv.style.display = "none"; + // this.responseDiv.toggleVisibility(false); //还是会占位 + } + + private getTextWithInterval(index: number) { + let text = this.buttonTexts[index]; + if (this.showInterval) { + text = + this.responseInterval == null + ? `${text}` + : Platform.isMobile + ? textInterval(this.responseInterval[index], true) + : `${text} - ${textInterval(this.responseInterval[index], false)}`; + } + return text; + } + + public isDisplay() { + return document.getElementById(this.id) != null; + // return this.containerEl.style.visibility === "visible"; + } + + selfDestruct() { + const reviewResponseModalBar = document.getElementById(this.id); + if (reviewResponseModalBar) { + reviewResponseModalBar.style.visibility = "hidden"; + if (reviewResponseModalBar.firstChild) { + reviewResponseModalBar.removeChild(reviewResponseModalBar.firstChild); + } + reviewResponseModalBar.remove(); + } + } + + autoClose() { + //after review + const timmer = setInterval(() => { + const reviewResponseModalBar = document.getElementById(this.id); + const Markdown = app.workspace.getActiveViewOfType(MarkdownView); + if (reviewResponseModalBar) { + if (!Markdown) { + reviewResponseModalBar.style.visibility = "hidden"; + this.selfDestruct(); + clearInterval(timmer); + } + } + }, 10000); + } +} + +function addButton_showInterval( + rrBar: reviewResponseModal, + showIntvlBtn: HTMLElement, + showCb: () => void, +) { + showIntvlBtn.setAttribute("id", "sr-showintvl-btn"); + showIntvlBtn.setAttribute("class", "ResponseFloatBarCommandItem"); + showIntvlBtn.setAttribute( + "aria-label", + "时间间隔显隐,\n建议:复习类不显示,渐进总结/增量写作显示", + ); + // showIntvlBtn.setText("Show"); + setIcon(showIntvlBtn, "alarm-clock"); + showIntvlBtn.addEventListener("click", showCb); +} + +function addButton_close(rrBar: reviewResponseModal, closeBtn: HTMLElement) { + closeBtn.setAttribute("id", "sr-close-btn"); + closeBtn.setAttribute("class", "ResponseFloatBarCommandItem"); + closeBtn.setAttribute("aria-label", "关闭浮栏显示"); + // closeBtn.setAttribute("style", `width: calc(95%/${buttonCounts});`); + // setIcon(closeBtn, "lucide-x"); + closeBtn.setText("X"); + closeBtn.addEventListener("click", () => { + rrBar.containerEl.style.visibility = "hidden"; + rrBar.selfDestruct(); + }); +} diff --git a/src/gui/sidebar.ts b/src/gui/sidebar.ts index 3ee2598c..27526c81 100644 --- a/src/gui/sidebar.ts +++ b/src/gui/sidebar.ts @@ -4,7 +4,8 @@ import type SRPlugin from "src/main"; import { COLLAPSE_ICON } from "src/constants"; import { ReviewDeck } from "src/ReviewDeck"; import { t } from "src/lang/helpers"; -import { DataLocation } from "./settings"; +import { DataLocation } from "src/dataStore/location_switch"; +import { DateUtils } from "src/util/utils_recall"; export const REVIEW_QUEUE_VIEW_TYPE = "review-queue-list-view"; @@ -70,10 +71,7 @@ export class ReviewQueueListView extends ItemView { ); for (const newFile of deck.newNotes) { - const fileIsOpen = - activeFile && - deckKey === this.plugin.lastSelectedReviewDeck && - newFile.path === activeFile.path; + const fileIsOpen = activeFile && newFile.path === activeFile.path; if (fileIsOpen) { deck.activeFolders.add(deck.deckName); deck.activeFolders.add(t("NEW")); @@ -97,7 +95,7 @@ export class ReviewQueueListView extends ItemView { now = Date.now(); } else { // end of today - now = this.plugin.store.EndofToday; + now = DateUtils.EndofToday; } let currnDays: number | null = null; let schedFolderEl: HTMLElement | null = null, @@ -109,8 +107,8 @@ export class ReviewQueueListView extends ItemView { const nDays: number = Math.ceil((sNote.dueUnix - now) / (24 * 3600 * 1000)); if (nDays != currnDays) { if (nDays > maxDaysToRender) { - // break; - continue; //rand review Queue + break; + // continue; //rand review Queue } if (nDays === -1) { @@ -138,10 +136,7 @@ export class ReviewQueueListView extends ItemView { currnDays = nDays; } - const fileIsOpen = - activeFile && - deckKey === this.plugin.lastSelectedReviewDeck && - sNote.note.path === activeFile.path; + const fileIsOpen = activeFile && sNote.note.path === activeFile.path; if (fileIsOpen) { deck.activeFolders.add(deck.deckName); deck.activeFolders.add(folderTitle); @@ -238,11 +233,8 @@ export class ReviewQueueListView extends ItemView { await this.app.workspace.getLeaf().openFile(file); if (plugin.data.settings.dataLocation !== DataLocation.SaveOnNoteFile) { const fid = this.plugin.store.getFileId(file.path); - const item = plugin.store.data.items[fid]; - plugin.reviewNoteFloatBar.algoDisplay( - true, - plugin.algorithm.calcAllOptsIntervals(item), - ); + const item = plugin.store.getItembyID(fid); + plugin.reviewFloatBar.algoDisplay(true, item); } return false; }, diff --git a/src/gui/stats-modal.tsx b/src/gui/stats-modal.tsx index ed93e347..991e008a 100644 --- a/src/gui/stats-modal.tsx +++ b/src/gui/stats-modal.tsx @@ -20,9 +20,11 @@ import type SRPlugin from "src/main"; import { getKeysPreserveType, getTypedObjectEntries } from "src/util/utils"; import { textInterval } from "src/scheduling"; import { t } from "src/lang/helpers"; -import { RPITEMTYPE } from "./data"; +import { RPITEMTYPE, ReviewedCounts } from "src/dataStore/data"; import { State } from "fsrs.js"; -import { algorithmNames } from "./settings"; +import { algorithmNames } from "src/algorithms/algorithms_switch"; +import { Stats } from "src/stats"; +import { CardListType } from "src/Deck"; Chart.register( BarElement, @@ -103,18 +105,30 @@ export class StatsModal extends Modal { ); const chartTypeEl = document.getElementById("sr-chart-type") as HTMLSelectElement; - chartTypeEl.addEventListener("click", () => { + chartTypeEl.addEventListener("change", () => { const chartType = chartTypeEl.value; if (chartType === RPITEMTYPE.NOTE) { - this.createNoteStatsChart(); + this.createCharts( + this.plugin.store.getReviewedCounts(), + this.plugin.noteStats, + this.plugin.noteStats.getTotalCount(CardListType.All), + ); return; } else { - this.createCardStatsChart(); + this.createCharts( + this.plugin.store.getReviewedCardCounts(), + this.plugin.cardStats, + this.plugin.deckTree.getCardCount(CardListType.All, true), + ); return; } }); - this.createCardStatsChart(); + this.createCharts( + this.plugin.store.getReviewedCardCounts(), + this.plugin.cardStats, + this.plugin.deckTree.getCardCount(CardListType.All, true), + ); } onClose(): void { @@ -122,9 +136,9 @@ export class StatsModal extends Modal { contentEl.empty(); } - private createCardStatsChart() { + private createCharts(rc: ReviewedCounts, cardStats: Stats, totalCardsCount: number) { //Add today review data - const rc = this.plugin.store.getReviewedCardCounts(); + // const rc = reviewedCounts; const now = window.moment(Date.now()); const todayDate: string = now.format("YYYY-MM-DD"); if (!(todayDate in rc)) { @@ -139,10 +153,7 @@ export class StatsModal extends Modal { "todayReviewedChart", t("REVIEWED_TODAY"), t("REVIEWED_TODAY_DESC"), - [ - `${t("NEW_LEARNED")} - ${Math.round(rnewCnt)}`, - `${t("DUE_REVIEWED")} - ${Math.round(rdueCnt)}`, - ], + [`${t("NEW_LEARNED")} - ${rnewCnt}`, `${t("DUE_REVIEWED")} - ${rdueCnt}`], [rnewCnt, rdueCnt], t("REVIEWED_TODAY_SUMMARY", { totalreviewedCount }), t("COUNT"), @@ -151,18 +162,24 @@ export class StatsModal extends Modal { ); // Add forecast - const cardStats: Stats = this.plugin.cardStats; + // const cardStats: Stats = this.plugin.cardStats; let maxN: number = cardStats.delayedDays.getMaxValue(); for (let dueOffset = 0; dueOffset <= maxN; dueOffset++) { cardStats.delayedDays.clearCountIfMissing(dueOffset); } - const dueDatesFlashcardsCopy: Record = { 0: 0 }; + const dueDatesFlashcardsCopy: Record = {}; + const todayStr = t("TODAY"); + dueDatesFlashcardsCopy[todayStr] = 0; for (const [dueOffset, dueCount] of getTypedObjectEntries(cardStats.delayedDays.dict)) { if (dueOffset <= 0) { - dueDatesFlashcardsCopy[0] += dueCount; + // dueDatesFlashcardsCopy[0] += dueCount; + dueDatesFlashcardsCopy[todayStr] += dueCount; } else { - dueDatesFlashcardsCopy[dueOffset] = dueCount; + // dueDatesFlashcardsCopy[dueOffset] = dueCount; + const due = now.clone().add(dueOffset, "days"); + const dateStr = due.format("YYYY-MM-DD"); + dueDatesFlashcardsCopy[dateStr] = dueCount; } } @@ -178,7 +195,7 @@ export class StatsModal extends Modal { Object.values(dueDatesFlashcardsCopy), t("REVIEWS_PER_DAY", { avg: (scheduledCount / maxN).toFixed(1) }), t("SCHEDULED"), - t("DAYS"), + t("DATE"), t("NUMBER_OF_CARDS"), ); @@ -218,12 +235,11 @@ export class StatsModal extends Modal { Math.round(cardStats.eases.getTotalOfValueMultiplyCount() / scheduledCount) || 0; const esaeStr: string[] = []; - Object.keys(cardStats.eases).forEach((value: string) => { - const v = parseInt(value); + getKeysPreserveType(cardStats.eases.dict).forEach((value: number) => { if (this.plugin.data.settings.algorithm === algorithmNames.Fsrs) { - esaeStr.push(`${State[v]} `); + esaeStr.push(`${State[value]} `); } else { - esaeStr.push(`${v} `); + esaeStr.push(`${value} `); } }); @@ -234,7 +250,7 @@ export class StatsModal extends Modal { "", esaeStr, // Object.keys(cardStats.eases), - Object.values(cardStats.eases), + Object.values(cardStats.eases.dict), t("EASES_SUMMARY", { avgEase: average_ease }), t("COUNT"), t("EASES"), @@ -242,7 +258,7 @@ export class StatsModal extends Modal { ); // Add card types - const totalCardsCount: number = this.plugin.deckTree.getCardCount(CardListType.All, true); + // const totalCardsCount: number = this.plugin.deckTree.getCardCount(CardListType.All, true); createStatsChart( "pie", "cardTypesChart", @@ -263,166 +279,6 @@ export class StatsModal extends Modal { t("CARD_TYPES_SUMMARY", { totalCardsCount }), ); } - - private createNoteStatsChart() { - //Add today review data - const rc = this.plugin.store.getReviewedCounts(); - const now = window.moment(Date.now()); - const todayDate: string = now.format("YYYY-MM-DD"); - if (!(todayDate in rc)) { - rc[todayDate] = { due: 0, new: 0 }; - } - const rdueCnt = rc[todayDate].due, - rnewCnt = rc[todayDate].new; - - const totalreviewedCount = rdueCnt + rnewCnt; - createStatsChart( - "bar", - "todayReviewedChart", - t("REVIEWED_TODAY"), - t("REVIEWED_TODAY_DESC"), - [ - `${t("NEW_LEARNED")} - ${Math.round(rnewCnt)}`, - `${t("DUE_REVIEWED")} - ${Math.round(rdueCnt)}`, - ], - [rnewCnt, rdueCnt], - t("REVIEWED_TODAY_SUMMARY", { totalreviewedCount }), - t("COUNT"), - "", - t("NUMBER_OF_CARDS"), - ); - - // Add forecast - let maxN: number = Math.max(...getKeysPreserveType(this.plugin.dueDatesNotes)); - for (let dueOffset = 0; dueOffset <= maxN; dueOffset++) { - if (!Object.prototype.hasOwnProperty.call(this.plugin.dueDatesNotes, dueOffset)) { - this.plugin.dueDatesNotes[dueOffset] = 0; - } - } - - const dueDatesFlashcardsCopy: Record = { 0: 0 }; - for (const [dueOffset, dueCount] of getTypedObjectEntries(this.plugin.dueDatesNotes)) { - if (dueOffset <= 0) { - dueDatesFlashcardsCopy[0] += dueCount; - } else { - dueDatesFlashcardsCopy[dueOffset] = dueCount; - } - } - - const cardStats: Stats = this.plugin.noteStats; - const scheduledCount: number = cardStats.youngCount + cardStats.matureCount; - maxN = Math.max(maxN, 1); - - createStatsChart( - "bar", - "forecastChart", - t("FORECAST"), - t("FORECAST_DESC"), - Object.keys(dueDatesFlashcardsCopy), - Object.values(dueDatesFlashcardsCopy), - t("REVIEWS_PER_DAY", { avg: (scheduledCount / maxN).toFixed(1) }), - t("SCHEDULED"), - t("DAYS"), - t("NUMBER_OF_CARDS"), - ); - - maxN = Math.max(...getKeysPreserveType(cardStats.intervals)); - for (let interval = 0; interval <= maxN; interval++) { - if (!Object.prototype.hasOwnProperty.call(cardStats.intervals, interval)) { - cardStats.intervals[interval] = 0; - } - } - - // Add intervals - const average_interval: string = textInterval( - Math.round( - (getTypedObjectEntries(cardStats.intervals) - .map(([interval, count]) => interval * count) - .reduce((a, b) => a + b, 0) / - scheduledCount) * - 10, - ) / 10 || 0, - false, - ), - longest_interval: string = textInterval( - Math.max(...getKeysPreserveType(cardStats.intervals)) || 0, - false, - ); - - createStatsChart( - "bar", - "intervalsChart", - t("INTERVALS"), - t("INTERVALS_DESC"), - Object.keys(cardStats.intervals), - Object.values(cardStats.intervals), - t("INTERVALS_SUMMARY", { avg: average_interval, longest: longest_interval }), - t("COUNT"), - t("DAYS"), - t("NUMBER_OF_CARDS"), - ); - - // Add eases - const eases: number[] = getKeysPreserveType(cardStats.eases); - for (let ease = Math.min(...eases); ease <= Math.max(...eases); ease++) { - if (!Object.prototype.hasOwnProperty.call(cardStats.eases, ease)) { - cardStats.eases[ease] = 0; - } - } - const average_ease: number = - Math.round( - getTypedObjectEntries(cardStats.eases) - .map(([ease, count]) => ease * count) - .reduce((a, b) => a + b, 0) / scheduledCount, - ) || 0; - - const esaeStr: string[] = []; - Object.keys(cardStats.eases).forEach((value: string) => { - const v = parseInt(value); - if (this.plugin.data.settings.algorithm === algorithmNames.Fsrs) { - esaeStr.push(`${State[v]} `); - } else { - esaeStr.push(`${v} `); - } - }); - - createStatsChart( - "bar", - "easesChart", - t("EASES"), - "", - esaeStr, - // Object.keys(cardStats.eases), - Object.values(cardStats.eases), - t("EASES_SUMMARY", { avgEase: average_ease }), - t("COUNT"), - t("EASES"), - t("NUMBER_OF_CARDS"), - ); - - // Add card types - const totalCardsCount: number = this.plugin.dueNotesCount + this.plugin.newNotesCount; - createStatsChart( - "pie", - "cardTypesChart", - t("CARD_TYPES"), - "", - // t("CARD_TYPES_DESC"), - [ - `${t("CARD_TYPE_NEW")} - ${Math.round( - (cardStats.newCount / totalCardsCount) * 100, - )}%`, - `${t("CARD_TYPE_YOUNG")} - ${Math.round( - (cardStats.youngCount / totalCardsCount) * 100, - )}%`, - `${t("CARD_TYPE_MATURE")} - ${Math.round( - (cardStats.matureCount / totalCardsCount) * 100, - )}%`, - ], - [cardStats.newCount, cardStats.youngCount, cardStats.matureCount], - t("CARD_TYPES_SUMMARY", { totalCardsCount }), - ); - } } function createStatsChart( @@ -514,7 +370,7 @@ function createStatsChart( if (shouldFilter) { const chartPeriodEl = document.getElementById("sr-chart-period") as HTMLSelectElement; - chartPeriodEl.addEventListener("click", () => { + chartPeriodEl.addEventListener("change", () => { if (statsChart.canvas != null) { chartPeriodCallBack(chartPeriodEl); } @@ -549,4 +405,6 @@ function createStatsChart( }; statsChart.update(); } + + document.getElementById(`${canvasId}Summary`).innerText = summary; } diff --git a/src/lang/locale/ar.ts b/src/lang/locale/ar.ts index 6875befb..cdc4f0bf 100644 --- a/src/lang/locale/ar.ts +++ b/src/lang/locale/ar.ts @@ -53,6 +53,10 @@ export default { DAYS_STR_IVL_MOBILE: "ي${interval}", MONTHS_STR_IVL_MOBILE: "ش${interval}", YEARS_STR_IVL_MOBILE: "س${interval}", + HOURS_STR_IVL: "${interval}hour(s)", + MINUTES_STR_IVL: "${interval}minute(s)", + HOURS_STR_IVL_MOBILE: "${interval}h", + MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts SETTINGS_HEADER: "Spaced Repetition Plugin - Settings", @@ -209,4 +213,5 @@ export default { NEW_LEARNED: "New Learned", DUE_REVIEWED: "due Reviewed", REVIEWED_TODAY_SUMMARY: "Total Reviewed today: ${totalreviewedCount}", + DATE: "Date", }; diff --git a/src/lang/locale/cz.ts b/src/lang/locale/cz.ts index dbfb550c..6b9afd57 100644 --- a/src/lang/locale/cz.ts +++ b/src/lang/locale/cz.ts @@ -53,6 +53,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}d", MONTHS_STR_IVL_MOBILE: "${interval}m", YEARS_STR_IVL_MOBILE: "${interval}r", + HOURS_STR_IVL: "${interval}hour(s)", + MINUTES_STR_IVL: "${interval}minute(s)", + HOURS_STR_IVL_MOBILE: "${interval}h", + MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts SETTINGS_HEADER: "Spaced Repetition Plugin - Nastavení", @@ -213,4 +217,5 @@ export default { NEW_LEARNED: "New Learned", DUE_REVIEWED: "due Reviewed", REVIEWED_TODAY_SUMMARY: "Total Reviewed today: ${totalreviewedCount}", + DATE: "Date", }; diff --git a/src/lang/locale/de.ts b/src/lang/locale/de.ts index 2fb2a2ea..599e7755 100644 --- a/src/lang/locale/de.ts +++ b/src/lang/locale/de.ts @@ -59,6 +59,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}d", MONTHS_STR_IVL_MOBILE: "${interval}m", YEARS_STR_IVL_MOBILE: "${interval}y", + HOURS_STR_IVL: "${interval}hour(s)", + MINUTES_STR_IVL: "${interval}minute(s)", + HOURS_STR_IVL_MOBILE: "${interval}h", + MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts SETTINGS_HEADER: "Spaced Repetition Plugin - Einstellungen", @@ -224,4 +228,5 @@ export default { NEW_LEARNED: "New Learned", DUE_REVIEWED: "due Reviewed", REVIEWED_TODAY_SUMMARY: "Total Reviewed today: ${totalreviewedCount}", + DATE: "Date", }; diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index c773af4b..5ed5e8f0 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -53,6 +53,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}d", MONTHS_STR_IVL_MOBILE: "${interval}m", YEARS_STR_IVL_MOBILE: "${interval}y", + HOURS_STR_IVL: "${interval}hour(s)", + MINUTES_STR_IVL: "${interval}minute(s)", + HOURS_STR_IVL_MOBILE: "${interval}h", + MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts SETTINGS_HEADER: "Spaced Repetition Plugin - Settings", @@ -213,4 +217,5 @@ export default { NEW_LEARNED: "New Learned", DUE_REVIEWED: "due Reviewed", REVIEWED_TODAY_SUMMARY: "Total Reviewed today: ${totalreviewedCount}", + DATE: "Date", }; diff --git a/src/lang/locale/es.ts b/src/lang/locale/es.ts index 88bf375c..a7bd6e9f 100644 --- a/src/lang/locale/es.ts +++ b/src/lang/locale/es.ts @@ -53,6 +53,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}d", MONTHS_STR_IVL_MOBILE: "${interval}m", YEARS_STR_IVL_MOBILE: "${interval}a", + HOURS_STR_IVL: "${interval}hour(s)", + MINUTES_STR_IVL: "${interval}minute(s)", + HOURS_STR_IVL_MOBILE: "${interval}h", + MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts SETTINGS_HEADER: "Extensión de Repetición Espaciada - Ajustes", @@ -218,4 +222,5 @@ export default { NEW_LEARNED: "New Learned", DUE_REVIEWED: "due Reviewed", REVIEWED_TODAY_SUMMARY: "Total Reviewed today: ${totalreviewedCount}", + DATE: "Date", }; diff --git a/src/lang/locale/ja.ts b/src/lang/locale/ja.ts index 0d44c094..c8013e2b 100644 --- a/src/lang/locale/ja.ts +++ b/src/lang/locale/ja.ts @@ -54,6 +54,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}d", MONTHS_STR_IVL_MOBILE: "${interval}m", YEARS_STR_IVL_MOBILE: "${interval}y", + HOURS_STR_IVL: "${interval}hour(s)", + MINUTES_STR_IVL: "${interval}minute(s)", + HOURS_STR_IVL_MOBILE: "${interval}h", + MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts SETTINGS_HEADER: "Spaced Repetition Plugin - 設定", @@ -217,4 +221,5 @@ export default { NEW_LEARNED: "New Learned", DUE_REVIEWED: "due Reviewed", REVIEWED_TODAY_SUMMARY: "Total Reviewed today: ${totalreviewedCount}", + DATE: "Date", }; diff --git a/src/lang/locale/ko.ts b/src/lang/locale/ko.ts index 9eb13cd8..26dc7cfa 100644 --- a/src/lang/locale/ko.ts +++ b/src/lang/locale/ko.ts @@ -53,6 +53,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}d", MONTHS_STR_IVL_MOBILE: "${interval}m", YEARS_STR_IVL_MOBILE: "${interval}y", + HOURS_STR_IVL: "${interval}hour(s)", + MINUTES_STR_IVL: "${interval}minute(s)", + HOURS_STR_IVL_MOBILE: "${interval}h", + MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts SETTINGS_HEADER: "Spaced Repetition Plugin - 설정", @@ -214,4 +218,5 @@ export default { NEW_LEARNED: "New Learned", DUE_REVIEWED: "due Reviewed", REVIEWED_TODAY_SUMMARY: "Total Reviewed today: ${totalreviewedCount}", + DATE: "Date", }; diff --git a/src/lang/locale/pt-br.ts b/src/lang/locale/pt-br.ts index cea2608d..5cddec3e 100644 --- a/src/lang/locale/pt-br.ts +++ b/src/lang/locale/pt-br.ts @@ -55,6 +55,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}d", MONTHS_STR_IVL_MOBILE: "${interval}m", YEARS_STR_IVL_MOBILE: "${interval}a", + HOURS_STR_IVL: "${interval}hour(s)", + MINUTES_STR_IVL: "${interval}minute(s)", + HOURS_STR_IVL_MOBILE: "${interval}h", + MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts SETTINGS_HEADER: "Plguin Spaced Repetition - Configuração", @@ -220,4 +224,5 @@ export default { NEW_LEARNED: "New Learned", DUE_REVIEWED: "due Reviewed", REVIEWED_TODAY_SUMMARY: "Total Reviewed today: ${totalreviewedCount}", + DATE: "Date", }; diff --git a/src/lang/locale/ru.ts b/src/lang/locale/ru.ts index 0f19982f..4af449ed 100644 --- a/src/lang/locale/ru.ts +++ b/src/lang/locale/ru.ts @@ -60,6 +60,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}д.", MONTHS_STR_IVL_MOBILE: "${interval}м.", YEARS_STR_IVL_MOBILE: "${interval}г.", + HOURS_STR_IVL: "${interval}hour(s)", + MINUTES_STR_IVL: "${interval}minute(s)", + HOURS_STR_IVL_MOBILE: "${interval}h", + MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts SETTINGS_HEADER: "Плагин Spaced Repetition - Настройки", @@ -224,4 +228,5 @@ export default { NEW_LEARNED: "New Learned", DUE_REVIEWED: "due Reviewed", REVIEWED_TODAY_SUMMARY: "Total Reviewed today: ${totalreviewedCount}", + DATE: "Date", }; diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 1e4f0c5f..f0aa6a15 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -53,6 +53,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}天", MONTHS_STR_IVL_MOBILE: "${interval}月", YEARS_STR_IVL_MOBILE: "${interval}年", + HOURS_STR_IVL: "${interval}小时", + MINUTES_STR_IVL: "${interval}分钟", + HOURS_STR_IVL_MOBILE: "${interval}时", + MINUTES_STR_IVL_MOBILE: "${interval}分", // settings.ts SETTINGS_HEADER: "间隔重复插件 - 设置", @@ -198,4 +202,5 @@ export default { NEW_LEARNED: "新学", DUE_REVIEWED: "复习", REVIEWED_TODAY_SUMMARY: "总复习数: ${totalreviewedCount}", + DATE: "日期", }; diff --git a/src/lang/locale/zh-tw.ts b/src/lang/locale/zh-tw.ts index 43574048..e1df946d 100644 --- a/src/lang/locale/zh-tw.ts +++ b/src/lang/locale/zh-tw.ts @@ -53,6 +53,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}天", MONTHS_STR_IVL_MOBILE: "${interval}月", YEARS_STR_IVL_MOBILE: "${interval}年", + HOURS_STR_IVL: "${interval}小時", + MINUTES_STR_IVL: "${interval}分鐘", + HOURS_STR_IVL_MOBILE: "${interval}時", + MINUTES_STR_IVL_MOBILE: "${interval}分", // settings.ts SETTINGS_HEADER: "間隔重複外掛 - 設定", @@ -197,4 +201,5 @@ export default { NEW_LEARNED: "新學", DUE_REVIEWED: "復習", REVIEWED_TODAY_SUMMARY: "總復習數: ${totalreviewedCount}", + DATE: "日期", }; diff --git a/src/main.ts b/src/main.ts index 4dc93204..67346a22 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,34 +1,13 @@ -import { - Notice, - Plugin, - TAbstractFile, - TFolder, - TFile, - HeadingCache, - getAllTags, - FrontMatterCache, -} from "obsidian"; +import { Notice, Plugin, TAbstractFile, TFile, getAllTags, FrontMatterCache } from "obsidian"; import * as graph from "pagerank.js"; -import { - SRSettingTab, - SRSettings, - DEFAULT_SETTINGS, - DataLocation, - algorithmNames, -} from "src/settings"; -import { FlashcardModal, Deck } from "src/flashcard-modal-algo"; -import { StatsModal, Stats } from "src/stats-modal"; -import { ReviewQueueListView, REVIEW_QUEUE_VIEW_TYPE } from "src/sidebar"; -import { Card, CardType, ReviewResponse, schedule } from "src/scheduling"; -import { - YAML_FRONT_MATTER_REGEX, - SCHEDULING_INFO_REGEX, - LEGACY_SCHEDULING_EXTRACTOR, - MULTI_SCHEDULING_EXTRACTOR, -} from "src/constants"; -import { escapeRegexString, cyrb53 } from "src/utils"; -import { ReviewDeck, ReviewDeckSelectionModal } from "src/review-deck"; +import { SRSettingTab, SRSettings, DEFAULT_SETTINGS } from "src/settings"; +import { FlashcardModal } from "src/gui/flashcard-modal"; +import { StatsModal } from "src/gui/stats-modal"; +import { ReviewQueueListView, REVIEW_QUEUE_VIEW_TYPE } from "src/gui/sidebar"; +import { ReviewResponse, schedule } from "src/scheduling"; +import { YAML_FRONT_MATTER_REGEX, SCHEDULING_INFO_REGEX } from "src/constants"; +import { ReviewDeck, ReviewDeckSelectionModal } from "src/ReviewDeck"; import { t } from "src/lang/helpers"; import { appIcon } from "src/icons/appicon"; import { TopicPath } from "./TopicPath"; @@ -57,13 +36,22 @@ import { NoteEaseList } from "./NoteEaseList"; import { QuestionPostponementList } from "./QuestionPostponementList"; // https://github.com/martin-jw/obsidian-recall -import { DataStore, RPITEMTYPE } from "./data"; +import { DataStore, RPITEMTYPE } from "./dataStore/data"; import Commands from "./commands"; -import SrsAlgorithm from "./algorithms"; +import SrsAlgorithm from "./algorithms/algorithms"; import { algorithms } from "src/settings"; -import { reviewNoteResponseModal } from "./modals/reviewresponse-modal"; -import { BlockUtils, DateUtils, isVersionNewerThanOther } from "./utils_recall"; -import { ReleaseNotes } from "./modals/ReleaseNotes"; +import { reviewResponseModal } from "src/gui/reviewresponse-modal"; +import { DateUtils, isVersionNewerThanOther } from "./util/utils_recall"; +import { ReleaseNotes } from "src/gui/ReleaseNotes"; + +import { algorithmNames } from "src/algorithms/algorithms_switch"; +import { DataLocation } from "./dataStore/location_switch"; +import { addFileMenuEvt, registerTrackFileEvents } from "./Events/trackFileEvents"; +import { ReviewNote, isIgnoredPath } from "src/reviewNote/review-note"; +import { Tags } from "./tags"; +import { DataSyncer } from "./dataStore/dataSyncer"; +import { calcLinkContribution, updategraphLink } from "./algorithms/priorities/linkPageranks"; +import { Queue } from "./dataStore/queue"; interface PluginData { settings: SRSettings; @@ -103,12 +91,9 @@ export default class SRPlugin extends Plugin { public easeByPath: NoteEaseList; private questionPostponementList: QuestionPostponementList; - private incomingLinks: Record = {}; - private pageranks: Record = {}; - public newNotesCount = 0; + public incomingLinks: Record = {}; + public pageranks: Record = {}; public dueNotesCount = 0; - public dueNotesCount_real = 0; - public minNextView = 0; public dueDatesNotes: Record = {}; // Record<# of days in future, due count> public deckTree: Deck = new Deck("root", null); @@ -120,12 +105,18 @@ export default class SRPlugin extends Plugin { public store: DataStore; public commands: Commands; public algorithm: SrsAlgorithm; - public reviewNoteFloatBar: reviewNoteResponseModal; + public reviewFloatBar: reviewResponseModal; public settingTab: SRSettingTab; async onload(): Promise { await this.loadPluginData(); - const store = this.store; + // const store = this.store; + this.easeByPath = new NoteEaseList(this.data.settings); + this.questionPostponementList = new QuestionPostponementList( + this, + this.data.settings, + this.data.buryList, + ); appIcon(); @@ -135,26 +126,28 @@ export default class SRPlugin extends Plugin { new ReleaseNotes(this.app, this, obsidianJustInstalled ? null : PLUGIN_VERSION).open(); } - this.algorithm = algorithms[this.data.settings.algorithm]; - this.algorithm.updateSettings( - this, - this.data.settings.algorithmSettings[this.data.settings.algorithm], - ); + const settings = this.data.settings; + this.algorithm = algorithms[settings.algorithm]; + this.algorithm.updateSettings(this, settings.algorithmSettings[settings.algorithm]); + settings.algorithmSettings[settings.algorithm] = this.algorithm.settings; + this.savePluginData(); - // this.store.buildQueue(); // will do it in sync_Algo. this.commands = new Commands(this); this.commands.addCommands(); if (this.data.settings.showDebugMessages) { this.commands.addDebugCommands(); } - this.reviewNoteFloatBar = new reviewNoteResponseModal(this); + this.reviewFloatBar = new reviewResponseModal(settings, this.algorithm.srsOptions()); + this.reviewFloatBar.submitCallback = (note, resp) => { + this.saveReviewResponse(note, resp); + }; - this.registerTrackFileEvents(); + registerTrackFileEvents(this); - if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { - this.registerInterval(window.setInterval(() => this.sync(), 5 * 60 * 1000)); - } + // if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { + // this.registerInterval(window.setInterval(() => this.sync(), 5 * 60 * 1000)); + // } this.statusBar = this.addStatusBarItem(); this.statusBar.classList.add("mod-clickable"); @@ -182,84 +175,22 @@ export default class SRPlugin extends Plugin { this.registerEvent( this.app.workspace.on("file-menu", (menu, fileish: TAbstractFile) => { if (fileish instanceof TFile && fileish.extension === "md") { - menu.addItem((item) => { - item.setTitle(t("REVIEW_EASY_FILE_MENU")) - .setIcon("SpacedRepIcon") - .onClick(() => { - this.saveReviewResponse(fileish, ReviewResponse.Easy); - }); - }); - - menu.addItem((item) => { - item.setTitle(t("REVIEW_GOOD_FILE_MENU")) - .setIcon("SpacedRepIcon") - .onClick(() => { - this.saveReviewResponse(fileish, ReviewResponse.Good); - }); - }); - - menu.addItem((item) => { - item.setTitle(t("REVIEW_HARD_FILE_MENU")) - .setIcon("SpacedRepIcon") - .onClick(() => { - this.saveReviewResponse(fileish, ReviewResponse.Hard); - }); - }); - } - - if (this.data.settings.dataLocation === DataLocation.SaveOnNoteFile) { - return; - } - if (fileish instanceof TFolder) { - const folder = fileish as TFolder; - - menu.addItem((item) => { - item.setIcon("plus-with-circle"); - item.setTitle("Track All Notes"); - item.onClick((_evt) => { - this.store.trackFilesInFolder(folder); - store.save(); - }); - }); - - menu.addItem((item) => { - item.setIcon("minus-with-circle"); - item.setTitle("Untrack All Notes"); - item.onClick((_evt) => { - this.store.untrackFilesInFolder(folder); - store.save(); - }); - }); - } else if (fileish instanceof TFile) { - if (this.store.isTracked(fileish.path)) { - menu.addItem((item) => { - item.setIcon("minus-with-circle"); - item.setTitle("Untrack Note"); - item.onClick(async (_evt) => { - this.store.untrackFile(fileish.path); - store.save(); - if ( - this.reviewNoteFloatBar.isDisplay() && - this.data.settings.autoNextNote - ) { - if (!this.syncLock) { - await this.sync(); - } - this.reviewNextNote(this.lastSelectedReviewDeck); - } - }); - }); - } else { + const options = this.algorithm.srsOptions(); + const algo = this.data.settings.algorithm; + const showtext = this.data.settings.responseOptionBtnsText; + for (let i = 1; i < options.length; i++) { menu.addItem((item) => { - item.setIcon("plus-with-circle"); - item.setTitle("Track Note"); - item.onClick((_evt) => { - this.store.trackFile(fileish.path); - store.save(); - }); + // item.setTitle(t("REVIEW_EASY_FILE_MENU")) + item.setTitle(showtext[algo][i]) + .setIcon("SpacedRepIcon") + .onClick(() => { + this.saveReviewResponse(fileish, i); + }); }); } } + + addFileMenuEvt(this, menu, fileish); }), ); } @@ -275,38 +206,21 @@ export default class SRPlugin extends Plugin { }, }); - this.addCommand({ - id: "srs-note-review-easy", - name: t("REVIEW_NOTE_EASY_CMD"), - callback: () => { - const openFile: TFile | null = this.app.workspace.getActiveFile(); - if (openFile && openFile.extension === "md") { - this.saveReviewResponse(openFile, ReviewResponse.Easy); - } - }, - }); - - this.addCommand({ - id: "srs-note-review-good", - name: t("REVIEW_NOTE_GOOD_CMD"), - callback: () => { - const openFile: TFile | null = this.app.workspace.getActiveFile(); - if (openFile && openFile.extension === "md") { - this.saveReviewResponse(openFile, ReviewResponse.Good); - } - }, - }); - - this.addCommand({ - id: "srs-note-review-hard", - name: t("REVIEW_NOTE_HARD_CMD"), - callback: () => { - const openFile: TFile | null = this.app.workspace.getActiveFile(); - if (openFile && openFile.extension === "md") { - this.saveReviewResponse(openFile, ReviewResponse.Hard); - } - }, - }); + const options = this.algorithm.srsOptions(); + const algo = this.data.settings.algorithm; + const showtext = this.data.settings.responseOptionBtnsText; + for (let i = 1; i < options.length; i++) { + this.addCommand({ + id: "srs-note-review-" + options[i].toLowerCase(), + name: "review as: " + showtext[algo][i], + callback: () => { + const openFile: TFile | null = this.app.workspace.getActiveFile(); + if (openFile && openFile.extension === "md") { + this.saveReviewResponse(openFile, i); + } + }, + }); + } this.addCommand({ id: "srs-review-flashcards", @@ -388,9 +302,57 @@ export default class SRPlugin extends Plugin { // console.log("tracked files saved."); } - async sync(ignoreStats = false): Promise { + private async openFlashcardModalForSingleNote( + noteFile: TFile, + reviewMode: FlashcardReviewMode, + ): Promise { + const topicPath: TopicPath = this.findTopicPath(this.createSrTFile(noteFile)); + const note: Note = await this.loadNote(noteFile, topicPath); + + const deckTree = new Deck("root", null); + note.appendCardsToDeck(deckTree); + const remainingDeckTree = DeckTreeFilter.filterForRemainingCards( + this.questionPostponementList, + deckTree, + reviewMode, + ); + this.openFlashcardModal(deckTree, remainingDeckTree, reviewMode); + } + + private openFlashcardModal( + fullDeckTree: Deck, + remainingDeckTree: Deck, + reviewMode: FlashcardReviewMode, + ): void { + const deckIterator = SRPlugin.createDeckTreeIterator(this.data.settings); + const cardScheduleCalculator = new CardScheduleCalculator( + this.data.settings, + this.easeByPath, + ); + const reviewSequencer: IFlashcardReviewSequencer = new FlashcardReviewSequencer( + reviewMode, + deckIterator, + this.data.settings, + cardScheduleCalculator, + this.questionPostponementList, + ); + + reviewSequencer.setDeckTree(fullDeckTree, remainingDeckTree); + new FlashcardModal(this.app, this, this.data.settings, reviewSequencer, reviewMode).open(); + } + + private static createDeckTreeIterator(settings: SRSettings): IDeckTreeIterator { + const iteratorOrder: IIteratorOrder = { + deckOrder: OrderMethod.Sequential, + cardListOrder: CardListOrder.DueFirst, + cardOrder: settings.randomizeCardOrder ? OrderMethod.Random : OrderMethod.Sequential, + }; + return new DeckTreeIterator(iteratorOrder, IteratorDeckSource.UpdatedByIterator); + } + + async sync(): Promise { if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { - await this.sync_Algo(ignoreStats); + await this.sync_Algo(); return; } @@ -404,11 +366,12 @@ export default class SRPlugin extends Plugin { this.easeByPath = new NoteEaseList(this.data.settings); this.incomingLinks = {}; this.pageranks = {}; - this.newNotesCount = 0; this.dueNotesCount = 0; this.dueDatesNotes = {}; this.reviewDecks = {}; + this.noteStats = new Stats(); + // reset flashcards stuff const fullDeckTree = new Deck("root", null); @@ -428,31 +391,13 @@ export default class SRPlugin extends Plugin { if ( this.data.settings.noteFoldersToIgnore.some((folder) => // note.path.startsWith(folder) - note.path.contains(folder), + noteFile.path.includes(folder), ) ) { continue; } - if (this.incomingLinks[noteFile.path] === undefined) { - this.incomingLinks[noteFile.path] = []; - } - - const links = this.app.metadataCache.resolvedLinks[noteFile.path] || {}; - for (const targetPath in links) { - if (this.incomingLinks[targetPath] === undefined) - this.incomingLinks[targetPath] = []; - - // markdown files only - if (targetPath.split(".").pop().toLowerCase() === "md") { - this.incomingLinks[targetPath].push({ - sourcePath: noteFile.path, - linkCount: links[targetPath], - }); - - graph.link(noteFile.path, targetPath, links[targetPath]); - } - } + updategraphLink(this.incomingLinks, noteFile); const topicPath: TopicPath = this.findTopicPath(this.createSrTFile(noteFile)); if (topicPath.hasPath) { @@ -500,9 +445,9 @@ export default class SRPlugin extends Plugin { ) ) { for (const matchedNoteTag of matchedNoteTags) { - this.reviewDecks[matchedNoteTag].newNotes.push(note); - this.newNotesCount++; + this.reviewDecks[matchedNoteTag].newNotes.push(noteFile); } + this.noteStats.incrementNew(); continue; } @@ -527,6 +472,7 @@ export default class SRPlugin extends Plugin { if (dueUnix <= now.valueOf()) { this.dueNotesCount++; + this.noteStats.incrementOnDue(); } const nDays: number = Math.ceil((dueUnix - now.valueOf()) / (24 * 3600 * 1000)); @@ -534,6 +480,8 @@ export default class SRPlugin extends Plugin { this.dueDatesNotes[nDays] = 0; } this.dueDatesNotes[nDays]++; + const interval = Number(frontmatter["sr-interval"]); + this.noteStats.update(nDays, interval, ease); } graph.rank(0.85, 0.000001, (node: string, rank: number) => { @@ -554,8 +502,7 @@ export default class SRPlugin extends Plugin { this.cardStats = calc.calculate(this.deckTree); if (this.data.settings.showDebugMessages) { - console.log(`SR: ${t("EASES")}`, this.easeByPath.dict); - console.log(`SR: ${t("DECKS")}`, this.deckTree); + this.showSyncInfo(); } for (const deckKey in this.reviewDecks) { @@ -582,7 +529,7 @@ export default class SRPlugin extends Plugin { this.syncLock = false; } - async sync_Algo(ignoreStats = false): Promise { + async sync_Algo(): Promise { if (this.syncLock) { return; } @@ -591,115 +538,79 @@ export default class SRPlugin extends Plugin { // reset notes stuff graph.reset(); - this.easeByPath = {}; + this.easeByPath = new NoteEaseList(this.data.settings); this.incomingLinks = {}; this.pageranks = {}; - this.newNotesCount = 0; this.dueNotesCount = 0; this.dueDatesNotes = {}; this.reviewDecks = {}; // reset flashcards stuff + const fullDeckTree = new Deck("root", null); this.deckTree = new Deck("root", null); - this.dueDatesFlashcards = {}; - this.cardStats = { - eases: {}, - intervals: {}, - newCount: 0, - youngCount: 0, - matureCount: 0, - }; + // this.cardStats = {}; - this.noteStats = { - eases: {}, - intervals: {}, - newCount: 0, - youngCount: 0, - matureCount: 0, - }; + this.noteStats = new Stats(); // check trackfile store.reLoad(); - const now = window.moment(Date.now()); + let now_number = Date.now(); + const now = window.moment(now_number); const todayDate: string = now.format("YYYY-MM-DD"); // clear bury list if we've changed dates if (todayDate !== this.data.buryDate) { + now_number = DateUtils.EndofToday; this.data.buryDate = todayDate; - this.data.buryList = []; + this.questionPostponementList.clear(); } const notes: TFile[] = this.app.vault.getMarkdownFiles(); - for (const note of notes) { - if ( - this.data.settings.noteFoldersToIgnore.some((folder) => - // note.path.startsWith(folder) - note.path.contains(folder), - ) - ) { + for (const noteFile of notes) { + if (isIgnoredPath(this.data.settings.noteFoldersToIgnore, noteFile.path)) { continue; } - if (this.incomingLinks[note.path] === undefined) { - this.incomingLinks[note.path] = []; - } - - const links = this.app.metadataCache.resolvedLinks[note.path] || {}; - for (const targetPath in links) { - if (this.incomingLinks[targetPath] === undefined) - this.incomingLinks[targetPath] = []; + updategraphLink(this.incomingLinks, noteFile); - // markdown files only - if (targetPath.split(".").pop().toLowerCase() === "md") { - this.incomingLinks[targetPath].push({ - sourcePath: note.path, - linkCount: links[targetPath], - }); - - graph.link(note.path, targetPath, links[targetPath]); - } - } - - const deckPath: string[] = this.findDeckPath(note); - if (deckPath.length !== 0) { - const flashcardsInNoteAvgEase: number = await this.findFlashcardsInNote( + const topicPath: TopicPath = this.findTopicPath(this.createSrTFile(noteFile)); + if (topicPath.hasPath) { + const note: Note = await this.loadNote(noteFile, topicPath); + const flashcardsInNoteAvgEase: number = NoteEaseCalculator.Calculate( note, - deckPath, - false, - ignoreStats, + this.data.settings, ); + note.appendCardsToDeck(fullDeckTree); if (flashcardsInNoteAvgEase > 0) { - this.easeByPath[note.path] = flashcardsInNoteAvgEase; + this.easeByPath.setEaseForPath(note.filePath, flashcardsInNoteAvgEase); } } - const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; - - const tags = getAllTags(fileCachedData) || []; - - const deckname = this.store.getNoteDeckName(tags); - if (deckname !== null) { + const settings = this.data.settings; + const deckname = Tags.getNoteDeckName(noteFile, this.data.settings); + if (deckname != null) { if (!Object.prototype.hasOwnProperty.call(this.reviewDecks, deckname)) { this.reviewDecks[deckname] = new ReviewDeck(deckname); } // update single note deck data, only tagged reviewnote - if (!this.store.isTracked(note.path)) { - this.store.trackFile(note.path, deckname); - this.noteStats.newCount++; + if (!store.isTracked(noteFile.path)) { + store.trackFile(noteFile.path, deckname, false); + this.noteStats.incrementNew(); } else { - const id = store.getFileId(note.path); - const scheduling = store.getSchedbyId(id); - if (scheduling != null) { - this.updateStats(this.noteStats, scheduling); - } else { - this.noteStats.newCount++; - } + const id = store.getFileId(noteFile.path); + const item = store.getItembyID(id); + this.noteStats.updateStats(item, DateUtils.EndofToday); } - store.syncRCDataToSRrevDeck(this.reviewDecks[deckname], note); - const id = store.getFileId(note.path); + const result = DataSyncer.syncRCDataToSRrevDeck( + this.reviewDecks[deckname], + noteFile, + now_number, + ); + this.dueNotesCount += result; + + const id = store.getFileId(noteFile.path); - const settings = this.data.settings; if ( settings.algorithm === algorithmNames.Anki || settings.algorithm === algorithmNames.Default || @@ -708,17 +619,26 @@ export default class SRPlugin extends Plugin { const sched = store.getSchedbyId(id); if (sched != null) { const ease: number = parseFloat(sched[3]); - if (now != null) { + if (!isNaN(ease)) { // this.plugin.easeByPath just update in plugin.sync(), shouldn't update in pulgin.singNoteSyncQueue() - if (Object.prototype.hasOwnProperty.call(this.easeByPath, note.path)) { - this.easeByPath[note.path] = - (this.easeByPath[note.path] + ease) / 2; + if (this.easeByPath.hasEaseForPath(noteFile.path)) { + this.easeByPath.setEaseForPath( + noteFile.path, + (this.easeByPath.getEaseByPath(noteFile.path) + ease) / 2, + ); } else { - this.easeByPath[note.path] = ease; + this.easeByPath.setEaseForPath(noteFile.path, ease); } } } } + } else { + const tf = store.getTrackedFile(noteFile.path); + const tag = tf?.tags?.last(); + if (tag != undefined && settings.tagsToReview.includes(tag)) { + tf.tags.remove(tag); + tf.updateTags(store.defaultDackName); + } } } @@ -727,19 +647,33 @@ export default class SRPlugin extends Plugin { }); // Add Recall reviewnote deck - const dkname = this.store.getDefaultDackName(); + const dkname = store.defaultDackName; if (!Object.prototype.hasOwnProperty.call(this.reviewDecks, dkname)) { this.reviewDecks[dkname] = new ReviewDeck(dkname); } - this.store.syncRCsrsDataToSRreviewDecks(this.reviewDecks[dkname]); + const dueCount = DataSyncer.syncRCsrsDataToSRreviewDecks( + this.reviewDecks, + dkname, + this.noteStats, + ); + this.dueNotesCount += dueCount; + + // Reviewable cards are all except those with the "edit later" tag + this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); // sort the deck names this.deckTree.sortSubdecksList(); + this.remainingDeckTree = DeckTreeFilter.filterForRemainingCards( + this.questionPostponementList, + this.deckTree, + FlashcardReviewMode.Review, + ); + const calc: DeckTreeStatsCalculator = new DeckTreeStatsCalculator(); + this.cardStats = calc.calculate(this.deckTree); + // this.noteStats = calc.calculate(this.deckTree); + if (this.data.settings.showDebugMessages) { - console.log(`SR: ${t("EASES")}`, this.easeByPath); - console.log(`SR: ${t("DECKS")}`, this.deckTree); - console.log(`SR: NOTE ${t("DECKS")}`, this.reviewDecks); - console.log("SR: this.dueDatesNotes", this.dueDatesNotes); + this.showSyncInfo(); } for (const deckKey in this.reviewDecks) { @@ -757,13 +691,63 @@ export default class SRPlugin extends Plugin { this.updateStatusBar(); - if (this.data.settings.enableNoteReviewPaneOnStartup) this.reviewQueueView?.redraw(); + if (this.data.settings.enableNoteReviewPaneOnStartup) this.reviewQueueView.redraw(); this.syncLock = false; } + async loadNote(noteFile: TFile, topicPath: TopicPath): Promise { + const loader: NoteFileLoader = new NoteFileLoader(this.data.settings); + const note: Note = await loader.load(this.createSrTFile(noteFile), topicPath); + const settings = this.data.settings; + if (topicPath.hasPath && settings.dataLocation !== DataLocation.SaveOnNoteFile) { + const store = this.store; + const deckname = topicPath.path[0]; + if (store.getFileIndex(noteFile.path) < 0) { + if ( + settings.trackedNoteToDecks && + (deckname === store.defaultDackName || + Tags.getNoteDeckName(noteFile, settings) !== null) + ) { + store.trackFile(noteFile.path, RPITEMTYPE.NOTE, false); + } else { + store.trackFile(noteFile.path, RPITEMTYPE.CARD, false); + } + } + DataSyncer.updateCardsSched_algo(note, topicPath); + } + if (note.hasChanged) note.writeNoteFile(this.data.settings); + return note; + } + async saveReviewResponse(note: TFile, response: ReviewResponse): Promise { + const settings = this.data.settings; if (this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile) { - await this.saveReviewResponsebyAlgo(note, ReviewResponse[response]); + const deckName = ReviewNote.getDeckName(settings, note); + if (deckName == null) return; + const opt = this.algorithm.srsOptions()[response]; + const ease = this.getLinkedEase(note); + const store = this.store; + const fileId = store.getFileId(note.path); + const item = store.getItembyID(fileId); + this.noteStats.decrementStats(item); + const result = ReviewNote.saveReviewResponsebyAlgo( + this.reviewDecks[deckName], + note, + opt, + settings.burySiblingCards, + ease, + ); + this.noteStats.updateStats(item); + this.dueNotesCount += result.dueNotesCount; + if (settings.burySiblingCards) { + this.data.buryList.push(...result.buryList); + await this.savePluginData(); + } + this.reviewDecks[deckName].sortNotes(this.pageranks); + this.updateStatusBar(); + if (settings.autoNextNote) { + this.reviewNextNote(deckName); + } return; } const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; @@ -908,93 +892,10 @@ export default class SRPlugin extends Plugin { } } - async saveReviewResponsebyAlgo(note: TFile, response: string): Promise { - const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; - const store = this.store; - - const tags = getAllTags(fileCachedData) || []; - if (this.data.settings.noteFoldersToIgnore.some((folder) => note.path.startsWith(folder))) { - new Notice(t("NOTE_IN_IGNORED_FOLDER")); - return; - } - - let shouldIgnore = true; - let matchedNoteTag: string; - for (const tag of tags) { - if ( - this.data.settings.tagsToReview.some( - (tagToReview) => - tag === (matchedNoteTag = tagToReview) || tag.startsWith(tagToReview + "/"), - ) - ) { - shouldIgnore = false; - // matchedNoteTag = tagToReview; - break; - } else { - shouldIgnore = true; - } - } - - if (shouldIgnore && !this.store.isTracked(note.path)) { - new Notice(t("PLEASE_TAG_NOTE")); - return; - } - - const fileId = store.getFileId(note.path); - const item = store.getItembyID(fileId); - const now: number = Date.now(); - if (store.isNewAdd(fileId)) { - // new note - const settings = this.data.settings; - if ( - settings.algorithm === algorithmNames.Anki || - settings.algorithm === algorithmNames.Default || - settings.algorithm === algorithmNames.SM2 - ) { - const settings = this.data.settings.algorithmSettings[this.data.settings.algorithm]; - const baseEase = settings.startingEase; - let ease = this.calcLinkContribution(note, baseEase).ease; - ease = Math.round(ease * 100) / 100; - store.updateItemAlgorithmData(fileId, "ease", ease); - } - } - - if (store.isDue(fileId)) { - const nDays: number = Math.ceil((item.nextReview - now) / DateUtils.DAYS_TO_MILLIS); - if (Object.prototype.hasOwnProperty.call(this.dueDatesNotes, nDays)) { - this.dueDatesNotes[nDays]--; - } - } - - store.updateReviewedCounts(fileId); - store.reviewId(fileId, response); - store.save(); - - if (this.data.settings.burySiblingCards) { - await this.findFlashcardsInNote(note, [], true); // bury all cards in current note - this.savePluginData(); - } - - //Sync update - this.singleNoteSyncQueue(this, note, fileId); - - this.updateminNextView(fileId); - - if (!this.lastSelectedReviewDeck) { - this.lastSelectedReviewDeck = matchedNoteTag; - } - - new Notice(t("RESPONSE_RECEIVED")); - - if (this.data.settings.autoNextNote) { - this.reviewNextNote(this.lastSelectedReviewDeck); - } - } - async reviewNextNoteModal(): Promise { const reviewDeckNames: string[] = Object.keys(this.reviewDecks); if (this.data.settings.reviewingNoteDirectly) { - const rdname = this.getDeckNameForReviewDirectly(); + const rdname = ReviewNote.getDeckNameForReviewDirectly(this.reviewDecks); this.reviewNextNote(rdname); } else if (reviewDeckNames.length === 1) { this.reviewNextNote(reviewDeckNames[0]); @@ -1014,12 +915,13 @@ export default class SRPlugin extends Plugin { this.lastSelectedReviewDeck = deckKey; const deck = this.reviewDecks[deckKey]; let show = false; - let path = null; + let path = ""; let index = -1; - if (deck.dueNotesCount > 0) { - index = this.getNextDueNoteIndex(deck.dueNotesCount); - } + index = ReviewNote.getNextDueNoteIndex( + deck.dueNotesCount, + this.data.settings.openRandomNote, + ); if (index >= 0) { await this.app.workspace.getLeaf().openFile(deck.scheduledNotes[index].note); path = deck.scheduledNotes[index].note.path; @@ -1040,11 +942,7 @@ export default class SRPlugin extends Plugin { const id = this.store.getFileId(path); const item = this.store.getItembyID(id); // console.debug("item:", item); - // this.reviewNoteFloatBar.algoDisplay(show, store.calcReviewInterval(fid)); - this.reviewNoteFloatBar.algoDisplay( - show, - this.algorithm.calcAllOptsIntervals(item), - ); + this.reviewFloatBar.algoDisplay(true, item); } return; @@ -1055,355 +953,36 @@ export default class SRPlugin extends Plugin { if ( this.data.settings.reviewingNoteDirectly && - this.dueNotesCount + this.newNotesCount > 0 + this.noteStats.onDueCount + this.noteStats.newCount > 0 ) { - const rdname: string = this.getDeckNameForReviewDirectly(); - if (rdname !== null) { + const rdname: string = ReviewNote.getDeckNameForReviewDirectly(this.reviewDecks); + if (rdname != undefined) { this.reviewNextNote(rdname); return; } } - if (this.minNextView > 0 && Object.keys(this.store.data.toDayLatterQueue).length > 0) { - const now = Date.now(); - const interval = Math.round((this.minNextView - now) / 1000 / 60); - if (interval < 60) { - new Notice("可以在" + interval + "分钟后来复习"); - } else if (interval < 60 * 5) { - new Notice("可以在" + interval / 60 + "小时后来复习"); - } - } + ReviewNote.nextReviewNotice(Queue.getInstance().toDayLatterQueue); this.updateStatusBar(); - this.reviewNoteFloatBar.selfDestruct(); + this.reviewFloatBar.selfDestruct(); this.reviewQueueView.redraw(); new Notice(t("ALL_CAUGHT_UP")); } - findDeckPath(note: TFile): string[] { - let deckPath: string[] = []; - if (this.data.settings.convertFoldersToDecks) { - deckPath = note.path.split("/"); - deckPath.pop(); // remove filename - if (deckPath.length === 0) { - deckPath = ["/"]; - } - } else { - const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; - const tags = getAllTags(fileCachedData) || []; - - outer: for (const tagToReview of this.data.settings.flashcardTags) { - for (const tag of tags) { - if (tag === tagToReview || tag.startsWith(tagToReview + "/")) { - deckPath = tag.substring(1).split("/"); - break outer; - } - } - } - if ( - deckPath.length === 0 && - this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile && - this.data.settings.trackedNoteToDecks && - (this.store.isTaged(note, "note") || this.store.isTrackedCardfile(note.path)) - ) { - let deckName = this.store.getNoteDeckName(tags); - if (deckName == null) { - deckName = this.store.getDefaultDackName(); - deckPath = deckName.split("/"); - } else { - deckPath = deckName.substring(1).split("/"); - } - if (!this.store.isTracked(note.path)) { - this.store.trackFile(note.path, RPITEMTYPE.CARD); - } - } - } - - return deckPath; + createSrTFile(note: TFile): SrTFile { + return new SrTFile(this.app.vault, this.app.metadataCache, note); } - async findFlashcardsInNote( - note: TFile, - deckPath: string[], - buryOnly = false, - ignoreStats = false, - ): Promise { - let fileText: string = await this.app.vault.read(note); - const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; - const headings: HeadingCache[] = fileCachedData.headings || []; - let fileChanged = false, - totalNoteEase = 0, - scheduledCount = 0; - const settings: SRSettings = this.data.settings; - const noteDeckPath = deckPath; - - const now: number = Date.now(); - const parsedCards: [CardType, string, number][] = parse( - fileText, - settings.singleLineCardSeparator, - settings.singleLineReversedCardSeparator, - settings.multilineCardSeparator, - settings.multilineReversedCardSeparator, - settings.convertHighlightsToClozes, - settings.convertBoldTextToClozes, - settings.convertCurlyBracketsToClozes, - ); - for (const parsedCard of parsedCards) { - deckPath = noteDeckPath; - const cardType: CardType = parsedCard[0], - lineNo: number = parsedCard[2]; - let cardText: string = parsedCard[1]; - - if (cardText.includes(settings.editLaterTag)) { - continue; - } - - if (!settings.convertFoldersToDecks) { - const tagInCardRegEx = /^#[^\s#]+/gi; - const cardDeckPath = cardText - .match(tagInCardRegEx) - ?.slice(-1)[0] - .replace("#", "") - .split("/"); - if (cardDeckPath) { - deckPath = cardDeckPath; - cardText = cardText.replaceAll(tagInCardRegEx, ""); - } - } - - this.deckTree.createDeck([...deckPath]); - - let cardTextHash: string = cyrb53(cardText); - - if (buryOnly) { - this.data.buryList.push(cardTextHash); - continue; - } - - const siblingMatches: [string, string][] = []; - if (cardType === CardType.Cloze) { - const siblings: RegExpMatchArray[] = []; - if (settings.convertHighlightsToClozes) { - siblings.push(...cardText.matchAll(/==(.*?)==/gm)); - } - if (settings.convertBoldTextToClozes) { - siblings.push(...cardText.matchAll(/\*\*(.*?)\*\*/gm)); - } - if (settings.convertCurlyBracketsToClozes) { - siblings.push(...cardText.matchAll(/{{(.*?)}}/gm)); - } - siblings.sort((a, b) => { - if (a.index < b.index) { - return -1; - } - if (a.index > b.index) { - return 1; - } - return 0; - }); - - let front: string, back: string; - for (const m of siblings) { - const deletionStart: number = m.index, - deletionEnd: number = deletionStart + m[0].length; - front = - cardText.substring(0, deletionStart) + - "[...]" + - cardText.substring(deletionEnd); - front = front - .replace(/==/gm, "") - .replace(/\*\*/gm, "") - .replace(/{{/gm, "") - .replace(/}}/gm, ""); - back = - cardText.substring(0, deletionStart) + - "" + - cardText.substring(deletionStart, deletionEnd) + - "" + - cardText.substring(deletionEnd); - back = back - .replace(/==/gm, "") - .replace(/\*\*/gm, "") - .replace(/{{/gm, "") - .replace(/}}/gm, ""); - siblingMatches.push([front, back]); - } - } else { - let idx: number; - if (cardType === CardType.SingleLineBasic) { - idx = cardText.indexOf(settings.singleLineCardSeparator); - siblingMatches.push([ - cardText.substring(0, idx), - cardText.substring(idx + settings.singleLineCardSeparator.length), - ]); - } else if (cardType === CardType.SingleLineReversed) { - idx = cardText.indexOf(settings.singleLineReversedCardSeparator); - const side1: string = cardText.substring(0, idx), - side2: string = cardText.substring( - idx + settings.singleLineReversedCardSeparator.length, - ); - siblingMatches.push([side1, side2]); - siblingMatches.push([side2, side1]); - } else if (cardType === CardType.MultiLineBasic) { - idx = cardText.indexOf("\n" + settings.multilineCardSeparator + "\n"); - siblingMatches.push([ - cardText.substring(0, idx), - cardText.substring(idx + 2 + settings.multilineCardSeparator.length), - ]); - } else if (cardType === CardType.MultiLineReversed) { - idx = cardText.indexOf("\n" + settings.multilineReversedCardSeparator + "\n"); - const side1: string = cardText.substring(0, idx), - side2: string = cardText.substring( - idx + 2 + settings.multilineReversedCardSeparator.length, - ); - siblingMatches.push([side1, side2]); - siblingMatches.push([side2, side1]); - } - } - - let scheduling: RegExpMatchArray[] = [...cardText.matchAll(MULTI_SCHEDULING_EXTRACTOR)]; - if (scheduling.length === 0) - scheduling = [...cardText.matchAll(LEGACY_SCHEDULING_EXTRACTOR)]; - - // we have some extra scheduling dates to delete - if (scheduling.length > siblingMatches.length) { - const idxSched: number = cardText.lastIndexOf(""; - - const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); - fileText = fileText.replace(replacementRegex, () => newCardText); - fileChanged = true; - scheduling.splice(siblingMatches.length, scheduling.length - siblingMatches.length); - } - - //update scheduling by recall - if (settings.dataLocation !== DataLocation.SaveOnNoteFile) { - const store = this.store; - if (scheduling.length) { - cardTextHash = BlockUtils.getTxtHash(cardText); - store.setTrackfileCardSched( - note, - "#" + noteDeckPath[0], - lineNo, - cardTextHash, - siblingMatches.length, - scheduling, - ); - // delete scheduling infos in note file. - const newCardText = store.updateCardSchedXml(cardText); - const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); - fileText = fileText.replace(replacementRegex, () => newCardText); - fileChanged = true; - console.debug("fileChanged", fileChanged); - } else { - store.getTrackfileCardSched( - note, - "#" + noteDeckPath[0], - lineNo, - cardTextHash, - siblingMatches.length, - scheduling, - ); - } - } - const context: string = settings.showContextInCards - ? getCardContext(lineNo, headings, note.basename) - : ""; - const siblings: Card[] = []; - for (let i = 0; i < siblingMatches.length; i++) { - const front: string = siblingMatches[i][0].trim(), - back: string = siblingMatches[i][1].trim(); - - const cardObj: Card = { - isDue: i < scheduling.length, - note, - lineNo, - front, - back, - cardText, - context, - cardType, - siblingIdx: i, - siblings, - editLater: false, - }; - - // card scheduled - if (ignoreStats) { - this.cardStats.newCount++; - cardObj.isDue = true; - this.deckTree.insertFlashcard([...deckPath], cardObj); - } else if (i < scheduling.length) { - const dueUnix: number = window - .moment(scheduling[i][1], ["YYYY-MM-DD", "DD-MM-YYYY"]) - .valueOf(); - const nDays: number = Math.ceil((dueUnix - now) / (24 * 3600 * 1000)); - if (!Object.prototype.hasOwnProperty.call(this.dueDatesFlashcards, nDays)) { - this.dueDatesFlashcards[nDays] = 0; - } - this.dueDatesFlashcards[nDays]++; - - const interval: number = parseInt(scheduling[i][2]), - ease: number = parseInt(scheduling[i][3]); - totalNoteEase += ease; - scheduledCount++; - - this.updateStats(this.cardStats, scheduling[i]); - - if (this.data.buryList.includes(cardTextHash)) { - this.deckTree.countFlashcard([...deckPath]); - continue; - } - - if (dueUnix <= now) { - cardObj.interval = interval; - cardObj.ease = ease; - cardObj.delayBeforeReview = now - dueUnix; - this.deckTree.insertFlashcard([...deckPath], cardObj); - } else { - this.deckTree.countFlashcard([...deckPath]); - continue; - } - } else { - this.cardStats.newCount++; - if (this.data.buryList.includes(cyrb53(cardText))) { - this.deckTree.countFlashcard([...deckPath]); - continue; - } - this.deckTree.insertFlashcard([...deckPath], cardObj); - } - - siblings.push(cardObj); - } - } - - if (fileChanged) { - await this.app.vault.modify(note, fileText); - } - - if (scheduledCount > 0) { - const flashcardsInNoteAvgEase: number = totalNoteEase / scheduledCount; - const flashcardContribution: number = Math.min( - 1.0, - Math.log(scheduledCount + 0.5) / Math.log(64), - ); - return ( - flashcardsInNoteAvgEase * flashcardContribution + - settings.baseEase * (1.0 - flashcardContribution) - ); - } - - return 0; + findTopicPath(note: ISRFile): TopicPath { + return TopicPath.getTopicPathOfFile(note, this.data.settings, this.store); } async loadPluginData(): Promise { this.data = Object.assign({}, DEFAULT_DATA, await this.loadData()); this.data.settings = Object.assign({}, DEFAULT_SETTINGS, this.data.settings); - this.store = new DataStore(this); + this.store = new DataStore(this.data.settings, this.manifest.dir); await this.store.load(); } @@ -1412,6 +991,7 @@ export default class SRPlugin extends Plugin { } initView(): void { + this.syncLock = true; this.registerView( REVIEW_QUEUE_VIEW_TYPE, (leaf) => (this.reviewQueueView = new ReviewQueueListView(leaf, this)), @@ -1419,222 +999,49 @@ export default class SRPlugin extends Plugin { if ( this.data.settings.enableNoteReviewPaneOnStartup && - app.workspace.getLeavesOfType(REVIEW_QUEUE_VIEW_TYPE).length == 0 + this.app.workspace.getLeavesOfType(REVIEW_QUEUE_VIEW_TYPE).length == 0 ) { this.app.workspace.getRightLeaf(false).setViewState({ type: REVIEW_QUEUE_VIEW_TYPE, active: true, }); } + this.syncLock = false; } - calcLinkContribution(note: TFile, baseEase?: number) { - let linkTotal = 0, - linkPGTotal = 0, - totalLinkCount = 0; - - for (const statObj of this.incomingLinks[note.path] || []) { - const ease: number = this.easeByPath[statObj.sourcePath]; - if (ease) { - linkTotal += statObj.linkCount * this.pageranks[statObj.sourcePath] * ease; - linkPGTotal += this.pageranks[statObj.sourcePath] * statObj.linkCount; - totalLinkCount += statObj.linkCount; - } - } - - const outgoingLinks = this.app.metadataCache.resolvedLinks[note.path] || {}; - for (const linkedFilePath in outgoingLinks) { - const ease: number = this.easeByPath[linkedFilePath]; - if (ease) { - const prank = outgoingLinks[linkedFilePath] * this.pageranks[linkedFilePath]; - linkTotal += prank * ease; - linkPGTotal += prank; - totalLinkCount += outgoingLinks[linkedFilePath]; - } - } - - // fix: settings.maxLinkFactor will be used in three algorithm, but not show in settings. - const linkContribution: number = - this.data.settings.maxLinkFactor * - Math.min(1.0, Math.log(totalLinkCount + 0.5) / Math.log(64)); - - let ease: number; - if (baseEase != null) { - ease = - (1.0 - linkContribution) * baseEase + - (totalLinkCount > 0 - ? (linkContribution * linkTotal) / linkPGTotal - : linkContribution * baseEase); - // add note's average flashcard ease if available - if (Object.prototype.hasOwnProperty.call(this.easeByPath, note.path)) { - ease = (ease + this.easeByPath[note.path]) / 2; - } - } - - return { - linkContribution, - totalLinkCount, - linkTotal, - linkPGTotal, - ease, - }; - } - - singleNoteSyncQueue(plugin: SRPlugin, note: TFile, fileId: number) { - // let deckname: string; - - const item = this.store.getItembyID(fileId); - const deckname = item.deckName; - if (!this.lastSelectedReviewDeck) { - this.lastSelectedReviewDeck = deckname; - } - const deck = plugin.reviewDecks[deckname]; - const now = Date.now(); - if (deck.newNotes.contains(note)) { - // isNew - deck.newNotes.remove(note); - plugin.newNotesCount--; - } else { - //isDued - const index = deck.scheduledNotes.findIndex((sNote, _index) => { - return sNote.note === note; - }); - deck.scheduledNotes.splice(index, 1); - if (index < deck.dueNotesCount) { - deck.dueNotesCount--; - plugin.dueNotesCount--; - } - } - - plugin.store.syncRCDataToSRrevDeck(deck, note, now); - deck.sortNotes(plugin.pageranks); - - // this.dueNotesCount_real = Object.keys(this.store.data.toDayAllQueue).length; - this.updateStatusBar(); - } - - getDeckNameForReviewDirectly(): string | null { - const reviewDeckNames: string[] = Object.keys(this.reviewDecks); - let ind = null; - let rdname = this.lastSelectedReviewDeck; - let ndeck: ReviewDeck; - let ncount = 0; - - if (this.lastSelectedReviewDeck != null && Object.keys(this.reviewDecks).includes(rdname)) { - ndeck = this.reviewDecks[rdname]; - ncount = ndeck.dueNotesCount + ndeck.newNotes.length; - if (ncount > 0) { - return this.lastSelectedReviewDeck; - } - } - - do { - rdname = reviewDeckNames[Math.round(Math.random() * (reviewDeckNames.length - 1))]; - ndeck = this.reviewDecks[rdname]; - ncount = ndeck.dueNotesCount + ndeck.newNotes.length; - - ind = reviewDeckNames.lastIndexOf(rdname); - reviewDeckNames.splice(ind, 1); - } while (ncount === 0 && reviewDeckNames.length); - if (ncount > 0) { - this.lastSelectedReviewDeck = rdname; - return rdname; - } else { - return null; - } - } - - getNextDueNoteIndex(NotesCount: number) { - let index = -1; - - if (NotesCount === 0) { - return -1; - } - if (!this.data.settings.openRandomNote) { - return 0; - } else { - index = Math.round(Math.random() * (NotesCount - 1)); - } - return index; - } - - updateminNextView(fileId: number) { - const now = Date.now(); - const nowToday: number = - Math.ceil(now / DateUtils.DAYS_TO_MILLIS) * DateUtils.DAYS_TO_MILLIS; - const item = this.store.getItembyID(fileId); - - if ( - Object.keys(this.store.data.toDayLatterQueue).length > 0 && - item.nextReview <= nowToday - ) { - if (this.minNextView < now || this.minNextView > item.nextReview) { - console.debug("interval diff:should be - (", this.minNextView - item.nextReview); - this.minNextView = item.nextReview; - } - } - } - - updateStats(stats: Stats, scheduling: RegExpMatchArray) { - const interval: number = parseInt(scheduling[2]), - ease: number = parseInt(scheduling[3]); - if (!Object.prototype.hasOwnProperty.call(stats.intervals, interval)) { - stats.intervals[interval] = 0; - } - stats.intervals[interval]++; - if (!Object.prototype.hasOwnProperty.call(stats.eases, ease)) { - stats.eases[ease] = 0; - } - stats.eases[ease]++; - - if (interval >= 32) { - stats.matureCount++; - } else { - stats.youngCount++; - } + showSyncInfo() { + console.log(`SR: ${t("EASES")}`, this.easeByPath); + console.log(`SR: ${t("DECKS")}`, this.deckTree); + console.log(`SR: NOTE ${t("DECKS")}`, this.reviewDecks); + console.log("SR: cardStats ", this.cardStats); + console.log("SR: noteStats ", this.noteStats); + console.log("SR: this.dueDatesNotes", this.dueDatesNotes); } updateStatusBar() { this.statusBar.setText( t("STATUS_BAR", { - dueNotesCount: this.dueNotesCount, - // dueNotesCount: this.dueNotesCount_real, - dueFlashcardsCount: this.deckTree.dueFlashcardsCount, + dueNotesCount: this.noteStats.onDueCount, + dueFlashcardsCount: this.remainingDeckTree.getCardCount(CardListType.All, true), }), ); } - registerTrackFileEvents() { - this.registerEvent( - this.app.vault.on("rename", (file, old) => { - this.store.renameTrackedFile(old, file.path); - }), - ); - - this.registerEvent( - this.app.vault.on("delete", (file) => { - this.store.untrackFile(file.path); - }), - ); - - this.registerEvent( - this.app.vault.on("modify", async (file: TFile) => { - if (file.extension === "md") { - if (this.data.settings.dataLocation === DataLocation.SaveOnNoteFile) { - return; - } - if (this.store.isTrackedCardfile(file.path)) { - if ( - (this.data.settings.trackedNoteToDecks && - this.store.isTaged(file, "all")) || - (!this.data.settings.trackedNoteToDecks && - this.store.isTaged(file, "card")) - ) { - await this.store.syncNoteCardsIndex(file); - } - } - } - }), - ); + getLinkedEase(note: TFile) { + const settings = this.data.settings; + if ( + settings.algorithm === algorithmNames.Anki || + settings.algorithm === algorithmNames.Default || + settings.algorithm === algorithmNames.SM2 + ) { + const ease = calcLinkContribution( + note, + this.easeByPath, + this.incomingLinks, + this.pageranks, + settings, + ).ease; + return ease; + } } } diff --git a/src/modals/reviewresponse-modal.tsx b/src/modals/reviewresponse-modal.tsx deleted file mode 100644 index 5b1c6f37..00000000 --- a/src/modals/reviewresponse-modal.tsx +++ /dev/null @@ -1,327 +0,0 @@ -// https://img.shields.io/github/v/release/chetachiezikeuzor/cMenu-Plugin -import { ButtonComponent, MarkdownView, Platform, TFile, setIcon } from "obsidian"; -import { ReviewResponse, textInterval } from "src/scheduling"; -import { SRSettings } from "src/settings"; -import SRPlugin from "../main"; - -export class reviewNoteResponseModal { - public plugin: SRPlugin; - public settings: SRSettings; - containerEl: HTMLElement; - - id = "reviewNoteResponseModalBar"; - buttons: HTMLButtonElement[]; - responseInterval: number[]; - showInterval = true; - buttonTexts: string[]; - - constructor(plugin: SRPlugin) { - this.plugin = plugin; - this.settings = plugin.data.settings; - const algo = plugin.data.settings.algorithm; - this.buttonTexts = plugin.data.settings.responseOptionBtnsText[algo]; - - // this.display(show, responseInterval); - } - - public algoDisplay(show = true, responseInterval?: number[]): void { - const plugin = this.plugin; - const settings: SRSettings = this.settings; - - if (!settings.reviewResponseFloatBar || !settings.autoNextNote) return; - const reviewNoteResponseModalBar = document.getElementById(this.id); - if (!show) { - this.selfDestruct(); - return; - } else if (reviewNoteResponseModalBar) { - // update show text - - this.plugin.algorithm.srsOptions().forEach((opt, index) => { - const btn = document.getElementById("sr-" + opt.toLowerCase() + "-btn"); - // let text = btnText[algo][index]; - const text = this.getTextWithInterval(index, responseInterval); - btn.setText(text); - }); - return; - } - const buttonClick = (s: string) => { - const openFile: TFile | null = plugin.app.workspace.getActiveFile(); - if (openFile && openFile.extension === "md") { - // const fid = plugin.store.getFileId(openFile.path); - // plugin.store.reviewId(fid, s); - plugin.saveReviewResponsebyAlgo(openFile, s); - } - }; - const options = this.plugin.algorithm.srsOptions(); - const optBtnCounts = options.length; - let btnCols = 4; - if (!Platform.isMobile && optBtnCounts > btnCols) { - btnCols = optBtnCounts; - } - this.containerEl = createEl("div"); - this.containerEl.setAttribute("id", this.id); - this.containerEl.addClass("ResponseFloatBarDefaultAesthetic"); - this.containerEl.setAttribute("style", `grid-template-columns: ${"1fr ".repeat(btnCols)}`); - document.body - .querySelector(".mod-vertical.mod-root") - .insertAdjacentElement("afterbegin", this.containerEl); - - this.buttons = []; - options.forEach((opt: string, index) => { - const btn = document.createElement("button"); - btn.setAttribute("id", "sr-" + opt.toLowerCase() + "-btn"); - btn.setAttribute("class", "ResponseFloatBarCommandItem"); - // btn.setAttribute("aria-label", "Hotkey: " + (index + 1)); - // btn.setAttribute("style", `width: calc(95%/${buttonCounts});`); - // setIcon(btn, item.icon); - // let text = btnText[algo][index]; - const text = this.getTextWithInterval(index, responseInterval); - btn.setText(text); - btn.addEventListener("click", () => buttonClick(opt)); - this.buttons.push(btn); - this.containerEl.appendChild(btn); - }); - - const showIntvlBtn = document.createElement("button"); - showIntvlBtn.setAttribute("id", "sr-showintvl-btn"); - showIntvlBtn.setAttribute("class", "ResponseFloatBarCommandItem"); - showIntvlBtn.setAttribute( - "aria-label", - "时间间隔显隐,\n建议:复习类不显示,渐进总结/增量写作显示", - ); - // showIntvlBtn.setText("Show"); - setIcon(showIntvlBtn, "alarm-clock"); - showIntvlBtn.addEventListener("click", () => { - if (this.showInterval) { - this.showInterval = false; - setIcon(showIntvlBtn, "alarm-clock-off"); - } else { - this.showInterval = true; - setIcon(showIntvlBtn, "alarm-clock"); - } - this.algoDisplay(show, responseInterval); - }); - this.buttons.push(showIntvlBtn); - this.containerEl.appendChild(showIntvlBtn); - - const closeBtn = document.createElement("button"); - closeBtn.setAttribute("id", "sr-close-btn"); - closeBtn.setAttribute("class", "ResponseFloatBarCommandItem"); - closeBtn.setAttribute("aria-label", "关闭浮栏显示"); - // closeBtn.setAttribute("style", `width: calc(95%/${buttonCounts});`); - // setIcon(closeBtn, "lucide-x"); - closeBtn.setText("X"); - closeBtn.addEventListener("click", () => { - this.containerEl.style.visibility = "hidden"; - this.selfDestruct(); - }); - this.buttons.push(closeBtn); - this.containerEl.appendChild(closeBtn); - - /* const bar = document.getElementById("reviewNoteResponseModalBar"); - const Markdown = app.workspace.getActiveViewOfType(MarkdownView); - - document.body.onkeydown = (e) => { - if ( - bar && - bar.checkVisibility && - (Markdown.getMode() === "preview" || - document.activeElement.hasClass("ResponseFloatBarCommandItem")) - ) { - const consume = () => { - e.preventDefault(); - e.stopPropagation(); - }; - for (let i = 0; i < options.length; i++) { - const num = "Numpad" + i; - const dig = "Digit" + i; - if (e.code === num || e.code === dig) { - buttonClick(options[0]); - break; - } - } - consume(); - } - }; - */ - - this.containerEl.style.visibility = "visible"; // : "hidden" - } - - private getTextWithInterval(index: number, responseInterval: number[]) { - let text = this.buttonTexts[index]; - if (this.showInterval) { - text = - responseInterval == null - ? `${text}` - : Platform.isMobile - ? textInterval(Number.parseFloat(responseInterval[index].toFixed(5)), true) - : `${text} - ${textInterval( - Number.parseFloat(responseInterval[index].toFixed(5)), - false, - )}`; - } - return text; - } - - public display(show = true, responseInterval?: number[]): void { - const settings: SRSettings = this.settings; - if (!settings.reviewResponseFloatBar || !settings.autoNextNote) return; - const menuCommands = [ - { - id: "obsidian-spaced-repetition:srs-note-review-hard", - name: "Hard", - response: ReviewResponse.Hard, - text: - responseInterval == null - ? `${settings.flashcardHardText}` - : Platform.isMobile - ? textInterval(responseInterval[1], true) - : `${settings.flashcardHardText} - ${textInterval( - responseInterval[1], - false, - )}`, - icon: "bold-glyph", - }, - { - id: "obsidian-spaced-repetition:srs-note-review-good", - name: "Good", - response: ReviewResponse.Good, - text: - responseInterval == null - ? `${settings.flashcardGoodText}` - : Platform.isMobile - ? textInterval(responseInterval[2], true) - : `${settings.flashcardGoodText} - ${textInterval( - responseInterval[2], - false, - )}`, - icon: "remix-GobletLine", - }, - { - id: "obsidian-spaced-repetition:srs-note-review-easy", - name: "Easy", - response: ReviewResponse.Easy, - text: - responseInterval == null - ? `${settings.flashcardEasyText}` - : Platform.isMobile - ? textInterval(responseInterval[3], true) - : `${settings.flashcardEasyText} - ${textInterval( - responseInterval[3], - false, - )}`, - icon: "remix-EmotionHappyLine", - }, - ]; - - function createMenu(bar: reviewNoteResponseModal) { - bar.containerEl = createEl("div"); - if (bar.containerEl) { - bar.containerEl.setAttribute( - "style", - `grid-template-columns: ${"1fr ".repeat(menuCommands.length + 1)}`, - ); - /* //left: ${0}%; bottom: ${ - 4.25 - }em; */ - } - bar.containerEl.setAttribute("id", bar.id); - bar.containerEl.addClass("ResponseFloatBarDefaultAesthetic"); - document.body - .querySelector(".mod-vertical.mod-root") - .insertAdjacentElement("afterbegin", bar.containerEl); - - menuCommands.forEach((item) => { - const btn = document.createElement("button"); - btn.setAttribute("id", "sr-" + item.name.toLowerCase() + "-btn"); - // btn.setAttribute("class", "ResponseFloatBarCommandItem"); - btn.setAttribute("aria-label", item.name); - // setIcon(btn, item.icon); - btn.setText(item.text); - btn.addEventListener("click", () => { - const openFile: TFile | null = app.workspace.getActiveFile(); - if (openFile && openFile.extension === "md") { - bar.plugin.saveReviewResponse(openFile, item.response); - } - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - //@ts-ignore - // app.commands.executeCommandById(item.id); - }); - bar.containerEl.appendChild(btn); - }); - - const button = new ButtonComponent(bar.containerEl); - button - .setIcon("lucide-x") - .setClass("ResponseFloatBarCommandItem") - // .setButtonText("x") - .setTooltip("关闭浮栏显示") - .onClick(() => { - bar.containerEl.style.visibility = "hidden"; - bar.selfDestruct(); - }); - - bar.containerEl.style.visibility = "visible"; // : "hidden" - console.log("menu:\n", bar.containerEl); - - //after review - const timmer = setInterval(() => { - const reviewNoteResponseModalBar = document.getElementById( - "reviewNoteResponseModalBar", - ); - const Markdown = app.workspace.getActiveViewOfType(MarkdownView); - if (reviewNoteResponseModalBar) { - if (!Markdown || !show) { - reviewNoteResponseModalBar.style.visibility = "hidden"; - bar.selfDestruct(); - clearInterval(timmer); - } - } - }, 10000); - } - if (show) { - // update show text - const reviewNoteResponseModalBar = document.getElementById(this.id); - if (reviewNoteResponseModalBar) { - if (responseInterval != null) { - menuCommands.forEach((item) => { - const btn = document.getElementById( - "sr-" + item.name.toLowerCase() + "-btn", - ); - btn.setText(item.text); - }); - } else { - menuCommands.forEach((item) => { - const btn = document.getElementById( - "sr-" + item.name.toLowerCase() + "-btn", - ); - btn.setText(item.name); - }); - } - - return; - } else { - createMenu(this); - } - } else { - this.selfDestruct(); - } - } - - public isDisplay() { - return document.getElementById(this.id) != null; - // return this.containerEl.style.visibility === "visible"; - } - - selfDestruct() { - const reviewNoteResponseModalBar = document.getElementById("reviewNoteResponseModalBar"); - if (reviewNoteResponseModalBar) { - reviewNoteResponseModalBar.style.visibility = "hidden"; - if (reviewNoteResponseModalBar.firstChild) { - reviewNoteResponseModalBar.removeChild(reviewNoteResponseModalBar.firstChild); - } - reviewNoteResponseModalBar.remove(); - } - } -} diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts new file mode 100644 index 00000000..a9167c95 --- /dev/null +++ b/src/reviewNote/review-note.ts @@ -0,0 +1,228 @@ +import { Notice, TFile } from "obsidian"; +import { DataStore } from "src/dataStore/data"; +import { DataSyncer } from "src/dataStore/dataSyncer"; +import { reviewResponseModal } from "src/gui/reviewresponse-modal"; +import { t } from "src/lang/helpers"; +import { ReviewDeck } from "src/ReviewDeck"; +import { SRSettings } from "src/settings"; +import { Tags } from "src/tags"; +import { DateUtils } from "src/util/utils_recall"; + +export class ReviewNote { + static itemId: number; + static minNextView: number; + + /** + * after checking ignored folder, get note deckname from review tag and trackedfile. + * @param settings SRSettings + * @param note TFile + * @returns string | null + */ + static getDeckName(settings: SRSettings, note: TFile): string | null { + const store = DataStore.getInstance(); + // const settings = plugin.data.settings; + + if (isIgnoredPath(settings.noteFoldersToIgnore, note.path)) { + new Notice(t("NOTE_IN_IGNORED_FOLDER")); + return; + } + + let deckName = Tags.getNoteDeckName(note, settings); + + if (deckName == null && !store.isTracked(note.path)) { + new Notice(t("PLEASE_TAG_NOTE")); + return; + } else if (deckName == null) { + deckName = store.getFileLasTag(note.path); + } + return deckName; + } + + static saveReviewResponsebyAlgo( + deck: ReviewDeck, + note: TFile, + option: string, + burySiblingCards: boolean, + ease?: number, + ) { + const store = DataStore.getInstance(); + const now = Date.now(); + + const fileId = store.getFileId(note.path); + const item = store.getItembyID(fileId); + if (item.isNew && ease != null) { + // new note + item.updateAlgorithmData("ease", ease); + } + const buryList: string[] = []; + if (burySiblingCards) { + const trackFile = store.getTrackedFile(note.path); + if (trackFile.hasCards) { + for (const cardinfo of trackFile.cardItems) { + buryList.push(cardinfo.cardTextHash); + } + } + } + + ReviewNote.recallReviewResponse(fileId, option); + + let dueNotesCount = 0; + dueNotesCount -= preUpdateDeck(deck, note); + dueNotesCount += DataSyncer.syncRCDataToSRrevDeck(deck, note, now); + return { buryList, dueNotesCount }; + } + + static recallReviewNote(settings: SRSettings) { + // const plugin = this.plugin; + const store = DataStore.getInstance(); + const reviewFloatBar = reviewResponseModal.getInstance(); + // const settings = plugin.data.settings; + const que = store.data.queues; + que.buildQueue(); + const item = store.getNext(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const state: any = { mode: "empty" }; + if (item != null) { + this.itemId = item.ID; + console.debug("item:", item, que.queueSize()); + const path = store.getFilePath(item); + if (path != null) { + state.file = path; + state.item = que.getNextId(); + // state.mode = "note"; + // state.mode = "question"; + // const fid = store.getFileId(path); + // const item = store.getItembyID(fid); + + reviewFloatBar.algoDisplay(true, item, (opt) => { + this.recallReviewResponse(this.itemId, opt, settings.autoNextNote); + if (settings.autoNextNote) { + this.recallReviewNote(settings); + } + }); + // plugin.reviewFloatBar.algoDisplay(true, store.calcReviewInterval(fid)); + } + } + const leaf = app.workspace.getLeaf(); + leaf.setViewState({ + type: "markdown", + state: state, + }); + + app.workspace.setActiveLeaf(leaf); + + if (item != null) { + return; + } + + this.nextReviewNotice(store.data.queues.toDayLatterQueue); + + // plugin.updateStatusBar(); + + reviewFloatBar.selfDestruct(); + // plugin.sync_Algo(); + new Notice(t("ALL_CAUGHT_UP")); + } + + static recallReviewResponse(itemId: number, response: string, autoNextNote: boolean = true) { + const store = DataStore.getInstance(); + const item = store.getItembyID(itemId); + // console.debug("itemId: ", itemId); + store.updateReviewedCounts(itemId); + store.reviewId(itemId, response); + store.save(); + + this.minNextView = this.updateminNextView(this.minNextView, item.nextReview); + + if (!autoNextNote) { + new Notice(t("RESPONSE_RECEIVED")); + } + } + + static getDeckNameForReviewDirectly(reviewDecks: { + [deckKey: string]: ReviewDeck; + }): string | null { + const reviewDeckNames: string[] = Object.keys(reviewDecks); + + const rdname = reviewDeckNames.find((dkey: string) => { + const ndeck = reviewDecks[dkey]; + const ncount = ndeck.dueNotesCount + ndeck.newNotes.length; + return ncount > 0; + }); + return rdname; + } + + static getNextDueNoteIndex(NotesCount: number, openRandomNote: boolean = false) { + let index = -1; + + if (NotesCount < 1) { + return -1; + } + if (!openRandomNote) { + return 0; + } else { + index = Math.floor(Math.random() * NotesCount); + } + return index; + } + + static updateminNextView(minNextView: number, nextReview: number): number { + const now = Date.now(); + const nowToday: number = window.moment().endOf("day").valueOf(); + + if (nextReview <= nowToday) { + if (minNextView == undefined || minNextView < now || minNextView > nextReview) { + // console.debug("interval diff:should be - (", minNextView - nextReview); + minNextView = nextReview; + } + } + return minNextView; + } + + static nextReviewNotice(toDayLatterQueue: Record) { + if (this.minNextView > 0 && Object.keys(toDayLatterQueue).length > 0) { + const now = Date.now(); + const interval = Math.round((this.minNextView - now) / 1000 / 60); + if (interval < 60) { + new Notice("可以在" + interval + "分钟后来复习"); + } else if (interval < 60 * 5) { + new Notice("可以在" + interval / 60 + "小时后来复习"); + } + } + } +} + +export function isIgnoredPath(noteFoldersToIgnore: string[], path: string) { + if (noteFoldersToIgnore.some((folder) => path.includes(folder))) { + return true; + } else { + return false; + } +} + +function preUpdateDeck(deck: ReviewDeck, note: TFile) { + let dueNotesCount = 0; + if (deck.newNotes.includes(note)) { + // isNew + deck.newNotes.remove(note); + } else { + //isDued + const index = deck.scheduledNotes.findIndex((sNote, _index) => { + return sNote.note === note; + }); + deck.scheduledNotes.splice(index, 1); + if (index < deck.dueNotesCount) { + deck.dueNotesCount--; + dueNotesCount--; + } + } + return dueNotesCount; +} + +export function updatenDays(dueDates: Record, dueUnix: number) { + const nDays: number = Math.ceil((dueUnix - DateUtils.EndofToday) / DateUtils.DAYS_TO_MILLIS); + if (!Object.prototype.hasOwnProperty.call(dueDates, nDays)) { + dueDates[nDays] = 0; + } + dueDates[nDays]++; +} diff --git a/src/scheduling.ts b/src/scheduling.ts index 677f107d..30364c06 100644 --- a/src/scheduling.ts +++ b/src/scheduling.ts @@ -2,10 +2,10 @@ import { SRSettings } from "src/settings"; import { t } from "src/lang/helpers"; export enum ReviewResponse { - Easy, - Good, - Hard, Reset, + Hard, + Good, + Easy, } // Flashcards @@ -77,11 +77,25 @@ export function textInterval(interval: number, isMobile: boolean): string { const m: number = Math.round(interval / 3.04375) / 10, y: number = Math.round(interval / 36.525) / 10; + let h = 24, + min = 60; + if (interval < 1) { + h = interval * 24; + if (h < 1) { + min = Math.round(h * 60 * 10) / 10; + } else { + h = Math.round(h * 10) / 10; + } + } if (isMobile) { + if (h < 1) return t("MINUTES_STR_IVL_MOBILE", { interval: min }); + if (interval < 1) return t("HOURS_STR_IVL_MOBILE", { interval: h }); if (m < 1.0) return t("DAYS_STR_IVL_MOBILE", { interval }); else if (y < 1.0) return t("MONTHS_STR_IVL_MOBILE", { interval: m }); else return t("YEARS_STR_IVL_MOBILE", { interval: y }); } else { + if (h < 1) return t("MINUTES_STR_IVL", { interval: min }); + if (interval < 1) return t("HOURS_STR_IVL", { interval: h }); if (m < 1.0) return t("DAYS_STR_IVL", { interval }); else if (y < 1.0) return t("MONTHS_STR_IVL", { interval: m }); else return t("YEARS_STR_IVL", { interval: y }); diff --git a/src/settings.ts b/src/settings.ts index 8ac0fca2..55564a98 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -3,12 +3,7 @@ import type SRPlugin from "src/main"; import { t } from "src/lang/helpers"; // https://github.com/martin-jw/obsidian-recall/blob/main/src/settings.ts -import SrsAlgorithm from "./algorithms"; -import { DefaultAlgorithm } from "./algorithms/scheduling_default"; -import { Sm2Algorithm } from "./algorithms/supermemo"; -import { AnkiAlgorithm } from "./algorithms/anki"; -import { FsrsAlgorithm } from "./algorithms/fsrs"; -import ConfirmModal from "./modals/confirm"; +import ConfirmModal from "src/gui/confirm"; import { FolderSuggest } from "./suggesters/FolderSuggester"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -17,35 +12,9 @@ import QR_alipay from ".github/funding/QR_alipay.png"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import QR_wechat from ".github/funding/QR_wechat.png"; - -// recall trackfile -export enum DataLocation { - PluginFolder = "In Plugin Folder", - RootFolder = "In Vault Folder", - SpecifiedFolder = "In the folder specified below", - SaveOnNoteFile = "Save On Note File", -} - -const locationMap: Record = { - "In Vault Folder": DataLocation.RootFolder, - "In Plugin Folder": DataLocation.PluginFolder, - "In the folder specified below": DataLocation.SpecifiedFolder, - "Save On Note File": DataLocation.SaveOnNoteFile, -}; - -export const algorithms: Record = { - Default: new DefaultAlgorithm(), - Anki: new AnkiAlgorithm(), - Fsrs: new FsrsAlgorithm(), - SM2: new Sm2Algorithm(), -}; - -export enum algorithmNames { - Default = "Default", - Anki = "Anki", - Fsrs = "Fsrs", - SM2 = "SM2", -} +import { algorithmNames, algorithmSwitchData, algorithms } from "./algorithms/algorithms_switch"; +import { DataLocation, LocationSwitch, locationMap } from "./dataStore/location_switch"; +import deepcopy from "deepcopy"; export interface SRSettings { // flashcards @@ -154,14 +123,14 @@ export const DEFAULT_SETTINGS: SRSettings = { showDebugMessages: false, // trackfile: https://github.com/martin-jw/obsidian-recall/blob/main/src/settings.ts - dataLocation: DataLocation.PluginFolder, + dataLocation: DataLocation.SaveOnNoteFile, customFolder: "", maxNewPerDay: -1, repeatItems: false, trackedNoteToDecks: false, algorithm: Object.keys(algorithms)[0], algorithmSettings: { algorithm: Object.values(algorithms)[0].settings }, - previousRelease: "0.0.0.0", + previousRelease: "0.0.0", }; // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/Settings.ts @@ -597,16 +566,30 @@ export class SRSettingTab extends PluginSettingTab { new Setting(containerEl).setName(t("DISPLAY_DEBUG_INFO")).addToggle((toggle) => toggle.setValue(this.plugin.data.settings.showDebugMessages).onChange(async (value) => { this.plugin.data.settings.showDebugMessages = value; + if (value) { + this.plugin.commands.addDebugCommands(); + } await this.plugin.savePluginData(); }), ); - this.buildDonation(); + buildDonation(this.containerEl); } addDataLocationSettings(containerEl: HTMLElement) { const plugin = this.plugin; const settings = plugin.data.settings; + const locSwitch = new LocationSwitch(plugin, settings); + const desc_toNote = + "BE CAREFUL!!!\n if you confirm this, it will convert \ + all your scheduling informations in `tracked_files.json` to note,\ + which will change lots of your note file in the same time.\n\ + Please make sure the setting tags of flashcards and notes is what you are using.\n"; + const desc_toNote_otherAlgo = + "if you want to save data on notefile, you **have to** use Default Algorithm.\n"; + const desc_toTrackedFiles = + "BE CAREFUL!!! \n if you confirm this, it will converte \ + all your scheduling informations on note(which will be deleted in the same time) TO `tracked_files.json`.\n"; new Setting(containerEl) .setName(t("DATA_LOC")) @@ -617,75 +600,115 @@ export class SRSettingTab extends PluginSettingTab { }); dropdown.setValue(plugin.data.settings.dataLocation); - dropdown.onChange((val) => { + dropdown.onChange(async (val) => { const loc = locationMap[val]; - const moveP = new Promise(function (resolve) { - if ( - settings.algorithm !== algorithmNames.Default && - loc === DataLocation.SaveOnNoteFile - ) { - new ConfirmModal( - plugin.app, - "if you want to save data on notefile, you **have to** use Default Algorithm.", - () => { - dropdown.setValue(plugin.data.settings.dataLocation); - }, - ).open(); - } else if (loc === DataLocation.SaveOnNoteFile) { - new ConfirmModal( - plugin.app, - "BE CAREFUL!!! if you confirm this, it will converte \ - all your scheduling informations in `tracked_files.json` will add to note,\ - which will change lots of your note file in the same time.", - async (confirm) => { - if (confirm) { - plugin.data.settings.dataLocation = loc; - plugin.store.moveStoreLocation(); - plugin.data.settings.customFolder = - plugin.store.getStorePath(); - await plugin.store.converteTrackfileToNoteSched(); - - resolve(true); - } - }, - ).open(); - } else if (settings.dataLocation === DataLocation.SaveOnNoteFile) { + await plugin.sync(); + const noteStats = deepcopy(plugin.noteStats); + const cardStats = deepcopy(plugin.cardStats); + + let confirmP: Promise; + // const moveP = new Promise(function (resolve) { + if (loc === DataLocation.SaveOnNoteFile) { + if (settings.algorithm === algorithmNames.Default) { + await locSwitch.converteTrackfileToNoteSched(true); + confirmP = new Promise(function (resolve) { + new ConfirmModal( + plugin, + desc_toNote + + "### review Notes\n" + + locSwitch.createTable(noteStats, plugin.noteStats) + + "\n---\n### flashcards\n" + + locSwitch.createTable(cardStats, plugin.cardStats), + async (confirm) => { + if (confirm) { + await locSwitch.converteTrackfileToNoteSched(); + plugin.data.settings.dataLocation = loc; + locSwitch.moveStoreLocation(); + plugin.data.settings.customFolder = + locSwitch.getStorePath(); + + resolve(true); + } + }, + ).open(); + }); + } else { + new ConfirmModal(plugin, desc_toNote_otherAlgo, () => { + dropdown.setValue(plugin.data.settings.dataLocation); + }).open(); + } + } else if (settings.dataLocation === DataLocation.SaveOnNoteFile) { + await locSwitch.converteNoteSchedToTrackfile(true, loc); + confirmP = new Promise(function (resolve) { new ConfirmModal( - plugin.app, - "BE CAREFUL!!! \n if you confirm this, it will converte \ - all your scheduling informations on note(which will be deleted in the same time) TO `tracked_files.json`.", + plugin, + desc_toTrackedFiles + + "### review Notes\n" + + locSwitch.createTable(noteStats, plugin.noteStats) + + "\n---\n### flashcards\n" + + locSwitch.createTable(cardStats, plugin.cardStats), async (confirm) => { if (confirm) { + await plugin.sync(); plugin.data.settings.dataLocation = loc; - plugin.store.moveStoreLocation(); + await locSwitch.moveStoreLocation(); plugin.data.settings.customFolder = - plugin.store.getStorePath(); - await plugin.store.converteNoteSchedToTrackfile(); + locSwitch.getStorePath(); + await locSwitch.converteNoteSchedToTrackfile(); resolve(true); } }, ).open(); - } else { - plugin.data.settings.dataLocation = loc; - plugin.store.moveStoreLocation(); - plugin.data.settings.customFolder = plugin.store.getStorePath(); + }); + } else { + plugin.data.settings.dataLocation = loc; + await locSwitch.moveStoreLocation(); + plugin.data.settings.customFolder = locSwitch.getStorePath(); - resolve(true); - } - }); - moveP.then(() => { + // resolve(true); + } + dropdown.setValue(plugin.data.settings.dataLocation); + // }); + // if (Promise.resolve(moveP)) { + if (await confirmP) { dropdown.setValue(plugin.data.settings.dataLocation); - plugin.savePluginData(); + // plugin.savePluginData(); + await plugin.savePluginData(); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + await this.app.plugins.disablePlugin(plugin.manifest.id); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + await this.app.plugins.enablePlugin(plugin.manifest.id); console.debug("finish location change."); - this.display(); - }); + + await plugin.sync(); + + if ( + locSwitch.compare(noteStats, plugin.noteStats, "note") || + locSwitch.compare(cardStats, plugin.cardStats, "card") + ) { + console.log( + "before chang noteStats, cardStats:\n", + noteStats, + cardStats, + "\nafter change:\n", + plugin.noteStats, + plugin.cardStats, + ); + new Notice("have some data lost, see console for detials."); + } + // this.display(); + } }); }); } addSpecifiedFolderSetting(containerEl: HTMLElement) { const plugin = this.plugin; + const settings = plugin.data.settings; + const locSwitch = new LocationSwitch(plugin, settings); const fder_index = plugin.data.settings.customFolder.lastIndexOf("/"); let cusFolder = plugin.data.settings.customFolder.substring(0, fder_index); const cusFilename = plugin.data.settings.customFolder.substring(fder_index + 1); @@ -706,10 +729,10 @@ export class SRSettingTab extends PluginSettingTab { btn .setButtonText("save") .setCta() - .onClick(() => { + .onClick(async () => { plugin.data.settings.customFolder = cusFolder + "/" + cusFilename; - plugin.store.moveStoreLocation(); - plugin.savePluginData(); + await locSwitch.moveStoreLocation(); + await plugin.savePluginData(); this.display(); }), ); @@ -771,56 +794,53 @@ export class SRSettingTab extends PluginSettingTab { const oldAlgo = plugin.data.settings.algorithm as algorithmNames; dropdown.setValue(plugin.data.settings.algorithm); dropdown.onChange((newValue) => { - if (newValue != plugin.data.settings.algorithm) { - if ( - settings.dataLocation === DataLocation.SaveOnNoteFile && - newValue !== algorithmNames.Default - ) { - new ConfirmModal( - plugin.app, - "if you want to use " + - newValue + - " Algorithm, you **can't ** save data on notefile.", - () => { - dropdown.setValue(plugin.data.settings.algorithm); - }, - ).open(); - return; - } - new ConfirmModal(plugin.app, t("ALGORITHMS_CONFIRM"), async (confirmed) => { - if (confirmed) { - const result = await plugin.store.algorithmSwitchData( - oldAlgo, - newValue as algorithmNames, - ); - if (!result) { - dropdown.setValue(plugin.data.settings.algorithm); - return; - } - - plugin.data.settings.algorithm = newValue; - plugin.algorithm = algorithms[plugin.data.settings.algorithm]; - plugin.algorithm.updateSettings( - plugin, - plugin.data.settings.algorithmSettings[ - plugin.data.settings.algorithm - ], - ); - await plugin.savePluginData(); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - await this.app.plugins.disablePlugin(plugin.manifest.id); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - await this.app.plugins.enablePlugin(plugin.manifest.id); - // this.app.setting.openTabById(plugin.manifest.id); - - this.display(); - } else { + if ( + settings.dataLocation === DataLocation.SaveOnNoteFile && + newValue !== algorithmNames.Default + ) { + new ConfirmModal( + plugin, + "if you want to use " + + newValue + + " Algorithm, you **can't ** save data on notefile.", + () => { dropdown.setValue(plugin.data.settings.algorithm); - } - }).open(); + }, + ).open(); + return; } + new ConfirmModal(plugin, t("ALGORITHMS_CONFIRM"), async (confirmed) => { + if (confirmed) { + const result = await algorithmSwitchData( + plugin, + oldAlgo, + newValue as algorithmNames, + ); + if (!result) { + dropdown.setValue(plugin.data.settings.algorithm); + return; + } + + plugin.data.settings.algorithm = newValue; + plugin.algorithm = algorithms[plugin.data.settings.algorithm]; + plugin.algorithm.updateSettings( + plugin, + plugin.data.settings.algorithmSettings[newValue], + ); + await plugin.savePluginData(); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + await this.app.plugins.disablePlugin(plugin.manifest.id); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + await this.app.plugins.enablePlugin(plugin.manifest.id); + // this.app.setting.openTabById(plugin.manifest.id); + + this.display(); + } else { + dropdown.setValue(plugin.data.settings.algorithm); + } + }).open(); }); }) .settingEl.querySelector(".setting-item-description").innerHTML = t("ALGORITHMS_DESC"); @@ -897,8 +917,9 @@ export class SRSettingTab extends PluginSettingTab { addResponseButtonTextSetting(containerEl: HTMLElement) { const plugin = this.plugin; const options = plugin.algorithm.srsOptions(); - const algo = plugin.data.settings.algorithm; - const btnText = this.plugin.data.settings.responseOptionBtnsText; + const settings = plugin.data.settings; + const algo = settings.algorithm; + const btnText = settings.responseOptionBtnsText; if (btnText[algo] == null) { btnText[algo] = []; @@ -927,7 +948,7 @@ export class SRSettingTab extends PluginSettingTab { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(() => { - this.plugin.data.settings.responseOptionBtnsText[algo][ind] = + settings.responseOptionBtnsText[algo][ind] = DEFAULT_SETTINGS.responseOptionBtnsText[algo][ind]; this.plugin.savePluginData(); this.display(); @@ -935,32 +956,32 @@ export class SRSettingTab extends PluginSettingTab { }); }); } - - private buildDonation(): void { - const div = this.containerEl.createEl("div"); - const hr: HTMLElement = document.createElement("hr"); - div.appendChild(hr); - div.style.width = "75%"; - div.style.textAlign = "center"; - div.style.margin = "0 auto"; - - const text = document.createElement("p"); - // text.textContent = t("COFFEE"); - text.textContent = "业余时间折腾的,如果对你有所帮助,可以请我喝瓶饮料呀~"; - div.appendChild(text); - - let anchor = document.createElement("a"); - const image = new Image(); - image.src = QR_alipay; - image.width = 130; - anchor.appendChild(image); - div.appendChild(anchor); - - const image2 = new Image(); - image2.src = QR_wechat; - image2.width = 130; - anchor = document.createElement("a"); - anchor.appendChild(image2); - div.appendChild(anchor); - } } +export function buildDonation(containerEl: HTMLElement): void { + const div = containerEl.createEl("div"); + const hr: HTMLElement = document.createElement("hr"); + div.appendChild(hr); + div.style.width = "75%"; + div.style.textAlign = "center"; + div.style.margin = "0 auto"; + + const text = document.createElement("p"); + // text.textContent = t("COFFEE"); + text.textContent = "业余时间折腾的,如果对你有所帮助,可以请我喝瓶饮料或奶茶呀~"; + div.appendChild(text); + + let anchor = document.createElement("a"); + const image = new Image(); + image.src = QR_alipay; + image.width = 130; + anchor.appendChild(image); + div.appendChild(anchor); + + const image2 = new Image(); + image2.src = QR_wechat; + image2.width = 130; + anchor = document.createElement("a"); + anchor.appendChild(image2); + div.appendChild(anchor); +} +export { algorithms }; diff --git a/src/stats.ts b/src/stats.ts index edadf19d..00b63965 100644 --- a/src/stats.ts +++ b/src/stats.ts @@ -1,10 +1,14 @@ +import { CardListType } from "./Deck"; +import { RepetitionItem } from "./dataStore/repetitionItem"; import { ValueCountDict } from "./util/NumberCountDict"; +import { DateUtils } from "./util/utils_recall"; export class Stats { eases: ValueCountDict = new ValueCountDict(); intervals: ValueCountDict = new ValueCountDict(); delayedDays: ValueCountDict = new ValueCountDict(); newCount: number = 0; + onDueCount: number = 0; youngCount: number = 0; matureCount: number = 0; @@ -12,10 +16,36 @@ export class Stats { return this.youngCount + this.matureCount; } + public getTotalCount(cardListType: CardListType = CardListType.All): number { + let result: number = 0; + if (cardListType == CardListType.NewCard || cardListType == CardListType.All) + result += this.newCount; + if (cardListType == CardListType.DueCard || cardListType == CardListType.All) + result += this.youngCount + this.matureCount; + + return result; + } + incrementNew() { this.newCount++; } + private decrementNew() { + if (this.newCount > 0) { + this.newCount--; + } + } + + incrementOnDue() { + this.onDueCount++; + } + + private decrementOnDue() { + if (this.onDueCount > 0) { + this.onDueCount--; + } + } + update(delayedDays: number, interval: number, ease: number) { this.intervals.incrementCount(interval); this.eases.incrementCount(ease); @@ -28,6 +58,73 @@ export class Stats { } } + updateStats(item: RepetitionItem, now?: number) { + const scheduling = item?.getSched(); + if (item == null || !item.isDue || scheduling == null) { + this.incrementNew(); + return; + } + if (now == undefined) { + now = Date.now(); + } + if (item.nextReview - now < 0) { + this.incrementOnDue(); + } + const interval: number = parseInt(scheduling[2]), + ease: number = parseFloat(scheduling[3]); + const delayedDays: number = Math.ceil( + (window + .moment(scheduling[1], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) + .valueOf() - + now) / + DateUtils.DAYS_TO_MILLIS, + ); + this.update(delayedDays, interval, ease); + } + + /** + * decrementStats + * should only use before save review response, before single note sync. + * @param item + * @param now + * @returns + */ + decrementStats(item: RepetitionItem, now?: number) { + const scheduling = item.getSched(); + if (item == null) { + return; + } + + if (now == undefined) { + now = Date.now(); + } + if (item.isDue && item.nextReview - now < 0) { + this.decrementOnDue(); + } else if (item.isNew) { + this.decrementNew(); + return; + } + + const interval: number = parseInt(scheduling[2]), + ease: number = parseFloat(scheduling[3]); + const delayedDays: number = Math.ceil( + (window + .moment(scheduling[1], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) + .valueOf() - + now) / + DateUtils.DAYS_TO_MILLIS, + ); + this.intervals.decrementCount(interval); + this.eases.decrementCount(ease); + this.delayedDays.decrementCount(delayedDays); + + if (interval >= 32) { + this.matureCount--; + } else { + this.youngCount--; + } + } + getMaxInterval(): number { return this.intervals.getMaxValue(); } diff --git a/src/suggesters/FolderSuggester.ts b/src/suggesters/FolderSuggester.ts index 1ebccaf5..d21fd1a5 100644 --- a/src/suggesters/FolderSuggester.ts +++ b/src/suggesters/FolderSuggester.ts @@ -12,7 +12,7 @@ export class FolderSuggest extends TextInputSuggest { abstractFiles.forEach((folder: TAbstractFile) => { if ( folder instanceof TFolder && - folder.path.toLowerCase().contains(lowerCaseInputStr) + folder.path.toLowerCase().includes(lowerCaseInputStr) ) { folders.push(folder); } diff --git a/src/tags.ts b/src/tags.ts new file mode 100644 index 00000000..b395e3b3 --- /dev/null +++ b/src/tags.ts @@ -0,0 +1,59 @@ +import { TFile, getAllTags } from "obsidian"; +import { SRSettings } from "./settings"; + +export class Tags { + static getFileTags(note: TFile) { + const fileCachedData = app.metadataCache.getFileCache(note) || {}; + const tags = getAllTags(fileCachedData) || []; + return tags; + } + + /** + * @param {string} fileTags + * @param {string} settingTags + * @return {string | null} tag | null + */ + static getTagFromSettingTags(fileTags: string[], settingTags: string[]): string { + for (const tagToReview of settingTags) { + if (fileTags.some((tag) => tag === tagToReview || tag.startsWith(tagToReview + "/"))) { + return tagToReview; + } + } + return null; + } + + /** + * if deckName of a note is in tagsToReview, return true. + * @param deckName + * @returns boolean + */ + static isTagedNoteDeckName(deckName: string, settings: SRSettings) { + const dn = this.getTagFromSettingTags([deckName], settings.tagsToReview); + if (dn !== null) { + return true; + } + return false; + } + + /** + * isTagedDeckName, if deckName is in flashcardTags, return true. + * @param deckName + * @returns + */ + static getCardDeckName(note: TFile, settings: SRSettings): string | null { + const tags = this.getFileTags(note); + const dn = this.getTagFromSettingTags(tags, settings.flashcardTags); + return dn; + } + + /** + * select a tag in tags , which is also in tagsToReview. If not, return null. + * @param tags tags from note file. + * @returns + */ + static getNoteDeckName(note: TFile, settings: SRSettings): string | null { + const tags = this.getFileTags(note); + const dn = this.getTagFromSettingTags(tags, settings.tagsToReview); + return dn; + } +} diff --git a/src/util/NumberCountDict.ts b/src/util/NumberCountDict.ts index 5d6d0cc7..2e2fa431 100644 --- a/src/util/NumberCountDict.ts +++ b/src/util/NumberCountDict.ts @@ -16,6 +16,12 @@ export class ValueCountDict { this.dict[value]++; } + decrementCount(value: number): void { + if (this.dict[value] > 0) { + this.dict[value]--; + } + } + getMaxValue(): number { return Math.max(...getKeysPreserveType(this.dict)) || 0; } diff --git a/src/utils_recall.ts b/src/util/utils_recall.ts similarity index 92% rename from src/utils_recall.ts rename to src/util/utils_recall.ts index 5bcfa8a6..f9048b90 100644 --- a/src/utils_recall.ts +++ b/src/util/utils_recall.ts @@ -1,6 +1,20 @@ -import { cyrb53 } from "./utils"; +import { cyrb53 } from "src/util/utils"; export class DateUtils { + /** + * ms + * @type {number} + */ + static _EndofToday: number = 0; + + static get EndofToday() { + if (DateUtils._EndofToday === 0) { + const nowToday = window.moment().endOf("day").valueOf(); + DateUtils._EndofToday = nowToday; + } + return DateUtils._EndofToday; + } + static addTime(date: Date, time: number): Date { return new Date(date.getTime() + time); } diff --git a/styles.css b/styles.css index 9c9a410f..ba54cac5 100644 --- a/styles.css +++ b/styles.css @@ -1,10 +1,10 @@ .tag-pane-tag-self:before { content: ""; position: absolute; - width: 100%; + width: 90%; height: 100%; top: -6px; - left: -5px; + left: 10%; cursor: pointer; } .sr-flashcard-menu { @@ -46,10 +46,14 @@ margin-top: 1rem; } +.sr-flashcard-response { + grid-template-columns: auto auto auto auto; +} + +.sr-ignorestats-response, .sr-flashcard-response { display: inline-grid; width: 100%; - grid-template-columns: auto auto auto auto; position: absolute; bottom: 0; } @@ -78,6 +82,7 @@ } #sr-show-answer { + display: block; height: 48px; line-height: 48px; width: 100%; @@ -181,10 +186,11 @@ margin: auto; } + .ResponseFloatBarCommandItem, #sr-hard-btn, #sr-good-btn, #sr-easy-btn { - width: 100px; + width: 90%; } /* sidebar */ @@ -210,12 +216,21 @@ } } +.srs-flex-row { + display: flex; + width: 100%; + flex-flow: row wrap; + justify-content: space-evenly; + align-items: flex-start; + padding-top: 10px; +} + /* https://img.shields.io/github/v/release/chetachiezikeuzor/cMenu-Plugin */ /*---------------------------------------------------------------- ResponseFloatBar TOOLBAR ----------------------------------------------------------------*/ -#reviewNoteResponseModalBar { +#reviewResponseModalBar { width: 95%; height: auto; padding: 3px; @@ -231,10 +246,20 @@ ResponseFloatBar TOOLBAR align-items: center; transition: 200ms ease; min-width: fit-content; - justify-content: space-around; + /* justify-content: space-around; */ z-index: var(--layer-status-bar); box-shadow: 0px 3px 32px rgba(37, 49, 224, 0.15); border: 1px solid var(--background-modifier-border); + background: rgb(255 255 255 / 90%); +} + +.sr-show-response { + height: 48px; + position: relative; +} + +.ResponseFloatBarCommandItem:before { + position: relative; } .ResponseFloatBarCommandItem { @@ -243,7 +268,7 @@ ResponseFloatBar TOOLBAR cursor: pointer; padding: 5px 6px; min-width: 10px; - width: 98%; + width: 90%; height: 48px; box-shadow: none; margin-left: 3px; @@ -256,12 +281,12 @@ ResponseFloatBar TOOLBAR --background-secondary: var(--background-primary-alt); } -#reviewNoteResponseModalBar button.ResponseFloatBarCommandItem:hover { +#reviewResponseModalBar button.ResponseFloatBarCommandItem:hover { color: #050505; background-color: var(--background-secondary); } -#reviewNoteResponseModalBar button.ResponseFloatBarCommandItem svg { +#reviewResponseModalBar button.ResponseFloatBarCommandItem svg { width: 1.3em; height: 1.3em; } @@ -290,7 +315,9 @@ ResponseFloatBar TOOLBAR #sr-showintvl-btn, #sr-close-btn { margin-top: 13px; + margin-right: 3px; height: 20px; + width: 30px; } .ResponseFloatBarCommandItem { @@ -298,31 +325,6 @@ ResponseFloatBar TOOLBAR padding: 18px 0 18px 0; } -.sortable-fallback { - cursor: grabbing; - box-shadow: 0px 3px 32px rgb(31 38 135 / 15%); -} - -.sortable-grab { - cursor: grabbing !important; -} - -.sortable-ghost { - opacity: 0.4; - cursor: grabbing; -} - -.sortable-chosen { - cursor: grabbing; - padding: 18px 0 18px 18px; - background-color: var(--background-primary); -} - -.sortable-drag { - cursor: grabbing; - box-shadow: 0px 3px 32px rgb(31 38 135 / 15%); -} - /*---------------------------------------------------------------- ResponseFloatBar CLASS CHANGES ----------------------------------------------------------------*/ diff --git a/tests/unit/TopicPath.test.ts b/tests/unit/TopicPath.test.ts index ba77f027..73539bb5 100644 --- a/tests/unit/TopicPath.test.ts +++ b/tests/unit/TopicPath.test.ts @@ -332,4 +332,25 @@ describe("getTopicPathOfFile", () => { expect(actual.path).toEqual(expected); }); }); + + describe("trackedNoteToDecks: true", () => { + let settings_trackedNoteToDecks: SRSettings = { ...DEFAULT_SETTINGS }; + settings_trackedNoteToDecks.trackedNoteToDecks = true; + test("Mixture of irrelevant tags and relevant ones", () => { + let ignoredContent: string = ` + #review + #ignored Q1::A1 + #ignored Q2::A2 + #also-Ignored Q3::A3 + #science Q4::A4 + #science/physics Q5::A5 + #math Q6::A6`; + + let fakeFilePath: string = "history/modern/Greek.md"; + let file: ISRFile = new UnitTestSRFile(ignoredContent, fakeFilePath); + let expected = ["review"]; + let actual = TopicPath.getTopicPathOfFile(file, settings_trackedNoteToDecks); + expect(actual.path).toEqual(expected); + }); + }); }); diff --git a/tests/unit/location_switch.test.ts b/tests/unit/location_switch.test.ts new file mode 100644 index 00000000..8ad83539 --- /dev/null +++ b/tests/unit/location_switch.test.ts @@ -0,0 +1,165 @@ +import { + updateNoteSchedFrontHeader, + updateCardSchedXml, + delDefaultTag, +} from "src/dataStore/location_switch"; + +describe("updateNoteSchedFrontHeader", () => { + test("update without scheduling", async () => { + const text: string = `--- +sr-due: 2023-11-25 +sr-interval: 1 +sr-ease: 231 +--- + + First of all, tell **me** a little bit about what's + your experience with note-taking **apps** like? + `; + const result = updateNoteSchedFrontHeader(text); + const expected = ` + First of all, tell **me** a little bit about what's + your experience with note-taking **apps** like? + `; + expect(result).toEqual(expected); + }); + + test("update with scheduling", async () => { + const text: string = ` + First of all, tell **me** a little bit about what's + your experience with note-taking **apps** like? + `; + const sched = [0, "2023-11-25", 1, 231]; + const result = updateNoteSchedFrontHeader(text, sched as RegExpMatchArray); + const expected = `--- +sr-due: 2023-11-25 +sr-interval: 1 +sr-ease: 231 +--- + + First of all, tell **me** a little bit about what's + your experience with note-taking **apps** like? + `; + expect(result).toEqual(expected); + }); +}); + +describe("updateCardSchedXml", () => { + test("update without scheduling", async () => { + const text: string = ` +First of all, tell **me** a little bit about what's +your experience with note-taking **apps** like? +`; + const result = updateCardSchedXml(text, true); + const expected = ` +First of all, tell **me** a little bit about what's +your experience with note-taking **apps** like?`; + expect(result).toEqual(expected); + }); + + test("update cardtext with ``` ", async () => { + const text: string = ` +\`\`\` +First of all, tell **me** a little bit about what's +your experience with note-taking **apps** like? +\`\`\` + +`; + const result = updateCardSchedXml(text, true); + const expected = ` +\`\`\` +First of all, tell **me** a little bit about what's +your experience with note-taking **apps** like? +\`\`\``; + expect(result).toEqual(expected); + }); +}); +describe("delDefaultTag", () => { + test("delDefaultTag : otherTag, review/default", () => { + const fileText = `--- +tags: kkk, review/default +--- +Notes`; + const expectedText = `--- +tags: kkk +--- +Notes`; + const result = delDefaultTag(fileText, "review/default"); + expect(result).toEqual(expectedText); + }); + + test("delDefaultTag : review/default, otherTag, ", () => { + const fileText = `--- +tags: kkk, review/default +--- +Notes`; + const expectedText = `--- +tags: kkk +--- +Notes`; + const result = delDefaultTag(fileText, "review/default"); + expect(result).toEqual(expectedText); + }); + + test("delDefaultTag : \n review/default", () => { + const fileText = `--- +tags: + - review/default + - ekadk + - kfewq +--- +Obsidian`; + const expectedText = `--- +tags: + - ekadk + - kfewq +--- +Obsidian`; + const result = delDefaultTag(fileText, "review/default"); + expect(result).toEqual(expectedText); + }); + test("delDefaultTag : \n review/default", () => { + const fileText = `--- +tags: + - ekadk + - review/default + - kfewq +sr-due: 2023-11-25 +sr-interval: 1 +sr-ease: 231 +--- +Obsidian`; + const expectedText = `--- +tags: + - ekadk + - kfewq +sr-due: 2023-11-25 +sr-interval: 1 +sr-ease: 231 +--- +Obsidian`; + const result = delDefaultTag(fileText, "review/default"); + expect(result).toEqual(expectedText); + }); + test("delDefaultTag : , other2 \n review/default", () => { + const fileText = `--- +tags: other, other2 + - ekadk + - kfewq, review/default +sr-due: 2023-11-25 +sr-interval: 1 +sr-ease: 231 +--- +Obsidian`; + const expectedText = `--- +tags: other, other2 + - ekadk + - kfewq +sr-due: 2023-11-25 +sr-interval: 1 +sr-ease: 231 +--- +Obsidian`; + const result = delDefaultTag(fileText, "review/default"); + expect(result).toEqual(expectedText); + }); +}); From 0d73be624ce398ded58984f3fb9df640afb00bd3 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 1 Dec 2023 22:26:16 +0800 Subject: [PATCH 080/155] prettier and lockfile fix --- docs/changelog.md | 7 +- docs/usage.md | 5 +- pnpm-lock.yaml | 304 +++++++++++++++++++++++++++++++++-------- src/dataStore/data.ts | 2 +- src/dataStore/queue.ts | 6 +- 5 files changed, 262 insertions(+), 62 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index f020f3c1..587bde68 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -93,16 +93,21 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). ### Changed -- (https://github.com/Newdea) add a setting option to Reviewing a Notes directly [#635](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/635) +- (https://github.com/Newdea) add a setting option to Reviewing a Notes directly [#635](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/635) ### Fixed - fixed open the next note automatically after reviewing another [#582](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/582) - fixed sidebar doesn't show/update some files. [#393](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/393) + #### Unreleased + #### [1.10.3](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.2...1.10.3) + #### Unreleased + #### [Unreleased] + #### [1.10.5](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.4...1.10.5) - Bug edit flashcard sometimes corrupts question text in file [`#784`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/784) diff --git a/docs/usage.md b/docs/usage.md index 634de5aa..80ed3904 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,7 +1,6 @@ - ### Quick Guide -#### CASE1: Not using the original SR plugin, directly using this plugin +#### CASE1: Not using the original SR plugin, directly using this plugin Recommended settings ![image](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/assets/9208450/a22d23df-5d11-4b19-9007-e1530e2808be) @@ -21,7 +20,7 @@ For the rest, refer to [@st3v3nmw's ReadMe](https://github.com/st3v3nmw/obsidian **backup the note vault** **backup the note vault !!!** - It is possible that there are bugs which may delete data in the current note. **Please make backups!** +It is possible that there are bugs which may delete data in the current note. **Please make backups!** Suggestions: 1. Close the original plugin first to avoid conflict. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4ba0f53..527914d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -147,7 +147,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -214,20 +214,20 @@ packages: '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/helper-environment-visitor@7.21.5: - resolution: {integrity: sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==} + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.3 dev: true - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.3 @@ -454,7 +454,7 @@ packages: dependencies: '@codemirror/state': 6.3.1 style-mod: 4.1.0 - w3c-keyname: 2.2.8 + w3c-keyname: 2.2.6 dev: true /@esbuild/android-arm64@0.19.5: @@ -827,7 +827,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 + '@sinonjs/fake-timers': 10.0.2 '@types/node': 20.9.0 jest-message-util: 29.7.0 jest-mock: 29.7.0 @@ -871,7 +871,7 @@ packages: istanbul-lib-instrument: 6.0.1 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 + istanbul-reports: 3.1.5 jest-message-util: 29.7.0 jest-util: 29.7.0 jest-worker: 29.7.0 @@ -887,7 +887,7 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@sinclair/typebox': 0.25.24 + '@sinclair/typebox': 0.27.8 dev: true /@jest/source-map@29.6.3: @@ -906,7 +906,7 @@ packages: '@jest/console': 29.7.0 '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.1 dev: true /@jest/test-sequencer@29.7.0: @@ -1529,7 +1529,7 @@ packages: resolution: {integrity: sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==} engines: {node: ^16.13 || >=18} dependencies: - chalk: 5.3.0 + chalk: 5.2.0 loglevel: 1.8.1 loglevel-plugin-prefix: 0.8.4 strip-ansi: 7.1.0 @@ -1542,7 +1542,7 @@ packages: chalk: 5.2.0 loglevel: 1.8.1 loglevel-plugin-prefix: 0.8.4 - strip-ansi: 6.0.1 + strip-ansi: 7.1.0 dev: true /@wdio/mocha-framework@8.22.0: @@ -1625,7 +1625,7 @@ packages: dependencies: '@wdio/reporter': 8.21.0 '@wdio/types': 8.21.0 - chalk: 5.3.0 + chalk: 5.2.0 easy-table: 1.2.0 pretty-ms: 7.0.1 dev: true @@ -1838,7 +1838,7 @@ packages: /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 is-array-buffer: 3.0.2 dev: true @@ -1890,6 +1890,11 @@ packages: - encoding dev: true + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + /axios@0.27.2(debug@4.3.4): resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} dependencies: @@ -1925,7 +1930,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -2048,7 +2053,7 @@ packages: dependencies: caniuse-lite: 1.0.30001561 electron-to-chromium: 1.4.581 - node-releases: 2.0.13 + node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true @@ -2199,6 +2204,11 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -2275,8 +2285,8 @@ packages: engines: {node: '>=6'} dev: true - /cli-width@4.0.0: - resolution: {integrity: sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==} + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} dev: true @@ -2550,9 +2560,9 @@ packages: resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==} dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 + call-bind: 1.0.5 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.2 is-arguments: 1.1.1 is-array-buffer: 3.0.2 is-date-object: 1.0.5 @@ -2561,12 +2571,12 @@ packages: isarray: 2.0.5 object-is: 1.1.5 object-keys: 1.1.1 - object.assign: 4.1.4 + object.assign: 4.1.5 regexp.prototype.flags: 1.5.0 side-channel: 1.0.4 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.9 + which-typed-array: 1.1.13 dev: true /deep-is@0.1.4: @@ -2610,6 +2620,15 @@ packages: has-property-descriptors: 1.0.1 dev: true + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + dev: true + /degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -2766,6 +2785,20 @@ packages: is-arrayish: 0.2.1 dev: true + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true + /esbuild@0.19.5: resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} engines: {node: '>=12'} @@ -2834,6 +2867,18 @@ packages: source-map: 0.6.1 dev: true + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3284,6 +3329,10 @@ packages: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + /gaze@1.1.3: resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==} engines: {node: '>= 4.0.0'} @@ -3332,14 +3381,6 @@ packages: hasown: 2.0.0 dev: true - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - dev: true - /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -3526,7 +3567,7 @@ packages: resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} engines: {node: '>=16'} dependencies: - '@sindresorhus/is': 5.6.0 + '@sindresorhus/is': 5.3.0 '@szmarczak/http-timer': 5.0.1 cacheable-lookup: 7.0.0 cacheable-request: 10.2.14 @@ -3564,6 +3605,10 @@ packages: uglify-js: 3.17.4 dev: true + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -3590,6 +3635,18 @@ packages: engines: {node: '>= 0.4'} dev: true + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + dev: true + /hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} @@ -3769,7 +3826,7 @@ packages: ansi-escapes: 4.3.2 chalk: 5.3.0 cli-cursor: 3.1.0 - cli-width: 4.0.0 + cli-width: 4.1.0 external-editor: 3.1.0 figures: 5.0.0 lodash: 4.17.21 @@ -3786,8 +3843,8 @@ packages: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 + get-intrinsic: 1.2.2 + has: 1.0.4 side-channel: 1.0.4 dev: true @@ -3804,6 +3861,22 @@ packages: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} dev: true + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.10 + dev: true + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true @@ -3821,16 +3894,36 @@ packages: binary-extensions: 2.2.0 dev: true + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + /is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.0 dev: true + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3902,7 +3995,7 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true @@ -3913,7 +4006,7 @@ packages: /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-stream@2.0.1: @@ -3945,7 +4038,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 @@ -3965,6 +4058,17 @@ packages: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} dev: true + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + /is2@2.0.9: resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} engines: {node: '>=v0.10.0'} @@ -4047,7 +4151,7 @@ packages: engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 + istanbul-lib-report: 3.0.1 dev: true /jackspeak@2.3.6: @@ -4778,7 +4882,7 @@ packages: resolution: {integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==} engines: {node: 14 || >=16.14} dependencies: - semver: 7.5.4 + semver: 7.5.0 dev: true /lru-cache@5.1.1: @@ -4803,7 +4907,7 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 6.3.0 + semver: 7.5.4 dev: true /make-error@1.3.6: @@ -4911,6 +5015,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true @@ -5039,8 +5150,8 @@ packages: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases@2.0.10: - resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true /normalize-package-data@6.0.0: @@ -5049,7 +5160,7 @@ packages: dependencies: hosted-git-info: 7.0.1 is-core-module: 2.13.1 - semver: 7.5.4 + semver: 7.5.0 validate-npm-package-license: 3.0.4 dev: true @@ -5090,6 +5201,29 @@ packages: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + /obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0): resolution: {integrity: sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==} peerDependencies: @@ -5122,6 +5256,18 @@ packages: mimic-fn: 4.0.0 dev: true + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.3 + dev: true + /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -5319,8 +5465,8 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry@1.8.0: - resolution: {integrity: sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g==} + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.0.2 @@ -5608,8 +5754,8 @@ packages: resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 + call-bind: 1.0.5 + define-properties: 1.2.1 functions-have-names: 1.2.3 dev: true @@ -5787,6 +5933,14 @@ packages: lru-cache: 6.0.0 dev: true + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /serialize-error@11.0.3: resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} engines: {node: '>=14.16'} @@ -5829,9 +5983,9 @@ packages: /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 dev: true /signal-exit@3.0.7: @@ -5843,6 +5997,11 @@ packages: engines: {node: '>=14'} dev: true + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -6197,6 +6356,13 @@ packages: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} dev: true + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: true + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -6447,7 +6613,7 @@ packages: '@wdio/types': 8.21.0 '@wdio/utils': 8.22.0 archiver: 6.0.1 - aria-query: 5.3.0 + aria-query: 5.1.3 css-shorthand-properties: 1.1.1 css-value: 0.0.1 devtools-protocol: 0.0.1213968 @@ -6456,7 +6622,7 @@ packages: is-plain-obj: 4.1.0 lodash.clonedeep: 4.5.0 lodash.zip: 4.2.0 - minimatch: 9.0.3 + minimatch: 9.0.0 puppeteer-core: 20.9.0(typescript@5.1.6) query-selector-shadow-dom: 1.0.1 resq: 1.11.0 @@ -6507,6 +6673,36 @@ packages: webidl-conversions: 3.0.1 dev: true + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} diff --git a/src/dataStore/data.ts b/src/dataStore/data.ts index 7cb18c64..7cbf053c 100644 --- a/src/dataStore/data.ts +++ b/src/dataStore/data.ts @@ -646,7 +646,7 @@ export class DataStore { item = this.getItembyID(id); if (item != null) { item.setTracked(fileIndex); - item.itemType= itemType; + item.itemType = itemType; item.data = Object.assign(algorithm.defaultData(), item.data); } else { this.data.items.push(newItem); diff --git a/src/dataStore/queue.ts b/src/dataStore/queue.ts index c6250e5b..cceca9bc 100644 --- a/src/dataStore/queue.ts +++ b/src/dataStore/queue.ts @@ -283,14 +283,14 @@ export class Queue implements IQueue { } remove(id: number, queue?: number[]) { - if(queue==undefined){ + if (queue == undefined) { this.remove(id, this.queue); this.remove(id, this.repeatQueue); - + if (this.toDayLatterQueue[id] !== null) { delete this.toDayLatterQueue[id]; } - }else{ + } else { if (this.isQueued(queue, id)) { queue.remove(id); } From 3da233cad36df0d65111b96848477d3f12ea643a Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 3 Dec 2023 15:54:27 +0800 Subject: [PATCH 081/155] bump version 1.10.5.2 close #25 add reset fix stats update docs fix last tag directly await --- docs/changelog.md | 6 ++++ docs/usage.md | 4 +-- ...77\347\224\250\346\225\231\347\250\213.md" | 4 +-- manifest.json | 2 +- package.json | 2 +- src/Events/trackFileEvents.ts | 4 +-- src/commands.ts | 24 +++++++-------- src/dataStore/dataSyncer.ts | 8 ++--- src/dataStore/location_switch.ts | 21 +++++++++++--- src/dataStore/repetitionItem.ts | 21 ++++++++++++++ src/main.ts | 29 ++++++++++--------- src/reviewNote/review-note.ts | 15 +++++++--- src/stats.ts | 13 +++++---- 13 files changed, 103 insertions(+), 50 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 587bde68..f46e7115 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.10.5.2] + +- close #25, 笔记复习增加重来命令 +- 修复查看数据时卡死的问题; +- 正常不会用到的命令放入了调试命令时; + ## [1.10.5.1] - 合并主分支; diff --git a/docs/usage.md b/docs/usage.md index 80ed3904..3dd585f1 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -25,8 +25,8 @@ Suggestions: 1. Close the original plugin first to avoid conflict. 2. backup the note vault (because after changing the DataLocation in the settings, the review information in the note content will be deleted and saved to a separate file tracked_files.json.) - -If you want to use FSRS algorithm, you need to set it as recommended [above CASE1](). +3. close Obsidan.md, copy `obsidian-spaced-repetition/data.json` to `obsidian-spaced-repetition-recall/data.json`, then start Obsidan.md. +4. If you want to use FSRS algorithm, you need to set it as recommended [above CASE1](). --- diff --git "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" index 6bba166a..8e0cee92 100644 --- "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" +++ "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" @@ -27,8 +27,8 @@ 1. 先关闭原插件,避免冲突。 2. 备份笔记库(因在设置中修改DataLocation后,会删除笔记内容中的复习信息,另存到 单独文件 tracked_files.json。 ) - -如果是想用FSRS算法,需要按上述CASE1推荐设置。 +3. 关闭Obsidian.md,复制原插件的`obsidian-spaced-repetition/data.json` 到 `obsidian-spaced-repetition-recall/data.json`,再打开Obsidan.md。 +4. 如果是想用FSRS算法,需要按上述CASE1推荐设置。 --- diff --git a/manifest.json b/manifest.json index b6761c53..eae599f4 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.10.5.1", + "version": "1.10.5.2", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index 0b154cf5..f44d5547 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.5.1", + "version": "1.10.5.2", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { diff --git a/src/Events/trackFileEvents.ts b/src/Events/trackFileEvents.ts index c0d95f9c..74ecf126 100644 --- a/src/Events/trackFileEvents.ts +++ b/src/Events/trackFileEvents.ts @@ -4,11 +4,11 @@ import SRPlugin from "src/main"; export function registerTrackFileEvents(plugin: SRPlugin) { plugin.registerEvent( - plugin.app.vault.on("rename", (file, old) => { + plugin.app.vault.on("rename", async (file, old) => { const trackFile = plugin.store.getTrackedFile(old); if (trackFile != null) { trackFile.rename(file.path); - plugin.store.save(); + await plugin.store.save(); } }), ); diff --git a/src/commands.ts b/src/commands.ts index 43df3ec1..469d5633 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -87,6 +87,11 @@ export default class Commands { // return false; // }, // }); + } + + addDebugCommands() { + console.log("Injecting debug commands..."); + const plugin = this.plugin; plugin.addCommand({ id: "build-queue", @@ -104,11 +109,6 @@ export default class Commands { ReviewNote.recallReviewNote(this.plugin.data.settings); }, }); - } - - addDebugCommands() { - console.log("Injecting debug commands..."); - const plugin = this.plugin; plugin.addCommand({ id: "debug-print-view-state", @@ -141,13 +141,13 @@ export default class Commands { // }, // }); - // plugin.addCommand({ - // id: "debug-clear-queue", - // name: "Clear Queue", - // callback: () => { - // Queue.getInstance().clearQueue(); - // }, - // }); + plugin.addCommand({ + id: "debug-clear-queue", + name: "Clear Queue", + callback: () => { + Queue.getInstance().clearQueue(); + }, + }); plugin.addCommand({ id: "debug-queue-all", diff --git a/src/dataStore/dataSyncer.ts b/src/dataStore/dataSyncer.ts index 5f3e4124..bcfe7b93 100644 --- a/src/dataStore/dataSyncer.ts +++ b/src/dataStore/dataSyncer.ts @@ -77,15 +77,15 @@ export class DataSyncer { const ind = store.getFileIndex(note.path); const trackedFile = store.getTrackedFile(note.path); const fileid = store.getFileId(note.path); - let item = store.getItembyID(fileid); + const item = store.getItembyID(fileid); let now_number: number = now; const nowToday: number = DateUtils.EndofToday; if (item == null || !item.isTracked) { - store._updateItem(fileid, ind, RPITEMTYPE.NOTE, rdeck.deckName); - item = store.getItembyID(fileid); + // store._updateItem(fileid, ind, RPITEMTYPE.NOTE, rdeck.deckName); + // item = store.getItembyID(fileid); console.debug("syncRCDataToSRrevDeck update null item:", item, trackedFile); - // return; + return; } if (now == null) { now_number = nowToday; diff --git a/src/dataStore/location_switch.ts b/src/dataStore/location_switch.ts index df22002b..ddd3915c 100644 --- a/src/dataStore/location_switch.ts +++ b/src/dataStore/location_switch.ts @@ -11,7 +11,7 @@ import SRPlugin from "src/main"; import { isIgnoredPath } from "src/reviewNote/review-note"; import { SRSettings } from "src/settings"; import { escapeRegexString } from "src/util/utils"; -import { DataStore } from "./data"; +import { DataStore, RPITEMTYPE } from "./data"; import { Tags } from "src/tags"; import { DataSyncer } from "./dataSyncer"; @@ -342,9 +342,22 @@ export class LocationSwitch { } else if (item?.isNew) { plugin.noteStats.incrementNew(); } - if (item?.deckName === store.defaultDackName) { - fileText = addDefaultTagtoNote(fileText, this.revTag); - fileChanged = true; + //update tag to note + if (item?.itemType === RPITEMTYPE.NOTE) { + const noteTag = Tags.getNoteDeckName(note, this.settings); + if (item.deckName === store.defaultDackName) { + fileText = addDefaultTagtoNote(fileText, this.revTag); + fileChanged = true; + } else if ( + noteTag == null && + this.settings.tagsToReview.includes(item.deckName) + ) { + const tag = [this.settings.tagsToReview[0], item.deckName.substring(1)] + .join("/") + .substring(1); + fileText = addDefaultTagtoNote(fileText, tag); + fileChanged = true; + } } if (!dryrun && fileChanged) { if (fileText == null) { diff --git a/src/dataStore/repetitionItem.ts b/src/dataStore/repetitionItem.ts index b1ef50ed..2ccd1ec2 100644 --- a/src/dataStore/repetitionItem.ts +++ b/src/dataStore/repetitionItem.ts @@ -69,6 +69,27 @@ export class RepetitionItem { this.data = data; } + /** + * @param {ReviewResult} result + * @return {*} + */ + reviewUpdate(result: ReviewResult) { + this.nextReview = DateUtils.fromNow(result.nextReview).getTime(); + this.timesReviewed += 1; + if (result.correct) { + this.timesCorrect += 1; + this.errorStreak = 0; + } else { + this.errorStreak += 1; + } + } + + /** + * + * @param isFsrs + * @param isNumDue default is true. + * @returns + */ getSched(isFsrs?: boolean, isNumDue = true): RegExpMatchArray | null { if (this.nextReview === 0 || this.nextReview === null || this.timesReviewed === 0) { return null; // new card doesn't need schedinfo diff --git a/src/main.ts b/src/main.ts index 67346a22..18704641 100644 --- a/src/main.ts +++ b/src/main.ts @@ -93,7 +93,7 @@ export default class SRPlugin extends Plugin { private questionPostponementList: QuestionPostponementList; public incomingLinks: Record = {}; public pageranks: Record = {}; - public dueNotesCount = 0; + private dueNotesCount = 0; public dueDatesNotes: Record = {}; // Record<# of days in future, due count> public deckTree: Deck = new Deck("root", null); @@ -209,9 +209,9 @@ export default class SRPlugin extends Plugin { const options = this.algorithm.srsOptions(); const algo = this.data.settings.algorithm; const showtext = this.data.settings.responseOptionBtnsText; - for (let i = 1; i < options.length; i++) { + options.map((option, i) => { this.addCommand({ - id: "srs-note-review-" + options[i].toLowerCase(), + id: "srs-note-review-" + option.toLowerCase(), name: "review as: " + showtext[algo][i], callback: () => { const openFile: TFile | null = this.app.workspace.getActiveFile(); @@ -220,7 +220,7 @@ export default class SRPlugin extends Plugin { } }, }); - } + }); this.addCommand({ id: "srs-review-flashcards", @@ -588,7 +588,14 @@ export default class SRPlugin extends Plugin { } const settings = this.data.settings; - const deckname = Tags.getNoteDeckName(noteFile, this.data.settings); + let deckname = Tags.getNoteDeckName(noteFile, this.data.settings); + if (deckname == null) { + const tf = store.getTrackedFile(noteFile.path); + const tag = tf?.lastTag; + if (tag != undefined && settings.tagsToReview.includes(tag)) { + deckname = tag; + } + } if (deckname != null) { if (!Object.prototype.hasOwnProperty.call(this.reviewDecks, deckname)) { this.reviewDecks[deckname] = new ReviewDeck(deckname); @@ -632,13 +639,6 @@ export default class SRPlugin extends Plugin { } } } - } else { - const tf = store.getTrackedFile(noteFile.path); - const tag = tf?.tags?.last(); - if (tag != undefined && settings.tagsToReview.includes(tag)) { - tf.tags.remove(tag); - tf.updateTags(store.defaultDackName); - } } } @@ -895,7 +895,10 @@ export default class SRPlugin extends Plugin { async reviewNextNoteModal(): Promise { const reviewDeckNames: string[] = Object.keys(this.reviewDecks); if (this.data.settings.reviewingNoteDirectly) { - const rdname = ReviewNote.getDeckNameForReviewDirectly(this.reviewDecks); + const rdname = + this.lastSelectedReviewDeck ?? + ReviewNote.getDeckNameForReviewDirectly(this.reviewDecks) ?? + reviewDeckNames[0]; this.reviewNextNote(rdname); } else if (reviewDeckNames.length === 1) { this.reviewNextNote(reviewDeckNames[0]); diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index a9167c95..8f89ce8c 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -143,13 +143,20 @@ export class ReviewNote { [deckKey: string]: ReviewDeck; }): string | null { const reviewDeckNames: string[] = Object.keys(reviewDecks); - - const rdname = reviewDeckNames.find((dkey: string) => { + const rdnames: string[] = []; + reviewDeckNames.some((dkey: string) => { const ndeck = reviewDecks[dkey]; const ncount = ndeck.dueNotesCount + ndeck.newNotes.length; - return ncount > 0; + if (ncount > 0) { + rdnames.push(dkey); + } }); - return rdname; + if (rdnames.length > 0) { + const ind = Math.floor(Math.random() * rdnames.length); + return rdnames[ind]; + } else { + return null; + } } static getNextDueNoteIndex(NotesCount: number, openRandomNote: boolean = false) { diff --git a/src/stats.ts b/src/stats.ts index 00b63965..c9858ead 100644 --- a/src/stats.ts +++ b/src/stats.ts @@ -73,12 +73,15 @@ export class Stats { const interval: number = parseInt(scheduling[2]), ease: number = parseFloat(scheduling[3]); const delayedDays: number = Math.ceil( - (window - .moment(scheduling[1], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) - .valueOf() - - now) / - DateUtils.DAYS_TO_MILLIS, + (parseFloat(scheduling[1]) - now) / DateUtils.DAYS_TO_MILLIS, ); + // const delayedDays: number = Math.ceil( + // (window + // .moment(scheduling[1], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) + // .valueOf() - + // now) / + // DateUtils.DAYS_TO_MILLIS, + // ); this.update(delayedDays, interval, ease); } From f9ef6c85cb9cab4999de9b2f7dab9c2acbb1a331 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 8 Dec 2023 20:43:13 +0800 Subject: [PATCH 082/155] bump version to 1.10.5.3 : fix hz bar position que today refactor algo review rptype and que update docs --- docs/changelog.md | 7 ++ manifest.json | 2 +- package.json | 2 +- src/algorithms/algorithms.ts | 28 +++--- src/algorithms/algorithms_switch.ts | 3 +- src/algorithms/anki.ts | 5 - src/algorithms/fsrs.ts | 12 +-- src/algorithms/scheduling_default.ts | 38 ++++---- src/algorithms/supermemo.ts | 4 +- src/dataStore/data.ts | 61 ++++-------- src/dataStore/dataSyncer.ts | 17 ++-- src/dataStore/location_switch.ts | 3 +- src/dataStore/queue.ts | 137 ++++++++++++++++++--------- src/dataStore/repetitionItem.ts | 8 +- src/dataStore/trackedFile.ts | 2 +- src/gui/flashcard-modal.tsx | 10 +- src/gui/reviewresponse-modal.tsx | 2 +- src/gui/stats-modal.tsx | 3 +- src/main.ts | 27 +++++- src/reviewNote/review-note.ts | 19 ++-- src/settings.ts | 1 - styles.css | 24 ++--- 22 files changed, 229 insertions(+), 186 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index f46e7115..a0903eb4 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.10.5.3] + +- 修复复习笔记时的排序问题; +- 更新文档; +- 修改水平滑块位置,解决卡片内公式等内容过长无法查看问题; +- 重构部分代码; + ## [1.10.5.2] - close #25, 笔记复习增加重来命令 diff --git a/manifest.json b/manifest.json index eae599f4..e784b5a3 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.10.5.2", + "version": "1.10.5.3", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index f44d5547..6c9d7498 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.5.2", + "version": "1.10.5.3", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { diff --git a/src/algorithms/algorithms.ts b/src/algorithms/algorithms.ts index bc15bc40..95251e47 100644 --- a/src/algorithms/algorithms.ts +++ b/src/algorithms/algorithms.ts @@ -1,13 +1,13 @@ import { algorithmNames } from "./algorithms_switch"; -import { RPITEMTYPE, ReviewResult } from "src/dataStore/data"; -import SRPlugin from "../main"; +import { ReviewResult } from "src/dataStore/data"; import { MiscUtils } from "src/util/utils_recall"; -import { RepetitionItem } from "src/dataStore/repetitionItem"; +import { RPITEMTYPE, RepetitionItem } from "src/dataStore/repetitionItem"; export default abstract class SrsAlgorithm { // eslint-disable-next-line @typescript-eslint/no-explicit-any settings: any; - plugin: SRPlugin; + // plugin: SRPlugin; + private dueDates: { [type: string]: Record }; public static instance: SrsAlgorithm; public static getInstance(): SrsAlgorithm { @@ -19,18 +19,18 @@ export default abstract class SrsAlgorithm { } // eslint-disable-next-line @typescript-eslint/no-explicit-any - updateSettings(plugin: SRPlugin, settings: any) { + updateSettings(settings: any) { this.settings = MiscUtils.assignOnly(this.defaultSettings(), settings); - this.plugin = plugin; - SrsAlgorithm.instance = plugin.algorithm; + // this.plugin = plugin; + SrsAlgorithm.instance = this; } - - getDueDates(itemType: RPITEMTYPE) { - const dueDates = - itemType === RPITEMTYPE.NOTE - ? this.plugin.noteStats.delayedDays.dict - : this.plugin.cardStats.delayedDays.dict; - return dueDates; + setDueDates(notedueDates: Record, carddueDates: Record) { + this.dueDates = {}; + this.dueDates[RPITEMTYPE.NOTE] = notedueDates; + this.dueDates[RPITEMTYPE.CARD] = carddueDates; + } + getDueDates(itemType: string) { + return this.dueDates[itemType]; } abstract defaultSettings(): unknown; diff --git a/src/algorithms/algorithms_switch.ts b/src/algorithms/algorithms_switch.ts index a7bf1311..aad2a1b8 100644 --- a/src/algorithms/algorithms_switch.ts +++ b/src/algorithms/algorithms_switch.ts @@ -44,7 +44,8 @@ export async function algorithmSwitchData( const fromTo = " from " + fromAlgo + " to: " + toAlgo; try { const algo = algorithms[toAlgo]; - algo.updateSettings(plugin, plugin.data.settings.algorithmSettings[toAlgo]); + algo.updateSettings(plugin.data.settings.algorithmSettings[toAlgo]); + algo.setDueDates(plugin.noteStats.delayedDays.dict, plugin.cardStats.delayedDays.dict); algo.importer(fromAlgo, items); if (toAlgo === algorithmNames.Fsrs) { store.data.items.find((item) => { diff --git a/src/algorithms/anki.ts b/src/algorithms/anki.ts index aa08a546..a03431f5 100644 --- a/src/algorithms/anki.ts +++ b/src/algorithms/anki.ts @@ -152,11 +152,6 @@ export class AnkiAlgorithm extends SrsAlgorithm { } private importer_Fsrs(items: RepetitionItem[]): void { - // const plugin = this.plugin; - // this.updateSettings( - // plugin, - // plugin.data.settings.algorithmSettings[algorithmNames.Anki], - // ); items.forEach((item) => { if (item != null && item.data != null) { const data = item.data as FsrsData; diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index 578f5bb7..6dd39235 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -1,7 +1,7 @@ import { Setting, Notice } from "obsidian"; import { DateUtils } from "src/util/utils_recall"; import SrsAlgorithm from "./algorithms"; -import { ReviewResult } from "../dataStore/data"; +import { DataStore, ReviewResult } from "../dataStore/data"; import * as fsrsjs from "fsrs.js"; import { t } from "src/lang/helpers"; @@ -102,7 +102,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { } getLogfilepath() { - const filepath = this.plugin.store.dataPath; + const filepath = DataStore.getInstance().dataPath; const fder_index = filepath.lastIndexOf("/"); this.logfilepath = filepath.substring(0, fder_index + 1) + this.filename; } @@ -190,7 +190,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { let nextInterval = data.due.valueOf() - data.last_review.valueOf(); // not sure should use balance or not. let days = nextInterval / DateUtils.DAYS_TO_MILLIS; - days = balance(days, this.getDueDates(item.itemType)); + days = balance(days, this.getDueDates(item.itemType), this.settings.maximum_interval); nextInterval = days * DateUtils.DAYS_TO_MILLIS; data.due = new Date(nextInterval + now.getTime()); @@ -261,10 +261,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { } importer(fromAlgo: algorithmNames, items: RepetitionItem[]): void { - // const plugin = this.plugin; - // const store = plugin.store; const options = this.srsOptions(); - // this.updateSettings(plugin, plugin.data.settings.algorithmSettings[algorithmNames.Fsrs]); const initItvl = this.settings.w[4]; items.forEach((item) => { if (item != null && item.data != null) { @@ -343,7 +340,6 @@ export class FsrsAlgorithm extends SrsAlgorithm { tags.last() === "" ? tags.pop() : tags; this.settings.revlog_tags = tags; update(this.settings); - // await this.plugin.savePluginData(); }); }), ); @@ -372,7 +368,6 @@ export class FsrsAlgorithm extends SrsAlgorithm { this.defaultSettings().request_retention; this.fsrs.p.request_retention = this.settings.request_retention; update(this.settings); - // this.plugin.settingTab.display(); }); }); }); @@ -445,7 +440,6 @@ export class FsrsAlgorithm extends SrsAlgorithm { applySettingsUpdate(async () => { this.settings.w = this.fsrs.p.w = this.defaultSettings().w; update(this.settings); - // this.plugin.settingTab.display(); }); }); }) diff --git a/src/algorithms/scheduling_default.ts b/src/algorithms/scheduling_default.ts index 1a4c5d8d..0fcd157e 100644 --- a/src/algorithms/scheduling_default.ts +++ b/src/algorithms/scheduling_default.ts @@ -197,8 +197,6 @@ export class DefaultAlgorithm extends SrsAlgorithm { } private importer_Fsrs(items: RepetitionItem[]) { - // const plugin = this.plugin; - // this.updateSettings(plugin, plugin.data.settings.algorithmSettings[algorithmNames.Default]); items.forEach((item) => { if (item != null && item.data != null) { const data = item.data as FsrsData; @@ -252,9 +250,10 @@ export class DefaultAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.baseEase = DEFAULTSETTINGS.baseEase; - update(this.settings); - this.plugin.settingTab.display(); + applySettingsUpdate(() => { + this.settings.baseEase = DEFAULTSETTINGS.baseEase; + update(this.settings); + }); }); }); @@ -276,9 +275,11 @@ export class DefaultAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.lapsesIntervalChange = DEFAULTSETTINGS.lapsesIntervalChange; - update(this.settings); - this.plugin.settingTab.display(); + applySettingsUpdate(async () => { + this.settings.lapsesIntervalChange = + DEFAULTSETTINGS.lapsesIntervalChange; + update(this.settings); + }); }); }); @@ -309,9 +310,10 @@ export class DefaultAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.easyBonus = DEFAULTSETTINGS.easyBonus; - update(this.settings); - this.plugin.settingTab.display(); + applySettingsUpdate(async () => { + this.settings.easyBonus = DEFAULTSETTINGS.easyBonus; + update(this.settings); + }); }); }); @@ -342,9 +344,10 @@ export class DefaultAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.maximumInterval = DEFAULTSETTINGS.maximumInterval; - update(this.settings); - this.plugin.settingTab.display(); + applySettingsUpdate(async () => { + this.settings.maximumInterval = DEFAULTSETTINGS.maximumInterval; + update(this.settings); + }); }); }); @@ -366,9 +369,10 @@ export class DefaultAlgorithm extends SrsAlgorithm { .setIcon("reset") .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { - this.settings.maxLinkFactor = DEFAULTSETTINGS.maxLinkFactor; - update(this.settings); - this.plugin.settingTab.display(); + applySettingsUpdate(async () => { + this.settings.maxLinkFactor = DEFAULTSETTINGS.maxLinkFactor; + update(this.settings); + }); }); }); return; diff --git a/src/algorithms/supermemo.ts b/src/algorithms/supermemo.ts index 8d3db215..0e333535 100644 --- a/src/algorithms/supermemo.ts +++ b/src/algorithms/supermemo.ts @@ -101,7 +101,7 @@ export class Sm2Algorithm extends SrsAlgorithm { importer(fromAlgo: algorithmNames, items: RepetitionItem[]): void { const anki = new AnkiAlgorithm(); - anki.updateSettings(this.plugin, this.settings); + anki.updateSettings(this.settings); anki.importer(fromAlgo, items); } @@ -111,7 +111,7 @@ export class Sm2Algorithm extends SrsAlgorithm { '用于间隔重复的算法. 目前与Anki算法共用参数(仅算法处理方式不同),更多信息请查阅 sm2算法.'; const anki = new AnkiAlgorithm(); - anki.updateSettings(this.plugin, this.settings); + anki.updateSettings(this.settings); anki.displaySettings(containerEl, (settings) => { update((this.settings = settings)); }); diff --git a/src/dataStore/data.ts b/src/dataStore/data.ts index 7cbf053c..fc15d2ab 100644 --- a/src/dataStore/data.ts +++ b/src/dataStore/data.ts @@ -1,9 +1,8 @@ -import { DateUtils } from "src/util/utils_recall"; +import { MiscUtils } from "src/util/utils_recall"; import { SRSettings } from "../settings"; import { TFile, TFolder, Notice, getAllTags } from "obsidian"; -import deepcopy from "deepcopy"; import { FsrsData } from "src/algorithms/fsrs"; import { AnkiData } from "src/algorithms/anki"; @@ -12,8 +11,8 @@ import { getStorePath } from "src/dataStore/location_switch"; import { Tags } from "src/tags"; import SrsAlgorithm from "src/algorithms/algorithms"; import { CardInfo, TrackedFile } from "./trackedFile"; -import { RepetitionItem } from "./repetitionItem"; -import { Queue } from "./queue"; +import { RPITEMTYPE, RepetitionItem } from "./repetitionItem"; +import { DEFAULT_QUEUE_DATA, Queue } from "./queue"; /** * SrsData. @@ -47,11 +46,6 @@ export interface SrsData { mtime: number; } -export enum RPITEMTYPE { - NOTE = "note", - CARD = "card", -} - export type ReviewedCounts = Record; /** @@ -69,7 +63,7 @@ export interface ReviewResult { } const DEFAULT_SRS_DATA: SrsData = { - queues: new Queue(), + queues: Object.assign({}, DEFAULT_QUEUE_DATA) as Queue, reviewedCounts: {}, reviewedCardCounts: {}, items: [], @@ -218,9 +212,16 @@ export class DataStore { * Returns total number of items tracked by the SRS. * @returns {number} */ - items(): number { + get itemSize(): number { return this.data.items.length; } + /** + * Returns all items tracked by the SRS. + * @returns {RepetitionItem} + */ + get items(): RepetitionItem[] { + return this.data.items; + } /** * getFileIndex. @@ -351,8 +352,8 @@ export class DataStore { * * @returns {RepetitionItem | null} */ - getNext(): RepetitionItem | null { - const id = this.data.queues.getNextId(); + getNext(key?: string): RepetitionItem | null { + const id = this.data.queues.getNextId(key); if (id != null) { return this.getItembyID(id); } @@ -387,35 +388,19 @@ export class DataStore { */ reviewId(itemId: number, option: string) { const item = this.getItembyID(itemId); + let result: ReviewResult; if (item == null) { return -1; } const algorithm = SrsAlgorithm.getInstance(); if (this.data.queues.isInRepeatQueue(itemId)) { - const result = algorithm.onSelection(item, option, true); - - this.data.queues.repeatQueue.remove(itemId); - if (!result.correct) { - this.data.queues.repeatQueue.push(itemId); // Re-add until correct. - } + result = algorithm.onSelection(item, option, true); } else { - const result = algorithm.onSelection(item, option, false); - - item.nextReview = DateUtils.fromNow(result.nextReview).getTime(); - item.timesReviewed += 1; - this.data.queues.queue.remove(itemId); - if (result.correct) { - item.timesCorrect += 1; - item.errorStreak = 0; - } else { - item.errorStreak += 1; - - if (this.settings.repeatItems) { - this.data.queues.repeatQueue.push(itemId); - } - } + result = algorithm.onSelection(item, option, false); + item.reviewUpdate(result); } + this.data.queues.updateWhenReview(item, result.correct, this.settings.repeatItems); } /** @@ -607,8 +592,8 @@ export class DataStore { } unTrackItem(id: number) { - this.data.queues.remove(id); const item = this.getItembyID(id); + this.data.queues.remove(item); item.setUntracked(); } @@ -896,11 +881,7 @@ export class DataStore { const nullItemList: number[] = []; const nullItemList_del: number[] = []; - // if (this.settings.algorithm === "Fsrs") { - // new Notice("因涉及到revlog.csv, 暂不可精简清除无效数据"); - // return; - // //用 固定 id - // } + this.data = MiscUtils.assignOnly(DEFAULT_SRS_DATA, this.data); tracked_files.map((tf, ind) => { if (tf == null) { nullFileList.push(ind); diff --git a/src/dataStore/dataSyncer.ts b/src/dataStore/dataSyncer.ts index bcfe7b93..4b466dea 100644 --- a/src/dataStore/dataSyncer.ts +++ b/src/dataStore/dataSyncer.ts @@ -4,7 +4,7 @@ import { Note } from "src/Note"; import { ReviewDeck } from "src/ReviewDeck"; import { SrTFile } from "src/SRFile"; import { TopicPath } from "src/TopicPath"; -import { DataStore, RPITEMTYPE } from "src/dataStore/data"; +import { DataStore } from "src/dataStore/data"; import { Stats } from "src/stats"; import { getKeysPreserveType } from "src/util/utils"; import { BlockUtils, DateUtils } from "src/util/utils_recall"; @@ -74,6 +74,7 @@ export class DataSyncer { // const plugin = plugin; // const rdeck = reviewDecks[deckName]; const store = DataStore.getInstance(); + const queue = store.data.queues; const ind = store.getFileIndex(note.path); const trackedFile = store.getTrackedFile(note.path); const fileid = store.getFileId(note.path); @@ -95,16 +96,15 @@ export class DataSyncer { getKeysPreserveType(store.data.queues.toDayLatterQueue).forEach((idStr, _idx, _arr) => { const id: number = Number(idStr); const item = store.getItembyID(id); - if (now - item.nextReview > 0) { - // const dname = item.deckName; - // reviewDecks[dname].dueNotesCount++; + if (item.deckName === rdeck.deckName && item.nextReview - now < 0) { + rdeck.dueNotesCount++; delete store.data.queues.toDayLatterQueue[id]; } }); + } - if (item.nextReview <= nowToday) { - store.data.queues.toDayLatterQueue[fileid] = rdeck.deckName; - } + if (item.nextReview - now_number > 0 && item.nextReview <= nowToday) { + store.data.queues.toDayLatterQueue[fileid] = rdeck.deckName; } let dueNotesCount: number = 0; @@ -113,6 +113,9 @@ export class DataSyncer { if (item.nextReview <= now_number) { rdeck.dueNotesCount++; dueNotesCount = 1; + if (now == null) { + queue.push(queue.queue[item.deckName], item.ID); + } } } else { rdeck.newNotes.push(note); diff --git a/src/dataStore/location_switch.ts b/src/dataStore/location_switch.ts index ddd3915c..cc2af038 100644 --- a/src/dataStore/location_switch.ts +++ b/src/dataStore/location_switch.ts @@ -11,12 +11,13 @@ import SRPlugin from "src/main"; import { isIgnoredPath } from "src/reviewNote/review-note"; import { SRSettings } from "src/settings"; import { escapeRegexString } from "src/util/utils"; -import { DataStore, RPITEMTYPE } from "./data"; +import { DataStore } from "./data"; import { Tags } from "src/tags"; import { DataSyncer } from "./dataSyncer"; import { Stats } from "src/stats"; import { DateUtils } from "src/util/utils_recall"; +import { RPITEMTYPE } from "./repetitionItem"; const ROOT_DATA_PATH = "./tracked_files.json"; // const PLUGIN_DATA_PATH = "./.obsidian/plugins/obsidian-spaced-repetition-recall/tracked_files.json"; diff --git a/src/dataStore/queue.ts b/src/dataStore/queue.ts index cceca9bc..b14d850b 100644 --- a/src/dataStore/queue.ts +++ b/src/dataStore/queue.ts @@ -1,13 +1,13 @@ import { isArray } from "src/util/utils_recall"; import { DataStore } from "./data"; -import { RepetitionItem } from "./repetitionItem"; import { TrackedFile } from "./trackedFile"; +import { RepetitionItem } from "./repetitionItem"; -interface IQueue { +export interface IQueue { /** * @type {number[]} */ - queue: number[]; + queue: Record; /** * @type {number[]} */ @@ -32,12 +32,42 @@ interface IQueue { */ newAdded: 0; } + +export const DEFAULT_QUEUE_DATA: IQueue = { + /** + * @type {number[]} + */ + queue: {}, + /** + * @type {number[]} + */ + repeatQueue: [], + /** + * @type {number[]} + */ + cardQueue: [], + /** + * @type {number[]} + */ + cardRepeatQueue: [], + toDayAllQueue: {}, + toDayLatterQueue: {}, + /** + * @type {number} + */ + lastQueue: 0, + /** + * @type {0} + */ + newAdded: 0, +}; + export class Queue implements IQueue { static instance: Queue; /** * @type {number[]} */ - queue: number[]; + queue: Record; /** * @type {number[]} */ @@ -53,8 +83,7 @@ export class Queue implements IQueue { toDayAllQueue: Record; toDayLatterQueue: Record; - items: RepetitionItem[]; - maxNewPerDay: number; + // maxNewPerDay: number; lastQueue: number; /** * @type {0} @@ -74,8 +103,7 @@ export class Queue implements IQueue { return que; } constructor() { - this.items = []; - this.queue = []; + this.queue = {}; this.repeatQueue = []; this.cardQueue = []; this.cardRepeatQueue = []; @@ -92,8 +120,11 @@ export class Queue implements IQueue { * * @returns {number} */ - queueSize(): number { - return this.queue.length; + queueSize(key?: string): number { + if (key == undefined) { + key = DataStore.getInstance().defaultDackName; + } + return this.queue[key]?.length ?? 0; } /** * repeatQueueSize. @@ -108,9 +139,9 @@ export class Queue implements IQueue { * * @returns {number | null} */ - getNextId(): number | null { - if (this.queueSize() > 0) { - return this.queue[0]; + getNextId(key?: string): number | null { + if (this.queueSize(key) > 0) { + return this.queue[key][0]; } else if (this.repeatQueue.length > 0) { return this.repeatQueue[0]; } else { @@ -124,7 +155,7 @@ export class Queue implements IQueue { async buildQueue() { // console.log("Building queue..."); const store = DataStore.getInstance(); - const maxNew = this.maxNewPerDay; + const maxNew = store.settings.maxNewPerDay; const now: Date = new Date(); if (now.getDate() != new Date(this.lastQueue).getDate()) { @@ -141,7 +172,7 @@ export class Queue implements IQueue { let removedItems = 0; const bUnTfiles = new Set(); await Promise.all( - this.items.map(async (item, _idx) => { + store.items.map(async (item, _idx) => { if (item != null && item.isTracked) { const file = store.getFileByIndex(item.fileIndex); if (file?.path == undefined) return; @@ -151,13 +182,15 @@ export class Queue implements IQueue { exists = store.findMovedFile(file); } if (!exists) { - console.debug("untrackfile by buildqueue:", file); - bUnTfiles.add(file); - // new Notice("untrackfile by buildqueue:" + file); + if (!bUnTfiles.has(file)) { + console.debug("untrackfile by buildqueue:", file); + bUnTfiles.add(file); + untrackedFiles += 1; + // new Notice("untrackfile by buildqueue:" + file); + } // removedItems += this.untrackFile(file.path, false); item.setUntracked(); removedItems += 1; - untrackedFiles += 1; } else if (file.noteId !== item.ID) { // card Queue if (item.isNew) { @@ -168,24 +201,23 @@ export class Queue implements IQueue { newAdd_card += 1; } } else if (item.nextReview <= now.getTime()) { - this.remove(item.ID, this.cardRepeatQueue); + this.remove(item, this.cardRepeatQueue); oldAdd_card += this.push(this.cardQueue, item.ID); } } else { // note Queue + if (this.queueSize(item.deckName) === 0) { + this.queue[item.deckName] = []; + } if (item.isNew) { // This is a new item. - if ( - !this.isQueued(this.queue, item.ID) && - (maxNew == -1 || newAdd < maxNew) - ) { + if (maxNew == -1 || newAdd < maxNew) { // data.newAdded += 1; - this.queue.push(item.ID); - newAdd += 1; + newAdd += this.push(this.queue[item.deckName], item.ID); } } else if (item.nextReview <= now.getTime()) { - this.remove(item.ID, this.repeatQueue); - oldAdd += this.push(this.queue, item.ID); + this.remove(item, this.repeatQueue); + oldAdd += this.push(this.queue[item.deckName], item.ID); } } } @@ -221,11 +253,12 @@ export class Queue implements IQueue { } buildQueueAll() { - this.queue = []; - const items = DataStore.getInstance().data.items; + const store = DataStore.getInstance(); + this.queue[store.defaultDackName] = []; + const items = store.data.items; for (let i = 0; i < items.length; i++) { if (items[i] != null || items[i].isTracked) { - this.queue.push(i); + this.queue[store.defaultDackName].push(i); } } } @@ -248,7 +281,7 @@ export class Queue implements IQueue { clearQueue(queue: unknown = null) { if (queue == null) { - this.queue = []; + this.queue = {}; this.repeatQueue = []; this.cardQueue = []; this.cardRepeatQueue = []; @@ -265,11 +298,11 @@ export class Queue implements IQueue { /** * isQueued. * - * @param {number} item + * @param {number} id * @returns {boolean} */ - isQueued(queue: number[], item: number): boolean { - return queue.includes(item); + isQueued(queue: number[], id: number): boolean { + return queue?.includes(id) ?? false; } /** @@ -282,26 +315,40 @@ export class Queue implements IQueue { return this.repeatQueue.includes(item) || this.cardRepeatQueue.includes(item); } - remove(id: number, queue?: number[]) { + updateWhenReview(item: RepetitionItem, correct: boolean, repeatItems: boolean) { + if (this.isInRepeatQueue(item.ID)) { + this.remove(item, this.repeatQueue); + } else { + this.remove(item, this.queue[item.deckName]); + } + if (repeatItems && !correct) { + this.push(this.repeatQueue, item.ID); // Re-add until correct. + } + } + + remove(item: RepetitionItem, queue?: number[]) { if (queue == undefined) { - this.remove(id, this.queue); - this.remove(id, this.repeatQueue); + if (this.isQueued(this.queue[item.deckName], item.ID)) { + this.remove(item, this.queue[item.deckName]); + this.remove(item, this.repeatQueue); + } - if (this.toDayLatterQueue[id] !== null) { - delete this.toDayLatterQueue[id]; + if (this.toDayLatterQueue[item.ID] !== null) { + delete this.toDayLatterQueue[item.ID]; } } else { - if (this.isQueued(queue, id)) { - queue.remove(id); + if (this.isQueued(queue, item.ID)) { + queue.remove(item.ID); } } } push(queue: number[], id: number) { let cnt = 0; - if (!this.isQueued(queue, id)) { - queue.push(id); - cnt++; + if (this.isQueued(queue, id)) { + return cnt; } + queue.push(id); + cnt++; return cnt; } } diff --git a/src/dataStore/repetitionItem.ts b/src/dataStore/repetitionItem.ts index 2ccd1ec2..5920cf20 100644 --- a/src/dataStore/repetitionItem.ts +++ b/src/dataStore/repetitionItem.ts @@ -1,6 +1,12 @@ import { AnkiData } from "src/algorithms/anki"; -import { RPITEMTYPE } from "./data"; import { FsrsData } from "src/algorithms/fsrs"; +import { ReviewResult } from "./data"; +import { DateUtils } from "src/util/utils_recall"; + +export enum RPITEMTYPE { + NOTE = "note", + CARD = "card", +} /** * RepetitionItem. diff --git a/src/dataStore/trackedFile.ts b/src/dataStore/trackedFile.ts index f8a695d6..f8322867 100644 --- a/src/dataStore/trackedFile.ts +++ b/src/dataStore/trackedFile.ts @@ -1,8 +1,8 @@ -import { RPITEMTYPE } from "./data"; import { SRSettings } from "src/settings"; import { BlockUtils } from "src/util/utils_recall"; import { CardType } from "src/Question"; import { parse } from "src/parser"; +import { RPITEMTYPE } from "./repetitionItem"; /** * TrackedFile. diff --git a/src/gui/flashcard-modal.tsx b/src/gui/flashcard-modal.tsx index 3bfa1893..07e9e76c 100644 --- a/src/gui/flashcard-modal.tsx +++ b/src/gui/flashcard-modal.tsx @@ -20,10 +20,9 @@ import { Note } from "src/Note"; import { RenderMarkdownWrapper } from "src/util/RenderMarkdownWrapper"; import { CardScheduleInfo } from "src/CardSchedule"; import { TopicPath } from "src/TopicPath"; -import { RPITEMTYPE } from "src/dataStore/data"; import { DataLocation } from "src/dataStore/location_switch"; import { SrTFile } from "src/SRFile"; -import { RepetitionItem } from "src/dataStore/repetitionItem"; +import { RepetitionItem, RPITEMTYPE } from "src/dataStore/repetitionItem"; export enum FlashcardModalMode { DecksList, @@ -487,7 +486,12 @@ export class FlashcardModal extends Modal { } private processReviewbyAlgo(response: ReviewResponse) { - const opt = this.plugin.algorithm.srsOptions()[response]; + const algo = this.plugin.algorithm; + algo.setDueDates( + this.plugin.noteStats.delayedDays.dict, + this.plugin.noteStats.delayedDays.dict, + ); + const opt = algo.srsOptions()[response]; const store = this.plugin.store; const id = this.currentCard.Id; diff --git a/src/gui/reviewresponse-modal.tsx b/src/gui/reviewresponse-modal.tsx index 3c1d3b93..5d73eec9 100644 --- a/src/gui/reviewresponse-modal.tsx +++ b/src/gui/reviewresponse-modal.tsx @@ -59,7 +59,7 @@ export class reviewResponseModal { if (!show) { this.selfDestruct(); return; - } else if (!reviewResponseModalBar) { + } else if (!reviewResponseModalBar || !this.buttons) { const buttonClick = (s: string) => { // this.mode = FlashcardModalMode.Front; diff --git a/src/gui/stats-modal.tsx b/src/gui/stats-modal.tsx index 991e008a..ac1740d3 100644 --- a/src/gui/stats-modal.tsx +++ b/src/gui/stats-modal.tsx @@ -20,11 +20,12 @@ import type SRPlugin from "src/main"; import { getKeysPreserveType, getTypedObjectEntries } from "src/util/utils"; import { textInterval } from "src/scheduling"; import { t } from "src/lang/helpers"; -import { RPITEMTYPE, ReviewedCounts } from "src/dataStore/data"; +import { ReviewedCounts } from "src/dataStore/data"; import { State } from "fsrs.js"; import { algorithmNames } from "src/algorithms/algorithms_switch"; import { Stats } from "src/stats"; import { CardListType } from "src/Deck"; +import { RPITEMTYPE } from "src/dataStore/repetitionItem"; Chart.register( BarElement, diff --git a/src/main.ts b/src/main.ts index 18704641..19b5b1e9 100644 --- a/src/main.ts +++ b/src/main.ts @@ -36,7 +36,7 @@ import { NoteEaseList } from "./NoteEaseList"; import { QuestionPostponementList } from "./QuestionPostponementList"; // https://github.com/martin-jw/obsidian-recall -import { DataStore, RPITEMTYPE } from "./dataStore/data"; +import { DataStore } from "./dataStore/data"; import Commands from "./commands"; import SrsAlgorithm from "./algorithms/algorithms"; import { algorithms } from "src/settings"; @@ -52,6 +52,7 @@ import { Tags } from "./tags"; import { DataSyncer } from "./dataStore/dataSyncer"; import { calcLinkContribution, updategraphLink } from "./algorithms/priorities/linkPageranks"; import { Queue } from "./dataStore/queue"; +import { RPITEMTYPE } from "./dataStore/repetitionItem"; interface PluginData { settings: SRSettings; @@ -128,7 +129,7 @@ export default class SRPlugin extends Plugin { const settings = this.data.settings; this.algorithm = algorithms[settings.algorithm]; - this.algorithm.updateSettings(this, settings.algorithmSettings[settings.algorithm]); + this.algorithm.updateSettings(settings.algorithmSettings[settings.algorithm]); settings.algorithmSettings[settings.algorithm] = this.algorithm.settings; this.savePluginData(); @@ -535,6 +536,7 @@ export default class SRPlugin extends Plugin { } this.syncLock = true; const store = this.store; + store.data.queues.buildQueue(); // reset notes stuff graph.reset(); @@ -560,7 +562,7 @@ export default class SRPlugin extends Plugin { const todayDate: string = now.format("YYYY-MM-DD"); // clear bury list if we've changed dates if (todayDate !== this.data.buryDate) { - now_number = DateUtils.EndofToday; + now_number = null; this.data.buryDate = todayDate; this.questionPostponementList.clear(); } @@ -612,7 +614,7 @@ export default class SRPlugin extends Plugin { const result = DataSyncer.syncRCDataToSRrevDeck( this.reviewDecks[deckname], noteFile, - now_number, + // now_number, ); this.dueNotesCount += result; @@ -671,6 +673,10 @@ export default class SRPlugin extends Plugin { const calc: DeckTreeStatsCalculator = new DeckTreeStatsCalculator(); this.cardStats = calc.calculate(this.deckTree); // this.noteStats = calc.calculate(this.deckTree); + this.algorithm.setDueDates( + this.noteStats.delayedDays.dict, + this.cardStats.delayedDays.dict, + ); if (this.data.settings.showDebugMessages) { this.showSyncInfo(); @@ -917,6 +923,7 @@ export default class SRPlugin extends Plugin { this.lastSelectedReviewDeck = deckKey; const deck = this.reviewDecks[deckKey]; + const queue = this.store.data.queues; let show = false; let path = ""; let index = -1; @@ -930,6 +937,18 @@ export default class SRPlugin extends Plugin { path = deck.scheduledNotes[index].note.path; show = true; // return; + } else if (queue.queueSize(deckKey) > 0) { + const item = this.store.getNext(deckKey); + if (item != null && item.isTracked) { + const path = this.store.getFilePath(item); + if (path != null) { + const note = app.vault.getAbstractFileByPath(path) as TFile; + if (note instanceof TFile) { + await this.app.workspace.getLeaf().openFile(note); + show = true; + } + } + } } else if (deck.newNotes.length > 0) { const index = this.data.settings.openRandomNote ? Math.floor(Math.random() * deck.newNotes.length) diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index 8f89ce8c..a2344a2d 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -82,20 +82,17 @@ export class ReviewNote { const item = store.getNext(); // eslint-disable-next-line @typescript-eslint/no-explicit-any const state: any = { mode: "empty" }; - if (item != null) { + if (item != null && item.isTracked) { this.itemId = item.ID; console.debug("item:", item, que.queueSize()); const path = store.getFilePath(item); if (path != null) { state.file = path; state.item = que.getNextId(); - // state.mode = "note"; // state.mode = "question"; - // const fid = store.getFileId(path); - // const item = store.getItembyID(fid); reviewFloatBar.algoDisplay(true, item, (opt) => { - this.recallReviewResponse(this.itemId, opt, settings.autoNextNote); + this.recallReviewResponse(this.itemId, opt); if (settings.autoNextNote) { this.recallReviewNote(settings); } @@ -112,6 +109,8 @@ export class ReviewNote { app.workspace.setActiveLeaf(leaf); if (item != null) { + const newstate = leaf.getViewState(); + console.debug(newstate); return; } @@ -120,23 +119,17 @@ export class ReviewNote { // plugin.updateStatusBar(); reviewFloatBar.selfDestruct(); - // plugin.sync_Algo(); new Notice(t("ALL_CAUGHT_UP")); } - static recallReviewResponse(itemId: number, response: string, autoNextNote: boolean = true) { + static recallReviewResponse(itemId: number, response: string) { const store = DataStore.getInstance(); const item = store.getItembyID(itemId); // console.debug("itemId: ", itemId); store.updateReviewedCounts(itemId); store.reviewId(itemId, response); store.save(); - this.minNextView = this.updateminNextView(this.minNextView, item.nextReview); - - if (!autoNextNote) { - new Notice(t("RESPONSE_RECEIVED")); - } } static getDeckNameForReviewDirectly(reviewDecks: { @@ -175,7 +168,7 @@ export class ReviewNote { static updateminNextView(minNextView: number, nextReview: number): number { const now = Date.now(); - const nowToday: number = window.moment().endOf("day").valueOf(); + const nowToday: number = DateUtils.EndofToday; if (nextReview <= nowToday) { if (minNextView == undefined || minNextView < now || minNextView > nextReview) { diff --git a/src/settings.ts b/src/settings.ts index 55564a98..e174b5af 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -824,7 +824,6 @@ export class SRSettingTab extends PluginSettingTab { plugin.data.settings.algorithm = newValue; plugin.algorithm = algorithms[plugin.data.settings.algorithm]; plugin.algorithm.updateSettings( - plugin, plugin.data.settings.algorithmSettings[newValue], ); await plugin.savePluginData(); diff --git a/styles.css b/styles.css index ba54cac5..84a69a76 100644 --- a/styles.css +++ b/styles.css @@ -131,17 +131,10 @@ width: 100%; } -.sr-modal-content { - position: relative; - height: 92%; - width: 100%; -} - #sr-flashcard-view { font-size: var(--font-text-size); overflow-y: auto; - height: 80%; - width: 100%; + height: 77%; user-select: text; } @@ -157,7 +150,7 @@ .sr-modal-content { width: 98% !important; - height: 90%; + /* height: 90%; */ } #sr-context { @@ -180,10 +173,7 @@ .sr-flashcard-response, #sr-show-answer { width: 93.5% !important; - /* line-height: 60px; */ - left: 0; - right: 0; - margin: auto; + line-height: 60px; } .ResponseFloatBarCommandItem, @@ -241,7 +231,7 @@ ResponseFloatBar TOOLBAR /* flex-direction: row; */ left: 0; right: 0; - bottom: 12%; + bottom: 0%; margin: auto; align-items: center; transition: 200ms ease; @@ -258,10 +248,6 @@ ResponseFloatBar TOOLBAR position: relative; } -.ResponseFloatBarCommandItem:before { - position: relative; -} - .ResponseFloatBarCommandItem { border: none; display: flex; @@ -271,6 +257,8 @@ ResponseFloatBar TOOLBAR width: 90%; height: 48px; box-shadow: none; + left: 0; + right: 0; margin-left: 3px; margin-right: 3px; margin: auto; From a64d8d89144d46c056cfecd7436c4a137b2fdb56 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 16 Dec 2023 15:21:03 +0800 Subject: [PATCH 083/155] - fix cardtext change - update docs - update template - add card debug msg, show notice when iteminfo - change cloze length [...] by answer length - close #27, floatBar use menu, mobile touch to close it. - fix #30 queue error - refactor, seperate cmd and query - add test.ts --- .github/ISSUE_TEMPLATE/bug_report.md | 25 +- docs/usage.md | 6 +- ...77\347\224\250\346\225\231\347\250\213.md" | 6 +- src/Events/touchEvent.ts | 138 ++++++ src/NoteEaseList.ts | 3 + src/Question.ts | 4 + src/QuestionType.ts | 7 +- src/ReviewDeck.ts | 13 +- src/TopicPath.ts | 6 +- src/algorithms/algorithms.ts | 27 +- src/algorithms/algorithms_switch.ts | 9 +- src/algorithms/anki.ts | 12 +- src/algorithms/fsrs.ts | 18 +- src/algorithms/priorities/linkPageranks.ts | 179 +++++--- src/algorithms/scheduling_default.ts | 18 +- src/algorithms/supermemo.ts | 16 +- src/commands.ts | 11 + src/constants.ts | 2 + src/dataStore/data.ts | 432 ++++++------------ src/dataStore/dataSyncer.ts | 219 --------- src/dataStore/itemToDecks.ts | 244 ++++++++++ src/dataStore/location_switch.ts | 379 ++++++++------- src/dataStore/queue.ts | 138 +++--- src/dataStore/repetitionItem.ts | 60 ++- src/dataStore/trackedFile.ts | 92 +++- src/gui/flashcard-modal.tsx | 5 + src/gui/info.ts | 2 +- src/gui/reviewresponse-modal.tsx | 209 +++++---- src/gui/sidebar.ts | 16 +- src/gui/stats-modal.tsx | 2 +- src/main.ts | 336 +++++--------- src/reviewNote/review-note.ts | 37 +- src/settings.ts | 72 ++- src/settings/responseBarSetting.ts | 17 + src/stats.ts | 11 +- src/tags.ts | 11 - src/util/utils_recall.ts | 86 +++- styles.css | 14 +- tests/unit/algorithms_switch.test.ts | 8 + tests/unit/data.test.ts | 125 +++++ tests/unit/location_switch.test.ts | 54 +++ tests/unit/util/utils_recall.test.ts | 30 ++ tsconfig.json | 27 +- 43 files changed, 1813 insertions(+), 1313 deletions(-) create mode 100644 src/Events/touchEvent.ts delete mode 100644 src/dataStore/dataSyncer.ts create mode 100644 src/dataStore/itemToDecks.ts create mode 100644 src/settings/responseBarSetting.ts create mode 100644 tests/unit/algorithms_switch.test.ts create mode 100644 tests/unit/data.test.ts create mode 100644 tests/unit/util/utils_recall.test.ts diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index b8afae53..795492b1 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -6,6 +6,11 @@ labels: bug assignees: "" --- +**Before report the bug** + +- [ ] searched the issues; +- [ ] disable origin `Obsidian Sapced Repetition` plugin; + **Describe the bug** A clear and concise description of what the bug is. @@ -23,12 +28,24 @@ A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain the bug. This could be the logs in the developer console (`CTRL` + `SHIFT` + `i`). +- [ ] error messages + **Versions (please complete the following information):** -- OS: [e.g. iOS] -- Obsidian version: [e.g. v0.12.4] -- Plugin version: [e.g. v1.4.9] -- If on desktop, Installer version: [run `this.navigator.appVersion` on the developer console, e.g. `5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/0.12.3 Chrome/89.0.4389.128 Electron/12.0.6 Safari/537.36"`] +- [ ] OS: [e.g. iOS] +- [ ] Obsidian version: [e.g. v0.12.4] +- [ ] Plugin version: [e.g. v1.4.9] +- [ ] If on desktop, Installer version: [run `this.navigator.appVersion` on the developer console, e.g. `5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/0.12.3 Chrome/89.0.4389.128 Electron/12.0.6 Safari/537.36"`] **Additional context** Add any other context about the problem here (e.g. the markdown producing the error). + +- Data Location Setting(select): +- [ ] Save in Note; +- [ ] Save in `tracked_files.json` +- Algorithm(select): +- [ ] Default +- [ ] Anki +- [ ] Fsrs +- [ ] SM2 +- [ ] Additional context diff --git a/docs/usage.md b/docs/usage.md index 3dd585f1..a4233089 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -54,6 +54,10 @@ Add a label corresponding to a review card to your notes, or convert review note Review notes can be opened from the command line, or from your computer by clicking Notes in the status bar/right sidebar. Feedback on memorization level is available via command line, hover bar or menu bar +- On computer , right-click on the floating bar, you can close it, set time interval visible/hidden; +- On mobile, swipup from the floating bar, close it , long press the floating bar to setting time interval visible/hidden; +- time interval visible/hidden Suggestion: review is not shown, progressive summary/incremental writing is shown; + #### Review Cards Review is available via the command line, or on the computer by clicking on the cards in the left side navigation bar. @@ -73,7 +77,7 @@ Via command line, `SR Item Info`, you can view review information for current/al Different algorithms have different parameters, please try to use one algorithm instead of switching algorithms repeatedly. [Algorithms desc](. /en/algorithms.md) -default(Anki modified)、Anki: [Algorithms desc](./en/algorithms.md) +[default(Anki modified)](./en/algorithms.md)、[Anki](https://github.com/martin-jw/obsidian-recall#currently-available-algorithms) 、 [FSRS](https://github.com/open-spaced-repetition/fsrs.js) #### Experimental function diff --git "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" index 8e0cee92..02c2cd71 100644 --- "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" +++ "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" @@ -56,6 +56,10 @@ 通过命令行,或电脑端点击状态栏/右侧边栏的笔记就可以打开复习笔记。通过命令行、悬浮栏或菜单栏可反馈记忆程度 +- 电脑端,在悬浮栏单击右键,可以关闭浮栏、设置 时间间隔显隐; +- 移动端,从浮栏向上滑 关闭浮栏,长按浮栏 设置 时间间隔显隐。 +- 时间间隔显隐 建议:复习类不显示,渐进总结/增量写作显示; + #### 复习卡片 通过命令行,或电脑端点击左侧边导航栏的卡片就可以复习。 @@ -74,7 +78,7 @@ #### 算法Algorithms 不同算法参数不同,请尽量使用一个算法,不要反复切换算法。 -默认的 Anki 优化算法、Anki 算法 : [Algorithms desc](./en/algorithms.md) +[默认的 Anki 优化算法](./en/algorithms.md)、[Anki 算法](https://github.com/martin-jw/obsidian-recall#currently-available-algorithms) 、 [Fsrs 算法](https://github.com/open-spaced-repetition/fsrs.js) #### 实验性功能 diff --git a/src/Events/touchEvent.ts b/src/Events/touchEvent.ts new file mode 100644 index 00000000..0afe0005 --- /dev/null +++ b/src/Events/touchEvent.ts @@ -0,0 +1,138 @@ +import { debug } from "src/util/utils_recall"; + +interface IminTouch { + identifier: number; + pageX: number; + pageY: number; +} + +export class TouchOnMobile { + timeStart = 0; + + originTouches: IminTouch[] = []; + ongoingTouches: IminTouch[] = []; + + public showcb: () => void; + public closecb: () => void; + + static create() { + return new TouchOnMobile(); + } + constructor() {} + + handleStart(evt: TouchEvent) { + const touches = evt.changedTouches; + this.timeStart = Date.now(); + for (let i = 0; i < touches.length; i++) { + // console.debug("开始第 " + i + " 个触摸 ..."); + this.originTouches.push(copyTouch(touches[i])); + this.ongoingTouches.push(copyTouch(touches[i])); + } + } + + handleMove(evt: TouchEvent) { + // evt.preventDefault(); + const touches = evt.changedTouches; + + for (let i = 0; i < touches.length; i++) { + const idx = this.finTouchesIndexById(touches[i].identifier); + + if (idx >= 0) { + // console.debug("继续第 " + idx + "个触摸。"); + // console.debug("ctx.lineTo(" + touches[i].pageX + ", " + touches[i].pageY + ");"); + this.ongoingTouches.splice(idx, 1, copyTouch(touches[i])); // 切换触摸信息 + } else { + console.debug("无法确定下一个触摸点。"); + } + } + } + + handleEnd(evt: TouchEvent) { + // console.debug("触摸结束。"); + const touches = evt.changedTouches; + + for (let i = 0; i < touches.length; i++) { + const idx = this.finTouchesIndexById(touches[i].identifier); + // const msg = `end touches len: ${touches.length}`; + // debug(this.handleEnd, {msg}); + if (idx >= 0) { + if (this.isSwipUp(idx)) { + evt.preventDefault(); + this.closecb(); + } else if (this.isLongClick(idx)) { + evt.preventDefault(); + this.showcb(); + } + // const msg = `移除 ${idx} (${ongoingTouches[idx].pageX}, ${ongoingTouches[idx].pageY}) timeDur: ${getTimeDuration()} `; + + this.originTouches.splice(idx, 1); // 用完后移除 + this.ongoingTouches.splice(idx, 1); // 用完后移除 + } else { + // console.debug("无法确定要结束哪个触摸点。"); + } + } + } + + handleCancel(evt: TouchEvent) { + evt.preventDefault(); + console.debug("触摸取消。"); + const touches = evt.changedTouches; + + for (let i = 0; i < touches.length; i++) { + const idx = this.finTouchesIndexById(touches[i].identifier); + this.originTouches.splice(idx, 1); // 用完后移除 + this.ongoingTouches.splice(idx, 1); // 用完后移除 + } + } + + finTouchesIndexById(idToFind: number) { + const idx = this.ongoingTouches.findIndex((t) => { + return idToFind === t.identifier; + }); + return idx; + } + isSwipUp(idx: number) { + const moveXDiff = 30; + const moveYDiff = 50; + const timeDiff = 200; // ms + // const msg = `actxdiff: ${this.absXDiff(idx)}, actydiff: ${this.actYDiff( + // idx, + // )}, time dur: ${this.getTimeDuration()}`; + // debug(this.isSwipUp, { msg }); + return ( + this.getTimeDuration() < timeDiff && + this.absXDiff(idx) < moveXDiff && + this.actYDiff(idx) > moveYDiff + ); + } + + isLongClick(idx: number) { + const longClickDiff = 10; + const timeDiff = 800; // ms + return ( + this.getTimeDuration() > timeDiff && + this.absXDiff(idx) < longClickDiff && + Math.abs(this.actYDiff(idx)) < longClickDiff + ); + } + + getTimeDuration() { + return Date.now() - this.timeStart; + } + + actYDiff(idx: number) { + return this.originTouches[idx].pageY - this.ongoingTouches[idx].pageY; + } + + absXDiff(idx: number) { + return Math.abs(this.originTouches[idx].pageX - this.ongoingTouches[idx].pageX); + } +} + +function copyTouch(touch: Touch) { + return { + identifier: touch.identifier, + pageX: touch.pageX, + pageY: touch.pageY, + }; +} diff --git a/src/NoteEaseList.ts b/src/NoteEaseList.ts index 0424f3c7..f55ec3fc 100644 --- a/src/NoteEaseList.ts +++ b/src/NoteEaseList.ts @@ -31,6 +31,9 @@ export class NoteEaseList implements INoteEaseList { } setEaseForPath(path: string, ease: number): void { + if (this.hasEaseForPath(path)) { + ease = (this.getEaseByPath(path) + ease) / 2; + } this.dict[path] = ease; } } diff --git a/src/Question.ts b/src/Question.ts index c94d879f..901d9ca4 100644 --- a/src/Question.ts +++ b/src/Question.ts @@ -1,6 +1,7 @@ import { Card } from "./Card"; import { CardScheduleInfo, NoteCardScheduleParser } from "./CardSchedule"; import { SR_HTML_COMMENT_BEGIN, SR_HTML_COMMENT_END } from "./constants"; +import { DataLocation } from "./dataStore/location_switch"; import { Note } from "./Note"; import { SRSettings } from "./settings"; import { TopicPath } from "./TopicPath"; @@ -152,6 +153,9 @@ export class Question { formatForNote(settings: SRSettings): string { let result: string = this.questionText.formatForNote(); + if (settings.dataLocation !== DataLocation.SaveOnNoteFile) { + return result; + } if (this.cards.some((card) => card.hasSchedule)) { result += this.getHtmlCommentSeparator(settings) + this.formatScheduleAsHtmlComment(settings); diff --git a/src/QuestionType.ts b/src/QuestionType.ts index 2592d07b..cfd48163 100644 --- a/src/QuestionType.ts +++ b/src/QuestionType.ts @@ -111,7 +111,7 @@ class QuestionType_Cloze implements IQuestionTypeHandler { deletionEnd: number = deletionStart + m[0].length; front = questionText.substring(0, deletionStart) + - QuestionType_ClozeUtil.renderClozeFront() + + QuestionType_ClozeUtil.renderClozeFront(m[0].length) + questionText.substring(deletionEnd); front = front .replace(/==/gm, "") @@ -137,8 +137,9 @@ class QuestionType_Cloze implements IQuestionTypeHandler { } export class QuestionType_ClozeUtil { - static renderClozeFront(): string { - return "[...]"; + static renderClozeFront(len:number=3): string { + const rpt = Math.round(len/3); + return "["+"...".repeat(rpt)+"]"; } static renderClozeBack(str: string): string { diff --git a/src/ReviewDeck.ts b/src/ReviewDeck.ts index b35fbb29..664817b6 100644 --- a/src/ReviewDeck.ts +++ b/src/ReviewDeck.ts @@ -1,11 +1,17 @@ import { App, FuzzySuggestModal, TFile } from "obsidian"; -import { SchedNote } from "src/main"; import { t } from "src/lang/helpers"; +import { RepetitionItem } from "./dataStore/repetitionItem"; + +export interface SchedNote { + note: TFile; + item?: RepetitionItem; + dueUnix?: number; +} export class ReviewDeck { public deckName: string; - public newNotes: TFile[] = []; + public newNotes: SchedNote[] = []; public scheduledNotes: SchedNote[] = []; public activeFolders: Set; public dueNotesCount = 0; @@ -18,7 +24,8 @@ export class ReviewDeck { public sortNotes(pageranks: Record): void { // sort new notes by importance this.newNotes = this.newNotes.sort( - (a: TFile, b: TFile) => (pageranks[b.path] || 0) - (pageranks[a.path] || 0), + (a: SchedNote, b: SchedNote) => + (pageranks[b.note.path] || 0) - (pageranks[a.note.path] || 0), ); // sort scheduled notes by date & within those days, sort them by importance diff --git a/src/TopicPath.ts b/src/TopicPath.ts index d09c62e2..a822020f 100644 --- a/src/TopicPath.ts +++ b/src/TopicPath.ts @@ -1,5 +1,5 @@ import { SRSettings } from "src/settings"; -import { OBSIDIAN_TAG_AT_STARTOFLINE_REGEX } from "./constants"; +import { DEFAULT_DECKNAME, OBSIDIAN_TAG_AT_STARTOFLINE_REGEX } from "./constants"; import { ISRFile } from "./SRFile"; import { DataStore } from "src/dataStore/data"; import { DataLocation } from "src/dataStore/location_switch"; @@ -82,9 +82,9 @@ export class TopicPath { if (settings.dataLocation !== DataLocation.SaveOnNoteFile && store != undefined) { if (result.isEmptyPath) { if (store.isTracked(noteFile.path)) { - let deckName = store.getFileLasTag(noteFile.path); + let deckName = store.getTrackedFile(noteFile.path).lastTag; if (deckName == null) { - deckName = store.defaultDackName; + deckName = DEFAULT_DECKNAME; } else if (TopicPath.isValidTag(deckName)) { deckName = deckName.slice(1); } diff --git a/src/algorithms/algorithms.ts b/src/algorithms/algorithms.ts index 95251e47..8f83597b 100644 --- a/src/algorithms/algorithms.ts +++ b/src/algorithms/algorithms.ts @@ -1,11 +1,15 @@ -import { algorithmNames } from "./algorithms_switch"; -import { ReviewResult } from "src/dataStore/data"; import { MiscUtils } from "src/util/utils_recall"; -import { RPITEMTYPE, RepetitionItem } from "src/dataStore/repetitionItem"; +import { RPITEMTYPE, RepetitionItem, ReviewResult } from "src/dataStore/repetitionItem"; -export default abstract class SrsAlgorithm { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - settings: any; +export enum algorithmNames { + Default = "Default", + Anki = "Anki", + Fsrs = "Fsrs", + SM2 = "SM2", +} + +export abstract class SrsAlgorithm { + settings: unknown; // plugin: SRPlugin; private dueDates: { [type: string]: Record }; public static instance: SrsAlgorithm; @@ -18,8 +22,7 @@ export default abstract class SrsAlgorithm { return SrsAlgorithm.instance; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - updateSettings(settings: any) { + updateSettings(settings: unknown) { this.settings = MiscUtils.assignOnly(this.defaultSettings(), settings); // this.plugin = plugin; SrsAlgorithm.instance = this; @@ -30,7 +33,7 @@ export default abstract class SrsAlgorithm { this.dueDates[RPITEMTYPE.CARD] = carddueDates; } getDueDates(itemType: string) { - return this.dueDates[itemType]; + return this.dueDates && itemType in this.dueDates ? this.dueDates[itemType] : undefined; } abstract defaultSettings(): unknown; @@ -39,6 +42,8 @@ export default abstract class SrsAlgorithm { abstract calcAllOptsIntervals(item: RepetitionItem): number[]; abstract srsOptions(): string[]; abstract importer(fromAlgo: algorithmNames, items: RepetitionItem[]): void; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - abstract displaySettings(containerEl: HTMLElement, update: (settings: any) => void): void; + abstract displaySettings( + containerEl: HTMLElement, + update: (settings: unknown, refresh?: boolean) => void, + ): void; } diff --git a/src/algorithms/algorithms_switch.ts b/src/algorithms/algorithms_switch.ts index aad2a1b8..829cb5a4 100644 --- a/src/algorithms/algorithms_switch.ts +++ b/src/algorithms/algorithms_switch.ts @@ -1,5 +1,5 @@ import { Notice } from "obsidian"; -import SrsAlgorithm from "src/algorithms/algorithms"; +import { SrsAlgorithm, algorithmNames } from "src/algorithms/algorithms"; import SRPlugin from "src/main"; import { AnkiAlgorithm } from "./anki"; import { FsrsAlgorithm } from "./fsrs"; @@ -13,13 +13,6 @@ export const algorithms: Record = { SM2: new Sm2Algorithm(), }; -export enum algorithmNames { - Default = "Default", - Anki = "Anki", - Fsrs = "Fsrs", - SM2 = "SM2", -} - /** * algorithmSwitchData * @param fromAlgo diff --git a/src/algorithms/anki.ts b/src/algorithms/anki.ts index a03431f5..588530d0 100644 --- a/src/algorithms/anki.ts +++ b/src/algorithms/anki.ts @@ -1,12 +1,10 @@ import { Setting, Notice } from "obsidian"; import { DateUtils, MiscUtils } from "src/util/utils_recall"; -import SrsAlgorithm from "./algorithms"; -import { ReviewResult } from "src/dataStore/data"; +import { SrsAlgorithm, algorithmNames } from "./algorithms"; import deepcopy from "deepcopy"; -import { algorithmNames } from "./algorithms_switch"; import { FsrsData } from "./fsrs"; import { balance } from "./balance/balance"; -import { RepetitionItem } from "src/dataStore/repetitionItem"; +import { RepetitionItem, ReviewResult } from "src/dataStore/repetitionItem"; export interface AnkiData { ease: number; @@ -170,8 +168,10 @@ export class AnkiAlgorithm extends SrsAlgorithm { }); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - displaySettings(containerEl: HTMLElement, update: (settings: any) => void) { + displaySettings( + containerEl: HTMLElement, + update: (settings: AnkiSettings, refresh?: boolean) => void, + ) { containerEl.createDiv().innerHTML = '用于间隔重复的算法. 更多信息请查阅 Anki算法.'; new Setting(containerEl) diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index 6dd39235..08cc2bc3 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -1,16 +1,15 @@ import { Setting, Notice } from "obsidian"; import { DateUtils } from "src/util/utils_recall"; -import SrsAlgorithm from "./algorithms"; -import { DataStore, ReviewResult } from "../dataStore/data"; +import { SrsAlgorithm, algorithmNames } from "./algorithms"; +import { DataStore } from "../dataStore/data"; import * as fsrsjs from "fsrs.js"; import { t } from "src/lang/helpers"; import deepcopy from "deepcopy"; -import { algorithmNames } from "./algorithms_switch"; import { AnkiData } from "./anki"; import { Rating, ReviewLog } from "fsrs.js"; import { balance } from "./balance/balance"; -import { RepetitionItem } from "src/dataStore/repetitionItem"; +import { RepetitionItem, ReviewResult } from "src/dataStore/repetitionItem"; // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/Settings.ts let applyDebounceTimer = 0; @@ -320,7 +319,10 @@ export class FsrsAlgorithm extends SrsAlgorithm { }); } - displaySettings(containerEl: HTMLElement, update: (settings: FsrsSettings) => void) { + displaySettings( + containerEl: HTMLElement, + update: (settings: FsrsSettings, refresh?: boolean) => void, + ) { if (!this.initFlag) { this.getLogfilepath(); this.updateFsrsParams(); @@ -367,7 +369,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { this.settings.request_retention = this.defaultSettings().request_retention; this.fsrs.p.request_retention = this.settings.request_retention; - update(this.settings); + update(this.settings, true); }); }); }); @@ -404,7 +406,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { applySettingsUpdate(async () => { this.settings.maximum_interval = this.fsrs.p.maximum_interval = this.defaultSettings().maximum_interval; - update(this.settings); + update(this.settings, true); }); }); }); @@ -439,7 +441,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { .onClick(async () => { applySettingsUpdate(async () => { this.settings.w = this.fsrs.p.w = this.defaultSettings().w; - update(this.settings); + update(this.settings, true); }); }); }) diff --git a/src/algorithms/priorities/linkPageranks.ts b/src/algorithms/priorities/linkPageranks.ts index 16a1a795..7804f3f5 100644 --- a/src/algorithms/priorities/linkPageranks.ts +++ b/src/algorithms/priorities/linkPageranks.ts @@ -1,87 +1,128 @@ -import { TFile } from "obsidian"; +import { MetadataCache, TFile } from "obsidian"; import { NoteEaseList } from "src/NoteEaseList"; import * as graph from "pagerank.js"; -import { LinkStat } from "src/main"; import { SRSettings } from "src/settings"; -export function updategraphLink(incomingLinks: Record, noteFile: TFile) { - if (incomingLinks[noteFile.path] === undefined) { - incomingLinks[noteFile.path] = []; +export interface LinkStat { + sourcePath: string; + linkCount: number; +} + +export class LinkRank { + settings: SRSettings; + + incomingLinks: Record = {}; + metadataCache: MetadataCache; + + private _pageranks: Record = {}; + + constructor(settings: SRSettings, metadataCache: MetadataCache) { + this.settings = settings; + this.metadataCache = metadataCache; + graph.reset(); } - const links = app.metadataCache.resolvedLinks[noteFile.path] || {}; - for (const targetPath in links) { - if (incomingLinks[targetPath] === undefined) incomingLinks[targetPath] = []; + get pageranks() { + return this._pageranks; + } - // markdown files only - if (targetPath.split(".").pop().toLowerCase() === "md") { - incomingLinks[targetPath].push({ - sourcePath: noteFile.path, - linkCount: links[targetPath], - }); + readLinks(notes: TFile[]) { + notes.map((note) => this._readLink(note)); + this.calcPageRanks(); + } + + /** + * should be called after this.update(), or after looping notes. + * @param note + * @param easeByPath + * @returns + */ + getContribution(note: TFile, easeByPath: NoteEaseList) { + const algoSettings = this.settings.algorithmSettings[this.settings.algorithm]; + const baseEase = algoSettings.baseEase; + let linkTotal = 0, + linkPGTotal = 0, + totalLinkCount = 0; - graph.link(noteFile.path, targetPath, links[targetPath]); + for (const statObj of this.incomingLinks[note.path] || []) { + const ease: number = easeByPath.getEaseByPath(statObj.sourcePath); + if (ease) { + linkTotal += statObj.linkCount * this._pageranks[statObj.sourcePath] * ease; + linkPGTotal += this._pageranks[statObj.sourcePath] * statObj.linkCount; + totalLinkCount += statObj.linkCount; + } } - } -} -export function calcLinkContribution( - note: TFile, - easeByPath: NoteEaseList, - incomingLinks: Record, - pageranks: Record, - settings: SRSettings, -) { - const algoSettings = settings.algorithmSettings[settings.algorithm]; - const baseEase = algoSettings.baseEase; - let linkTotal = 0, - linkPGTotal = 0, - totalLinkCount = 0; - - for (const statObj of incomingLinks[note.path] || []) { - const ease: number = easeByPath.getEaseByPath(statObj.sourcePath); - if (ease) { - linkTotal += statObj.linkCount * pageranks[statObj.sourcePath] * ease; - linkPGTotal += pageranks[statObj.sourcePath] * statObj.linkCount; - totalLinkCount += statObj.linkCount; + const outgoingLinks = this.metadataCache.resolvedLinks[note.path] || {}; + for (const linkedFilePath in outgoingLinks) { + const ease: number = easeByPath.getEaseByPath(linkedFilePath); + if (ease) { + const prank = outgoingLinks[linkedFilePath] * this._pageranks[linkedFilePath]; + linkTotal += prank * ease; + linkPGTotal += prank; + totalLinkCount += outgoingLinks[linkedFilePath]; + } } - } - const outgoingLinks = app.metadataCache.resolvedLinks[note.path] || {}; - for (const linkedFilePath in outgoingLinks) { - const ease: number = easeByPath.getEaseByPath(linkedFilePath); - if (ease) { - const prank = outgoingLinks[linkedFilePath] * pageranks[linkedFilePath]; - linkTotal += prank * ease; - linkPGTotal += prank; - totalLinkCount += outgoingLinks[linkedFilePath]; + // fix: settings.maxLinkFactor will be used in three algorithm, but not show in settings. + const linkContribution: number = + this.settings.maxLinkFactor * + Math.min(1.0, Math.log(totalLinkCount + 0.5) / Math.log(64)); + + let ease: number = baseEase; + ease = + (1.0 - linkContribution) * baseEase + + (totalLinkCount > 0 + ? (linkContribution * linkTotal) / linkPGTotal + : linkContribution * baseEase); + // add note's average flashcard ease if available + if (Object.prototype.hasOwnProperty.call(easeByPath, note.path)) { + ease = (ease + easeByPath.getEaseByPath(note.path)) / 2; + } + ease = Math.round(ease * 100) / 100; + if (isNaN(ease)) { + throw new Error("ease: NaN."); } - } - // fix: settings.maxLinkFactor will be used in three algorithm, but not show in settings. - const linkContribution: number = - settings.maxLinkFactor * Math.min(1.0, Math.log(totalLinkCount + 0.5) / Math.log(64)); - - let ease: number = baseEase; - ease = - (1.0 - linkContribution) * baseEase + - (totalLinkCount > 0 - ? (linkContribution * linkTotal) / linkPGTotal - : linkContribution * baseEase); - // add note's average flashcard ease if available - if (Object.prototype.hasOwnProperty.call(easeByPath, note.path)) { - ease = (ease + easeByPath.getEaseByPath(note.path)) / 2; + return { + linkContribution, + totalLinkCount, + linkTotal, + linkPGTotal, + ease, + }; } - ease = Math.round(ease * 100) / 100; - if (isNaN(ease)) { - throw new Error("ease: NaN."); + + /** + * just get single note links. + * @param noteFile + * @returns + */ + _readLink(noteFile: TFile) { + if (this.incomingLinks[noteFile.path] === undefined) { + this.incomingLinks[noteFile.path] = []; + } + + const links = app.metadataCache.resolvedLinks[noteFile.path] || {}; + for (const targetPath in links) { + if (this.incomingLinks[targetPath] === undefined) this.incomingLinks[targetPath] = []; + + // markdown files only + if (targetPath.split(".").pop().toLowerCase() === "md") { + this.incomingLinks[targetPath].push({ + sourcePath: noteFile.path, + linkCount: links[targetPath], + }); + + graph.link(noteFile.path, targetPath, links[targetPath]); + } + } + return this.incomingLinks; } - return { - linkContribution, - totalLinkCount, - linkTotal, - linkPGTotal, - ease, - }; + calcPageRanks() { + graph.rank(0.85, 0.000001, (node: string, rank: number) => { + this._pageranks[node] = rank * 10000; + }); + } } diff --git a/src/algorithms/scheduling_default.ts b/src/algorithms/scheduling_default.ts index 0fcd157e..458f1ebf 100644 --- a/src/algorithms/scheduling_default.ts +++ b/src/algorithms/scheduling_default.ts @@ -3,14 +3,12 @@ import { Notice, Setting } from "obsidian"; import { t } from "src/lang/helpers"; import { DateUtils } from "src/util/utils_recall"; -import SrsAlgorithm from "./algorithms"; -import { ReviewResult } from "src/dataStore/data"; +import { SrsAlgorithm, algorithmNames } from "./algorithms"; import deepcopy from "deepcopy"; -import { algorithmNames } from "./algorithms_switch"; import { AnkiData } from "./anki"; import { FsrsData } from "./fsrs"; import { balance } from "./balance/balance"; -import { RepetitionItem } from "src/dataStore/repetitionItem"; +import { RepetitionItem, ReviewResult } from "src/dataStore/repetitionItem"; // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/Settings.ts let applyDebounceTimer = 0; @@ -213,7 +211,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { displaySettings( containerEl: HTMLElement, - update: (settings: DefaultAlgoSettings) => void, + update: (settings: DefaultAlgoSettings, refresh?: boolean) => void, ): void { containerEl.createDiv().innerHTML = t("CHECK_ALGORITHM_WIKI", { algo_url: "https://www.stephenmwangi.com/obsidian-spaced-repetition/algorithms/", @@ -252,7 +250,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { .onClick(async () => { applySettingsUpdate(() => { this.settings.baseEase = DEFAULTSETTINGS.baseEase; - update(this.settings); + update(this.settings, true); }); }); }); @@ -278,7 +276,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { applySettingsUpdate(async () => { this.settings.lapsesIntervalChange = DEFAULTSETTINGS.lapsesIntervalChange; - update(this.settings); + update(this.settings, true); }); }); }); @@ -312,7 +310,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { .onClick(async () => { applySettingsUpdate(async () => { this.settings.easyBonus = DEFAULTSETTINGS.easyBonus; - update(this.settings); + update(this.settings, true); }); }); }); @@ -346,7 +344,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { .onClick(async () => { applySettingsUpdate(async () => { this.settings.maximumInterval = DEFAULTSETTINGS.maximumInterval; - update(this.settings); + update(this.settings, true); }); }); }); @@ -371,7 +369,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { .onClick(async () => { applySettingsUpdate(async () => { this.settings.maxLinkFactor = DEFAULTSETTINGS.maxLinkFactor; - update(this.settings); + update(this.settings, true); }); }); }); diff --git a/src/algorithms/supermemo.ts b/src/algorithms/supermemo.ts index 0e333535..f6639739 100644 --- a/src/algorithms/supermemo.ts +++ b/src/algorithms/supermemo.ts @@ -1,11 +1,9 @@ import { DateUtils, MiscUtils } from "src/util/utils_recall"; -import SrsAlgorithm from "./algorithms"; -import { ReviewResult } from "src/dataStore/data"; +import { SrsAlgorithm, algorithmNames } from "./algorithms"; import deepcopy from "deepcopy"; import { AnkiAlgorithm, AnkiSettings } from "./anki"; -import { algorithmNames } from "./algorithms_switch"; import { balance } from "./balance/balance"; -import { RepetitionItem } from "src/dataStore/repetitionItem"; +import { RepetitionItem, ReviewResult } from "src/dataStore/repetitionItem"; interface Sm2Data { ease: number; @@ -105,15 +103,17 @@ export class Sm2Algorithm extends SrsAlgorithm { anki.importer(fromAlgo, items); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any - displaySettings(containerEl: HTMLElement, update: (settings: any) => void): void { + displaySettings( + containerEl: HTMLElement, + update: (settings: AnkiSettings, refresh?: boolean) => void, + ): void { containerEl.createDiv().innerHTML = '用于间隔重复的算法. 目前与Anki算法共用参数(仅算法处理方式不同),更多信息请查阅 sm2算法.'; const anki = new AnkiAlgorithm(); anki.updateSettings(this.settings); - anki.displaySettings(containerEl, (settings) => { - update((this.settings = settings)); + anki.displaySettings(containerEl, (settings, refresh?: boolean) => { + update((this.settings = settings), refresh); }); } } diff --git a/src/commands.ts b/src/commands.ts index 469d5633..d26addc8 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -3,6 +3,7 @@ import ObsidianSrsPlugin from "./main"; import { ReviewNote } from "src/reviewNote/review-note"; import { ItemInfoModal } from "src/gui/info"; import { Queue } from "./dataStore/queue"; +import { debug } from "./util/utils_recall"; export default class Commands { plugin: ObsidianSrsPlugin; @@ -22,6 +23,16 @@ export default class Commands { if (file) { if (plugin.store.isTracked(file.path)) { if (!checking) { + const store = this.plugin.store; + const deckname = store.getTrackedFile(file.path).lastTag; + const deck = this.plugin.reviewDecks[deckname]; + const msg = `${deckname} has ${deck.dueNotesCount} dueCount(till today end),\n note onDueC ${this.plugin.noteStats.onDueCount} (till now).`; + debug("itemInfo", 0, { + msg, + noteStats: this.plugin.noteStats, + // decks: deck.scheduledNotes.map((sn) => [sn.note.path, sn.item]), + que: store.data.queues, + }); new ItemInfoModal(plugin.data.settings, file).open(); } return true; diff --git a/src/constants.ts b/src/constants.ts index e85f0846..79f91ff8 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -33,3 +33,5 @@ export const TICKS_PER_DAY = 24 * 3600 * 1000; export const SR_HTML_COMMENT_BEGIN = ""; + +export const DEFAULT_DECKNAME = "default"; diff --git a/src/dataStore/data.ts b/src/dataStore/data.ts index fc15d2ab..9961b25e 100644 --- a/src/dataStore/data.ts +++ b/src/dataStore/data.ts @@ -1,17 +1,16 @@ import { MiscUtils } from "src/util/utils_recall"; import { SRSettings } from "../settings"; -import { TFile, TFolder, Notice, getAllTags } from "obsidian"; +import { TFile, TFolder, getAllTags } from "obsidian"; import { FsrsData } from "src/algorithms/fsrs"; import { AnkiData } from "src/algorithms/anki"; -import { algorithmNames } from "src/algorithms/algorithms_switch"; import { getStorePath } from "src/dataStore/location_switch"; import { Tags } from "src/tags"; -import SrsAlgorithm from "src/algorithms/algorithms"; +import { SrsAlgorithm, algorithmNames } from "src/algorithms/algorithms"; import { CardInfo, TrackedFile } from "./trackedFile"; -import { RPITEMTYPE, RepetitionItem } from "./repetitionItem"; +import { RPITEMTYPE, RepetitionItem, ReviewResult } from "./repetitionItem"; import { DEFAULT_QUEUE_DATA, Queue } from "./queue"; /** @@ -48,21 +47,7 @@ export interface SrsData { export type ReviewedCounts = Record; -/** - * ReviewResult. - */ -export interface ReviewResult { - /** - * @type {boolean} - */ - correct: boolean; - /** - * @type {number} - */ - nextReview: number; -} - -const DEFAULT_SRS_DATA: SrsData = { +export const DEFAULT_SRS_DATA: SrsData = { queues: Object.assign({}, DEFAULT_QUEUE_DATA) as Queue, reviewedCounts: {}, reviewedCardCounts: {}, @@ -77,10 +62,6 @@ const DEFAULT_SRS_DATA: SrsData = { export class DataStore { static instance: DataStore; - /** - * @type {string} - */ - private _defaultDeckname = "default"; /** * @type {SrsData} */ @@ -104,10 +85,6 @@ export class DataStore { return DataStore.instance; } - get defaultDackName() { - return this._defaultDeckname; - } - /** * * @param settings @@ -122,20 +99,8 @@ export class DataStore { } toInstances() { - this.data.trackedFiles.forEach((tf, idx) => { - tf = TrackedFile.create(tf); - this.data.trackedFiles[idx] = tf; - if (tf != null) { - this.getItembyID(tf.noteId); - if (tf.hasCards) { - tf.cardItems.forEach((cinfo: CardInfo) => { - cinfo.itemIds.forEach((id) => { - this.getItembyID(id); - }); - }); - } - } - }); + this.data.trackedFiles = this.data.trackedFiles.map(TrackedFile.create); + this.data.items = this.data.items.map(RepetitionItem.create); this.data.queues = Queue.create(this.data.queues); } @@ -143,20 +108,29 @@ export class DataStore { * load. */ async load(path = this.dataPath) { - const adapter = app.vault.adapter; - - if (await adapter.exists(path)) { - const data = await adapter.read(path); - if (data == null) { - console.log("Unable to read SRS data!"); - this.data = Object.assign({}, DEFAULT_SRS_DATA); + try { + const adapter = app.vault.adapter; + + if (await adapter.exists(path)) { + const data = await adapter.read(path); + if (data == null) { + console.log("Unable to read SRS data!"); + this.data = Object.assign({}, DEFAULT_SRS_DATA); + } else { + console.log("Reading tracked files..."); + this.data = Object.assign( + Object.assign({}, DEFAULT_SRS_DATA), + JSON.parse(data), + ); + this.data.mtime = await this.getmtime(); + } } else { - console.log("Reading tracked files..."); - this.data = Object.assign(Object.assign({}, DEFAULT_SRS_DATA), JSON.parse(data)); - this.data.mtime = await this.getmtime(); + console.log("Tracked files not found! Creating new file..."); + this.data = Object.assign({}, DEFAULT_SRS_DATA); + await this.save(); } - } else { - console.log("Tracked files not found! Creating new file..."); + } catch (error) { + console.log(error + "Tracked files not found! Creating new file..."); this.data = Object.assign({}, DEFAULT_SRS_DATA); await this.save(); } @@ -182,15 +156,14 @@ export class DataStore { * save. */ async save(path = this.dataPath) { - await app.vault.adapter.write(path, JSON.stringify(this.data)).catch((e) => { - new Notice("Unable to save data file!"); - console.log(e); + try { + await app.vault.adapter.write(path, JSON.stringify(this.data)); + } catch (error) { + MiscUtils.notice("Unable to save data file!"); + console.log(error); return; - }); + } this.data.mtime = await this.getmtime(); - // if (path !== this.dataPath) { - // this.dataPath = path; - // } } /** @@ -235,25 +208,12 @@ export class DataStore { }); } - getFileId(path: string): number { - const fileInd = this.getFileIndex(path); - if (fileInd == -1) { - return -1; - } - const fileId = this.data.trackedFiles[fileInd].items["file"]; - return fileId; - } - getTrackedFile(path: string): TrackedFile { const ind = this.getFileIndex(path); if (ind < 0) { return null; } - let tf: TrackedFile = this.data.trackedFiles[ind]; - if (!(tf instanceof TrackedFile)) { - tf = this.data.trackedFiles[ind] = TrackedFile.create(tf); - } - return tf; + return this.data.trackedFiles[ind]; } /** @@ -263,7 +223,8 @@ export class DataStore { */ isTracked(path: string): boolean { const ind = this.getFileIndex(path); - const fid = this.getFileId(path); + if (ind < 0) return false; + const fid = this.getFileByIndex(ind).noteID; return ind >= 0 && fid >= 0; } @@ -289,7 +250,7 @@ export class DataStore { isCardItem(id: number) { const item = this.getItembyID(id); const file = this.getFileByIndex(item.fileIndex); - return file.items.file !== id; + return file.noteID !== id; } /** @@ -312,39 +273,31 @@ export class DataStore { } getItembyID(id: number): RepetitionItem { - if (id < 0) { - return null; - } - let ind = -1; - let item = this.data.items.find((item: RepetitionItem, idx) => { - if (item != null && item.ID === id) { - ind = idx; - return true; - } - }); - if (item != undefined && !(item instanceof RepetitionItem)) { - item = this.data.items[ind] = RepetitionItem.create(item); - } - return item; + return id < 0 + ? null + : this.data.items.find((item: RepetitionItem, _idx) => { + if (item != null && item.ID === id) { + return true; + } + }); } getFileByIndex(idx: number): TrackedFile { + // assert(idx >= 0); return this.data.trackedFiles[idx]; } /** * getItemsOfFile. - * todo: note item and cards items? * @param {string} path * @returns {RepetitionItem[]} */ getItemsOfFile(path: string): RepetitionItem[] { - const result: RepetitionItem[] = []; const file = this.getTrackedFile(path); - Object.values(file.items).forEach((itemIdx) => { - result.push(this.getItembyID(itemIdx)); - }); - return result; + return file?.isTracked ? file.itemIDs.map(this.getItembyID, this) : []; + } + getNoteItem(path: string): RepetitionItem { + return this.getItembyID(this.getTrackedFile(path)?.noteID) ?? null; } /** @@ -445,7 +398,7 @@ export class DataStore { }); if (firstCalled) { const msg = `在文件夹 ${folder.path} 下,共有 ${totalRemoved} 个文件不再跟踪重复了`; - new Notice(msg); + MiscUtils.notice(msg); console.log(msg); } return totalRemoved; @@ -490,7 +443,7 @@ export class DataStore { } }); - new Notice("Added " + totalAdded + " new items, removed " + totalRemoved + " items."); + MiscUtils.notice("Added " + totalAdded + " new items, removed " + totalRemoved + " items."); } /** @@ -508,19 +461,24 @@ export class DataStore { ): { added: number; removed: number } | null { let dname: string; let itemtype: RPITEMTYPE = RPITEMTYPE.NOTE; - + // fix: type? if (type === RPITEMTYPE.CARD) { itemtype = RPITEMTYPE.CARD; } else if (type == undefined || type === RPITEMTYPE.NOTE) { itemtype = RPITEMTYPE.NOTE; - dname = this.defaultDackName; } else { dname = type as string; } const trackedFile = new TrackedFile(path, itemtype, dname); - if (this.getFileIndex(path) < 0) { + const ind = this.getFileIndex(path); + if (ind < 0) { this.data.trackedFiles.push(trackedFile); + } else { + const tkfile = this.getFileByIndex(ind); + if (!tkfile.isTracked) { + tkfile.setTracked(itemtype, dname); + } } const data = this.updateItems(path, itemtype, dname, notice); console.log("Tracked: " + path); @@ -552,10 +510,10 @@ export class DataStore { const tags = getAllTags(fileCachedData) || []; const deckname = Tags.getNoteDeckName(note, this.settings); const cardName = Tags.getTagFromSettingTags(tags, this.settings.flashcardTags); - if (deckname !== null || cardName !== null) { + if (deckname !== null || cardName !== null || this.settings.convertFoldersToDecks) { // it's taged file, can't untrack by this. console.log(path + " is taged file, can't untrack by this."); - new Notice( + MiscUtils.notice( "it is taged file, can't untrack by this. You can delete the #review tag in note file.", ); return 0; @@ -564,6 +522,7 @@ export class DataStore { let numItems = 0; + trackedFile.setUnTracked(); for (const key in trackedFile.items) { const ind = trackedFile.items[key]; this.unTrackItem(ind); @@ -571,20 +530,16 @@ export class DataStore { // when file not exist, or doesn't have carditems, del it. let nulrstr: string; + this.data.trackedFiles[index] = null; + numItems++; if (note == null) { - this.data.trackedFiles[index] = null; nulrstr = ", because it not exist."; - numItems++; - } else { - // still have cards items, just set fileId = -1 - this.data.trackedFiles[index].items.file = -1; - numItems++; } // this.save(); // will be used when plugin.sync_Algo(), which shouldn't // this.plugin.updateStatusBar(); if (notice) { - new Notice("Untracked " + numItems + " items!"); + MiscUtils.notice("Untracked " + numItems + " items!"); } console.log("Untracked: " + path + nulrstr); @@ -654,13 +609,11 @@ export class DataStore { */ updateItems( path: string, - type?: RPITEMTYPE, - dname?: string, + type: RPITEMTYPE, + dname: string, notice?: boolean, ): { added: number; removed: number } | null { if (notice == null) notice = true; - if (type == null) type = RPITEMTYPE.NOTE; - if (dname == null) dname = this.defaultDackName; const ind = this.getFileIndex(path); if (ind == -1) { @@ -669,18 +622,13 @@ export class DataStore { } const trackedFile = this.getFileByIndex(ind); - const file = app.vault.getAbstractFileByPath(path) as TFile; - if (!file) { - console.log("Could not find file: " + path); - return; - } - let added = 0; let removed = 0; const newItems: Record = {}; - if ("file" in trackedFile.items) { + if ("file" in trackedFile.items && trackedFile.noteID > 0) { newItems["file"] = trackedFile.items["file"]; + this.getItembyID(trackedFile.noteID).setTracked(ind); } else if (type === RPITEMTYPE.NOTE) { const ID = this._updateItem(undefined, ind, type, dname); newItems["file"] = ID; @@ -701,7 +649,7 @@ export class DataStore { // this.save(); // will be used when plugin.sync_Algo(), which shouldn't if (notice) { - new Notice("Added " + added + " new items, removed " + removed + " items."); + MiscUtils.notice("Added " + added + " new items, removed " + removed + " items."); } return { added, removed }; } @@ -710,39 +658,44 @@ export class DataStore { trackedFile: TrackedFile, cardinfo: CardInfo, count: number, - deckName: string = this.defaultDackName, + deckName: string, notice?: boolean, ): { added: number; removed: number } | null { if (notice == null) notice = false; - const len = cardinfo.itemIds.length; - for (const id of cardinfo.itemIds) { - const item = this.getItembyID(id); - item.updateDeckName(deckName, true); - } - if (len === count) { + const idsLen = cardinfo.itemIds.length; + const ind = this.getFileIndex(trackedFile.path); + cardinfo.itemIds.map(this.getItembyID, this).filter((item, _idx) => { + if (_idx < count) { + item.setTracked(ind); + item.updateDeckName(deckName, true); + return true; + } + }); + if (idsLen === count) { return; } - const ind = this.getFileIndex(trackedFile.path); let added = 0; let removed = 0; const newitemIds: number[] = cardinfo.itemIds.slice(); - //delete extra items data - if (count < len) { - const rmvIds = newitemIds.slice(count); - rmvIds.forEach((id) => { - this.unTrackItem(id); - removed++; - }); - newitemIds.splice(count, len - count); - console.debug("delete %d ids:", removed, rmvIds); + if (count < idsLen) { + const untrackExtraItems = () => { + const rmvIds = newitemIds.slice(count); + rmvIds.forEach((id) => { + this.unTrackItem(id); + removed++; + }); + newitemIds.splice(count, idsLen - count); + console.debug("delete %d ids:", removed, rmvIds); + }; + untrackExtraItems(); // len = newitemIds.length; } else { // count > len // add new card data - for (let i = 0; i < count - len; i++) { + for (let i = 0; i < count - idsLen; i++) { const cardId = this._updateItem(undefined, ind, RPITEMTYPE.CARD, deckName); newitemIds.push(cardId); added += 1; @@ -754,27 +707,11 @@ export class DataStore { cardinfo.itemIds = newitemIds; // this.save(); - // console.log( - // trackedFile.path + - // " update - lineNo:" + - // cardinfo.lineNo + - // "\n Added: " + - // added + - // " new card items, removed " + - // removed + - // " card items.", - // ); + const msg = `${trackedFile.path} update - lineNo: ${cardinfo.lineNo} \n Added: ${added} new card items, removed \ + ${removed} card items.`; + console.debug(msg); if (notice) { - new Notice( - trackedFile.path + - " update - lineNo:" + - cardinfo.lineNo + - "\n Added: " + - added + - " new card items, removed " + - removed + - " card items.", - ); + MiscUtils.notice(msg); } return { added, removed }; } @@ -790,7 +727,7 @@ export class DataStore { } }), ); - new Notice("all items have been updated."); + MiscUtils.notice("all items have been updated."); } updateReviewedCounts(id: number, type: RPITEMTYPE = RPITEMTYPE.NOTE) { @@ -824,9 +761,8 @@ export class DataStore { } } - findMovedFile(trackedFile: TrackedFile): boolean { - let exists = false; - const pathArr = trackedFile.path.split("/"); + findMovedFile(path: string): string { + const pathArr = path.split("/"); const name = pathArr.last().replace(".md", ""); const notes: TFile[] = app.vault.getMarkdownFiles(); const result: string[] = []; @@ -836,11 +772,19 @@ export class DataStore { } }); if (result.length > 0) { - exists = true; - console.debug("find file: %s has been moved. %d", trackedFile.path, result.length); - trackedFile.rename(result[0]); + console.debug("find file: %s has been moved. %d", path, result.length); + return result[0]; + } + return null; + } + + updateMovedFile(trackedFile: TrackedFile): boolean { + const newpath = this.findMovedFile(trackedFile.path); + if (newpath !== null) { + trackedFile.rename(newpath); + return true; } - return exists; + return false; } /** @@ -872,144 +816,48 @@ export class DataStore { * @returns */ async pruneData() { - const items = this.data.items; const tracked_files = this.data.trackedFiles; - let removedNulltFiles = 0; - let removedNullItems = 0; - const nullFileList: number[] = []; - const nullFileList_del: number[] = []; - const nullItemList: number[] = []; - const nullItemList_del: number[] = []; + let removedItems = this.itemSize; + let removedtkfiles = tracked_files.length; this.data = MiscUtils.assignOnly(DEFAULT_SRS_DATA, this.data); - tracked_files.map((tf, ind) => { - if (tf == null) { - nullFileList.push(ind); - nullFileList_del.push(ind - nullFileList_del.length); - removedNulltFiles++; - } - }); - for (let i = 0; i < nullFileList_del.length; i++) { - tracked_files.splice(nullFileList_del[i], 1); - } - const nflMin = Math.min(...nullFileList); - items.map((item, id) => { - if (item != null && item.fileIndex >= nflMin) { - const ifind = item.fileIndex; - for (let nli = nullFileList.length - 1; nli >= 0; nli--) { - if (ifind > nullFileList[nli]) { - item.fileIndex -= nli + 1; - break; - } else if (ifind === nullFileList[nli]) { - item = null; - console.debug("pruneData: item null: " + ifind); - break; - } - } - } - if (item == null) { - nullItemList.push(id); - nullItemList_del.push(id - nullItemList_del.length); - removedNullItems++; + + this.data.trackedFiles = this.data.trackedFiles.filter((tkfile, _idx) => { + if (tkfile == null || !tkfile.isTracked) { + return false; } + return ( + tkfile.itemIDs.map(this.getItembyID, this).filter((item) => item?.isTracked) + .length > 0 + ); // this tkfile has tracked items }); - for (let i = 0; i < nullItemList_del.length; i++) { - items.splice(nullItemList_del[i], 1); - } - - // const nlMin = Math.min(...nullItemList); - // for (const trackedFile of tracked_files) { - // if (trackedFile == null) continue; - // const oldId = trackedFile.noteId; - // let newId = -1; - // if (oldId >= nlMin) { - // for (let nli = nullItemList.length - 1; nli >= 0; nli--) { - // if (oldId >= nullItemList[nli]) { - // newId = oldId > nullItemList[nli] ? oldId - (nli + 1) : -1; - // trackedFile.items.file = newId; - // this.getItembyID(newId).ID = newId; - // // console.debug("change file: id%d to id%d", oldId, newId, trackedFile); - // break; - // } - // } - // } - - // // loop itemIds, if has some id point to null, change it. - // if (!Object.prototype.hasOwnProperty.call(trackedFile, "cardItems")) { - // continue; - // } - // for (const carditem of trackedFile.cardItems) { - // if (Math.max(...carditem.itemIds) >= nlMin) { - // for (let idi = 0; idi < carditem.itemIds.length; idi++) { - // const oldId = carditem.itemIds[idi]; - // let newId = -1; - // if (oldId >= nlMin) { - // nlfor: for (let nli = nullItemList.length - 1; nli >= 0; nli--) { - // if (oldId >= nullItemList[nli]) { - // newId = oldId > nullItemList[nli] ? oldId - (nli + 1) : newId; - // carditem.itemIds.splice(idi, 1, newId); - // this.getItembyID(newId).ID = newId; - // break nlfor; - // } - // } - // } - // } - // console.debug("changed card:%s by %s", carditem.itemIds, nullFileList); - // } - // } - // } - - // console.debug("after delete nullitems:", items); + this.data.items = this.data.trackedFiles + .map((tkfile, idx) => { + return ( + tkfile.itemIDs + .map(this.getItembyID, this) + // .filter((item) => item?.isTracked) //dont have to tkfile already have filtered. + .filter((item) => { + item.fileIndex = idx; + return true; + }) + ); + }) + .flat(); + + removedtkfiles = removedtkfiles - this.data.trackedFiles.length; + removedItems = removedItems - this.itemSize; this.data.queues.clearQueue(); this.save(); console.log( "removed " + - removedNulltFiles + + removedtkfiles + " nullTrackedfile(s), removed " + - removedNullItems + + removedItems + " nullitem(s).", ); return; } - - /** - * @description: getSchedbyId , give returns to scheduling - * @param {number} id - * @return {[]} ["due-interval-ease00", dueString, interval, ease] | null for new - */ - getSchedbyId(id: number, isNumDue?: boolean): RegExpMatchArray { - const item: RepetitionItem = this.getItembyID(id); - return item.getSched(this.settings.algorithm === algorithmNames.Fsrs, isNumDue); - } - - /** - * setSchedbyId: set sched into items - * @param id - * @param sched RegExpMatchArray - * @param correct user response - * @returns - */ - setSchedbyId(id: number, sched: RegExpMatchArray | number[] | string[], correct?: boolean) { - const item: RepetitionItem = this.getItembyID(id); - if (item == null) { - console.warn("setSchedbyId failed: item === null"); - // this.updateItemById(id); //not work well yet. - return; - } - sched[0] = id; - // console.debug("setSchedbyId:", sched); - item.updateSched(sched, correct); - } - - /** - * getFileLast Tag - * @param path - * @returns tf.tags.last() - */ - getFileLasTag(path: string) { - const tf = this.getTrackedFile(path); - return tf?.lastTag ?? null; - } } diff --git a/src/dataStore/dataSyncer.ts b/src/dataStore/dataSyncer.ts deleted file mode 100644 index 4b466dea..00000000 --- a/src/dataStore/dataSyncer.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { TFile } from "obsidian"; -import { CardScheduleInfo, NoteCardScheduleParser } from "src/CardSchedule"; -import { Note } from "src/Note"; -import { ReviewDeck } from "src/ReviewDeck"; -import { SrTFile } from "src/SRFile"; -import { TopicPath } from "src/TopicPath"; -import { DataStore } from "src/dataStore/data"; -import { Stats } from "src/stats"; -import { getKeysPreserveType } from "src/util/utils"; -import { BlockUtils, DateUtils } from "src/util/utils_recall"; -import { CardInfo, TrackedFile } from "./trackedFile"; -import { Card } from "src/Card"; - -export class DataSyncer { - // store: DataStore; - - // constructor() { - // this.store = DataStore.getInstance(); - // } - - /** - * sync RCsrsDataTo SRreviewDecks - * - * @param rdeck - * @returns - */ - static syncRCsrsDataToSRreviewDecks( - reviewDecks: { [deckKey: string]: ReviewDeck }, - deckName: string, - noteStats: Stats, - ) { - const store = DataStore.getInstance(); - // const store = plugin.store; - store.data.queues.buildQueue(); - const now = new Date().getTime(); - const queue = store.data.queues.queue; - let dueCount: number = 0; - // for (let i = 0; i < queue.length; i++) { - for (const trackedFile of store.data.trackedFiles) { - if (trackedFile == null || trackedFile.noteId < 0) { - continue; - } - const id = trackedFile.noteId; - // const id = queue[i]; - const item = store.getItembyID(id); - if (item == null || !item.isTracked) { - console.log("syncRCsrsDataToSRreviewDecks: null item", id); - continue; - } - - const note = app.vault.getAbstractFileByPath(trackedFile.path) as TFile; - if (!note) { - console.log("Could not find file: ", trackedFile.path); - continue; - } - - if (trackedFile.tags?.last() === store.defaultDackName) { - // only add default deck. - noteStats.updateStats(item); - const result = DataSyncer.syncRCDataToSRrevDeck(reviewDecks[deckName], note); - dueCount += result; - } - } - return dueCount; - } - - /** - * syncRCDataToSR ReviewDeck , - * and update deckName to trackedfile.tags; - * @param rdeck - * @returns - */ - static syncRCDataToSRrevDeck(rdeck: ReviewDeck, note: TFile, now?: number) { - // const plugin = plugin; - // const rdeck = reviewDecks[deckName]; - const store = DataStore.getInstance(); - const queue = store.data.queues; - const ind = store.getFileIndex(note.path); - const trackedFile = store.getTrackedFile(note.path); - const fileid = store.getFileId(note.path); - const item = store.getItembyID(fileid); - let now_number: number = now; - const nowToday: number = DateUtils.EndofToday; - - if (item == null || !item.isTracked) { - // store._updateItem(fileid, ind, RPITEMTYPE.NOTE, rdeck.deckName); - // item = store.getItembyID(fileid); - console.debug("syncRCDataToSRrevDeck update null item:", item, trackedFile); - return; - } - if (now == null) { - now_number = nowToday; - } else { - delete store.data.queues.toDayLatterQueue[fileid]; - - getKeysPreserveType(store.data.queues.toDayLatterQueue).forEach((idStr, _idx, _arr) => { - const id: number = Number(idStr); - const item = store.getItembyID(id); - if (item.deckName === rdeck.deckName && item.nextReview - now < 0) { - rdeck.dueNotesCount++; - delete store.data.queues.toDayLatterQueue[id]; - } - }); - } - - if (item.nextReview - now_number > 0 && item.nextReview <= nowToday) { - store.data.queues.toDayLatterQueue[fileid] = rdeck.deckName; - } - - let dueNotesCount: number = 0; - if (item.isDue) { - rdeck.scheduledNotes.push({ note: note, dueUnix: item.nextReview }); - if (item.nextReview <= now_number) { - rdeck.dueNotesCount++; - dueNotesCount = 1; - if (now == null) { - queue.push(queue.queue[item.deckName], item.ID); - } - } - } else { - rdeck.newNotes.push(note); - // console.debug("syncRCDataToSRrevDeck : addNew", fileid); - } - // update store.trackFile and item - trackedFile.updateTags(rdeck.deckName); - item.updateDeckName(rdeck.deckName, store.isCardItem(item.ID)); - - return dueNotesCount; - } - - static setTrackfileCardSched( - trackedFile: TrackedFile, - deckName: string, - lineNo: number, - cardTextHash: string, - count: number, - scheduling?: RegExpMatchArray[], - ): CardInfo { - if (scheduling == null || scheduling.length == 0) { - return; - } - - const store = DataStore.getInstance(); - const carditem = trackedFile.trackCard(lineNo, cardTextHash); - - store.updateCardItems(trackedFile, carditem, count, deckName); - // from CardSchedule.ts - const dummyDueDateForNewCard: string = "2000-01-01"; - scheduling.forEach((sched: RegExpMatchArray, index) => { - if (sched[1] !== dummyDueDateForNewCard) { - store.setSchedbyId(carditem.itemIds[index], sched, true); - } - }); - return carditem; - } - - static updateCardsSched_algo(note: Note, topicPath: TopicPath) { - // const settings: SRSettings = plugin.data.settings; - - const store = DataStore.getInstance(); - // const store = plugin.store; - const file: SrTFile = note.file as SrTFile; - const trackedFile = store.getTrackedFile(file.path); - - for (const question of note.questionList) { - const deckname = question.topicPath.hasPath - ? question.topicPath.path[0] - : topicPath.path[0]; - - const cardText: string = question.questionText.actualQuestion; - const lineNo: number = question.lineNo; - const cardTextHash = BlockUtils.getTxtHash(cardText); - const count: number = question.cards.length; - const scheduling: RegExpMatchArray[] = []; - let carditem = trackedFile.getSyncCardInfo(lineNo, cardTextHash); - if (carditem != null) { - carditem.itemIds.forEach((id: number) => { - const sched = store.getSchedbyId(id); - // ignore new add card - if (sched != null && scheduling.length <= count) { - scheduling.push(sched); - } - }); - } else { - carditem = trackedFile.trackCard(lineNo, cardTextHash); - } - store.updateCardItems(trackedFile, carditem, count, deckname, false); - updateCardObjs(question.cards, carditem, scheduling); - - // update question - question.hasChanged = false; - if (question.topicPath.isEmptyPath && deckname === store.defaultDackName) { - question.topicPath = new TopicPath([deckname]); - } - } - - // update trackfile - if (note.questionList.length > 0) { - const tag = topicPath.path[0]; - if (tag !== store.defaultDackName && !tag.startsWith("#")) { - trackedFile.updateTags("#" + tag); - } - } - } -} - -function updateCardObjs(cards: Card[], cardinfo: CardInfo, scheduling: RegExpMatchArray[]) { - const schedInfoList: CardScheduleInfo[] = - NoteCardScheduleParser.createInfoList_algo(scheduling); - const carditemIds = cardinfo.itemIds; - for (let i = 0; i < cards.length; i++) { - const cardObj = cards[i]; - const hasScheduleInfo: boolean = i < schedInfoList.length; - const schedule: CardScheduleInfo = schedInfoList[i]; - cardObj.scheduleInfo = - hasScheduleInfo && !schedule.isDummyScheduleForNewCard() ? schedule : null; - cardObj.Id = carditemIds[i]; - } -} diff --git a/src/dataStore/itemToDecks.ts b/src/dataStore/itemToDecks.ts new file mode 100644 index 00000000..63540808 --- /dev/null +++ b/src/dataStore/itemToDecks.ts @@ -0,0 +1,244 @@ +import { TFile } from "obsidian"; +import { CardScheduleInfo, NoteCardScheduleParser } from "src/CardSchedule"; +import { Note } from "src/Note"; +import { ReviewDeck } from "src/ReviewDeck"; +import { SrTFile } from "src/SRFile"; +import { TopicPath } from "src/TopicPath"; +import { DataStore } from "src/dataStore/data"; +import { getKeysPreserveType } from "src/util/utils"; +import { BlockUtils, DateUtils, debug, logExecutionTime } from "src/util/utils_recall"; +import { CardInfo, TrackedFile } from "./trackedFile"; +import { Card } from "src/Card"; +import { DataLocation } from "./location_switch"; +import { RPITEMTYPE } from "./repetitionItem"; +import { Tags } from "src/tags"; +import { SRSettings } from "src/settings"; +import { INoteEaseList } from "src/NoteEaseList"; +import { algorithmNames } from "src/algorithms/algorithms"; + +export class ItemToDecks { + settings: SRSettings; + + constructor(settings: SRSettings) { + this.settings = settings; + } + + /** + * sync RCsrsDataTo SRreviewDecks + * + * @param rdeck + * @returns + */ + syncRCsrsDataToSRreviewDecks( + reviewDecks: { [deckKey: string]: ReviewDeck }, + notes: TFile[], + easeByPath: INoteEaseList, + ) { + const store = DataStore.getInstance(); + const settings = this.settings; + // store.data.queues.buildQueue(); + const now = new Date().getTime(); + notes.map(async (note) => { + let deckname = Tags.getNoteDeckName(note, this.settings); + if (deckname == null) { + const tkfile = store.getTrackedFile(note.path); + const tag = tkfile?.lastTag; + if (tag != undefined && (settings.tagsToReview.includes(tag) || tkfile.isDefault)) { + deckname = tag; + } + } + if (deckname != null) { + if (!Object.prototype.hasOwnProperty.call(reviewDecks, deckname)) { + reviewDecks[deckname] = new ReviewDeck(deckname); + } + // update single note deck data, only tagged reviewnote + if (!store.isTracked(note.path)) { + store.trackFile(note.path, deckname, false); + } + if ( + settings.algorithm === algorithmNames.Anki || + settings.algorithm === algorithmNames.Default || + settings.algorithm === algorithmNames.SM2 + ) { + const sched = store.getNoteItem(note.path).getSched(); + if (sched != null) { + const ease: number = parseFloat(sched[3]); + if (!isNaN(ease)) { + easeByPath.setEaseForPath(note.path, ease); + } + } + } + + ItemToDecks.syncRCDataToSRrevDeck(reviewDecks[deckname], note); + } + + // Add Recall reviewnote deck + // const dkname = DEFAULT_DECKNAME; + // if (!Object.prototype.hasOwnProperty.call(reviewDecks, dkname)) { + // reviewDecks[dkname] = new ReviewDeck(dkname); + // } + + // store.data.trackedFiles + // .filter((trackedFile) => trackedFile?.noteID >= 0 && trackedFile.isTracked) + // .filter((trackedFile) => trackedFile.isDefault) + // .filter((trackedFile) => { + // // only add default deck. + // const note = app.vault.getAbstractFileByPath(trackedFile.path) as TFile; + // if (note instanceof TFile) { + // noteStats.updateStats(store.getItembyID(trackedFile.noteID)); + // DataSyncer.syncRCDataToSRrevDeck(reviewDecks[deckName], note); + // return true; + // } + // }); + }); + return; + } + + /** + * syncRCDataToSR ReviewDeck , + * and update deckName to trackedfile.tags; + * @param rdeck + * @returns + */ + static syncRCDataToSRrevDeck(rdeck: ReviewDeck, note: TFile, now?: number) { + // const plugin = plugin; + // const rdeck = reviewDecks[deckName]; + const store = DataStore.getInstance(); + const queue = store.data.queues; + const ind = store.getFileIndex(note.path); + const trackedFile = store.getTrackedFile(note.path); + const fileid = store.getTrackedFile(note.path).noteID; + const item = store.getItembyID(fileid); + let now_number: number = now; + const nowToday: number = DateUtils.EndofToday; + + if (!trackedFile.isDefault && (item == null || !item.isTracked)) { + item.setTracked(ind); + } + if (item == null) { + // store._updateItem(fileid, ind, RPITEMTYPE.NOTE, rdeck.deckName); + // item = store.getItembyID(fileid); + console.debug("syncRCDataToSRrevDeck update null item:", item, trackedFile); + return; + } + const latterQue = store.data.queues.toDayLatterQueue; + delete latterQue[fileid]; + if (now == null) { + now_number = Date.now(); + } else { + getKeysPreserveType(latterQue).forEach((idStr, _idx, _arr) => { + const id: number = Number(idStr); + const item = store.getItembyID(id); + if (item.deckName === rdeck.deckName && item.nextReview - Date.now() < 0) { + rdeck.dueNotesCount++; + // console.debug( + // `${rdeck.deckName}keysPreserve dueCnt: ${rdeck.dueNotesCount} \ + // item: toQ:`, + // item, + // latterQue, + // ); + delete latterQue[id]; + } + }); + } + + if (item.nextReview - now_number > 0 && item.nextReview <= nowToday) { + // console.debug( + // `add ${rdeck.deckName} dueCnt: ${rdeck.dueNotesCount} \ + // item: toQ:`, + // item, + // latterQue, + // ); + latterQue[fileid] = rdeck.deckName; + } + + if (item.isDue) { + rdeck.scheduledNotes.push({ note, item, dueUnix: item.nextReview }); + if (item.nextReview <= now_number) { + rdeck.dueNotesCount++; + // console.debug(`${rdeck.deckName} isDue dueCnt: ${rdeck.dueNotesCount}`, item); + } + } else { + rdeck.newNotes.push({ note, item }); + } + // update store.trackFile and item + trackedFile.updateTags(rdeck.deckName); + item.updateDeckName(rdeck.deckName, store.isCardItem(item.ID)); + + return; + } + + static updateCardsSched_algo(note: Note, topicPath: TopicPath) { + const store = DataStore.getInstance(); + const settings = store.settings; + const noteFile: SrTFile = note.file as SrTFile; + if (topicPath.isEmptyPath || settings.dataLocation === DataLocation.SaveOnNoteFile) { + return; + } + if (store.getFileIndex(note.filePath) < 0) { + if ( + settings.trackedNoteToDecks && + Tags.getNoteDeckName(noteFile.file, settings) !== null + ) { + store.trackFile(note.filePath, RPITEMTYPE.NOTE, false); + } else { + store.trackFile(note.filePath, RPITEMTYPE.CARD, false); + } + } + // DataSyncer.updateCardsSched_algo(note, topicPath); + const trackedFile = store.getTrackedFile(noteFile.path); + + for (const question of note.questionList) { + const deckname = question.topicPath.hasPath + ? question.topicPath.path[0] + : topicPath.path[0]; + + const cardText: string = question.questionText.actualQuestion; + const lineNo: number = question.lineNo; + const cardTextHash = BlockUtils.getTxtHash(cardText); + const count: number = question.cards.length; + const scheduling: RegExpMatchArray[] = []; + let carditem = trackedFile.getSyncCardInfo(lineNo, cardTextHash); + if (carditem != null) { + carditem.itemIds + .map((id: number) => store.getItembyID(id).getSched()) + .filter((sched) => { + // ignore new add card + if (sched != null && scheduling.length <= count) { + scheduling.push(sched); + return true; + } + }); + } else { + carditem = trackedFile.trackCard(lineNo, cardTextHash); + } + store.updateCardItems(trackedFile, carditem, count, deckname, false); + updateCardObjs(question.cards, carditem, scheduling); + + // update question + question.hasChanged = false; + } + + // update trackfile + if (note.questionList.length > 0) { + const tag = topicPath.path[0]; + if (!TrackedFile.isDefaultDackName(tag) && !tag.startsWith("#")) { + trackedFile.updateTags("#" + tag); + } + } + } +} + +function updateCardObjs(cards: Card[], cardinfo: CardInfo, scheduling: RegExpMatchArray[]) { + const schedInfoList: CardScheduleInfo[] = + NoteCardScheduleParser.createInfoList_algo(scheduling); + const carditemIds = cardinfo.itemIds; + for (let i = 0; i < cards.length; i++) { + const cardObj = cards[i]; + const hasScheduleInfo: boolean = i < schedInfoList.length; + const schedule: CardScheduleInfo = schedInfoList[i]; + cardObj.scheduleInfo = + hasScheduleInfo && !schedule.isDummyScheduleForNewCard() ? schedule : null; + cardObj.Id = carditemIds[i]; + } +} diff --git a/src/dataStore/location_switch.ts b/src/dataStore/location_switch.ts index cc2af038..c52c31cb 100644 --- a/src/dataStore/location_switch.ts +++ b/src/dataStore/location_switch.ts @@ -1,9 +1,12 @@ import { CachedMetadata, FrontMatterCache, Notice, TFile } from "obsidian"; import { TopicPath } from "src/TopicPath"; import { + DEFAULT_DECKNAME, LEGACY_SCHEDULING_EXTRACTOR, MULTI_SCHEDULING_EXTRACTOR, SCHEDULING_INFO_REGEX, + SR_HTML_COMMENT_BEGIN, + SR_HTML_COMMENT_END, YAML_FRONT_MATTER_REGEX, YAML_TAGS_REGEX, } from "src/constants"; @@ -13,11 +16,12 @@ import { SRSettings } from "src/settings"; import { escapeRegexString } from "src/util/utils"; import { DataStore } from "./data"; import { Tags } from "src/tags"; -import { DataSyncer } from "./dataSyncer"; import { Stats } from "src/stats"; import { DateUtils } from "src/util/utils_recall"; import { RPITEMTYPE } from "./repetitionItem"; +import deepcopy from "deepcopy"; +import { NoteCardScheduleParser } from "src/CardSchedule"; const ROOT_DATA_PATH = "./tracked_files.json"; // const PLUGIN_DATA_PATH = "./.obsidian/plugins/obsidian-spaced-repetition-recall/tracked_files.json"; @@ -40,15 +44,16 @@ export const locationMap: Record = { export class LocationSwitch { public plugin: SRPlugin; private settings: SRSettings; - + public beforenoteStats: Stats; + public afternoteStats: Stats; + public beforecardStats: Stats; + public aftercardStats: Stats; revTag: string; constructor(plugin: SRPlugin, settings: SRSettings) { this.plugin = plugin; this.settings = settings; - this.revTag = [this.settings.tagsToReview[0], plugin.store.defaultDackName] - .join("/") - .substring(1); + this.revTag = this.converteTag(); } /** @@ -77,7 +82,6 @@ export class LocationSwitch { store.verify(newPath).then(async (v) => { exist = v; if (exist) { - const adapter = app.vault.adapter; const suffix = "-" + new Date().toISOString().replace(/[:.]/g, ""); await adapter.rename(newPath, newPath + suffix).then(() => { console.debug("orginal file: " + newPath + " renamed to: " + newPath + suffix); @@ -107,6 +111,13 @@ export class LocationSwitch { } } + converteTag(tag?: string): string { + if (tag == undefined) { + tag = DEFAULT_DECKNAME; + } + return [this.settings.tagsToReview[0], tag].join("/").substring(1); + } + /** * converteNoteSchedToTrackfile * @@ -116,30 +127,30 @@ export class LocationSwitch { // const store = plugin.store; const store = DataStore.getInstance(); const settings = plugin.data.settings; - // const orgLocation = settings.dataLocation; + this.initStats(); + this.setBeforeStats(); if (dryrun) { if (newLocation) { settings.dataLocation = newLocation; } } - await store.load(); + await store.save(); // await plugin.sync_Algo(); - const notes: TFile[] = app.vault.getMarkdownFiles(); + let notes: TFile[] = app.vault.getMarkdownFiles(); + notes = notes.filter( + (noteFile) => !isIgnoredPath(settings.noteFoldersToIgnore, noteFile.path), + ); for (const noteFile of notes) { - if (isIgnoredPath(this.settings.noteFoldersToIgnore, noteFile.path)) { - continue; - } - let deckname = Tags.getNoteDeckName(noteFile, this.settings); let topicPath: TopicPath = plugin.findTopicPath(plugin.createSrTFile(noteFile)); let fileText: string = ""; let fileChanged = false; if (topicPath.hasPath) { - fileText = await app.vault.read(noteFile); + fileText = await noteFile.vault.read(noteFile); if (topicPath.formatAsTag().includes(this.revTag)) { - deckname = store.defaultDackName; + deckname = DEFAULT_DECKNAME; topicPath = new TopicPath([deckname]); fileText = delDefaultTag(fileText, this.revTag); fileChanged = true; @@ -150,16 +161,16 @@ export class LocationSwitch { const fileCachedData = app.metadataCache.getFileCache(noteFile) || {}; fileText = await _convertFrontMatter(noteFile, fileCachedData, deckname, fileText); if (fileText == null) { - console.debug("_convertFrontMatter: fileText null: "); - throw new Error("_convertFrontMatter fileText null: " + fileText); + console.warn("_convertFrontMatter: fileText null: "); + // throw new Error("_convertFrontMatter fileText null: " + fileText); } if (SCHEDULING_INFO_REGEX.test(fileText)) { - console.error( + console.warn( "still have SCHEDULING_INFO_REGEX in fileText:\n", noteFile.path, fileText, ); - throw new Error("_convertFrontMatter failed: \n" + fileText); + // throw new Error("_convertFrontMatter failed: \n" + fileText); } fileChanged = true; } @@ -167,7 +178,7 @@ export class LocationSwitch { if (topicPath.hasPath) { fileText = await _convertCardsSched(noteFile, fileText, topicPath.path[0]); if (fileText == null) { - console.debug("fileText null"); + console.warn("fileText null"); throw new Error(fileText); } if ( @@ -175,17 +186,17 @@ export class LocationSwitch { LEGACY_SCHEDULING_EXTRACTOR.test(fileText) ) { console.error("still have cardsched in fileText:\n", noteFile.path, fileText); - throw new Error("_convertCardsSched failed: \n" + fileText); + // throw new Error("_convertCardsSched failed: \n" + fileText); } fileChanged = true; } if (!dryrun && fileChanged) { if (fileText == null) { - console.debug("fileText null"); + console.error("fileText null"); throw new Error(fileText); } - await app.vault.modify(noteFile, fileText); + await noteFile.vault.modify(noteFile, fileText); // console.debug("_convert fileChanged end :\n", fileText); } } @@ -193,8 +204,15 @@ export class LocationSwitch { const msg = "converteNoteSchedToTrackfile success!"; if (dryrun) { await plugin.sync(); - await store.load(); + this.setAfterStats(); + // await store.load(); settings.dataLocation = DataLocation.SaveOnNoteFile; + this.resultCheck( + this.beforenoteStats, + this.beforecardStats, + this.afternoteStats, + this.aftercardStats, + ); } else { await store.save(); new Notice(msg); @@ -204,7 +222,7 @@ export class LocationSwitch { async function _convertCardsSched(note: TFile, fileText: string, deckName: string) { // console.debug("_convertCardsSched: ", note.basename); const trackedFile = store.getTrackedFile(note.path); - // let fileText: string = await app.vault.read(note); + // let fileText: string = await note.vault.read(note); let fileChanged = false; trackedFile.syncNoteCardsIndex(fileText, settings, (cardText, cardinfo) => { let scheduling: RegExpMatchArray[] = [ @@ -213,28 +231,27 @@ export class LocationSwitch { if (scheduling.length === 0) scheduling = [...cardText.matchAll(LEGACY_SCHEDULING_EXTRACTOR)]; if (scheduling.length > 0) { - DataSyncer.setTrackfileCardSched( - trackedFile, - deckName, - cardinfo.lineNo, - cardinfo.cardTextHash, - scheduling.length, - scheduling, - ); + store.updateCardItems(trackedFile, cardinfo, scheduling.length, deckName); + const schedInfoList = NoteCardScheduleParser.createInfoList_algo(scheduling); + scheduling.forEach((sched: RegExpMatchArray, index) => { + if (!schedInfoList[index].isDummyScheduleForNewCard) { + store.getItembyID(cardinfo.itemIds[index])?.updateSched(sched, true); + } + }); + // console.debug(cardinfo.lineNo, scheduling); const newCardText = updateCardSchedXml( cardText, settings.cardCommentOnSameLine, ); - const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); - fileText = fileText.replace(replacementRegex, () => newCardText); + fileText = cardTextReplace(fileText, cardText, newCardText); fileChanged = true; } }); // if (fileChanged) { - // // await app.vault.modify(note, fileText); + // // await note.vault.modify(note, fileText); // console.debug("_convertCardsSched end :\n", fileText); // } return fileText; @@ -246,7 +263,7 @@ export class LocationSwitch { deckname: string, fileText: string, ) { - console.debug("_convertFrontMatter"); + // console.debug("_convertFrontMatter"); // const fileCachedData = app.metadataCache.getFileCache(note) || {}; const frontmatter: FrontMatterCache | Record = fileCachedData.frontmatter || {}; @@ -256,8 +273,8 @@ export class LocationSwitch { if (!store.isTracked(note.path)) { store.trackFile(note.path, deckname, false); } - const item = store.getItemsOfFile(note.path)[0]; - // const id = store.getFileId(note.path); + const item = store.getItembyID(store.getTrackedFile(note.path).noteID); + // const id = store.getTrackedFile(note.path).noteID // store.reviewId(id, opts[1]); item.updateSched(sched, true); fileText = updateNoteSchedFrontHeader(fileText); @@ -273,129 +290,169 @@ export class LocationSwitch { async converteTrackfileToNoteSched(dryrun: boolean = false) { const plugin = this.plugin; const store = plugin.store; - + this.initStats(); + this.setBeforeStats(); plugin.syncLock = true; - plugin.noteStats = new Stats(); - plugin.cardStats = new Stats(); - - const tracked_files = store.data.trackedFiles; - for (const tkfile of tracked_files) { - if (tkfile == null) { - continue; - } - // if (ReviewNote.isIgnored(this.settings.noteFoldersToIgnore, tkfile.path)) { - // continue; - // } - let exists = await store.verify(tkfile.path); - if (!exists) { - // in case file moved away. - exists = store.findMovedFile(tkfile); - } - if (exists) { - const id = tkfile.items["file"]; - const item = store.getItembyID(id); - const note = app.vault.getAbstractFileByPath(tkfile.path) as TFile; - const deckPath: string[] = plugin.findTopicPath(plugin.createSrTFile(note)).path; - let fileText: string = await app.vault.read(note); - let fileChanged = false; - if (deckPath.length !== 0) { - tkfile.syncNoteCardsIndex(fileText, this.settings, (cardText, cardinfo) => { - if (cardinfo == null || cardinfo?.itemIds == null) { - return; - } - const ids = cardinfo.itemIds; - ids.sort((a: number, b: number) => a - b); - const scheduling: RegExpMatchArray[] = []; - ids.forEach((id: number) => { - const citem = store.getItembyID(id); - const sched = citem.getSched(false, false); - // ignore new add card - if (sched != null) { - scheduling.push(sched); + await store.pruneData(); + + // eslint-disable-next-line prefer-const + let tracked_files = store.data.trackedFiles; + const dueIds: number[] = []; + await Promise.all( + tracked_files + .filter((tkfile) => tkfile != null) + .filter((tkfile) => !isIgnoredPath(this.settings.noteFoldersToIgnore, tkfile.path)) + .map(async (tkfile) => { + const item = store.getItembyID(tkfile.noteID); + const note = app.vault.getAbstractFileByPath(tkfile.path) as TFile; + if (!(note instanceof TFile)) { + return; + } + const deckPath: string[] = plugin.findTopicPath( + plugin.createSrTFile(note), + ).path; + let fileText: string = await note.vault.read(note); + let fileChanged = false; + if (deckPath.length !== 0) { + tkfile.syncNoteCardsIndex(fileText, this.settings, (cardText, cardinfo) => { + if (cardinfo == null || cardinfo?.itemIds == null) { + return; } - plugin.cardStats.updateStats(citem, DateUtils.EndofToday); + const ids = cardinfo.itemIds; + const scheduling: RegExpMatchArray[] = []; + ids.map((id: number) => store.getItembyID(id)) + .filter((citem) => citem.isTracked) + .filter((citem) => { + // const citem = store.getItembyID(id); + // if (citem.isTracked) { + const sched = citem.getSchedDurAsStr(); + if (citem.isDue && sched != null) { + scheduling.push(sched); + dueIds.push(citem.ID); + } + this.aftercardStats.updateStats(citem, DateUtils.EndofToday); + // } + }); + const newCardText = updateCardSchedXml( + cardText, + this.settings.cardCommentOnSameLine, + scheduling, + ); + fileText = cardTextReplace(fileText, cardText, newCardText); + // const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); + // fileText = fileText.replace(replacementRegex, () => newCardText); + fileChanged = true; }); - const newCardText = updateCardSchedXml( - cardText, - this.settings.cardCommentOnSameLine, - scheduling, - ); - const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); - fileText = fileText.replace(replacementRegex, () => newCardText); - fileChanged = true; - }); - } - // console.debug("_convert CardsSched end :\n", fileText); - if (item?.isDue) { - // let due: number, ease: number, interval: number; - const ret = item.getSched(false, false); - if (ret != null) { - // if(item.deckName === store.defaultDackName){ - - // } - fileText = updateNoteSchedFrontHeader(fileText, ret); - fileChanged = true; - // console.debug("converteTrackfileToNoteSched: " + tkfile.path, fileText); } - plugin.noteStats.updateStats(item, DateUtils.EndofToday); - // console.debug(tkfile.path, plugin.noteStats.youngCount); - } else if (item?.isNew) { - plugin.noteStats.incrementNew(); - } - //update tag to note - if (item?.itemType === RPITEMTYPE.NOTE) { - const noteTag = Tags.getNoteDeckName(note, this.settings); - if (item.deckName === store.defaultDackName) { - fileText = addDefaultTagtoNote(fileText, this.revTag); - fileChanged = true; - } else if ( - noteTag == null && - this.settings.tagsToReview.includes(item.deckName) + // console.debug("_convert CardsSched end :\n", fileText); + if ( + item?.isTracked && + (tkfile.isDefault || Tags.isTagedNoteDeckName(item.deckName, this.settings)) ) { - const tag = [this.settings.tagsToReview[0], item.deckName.substring(1)] - .join("/") - .substring(1); - fileText = addDefaultTagtoNote(fileText, tag); - fileChanged = true; + if (item?.isDue) { + // let due: str, ease: number, interval: number; + const ret = item.getSchedDurAsStr(); + if (ret != null) { + fileText = updateNoteSchedFrontHeader(fileText, ret); + fileChanged = true; + // console.debug("converteTrackfileToNoteSched: " + tkfile.path, fileText); + } + // console.debug(tkfile.path, this.afternoteStats.youngCount); + } + this.afternoteStats.updateStats(item, DateUtils.EndofToday); + //update tag to note + if (item?.itemType === RPITEMTYPE.NOTE) { + const noteTag = Tags.getNoteDeckName(note, this.settings); + if (tkfile.isDefault) { + fileText = addDefaultTagtoNote(fileText, this.revTag); + fileChanged = true; + } else if ( + noteTag == null && + this.settings.tagsToReview.includes(item.deckName) + ) { + const tag = this.converteTag(item.deckName.substring(1)); + fileText = addDefaultTagtoNote(fileText, tag); + fileChanged = true; + } + } } - } - if (!dryrun && fileChanged) { - if (fileText == null) { - console.debug("fileText null"); - throw new Error(fileText); + if (!dryrun && fileChanged) { + if (fileText == null) { + console.error("fileText null"); + throw new Error(fileText); + } + await note.vault.modify(note, fileText); } - await app.vault.modify(note, fileText); - } - } - } + }), + ); + store.save(); plugin.syncLock = false; const msg = "converteTrackfileToNoteSched success!"; + console.debug("dueids after: ", dueIds, store.data.trackedFiles, store.data.items); if (dryrun) { // const settings = plugin.data.settings; // const orgLocation = settings.dataLocation; // settings.dataLocation = DataLocation.SaveOnNoteFile; // await plugin.sync(); // settings.dataLocation = orgLocation; + this.resultCheck( + this.beforenoteStats, + this.beforecardStats, + this.afternoteStats, + this.aftercardStats, + ); } else { new Notice(msg); } console.log(msg); } + private initStats() { + this.beforenoteStats = new Stats(); + this.beforecardStats = new Stats(); + this.afternoteStats = new Stats(); + this.aftercardStats = new Stats(); + } + + private setBeforeStats() { + this.beforenoteStats = deepcopy(this.plugin.noteStats); + this.beforecardStats = deepcopy(this.plugin.cardStats); + } + private setAfterStats() { + this.afternoteStats = deepcopy(this.plugin.noteStats); + this.aftercardStats = deepcopy(this.plugin.cardStats); + } + + resultCheck(noteStats: Stats, cardStats: Stats, afternoteStats: Stats, aftercardStats: Stats) { + if ( + this.compare(noteStats, afternoteStats, "note") || + this.compare(cardStats, aftercardStats, "card") + ) { + console.log( + "before chang noteStats, cardStats:\n", + noteStats, + cardStats, + "\nafter change:\n", + afternoteStats, + aftercardStats, + ); + new Notice("have some data lost, see console for detials."); + } + } compare(before: Stats, after: Stats, prefix: string) { let ntc = false; for (const keyS in before) { const key = keyS as keyof typeof before; if (!(before[key] instanceof Object) && before[key] !== after[key]) { - console.error("%s %s before: %d, after: %d", prefix, key, before[key], after[key]); + console.warn("%s %s before: %d, after: %d", prefix, key, before[key], after[key]); ntc = true; } } return ntc; } - createTable(Stats: Stats, afterStats: Stats) { + createTable(Stats: Stats, afterStats: Stats): string { const title = "Location | new | onDue | yung | mature \n\ ---|---|---|---|---\n"; @@ -405,6 +462,25 @@ export class LocationSwitch { } } +export function cardTextReplace(fileText: string, cardText: string, newCardText: string) { + const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); + const result = replacementRegex.exec(fileText); + if (fileText.indexOf(cardText) === fileText.lastIndexOf(cardText)) { + return fileText.replace(replacementRegex, () => newCardText); + } else { + const blanLine = "(\n\\s*?\n)"; + let rpreg = new RegExp(blanLine + escapeRegexString(cardText), "gm"); + if (fileText.match(rpreg) !== null) { + console.debug("got many: front blank"); + return fileText.replace(rpreg, `$1${newCardText}`); + } else { + rpreg = new RegExp(escapeRegexString(cardText) + blanLine, "gm"); + console.debug("got many: back blank"); + return fileText.replace(rpreg, `${newCardText}$1`); + } + } +} + /** * get ReviewNote frontmatter Data from notefile. * @@ -426,10 +502,10 @@ function getReviewNoteHeaderData(frontmatter: FrontMatterCache): number[] { const sched = [null, dueUnix, interval, ease]; return sched; } else { - console.log( - "getReviewNoteHeaderData --> note: %s doesn't have sr frontmatter. ", - frontmatter, - ); + // console.log( + // "getReviewNoteHeaderData --> note: %s doesn't have sr frontmatter. ", + // frontmatter, + // ); return null; } } @@ -492,24 +568,14 @@ export function updateCardSchedXml( cardCount?: number, ) { let sep: string = cardCommentOnSameLine ? " " : "\n"; - let schedString = sep + "/gm, "").trimEnd(); + let schedString: string = ""; + if (newCardText.endsWith("```") && sep !== "\n") { + sep = "\n"; } + if (scheduling != null && scheduling.length > 0) { - schedString = sep + ""; + schedString += SR_HTML_COMMENT_END; } else { schedString = ""; } - // const idxSched: number = cardText.lastIndexOf(sep + "/gm, "").trimEnd(); const cardTextHash: string = cyrb53(cardText); - return cardTextHash; + return cardTextHash.substring(0, 6); } } @@ -217,3 +213,11 @@ export const logExecutionTime = () => { return propertyDescriptor; }; }; + +export function isIgnoredPath(noteFoldersToIgnore: string[], path: string) { + if (noteFoldersToIgnore.some((folder) => path.includes(folder))) { + return true; + } else { + return false; + } +} diff --git a/tests/unit/QuestionType.test.ts b/tests/unit/QuestionType.test.ts index 108c153b..6829a9b2 100644 --- a/tests/unit/QuestionType.test.ts +++ b/tests/unit/QuestionType.test.ts @@ -37,7 +37,7 @@ test("CardType.MultiLineReversed", () => { }); test("CardType.Cloze", () => { - let frontHtml = QuestionType_ClozeUtil.renderClozeFront(); + let frontHtml = QuestionType_ClozeUtil.renderClozeFront("==interesting==".length); expect( CardFrontBackUtil.expand( @@ -83,15 +83,15 @@ test("CardType.Cloze", () => { ), ).toEqual([ new CardFrontBack( - "This is a really very [...] and fascinating and great test", + "This is a really very [...............] and fascinating and great test", "This is a really very interesting and fascinating and great test", ), new CardFrontBack( - "This is a really very interesting and [...] and great test", + "This is a really very interesting and [...............] and great test", "This is a really very interesting and fascinating and great test", ), new CardFrontBack( - "This is a really very interesting and fascinating and [...] test", + "This is a really very interesting and fascinating and [.........] test", "This is a really very interesting and fascinating and great test", ), ]); diff --git a/tests/unit/data.test.ts b/tests/unit/data.test.ts index 5f68ed75..f29dcf69 100644 --- a/tests/unit/data.test.ts +++ b/tests/unit/data.test.ts @@ -1,28 +1,30 @@ import { SrsAlgorithm, algorithmNames } from "src/algorithms/algorithms"; import { DefaultAlgorithm } from "src/algorithms/scheduling_default"; import { DataStore } from "src/dataStore/data"; -import { DataLocation } from "src/dataStore/location_switch"; +import { DataLocation } from "src/dataStore/dataLocation"; import { RPITEMTYPE } from "src/dataStore/repetitionItem"; -import { DEFAULT_SETTINGS } from "src/settings"; +import { DEFAULT_SETTINGS, SRSettings } from "src/settings"; import { Stats } from "src/stats"; +const settings_tkfile = Object.assign({}, DEFAULT_SETTINGS); +settings_tkfile.dataLocation = DataLocation.PluginFolder; + export class SampleDataStore { static roundInt = (num: number) => Math.round(Math.random() * num); - static async create() { - const settings_tkfile = Object.assign({}, DEFAULT_SETTINGS); - settings_tkfile.dataLocation = DataLocation.PluginFolder; + + static async create(settings: SRSettings) { let store: DataStore; let algo: SrsAlgorithm; let arr: number[]; // const roundInt = (num: number) => Math.round(Math.random() * num); // beforeEach(async () => { // eslint-disable-next-line prefer-const - store = new DataStore(DEFAULT_SETTINGS, "./"); + store = new DataStore(settings, "./"); await store.load(); // store.toInstances(); // eslint-disable-next-line prefer-const algo = new DefaultAlgorithm(); - algo.updateSettings(settings_tkfile.algorithmSettings[algorithmNames.Default]); + algo.updateSettings(settings.algorithmSettings[algorithmNames.Default]); const opts = algo.srsOptions(); // eslint-disable-next-line prefer-const arr = Array.from(new Array(50)).map((_v, _idx) => { @@ -103,7 +105,7 @@ describe("pruneDate", () => { // let algo: SrsAlgorithm; // let arr: number[]; beforeEach(async () => { - const sample = await SampleDataStore.create(); + const sample = await SampleDataStore.create(settings_tkfile); store = sample.store; }); @@ -112,8 +114,8 @@ describe("pruneDate", () => { const itemResult = store.items.every((item) => item != null && item.isTracked); const tkfileResult = store.data.trackedFiles.every((tkfile) => tkfile != null); const check = - store.data.trackedFiles.map((tkfile) => tkfile?.itemIDs).flat().length === - store.itemSize; + store.data.trackedFiles.map((tkfile) => tkfile?.itemIDs.filter((id) => id >= 0)).flat() + .length === store.itemSize; const checkcard = store.data.trackedFiles.every((tkfile) => tkfile?.hasCards ? tkfile?.cardIDs.length > 0 : tkfile.noteID >= 0, ); From 6bb378ef81ba457c4416f1f0f550b11e6be95d8b Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 30 Dec 2023 11:42:43 +0800 Subject: [PATCH 088/155] update action --- .github/workflows/pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index d0005ff6..9ddf13af 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -22,7 +22,7 @@ jobs: with: node-version: 16 cache: "npm" - - run: npm i + - run: pnpm i # - name: Eslint # run: npm run lint From c7fb9f6b88e89a9bb419b22b98d14b5bd5d4ff24 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 30 Dec 2023 11:42:43 +0800 Subject: [PATCH 089/155] update action --- .github/workflows/pr.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 9ddf13af..dd36789c 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -17,18 +17,21 @@ jobs: - uses: actions/checkout@v3 with: submodules: "true" + - name: Install Dependencies + run: npm install -g pnpm && pnpm install + - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 16 - cache: "npm" + node-version: "20.x" + cache: "pnpm" - run: pnpm i # - name: Eslint - # run: npm run lint + # run: pnpm run lint - name: Run test - run: npm run test + run: pnpm run test pretty: needs: validate From eb9dcd7f585150f7f002fe32a1adeef295351d0a Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 14 Jan 2024 09:48:34 +0800 Subject: [PATCH 090/155] fix #34, untrack error --- docs/changelog.md | 4 ++++ src/dataStore/data.ts | 23 +++++++++++------------ src/dataStore/queue.ts | 3 +-- src/gui/reviewresponse-modal.tsx | 4 ++-- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 3a69dccf..29274589 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [unrelease] + +- fix #34, untrack error; +- ## [1.10.5.5] 元旦快乐~ diff --git a/src/dataStore/data.ts b/src/dataStore/data.ts index 0bac7a86..a6f02a7c 100644 --- a/src/dataStore/data.ts +++ b/src/dataStore/data.ts @@ -157,12 +157,12 @@ export class DataStore { async save(path = this.dataPath) { try { await app.vault.adapter.write(path, JSON.stringify(this.data)); + this.data.mtime = await this.getmtime(); } catch (error) { MiscUtils.notice("Unable to save data file!"); console.log(error); return; } - this.data.mtime = await this.getmtime(); } /** @@ -490,12 +490,13 @@ export class DataStore { const trackedFile = this.getTrackedFile(path); const note = app.vault.getAbstractFileByPath(path) as TFile; + let cardName: string = null; if (note != null && trackedFile.tags.length > 0) { - // const fileCachedData = app.metadataCache.getFileCache(note) || {}; - // const tags = getAllTags(fileCachedData) || []; + const fileCachedData = app.metadataCache.getFileCache(note) || {}; + const tags = getAllTags(fileCachedData) || []; const deckname = Tags.getNoteDeckName(note, this.settings); - // const cardName = Tags.getTagFromSettingTags(tags, this.settings.flashcardTags); + cardName = Tags.getTagFromSettingTags(tags, this.settings.flashcardTags); if (deckname !== null || this.settings.convertFoldersToDecks) { // || cardName !== null // it's taged file, can't untrack by this. @@ -511,19 +512,17 @@ export class DataStore { const lastTag = trackedFile.lastTag; trackedFile.setUnTracked(); for (const key in trackedFile.items) { - const ind = trackedFile.items[key]; - this.unTrackItem(ind); - numItems++; + const id = trackedFile.items[key]; + if (id >= 0) { + this.unTrackItem(id); + numItems++; + } } - const fileCachedData = app.metadataCache.getFileCache(note) || {}; - const tags = getAllTags(fileCachedData) || []; - const cardName = Tags.getTagFromSettingTags(tags, this.settings.flashcardTags); if (cardName == null && this.settings.trackedNoteToDecks) { - trackedFile.cardIDs.forEach(this.unTrackItem, this); + trackedFile.cardIDs.filter((id) => id >= 0).forEach(this.unTrackItem, this); numItems += trackedFile.cardIDs.length; } - // when file not exist, or doesn't have carditems, del it. let nulrstr: string = ""; // this.data.trackedFiles[index] = null; if (note == null) { diff --git a/src/dataStore/queue.ts b/src/dataStore/queue.ts index 4e031172..8163b1c5 100644 --- a/src/dataStore/queue.ts +++ b/src/dataStore/queue.ts @@ -186,7 +186,6 @@ export class Queue implements IQueue { let untrackedFiles = 0; let removedItems = 0; const bUnTfiles = new Set(); - let validItems: RepetitionItem[] = []; await Promise.all( store.data.trackedFiles.map(async (file, _idx) => { if (file?.path == undefined || !file.isTracked) return false; @@ -205,7 +204,7 @@ export class Queue implements IQueue { return exists; }), ); - validItems = store.items.filter((item) => item != null && item.isTracked); + const validItems = store.items.filter((item) => item != null && item.isTracked); validItems .filter((item) => item.isCard) .forEach((item) => { diff --git a/src/gui/reviewresponse-modal.tsx b/src/gui/reviewresponse-modal.tsx index b7b1d387..c2548403 100644 --- a/src/gui/reviewresponse-modal.tsx +++ b/src/gui/reviewresponse-modal.tsx @@ -215,14 +215,14 @@ export class reviewResponseModal { private addKeysEvent() { const bar = document.getElementById(this.barId); - const Markdown = app.workspace.getActiveViewOfType(MarkdownView); + // const Markdown = app.workspace.getActiveViewOfType(MarkdownView); document.body.onkeydown = (e) => { if ( bar && bar.checkVisibility() && this.isDisplay() && - Markdown.getMode() === "preview" + app.workspace.getActiveViewOfType(MarkdownView).getMode() === "preview" ) { const consume = () => { e.preventDefault(); From b6351a0aaec186ce7cc766b6c3e4654cd659ef52 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 14 Jan 2024 11:42:07 +0800 Subject: [PATCH 091/155] chore: version --- docs/changelog.md | 2 +- manifest.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 7b3b04c6..0be6e14f 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -7,7 +7,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). ## [unrelease] - fix #34, untrack error; -- +- close #36, merge master branch; ## [1.10.5.5] 元旦快乐~ diff --git a/manifest.json b/manifest.json index 4e892bd5..2430a4f5 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.10.5.5", + "version": "1.11.0.1", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index 71d13888..3908dc6b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.10.5.5", + "version": "1.11.0.1", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { From 4b3458893de38d53b409525e9173a705a0f52299 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 14 Jan 2024 14:08:50 +0800 Subject: [PATCH 092/155] fix merge --- docs/changelog.md | 23 +- docs/usage.md | 11 +- ...77\347\224\250\346\225\231\347\250\213.md" | 8 +- package.json | 2 +- pnpm-lock.yaml | 8730 ++++++++++------- src/QuestionType.ts | 2 +- src/algorithms/anki.ts | 4 +- src/gui/reviewresponse-modal.tsx | 4 +- tests/unit/util/utils.test.ts | 1 + 9 files changed, 5462 insertions(+), 3323 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 0be6e14f..c675116b 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,21 +4,21 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). -## [unrelease] +## [unrelease] -- fix #34, untrack error; -- close #36, merge master branch; +- fix #34, untrack error; +- close #36, merge master branch; ## [1.10.5.5] 元旦快乐~ -- feat: 显示浮栏复习笔记且笔记在**阅读/预览**视图时,可使用数字快捷键(0重来,1,2,3简单) -- close #29, 并删除部分调试代码; -- fix #31, 数据位置修改后无法保存设置; -- fix #32, 无复习标签时,即可手动untrack; -- new: #32, 添加设置项,在删除笔记中复习标签时,同步untrack操作(默认false,不同步); -- fix: 在从另一设备同步过来较新的trackedfiles.json数据后,插件还是用旧数据的问题, 需再次打开卡片面板/(点击状态栏/命令行)打开一篇笔记复习,才会用新数据; -- 优化: 重构、数据结构调整; -- +- feat: 显示浮栏复习笔记且笔记在**阅读/预览**视图时,可使用数字快捷键(0重来,1,2,3简单) +- close #29, 并删除部分调试代码; +- fix #31, 数据位置修改后无法保存设置; +- fix #32, 无复习标签时,即可手动untrack; +- new: #32, 添加设置项,在删除笔记中复习标签时,同步untrack操作(默认false,不同步); +- fix: 在从另一设备同步过来较新的trackedfiles.json数据后,插件还是用旧数据的问题, 需再次打开卡片面板/(点击状态栏/命令行)打开一篇笔记复习,才会用新数据; +- 优化: 重构、数据结构调整; +- ## [1.10.5.4] @@ -143,7 +143,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). #### Unreleased - #### [1.11.0](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.10.5...1.11.0) - chore: Update dependencies [`#824`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/824) diff --git a/docs/usage.md b/docs/usage.md index aceba101..f5fda5b2 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -3,9 +3,10 @@ #### CASE1: Not using the original SR plugin, directly using this plugin Recommended settings - - Data Location: in plugin/vault/specified folder - - Algorithm: Fsrs -![image](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/assets/9208450/a22d23df-5d11-4b19-9007-e1530e2808be) + +- Data Location: in plugin/vault/specified folder +- Algorithm: Fsrs + ![image](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/assets/9208450/a22d23df-5d11-4b19-9007-e1530e2808be) For the specific parameter settings of the algorithm, please refer to [FSRS v4](https://github.com/open-spaced-repetition/fsrs4anki/wiki/The-Algorithm#fsrs-v4). @@ -57,8 +58,8 @@ Add a label corresponding to a review card to your notes, or convert review note Review notes can be opened from the command line, or from your computer by clicking Notes in the status bar/right sidebar. Feedback on memorization level is available via command line, hover bar or menu bar -- On computer , right-click on the floating bar, you can close it, set time interval visible/hidden; -- On computer, when floatbar is show and in preview, you can use keyshortcut(0 reset, 1,2, 3 easy ) feedback; +- On computer , right-click on the floating bar, you can close it, set time interval visible/hidden; +- On computer, when floatbar is show and in preview, you can use keyshortcut(0 reset, 1,2, 3 easy ) feedback; - On mobile, swipup from the floating bar, close it , long press the floating bar to setting time interval visible/hidden; - time interval visible/hidden Suggestion: review is not shown, progressive summary/incremental writing is shown; diff --git "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" index a8be9eda..c0e6ca5f 100644 --- "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" +++ "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" @@ -5,9 +5,9 @@ #### CASE1: 没有使用原SR插件,直接使用这个插件 推荐设置 - - 数据位置: in plugin/vault/specified folder (不能保存在笔记中) - - 算法: Fsrs(用这个修改版插件应该都是冲这个来的😄️) -![image](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/assets/9208450/a22d23df-5d11-4b19-9007-e1530e2808be) + +- 数据位置: in plugin/vault/specified folder (不能保存在笔记中) - 算法: Fsrs(用这个修改版插件应该都是冲这个来的😄️) + ![image](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/assets/9208450/a22d23df-5d11-4b19-9007-e1530e2808be) 算法对应的具体参数设置,可参考[FSRS v4](https://github.com/open-spaced-repetition/fsrs4anki/wiki/The-Algorithm#fsrs-v4) @@ -58,7 +58,7 @@ 通过命令行,或电脑端点击状态栏/右侧边栏的笔记就可以打开复习笔记。通过命令行、悬浮栏或菜单栏可反馈记忆程度 -- 电脑端,在悬浮栏单击右键,可以关闭浮栏、设置 时间间隔显隐; +- 电脑端,在悬浮栏单击右键,可以关闭浮栏、设置 时间间隔显隐; - 电脑端,在打开浮栏且笔记在**阅读/预览**视图(非编辑视图)时,可使用数字快捷键(0重来,1,2,3简单)反馈记忆程度; - 移动端,从浮栏向上滑 关闭浮栏,长按浮栏 设置 时间间隔显隐。 - 时间间隔显隐 建议:复习类不显示,渐进总结/增量写作显示; diff --git a/package.json b/package.json index 3908dc6b..1c93d9f6 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "devDependencies": { "@popperjs/core": "^2.11.8", "deepcopy": "^2.1.0", - "fsrs.js": "^1.1.0", + "fsrs.js": "1.1.0", "@types/jest": "^29.5.11", "@types/node": "^20.10.6", "@types/vhtml": "^2.2.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ee1a559..9b400b32 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,449 +7,1015 @@ settings: dependencies: chart.js: specifier: ^4.4.1 - version: 4.4.1 + version: registry.npmmirror.com/chart.js@4.4.1 pagerank.js: specifier: ^1.0.2 version: 1.0.2 -devDependencies: - '@popperjs/core': - specifier: ^2.11.8 - version: 2.11.8 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 - '@types/node': - specifier: ^20.10.6 - version: 20.10.6 - '@types/vhtml': - specifier: ^2.2.9 - version: 2.2.9 - '@typescript-eslint/eslint-plugin': - specifier: ^6.16.0 - version: 6.16.0(@typescript-eslint/parser@6.16.0)(eslint@8.56.0)(typescript@5.1.6) - '@typescript-eslint/parser': - specifier: ^6.16.0 - version: 6.16.0(eslint@8.56.0)(typescript@5.1.6) - '@wdio/cli': - specifier: ^8.27.1 - version: 8.27.1(typescript@5.1.6) - '@wdio/local-runner': - specifier: ^8.27.0 - version: 8.27.0(typescript@5.1.6) - '@wdio/mocha-framework': - specifier: ^8.27.0 - version: 8.27.0 - '@wdio/spec-reporter': - specifier: ^8.27.0 - version: 8.27.0 - auto-changelog: - specifier: ^2.4.0 - version: 2.4.0 - builtin-modules: - specifier: ^3.3.0 - version: 3.3.0 - chai: - specifier: ^4.3.10 - version: 4.3.10 - esbuild: - specifier: ~0.19.11 - version: 0.19.11 - eslint: - specifier: ^8.56.0 - version: 8.56.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.10.6) - jest-environment-jsdom: - specifier: ^29.7.0 - version: 29.7.0 - jest-expect-message: - specifier: ^1.1.3 - version: 1.1.3 - moment: - specifier: ^2.30.1 - version: 2.30.1 - obsidian: - specifier: ^1.4.11 - version: 1.4.11(@codemirror/state@6.4.0)(@codemirror/view@6.23.0) - prettier: - specifier: ^3.1.1 - version: 3.1.1 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.23.7)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6) - tslib: - specifier: 2.6.1 - version: 2.6.1 - typescript: - specifier: 5.1.6 - version: 5.1.6 - vhtml: - specifier: ^2.2.0 - version: 2.2.0 - wdio-chromedriver-service: - specifier: ^8.1.1 - version: 8.1.1(webdriverio@8.27.0) +devDependencies: + '@popperjs/core': + specifier: ^2.11.8 + version: 2.11.8 + '@types/jest': + specifier: ^29.5.11 + version: registry.npmmirror.com/@types/jest@29.5.11 + '@types/node': + specifier: ^20.10.6 + version: registry.npmmirror.com/@types/node@20.11.0 + '@types/vhtml': + specifier: ^2.2.9 + version: registry.npmmirror.com/@types/vhtml@2.2.9 + '@typescript-eslint/eslint-plugin': + specifier: ^6.16.0 + version: registry.npmmirror.com/@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.1.6) + '@typescript-eslint/parser': + specifier: ^6.16.0 + version: registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6) + '@wdio/cli': + specifier: ^8.27.1 + version: registry.npmmirror.com/@wdio/cli@8.27.2(typescript@5.1.6) + '@wdio/local-runner': + specifier: ^8.27.0 + version: registry.npmmirror.com/@wdio/local-runner@8.27.2(typescript@5.1.6) + '@wdio/mocha-framework': + specifier: ^8.27.0 + version: registry.npmmirror.com/@wdio/mocha-framework@8.27.2 + '@wdio/spec-reporter': + specifier: ^8.27.0 + version: registry.npmmirror.com/@wdio/spec-reporter@8.27.2 + auto-changelog: + specifier: ^2.4.0 + version: 2.4.0 + builtin-modules: + specifier: ^3.3.0 + version: 3.3.0 + chai: + specifier: ^4.3.10 + version: registry.npmmirror.com/chai@4.3.10 + deepcopy: + specifier: ^2.1.0 + version: 2.1.0 + esbuild: + specifier: ~0.19.11 + version: registry.npmmirror.com/esbuild@0.19.11 + eslint: + specifier: ^8.56.0 + version: registry.npmmirror.com/eslint@8.56.0 + fsrs.js: + specifier: 1.1.0 + version: registry.npmmirror.com/fsrs.js@1.1.0 + jest: + specifier: ^29.7.0 + version: registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0) + jest-environment-jsdom: + specifier: ^29.7.0 + version: registry.npmmirror.com/jest-environment-jsdom@29.7.0 + jest-expect-message: + specifier: ^1.1.3 + version: 1.1.3 + moment: + specifier: ^2.30.1 + version: registry.npmmirror.com/moment@2.30.1 + obsidian: + specifier: ^1.4.11 + version: registry.npmmirror.com/obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0) + prettier: + specifier: ^3.1.1 + version: registry.npmmirror.com/prettier@3.2.2 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.23.3)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6) + tslib: + specifier: 2.6.1 + version: 2.6.1 + typescript: + specifier: 5.1.6 + version: 5.1.6 + vhtml: + specifier: ^2.2.0 + version: 2.2.0 + wdio-chromedriver-service: + specifier: ^8.1.1 + version: 8.1.1(webdriverio@8.27.2) + +packages: + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@types/yargs': 17.0.31 + chalk: registry.npmmirror.com/chalk@4.1.2 + dev: true + + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@17.0.31: + resolution: {integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@wdio/logger@8.16.17: + resolution: {integrity: sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==} + engines: {node: ^16.13 || >=18} + dependencies: + chalk: 5.2.0 + loglevel: 1.8.1 + loglevel-plugin-prefix: 0.8.4 + strip-ansi: 7.1.0 + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /auto-changelog@2.4.0: + resolution: {integrity: sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==} + engines: {node: '>=8.3'} + hasBin: true + dependencies: + commander: 7.2.0 + handlebars: 4.7.8 + node-fetch: 2.7.0 + parse-github-url: 1.0.2 + semver: 7.5.0 + transitivePeerDependencies: + - encoding + dev: true + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /debug@4.3.1: + resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepcopy@2.1.0: + resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: registry.npmmirror.com/uglify-js@3.17.4 + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /ip-regex@4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + dev: true + + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: true + + /is2@2.0.9: + resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} + engines: {node: '>=v0.10.0'} + dependencies: + deep-is: 0.1.4 + ip-regex: 4.3.0 + is-url: 1.2.4 + dev: true + + /jest-expect-message@1.1.3: + resolution: {integrity: sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==} + dev: true + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + dev: true + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + dev: true + + /loglevel@1.8.1: + resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} + engines: {node: '>= 0.6.0'} + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /pagerank.js@1.0.2: + resolution: {integrity: sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw==} + dev: false + + /parse-github-url@1.0.2: + resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /semver@7.5.0: + resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /tcp-port-used@1.0.2: + resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} + dependencies: + debug: 4.3.1 + is2: 2.0.9 + transitivePeerDependencies: + - supports-color + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-jest@29.1.1(@babel/core@7.23.3)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + bs-logger: 0.2.6 + esbuild: registry.npmmirror.com/esbuild@0.19.11 + fast-json-stable-stringify: 2.1.0 + jest: registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.1.6 + yargs-parser: 21.1.1 + dev: true + + /tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /vhtml@2.2.0: + resolution: {integrity: sha512-TPXrXrxBOslRUVnlVkiAqhoXneiertIg86bdvzionrUYhEuiROvyPZNiiP6GIIJ2Q7oPNVyEtIx8gMAZZE9lCQ==} + dev: true + + /wdio-chromedriver-service@8.1.1(webdriverio@8.27.2): + resolution: {integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==} + engines: {node: ^16.13 || >=18} + peerDependencies: + '@wdio/types': ^7.0.0 || ^8.0.0-alpha.219 + chromedriver: '*' + webdriverio: ^7.0.0 || ^8.0.0-alpha.219 + peerDependenciesMeta: + '@wdio/types': + optional: true + chromedriver: + optional: true + dependencies: + '@wdio/logger': 8.16.17 + fs-extra: 11.1.1 + split2: 4.2.0 + tcp-port-used: 1.0.2 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + transitivePeerDependencies: + - supports-color + dev: true -packages: + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, tarball: https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz} + name: '@aashutoshrathi/word-wrap' + version: 1.2.6 engines: {node: '>=0.10.0'} dev: true - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + registry.npmmirror.com/@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, tarball: https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz} + name: '@ampproject/remapping' + version: 2.2.1 engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 dev: true - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + registry.npmmirror.com/@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==, tarball: https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz} + name: '@babel/code-frame' + version: 7.22.13 engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': registry.npmmirror.com/@babel/highlight@7.22.20 + chalk: registry.npmmirror.com/chalk@2.4.2 dev: true - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + registry.npmmirror.com/@babel/compat-data@7.23.3: + resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==, tarball: https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.3.tgz} + name: '@babel/compat-data' + version: 7.23.3 engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.23.7: - resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + registry.npmmirror.com/@babel/core@7.23.3: + resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==, tarball: https://registry.npmmirror.com/@babel/core/-/core-7.23.3.tgz} + name: '@babel/core' + version: 7.23.3 engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) - '@babel/helpers': 7.23.7 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 - convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 + '@ampproject/remapping': registry.npmmirror.com/@ampproject/remapping@2.2.1 + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + '@babel/generator': registry.npmmirror.com/@babel/generator@7.23.3 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets@7.22.15 + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3) + '@babel/helpers': registry.npmmirror.com/@babel/helpers@7.23.2 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 + '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + gensync: registry.npmmirror.com/gensync@1.0.0-beta.2 + json5: registry.npmmirror.com/json5@2.2.3 + semver: registry.npmmirror.com/semver@6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + registry.npmmirror.com/@babel/generator@7.23.3: + resolution: {integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==, tarball: https://registry.npmmirror.com/@babel/generator/-/generator-7.23.3.tgz} + name: '@babel/generator' + version: 7.23.3 engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - jsesc: 2.5.2 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + jsesc: registry.npmmirror.com/jsesc@2.5.2 dev: true - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + registry.npmmirror.com/@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==, tarball: https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz} + name: '@babel/helper-compilation-targets' + version: 7.22.15 engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.2 - lru-cache: 5.1.1 - semver: 6.3.1 + '@babel/compat-data': registry.npmmirror.com/@babel/compat-data@7.23.3 + '@babel/helper-validator-option': registry.npmmirror.com/@babel/helper-validator-option@7.22.15 + browserslist: registry.npmmirror.com/browserslist@4.22.1 + lru-cache: registry.npmmirror.com/lru-cache@5.1.1 + semver: registry.npmmirror.com/semver@6.3.1 dev: true - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, tarball: https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz} + name: '@babel/helper-environment-visitor' + version: 7.22.20 engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + registry.npmmirror.com/@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, tarball: https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz} + name: '@babel/helper-function-name' + version: 7.23.0 engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 dev: true - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + registry.npmmirror.com/@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, tarball: https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz} + name: '@babel/helper-hoist-variables' + version: 7.22.5 engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 dev: true - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + registry.npmmirror.com/@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, tarball: https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz} + name: '@babel/helper-module-imports' + version: 7.22.15 engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + registry.npmmirror.com/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, tarball: https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz} + id: registry.npmmirror.com/@babel/helper-module-transforms/7.23.3 + name: '@babel/helper-module-transforms' + version: 7.23.3 engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20 + '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports@7.22.15 + '@babel/helper-simple-access': registry.npmmirror.com/@babel/helper-simple-access@7.22.5 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6 + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 dev: true - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, tarball: https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz} + name: '@babel/helper-plugin-utils' + version: 7.22.5 engines: {node: '>=6.9.0'} dev: true - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + registry.npmmirror.com/@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, tarball: https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz} + name: '@babel/helper-simple-access' + version: 7.22.5 engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 dev: true - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, tarball: https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz} + name: '@babel/helper-split-export-declaration' + version: 7.22.6 engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 dev: true - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + registry.npmmirror.com/@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, tarball: https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz} + name: '@babel/helper-string-parser' + version: 7.22.5 engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, tarball: https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz} + name: '@babel/helper-validator-identifier' + version: 7.22.20 engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + registry.npmmirror.com/@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==, tarball: https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz} + name: '@babel/helper-validator-option' + version: 7.22.15 engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.23.7: - resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} + registry.npmmirror.com/@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==, tarball: https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.2.tgz} + name: '@babel/helpers' + version: 7.23.2 engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 + '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 + '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + registry.npmmirror.com/@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==, tarball: https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.20.tgz} + name: '@babel/highlight' + version: 7.22.20 engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 + chalk: registry.npmmirror.com/chalk@2.4.2 + js-tokens: registry.npmmirror.com/js-tokens@4.0.0 dev: true - /@babel/parser@7.23.6: - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + registry.npmmirror.com/@babel/parser@7.23.3: + resolution: {integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==, tarball: https://registry.npmmirror.com/@babel/parser/-/parser-7.23.3.tgz} + name: '@babel/parser' + version: 7.23.3 engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.6 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.7): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-async-generators/7.8.4 + name: '@babel/plugin-syntax-async-generators' + version: 7.8.4 peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + registry.npmmirror.com/@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-bigint/7.8.3 + name: '@babel/plugin-syntax-bigint' + version: 7.8.3 peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.7): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-class-properties/7.12.13 + name: '@babel/plugin-syntax-class-properties' + version: 7.12.13 peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.7): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + registry.npmmirror.com/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-import-meta/7.10.4 + name: '@babel/plugin-syntax-import-meta' + version: 7.10.4 peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-json-strings/7.8.3 + name: '@babel/plugin-syntax-json-strings' + version: 7.8.3 peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + registry.npmmirror.com/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-jsx/7.23.3 + name: '@babel/plugin-syntax-jsx' + version: 7.23.3 engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.7): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/7.10.4 + name: '@babel/plugin-syntax-logical-assignment-operators' + version: 7.10.4 peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3 + name: '@babel/plugin-syntax-nullish-coalescing-operator' + version: 7.8.3 peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.7): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/7.10.4 + name: '@babel/plugin-syntax-numeric-separator' + version: 7.10.4 peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/7.8.3 + name: '@babel/plugin-syntax-object-rest-spread' + version: 7.8.3 peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/7.8.3 + name: '@babel/plugin-syntax-optional-catch-binding' + version: 7.8.3 peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/7.8.3 + name: '@babel/plugin-syntax-optional-chaining' + version: 7.8.3 peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.7): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-top-level-await/7.14.5 + name: '@babel/plugin-syntax-top-level-await' + version: 7.14.5 engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + registry.npmmirror.com/@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-typescript/7.23.3 + name: '@babel/plugin-syntax-typescript' + version: 7.23.3 engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 dev: true - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + registry.npmmirror.com/@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, tarball: https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz} + name: '@babel/template' + version: 7.22.15 engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 dev: true - /@babel/traverse@7.23.7: - resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + registry.npmmirror.com/@babel/traverse@7.23.3: + resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==, tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.3.tgz} + name: '@babel/traverse' + version: 7.23.3 engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + '@babel/generator': registry.npmmirror.com/@babel/generator@7.23.3 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20 + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name@7.23.0 + '@babel/helper-hoist-variables': registry.npmmirror.com/@babel/helper-hoist-variables@7.22.5 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + globals: registry.npmmirror.com/globals@11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.23.6: - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + registry.npmmirror.com/@babel/types@7.23.3: + resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==, tarball: https://registry.npmmirror.com/@babel/types/-/types-7.23.3.tgz} + name: '@babel/types' + version: 7.23.3 engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': registry.npmmirror.com/@babel/helper-string-parser@7.22.5 + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 + to-fast-properties: registry.npmmirror.com/to-fast-properties@2.0.0 dev: true - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + registry.npmmirror.com/@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, tarball: https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz} + name: '@bcoe/v8-coverage' + version: 0.2.3 dev: true - /@codemirror/state@6.4.0: - resolution: {integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==} + registry.npmmirror.com/@codemirror/state@6.3.1: + resolution: {integrity: sha512-88e4HhMtKJyw6fKprGaN/yZfiaoGYOi2nM45YCUC6R/kex9sxFWBDGatS1vk4lMgnWmdIIB9tk8Gj1LmL8YfvA==, tarball: https://registry.npmmirror.com/@codemirror/state/-/state-6.3.1.tgz} + name: '@codemirror/state' + version: 6.3.1 dev: true - /@codemirror/view@6.23.0: - resolution: {integrity: sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==} + registry.npmmirror.com/@codemirror/view@6.22.0: + resolution: {integrity: sha512-6zLj4YIoIpfTGKrDMTbeZRpa8ih4EymMCKmddEDcJWrCdp/N1D46B38YEz4creTb4T177AVS9EyXkLeC/HL2jA==, tarball: https://registry.npmmirror.com/@codemirror/view/-/view-6.22.0.tgz} + name: '@codemirror/view' + version: 6.22.0 dependencies: - '@codemirror/state': 6.4.0 - style-mod: 4.1.0 - w3c-keyname: 2.2.8 + '@codemirror/state': registry.npmmirror.com/@codemirror/state@6.3.1 + style-mod: registry.npmmirror.com/style-mod@4.1.0 + w3c-keyname: registry.npmmirror.com/w3c-keyname@2.2.6 dev: true - /@esbuild/aix-ppc64@0.19.11: - resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==, tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz} + name: '@esbuild/aix-ppc64' + version: 0.19.11 engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -457,8 +1023,10 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.11: - resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + registry.npmmirror.com/@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz} + name: '@esbuild/android-arm64' + version: 0.19.11 engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -466,8 +1034,10 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.11: - resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + registry.npmmirror.com/@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz} + name: '@esbuild/android-arm' + version: 0.19.11 engines: {node: '>=12'} cpu: [arm] os: [android] @@ -475,8 +1045,10 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.11: - resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + registry.npmmirror.com/@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz} + name: '@esbuild/android-x64' + version: 0.19.11 engines: {node: '>=12'} cpu: [x64] os: [android] @@ -484,8 +1056,10 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.11: - resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz} + name: '@esbuild/darwin-arm64' + version: 0.19.11 engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -493,8 +1067,10 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.11: - resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + registry.npmmirror.com/@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz} + name: '@esbuild/darwin-x64' + version: 0.19.11 engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -502,8 +1078,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.11: - resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz} + name: '@esbuild/freebsd-arm64' + version: 0.19.11 engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -511,8 +1089,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.11: - resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz} + name: '@esbuild/freebsd-x64' + version: 0.19.11 engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -520,8 +1100,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.11: - resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + registry.npmmirror.com/@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz} + name: '@esbuild/linux-arm64' + version: 0.19.11 engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -529,8 +1111,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.11: - resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + registry.npmmirror.com/@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz} + name: '@esbuild/linux-arm' + version: 0.19.11 engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -538,8 +1122,10 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.11: - resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + registry.npmmirror.com/@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz} + name: '@esbuild/linux-ia32' + version: 0.19.11 engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -547,8 +1133,10 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.11: - resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + registry.npmmirror.com/@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz} + name: '@esbuild/linux-loong64' + version: 0.19.11 engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -556,8 +1144,10 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.11: - resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz} + name: '@esbuild/linux-mips64el' + version: 0.19.11 engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -565,8 +1155,10 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.11: - resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz} + name: '@esbuild/linux-ppc64' + version: 0.19.11 engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -574,8 +1166,10 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.11: - resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz} + name: '@esbuild/linux-riscv64' + version: 0.19.11 engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -583,8 +1177,10 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.11: - resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + registry.npmmirror.com/@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz} + name: '@esbuild/linux-s390x' + version: 0.19.11 engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -592,8 +1188,10 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.11: - resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + registry.npmmirror.com/@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz} + name: '@esbuild/linux-x64' + version: 0.19.11 engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -601,8 +1199,10 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.11: - resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz} + name: '@esbuild/netbsd-x64' + version: 0.19.11 engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -610,8 +1210,10 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.11: - resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz} + name: '@esbuild/openbsd-x64' + version: 0.19.11 engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -619,8 +1221,10 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.11: - resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + registry.npmmirror.com/@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz} + name: '@esbuild/sunos-x64' + version: 0.19.11 engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -628,8 +1232,10 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.11: - resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + registry.npmmirror.com/@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz} + name: '@esbuild/win32-arm64' + version: 0.19.11 engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -637,8 +1243,10 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.11: - resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + registry.npmmirror.com/@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz} + name: '@esbuild/win32-ia32' + version: 0.19.11 engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -646,8 +1254,10 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.11: - resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + registry.npmmirror.com/@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz} + name: '@esbuild/win32-x64' + version: 0.19.11 engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -655,105 +1265,130 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, tarball: https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz} + id: registry.npmmirror.com/@eslint-community/eslint-utils/4.4.0 + name: '@eslint-community/eslint-utils' + version: 4.4.0 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 + eslint: registry.npmmirror.com/eslint@8.56.0 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + registry.npmmirror.com/@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, tarball: https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz} + name: '@eslint-community/regexpp' + version: 4.10.0 engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + registry.npmmirror.com/@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, tarball: https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz} + name: '@eslint/eslintrc' + version: 2.1.4 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 + ajv: registry.npmmirror.com/ajv@6.12.6 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + espree: registry.npmmirror.com/espree@9.6.1 + globals: registry.npmmirror.com/globals@13.23.0 + ignore: registry.npmmirror.com/ignore@5.2.4 + import-fresh: registry.npmmirror.com/import-fresh@3.3.0 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 transitivePeerDependencies: - supports-color dev: true - /@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + registry.npmmirror.com/@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, tarball: https://registry.npmmirror.com/@eslint/js/-/js-8.56.0.tgz} + name: '@eslint/js' + version: 8.56.0 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + registry.npmmirror.com/@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, tarball: https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz} + name: '@humanwhocodes/config-array' + version: 0.11.13 engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 + '@humanwhocodes/object-schema': registry.npmmirror.com/@humanwhocodes/object-schema@2.0.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + minimatch: registry.npmmirror.com/minimatch@3.1.2 transitivePeerDependencies: - supports-color dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + registry.npmmirror.com/@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, tarball: https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz} + name: '@humanwhocodes/module-importer' + version: 1.0.1 engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + registry.npmmirror.com/@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, tarball: https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz} + name: '@humanwhocodes/object-schema' + version: 2.0.1 dev: true - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + registry.npmmirror.com/@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, tarball: https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz} + name: '@isaacs/cliui' + version: 8.0.2 engines: {node: '>=12'} dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 + string-width: registry.npmmirror.com/string-width@5.1.2 + string-width-cjs: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 + strip-ansi-cjs: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@8.1.0 + wrap-ansi-cjs: registry.npmmirror.com/wrap-ansi@7.0.0 dev: true - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + registry.npmmirror.com/@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, tarball: https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz} + name: '@istanbuljs/load-nyc-config' + version: 1.1.0 engines: {node: '>=8'} dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 + camelcase: registry.npmmirror.com/camelcase@5.3.1 + find-up: registry.npmmirror.com/find-up@4.1.0 + get-package-type: registry.npmmirror.com/get-package-type@0.1.0 + js-yaml: registry.npmmirror.com/js-yaml@3.14.1 + resolve-from: registry.npmmirror.com/resolve-from@5.0.0 dev: true - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + registry.npmmirror.com/@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, tarball: https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz} + name: '@istanbuljs/schema' + version: 0.1.3 engines: {node: '>=8'} dev: true - /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + registry.npmmirror.com/@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==, tarball: https://registry.npmmirror.com/@jest/console/-/console-29.7.0.tgz} + name: '@jest/console' + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 dev: true - /@jest/core@29.7.0: - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + registry.npmmirror.com/@jest/core@29.7.0: + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==, tarball: https://registry.npmmirror.com/@jest/core/-/core-29.7.0.tgz} + name: '@jest/core' + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -761,93 +1396,105 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.10.6) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 + '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 + '@jest/reporters': registry.npmmirror.com/@jest/reporters@29.7.0 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 + chalk: registry.npmmirror.com/chalk@4.1.2 + ci-info: registry.npmmirror.com/ci-info@3.9.0 + exit: registry.npmmirror.com/exit@0.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-changed-files: registry.npmmirror.com/jest-changed-files@29.7.0 + jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-resolve-dependencies: registry.npmmirror.com/jest-resolve-dependencies@29.7.0 + jest-runner: registry.npmmirror.com/jest-runner@29.7.0 + jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + jest-watcher: registry.npmmirror.com/jest-watcher@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 transitivePeerDependencies: - babel-plugin-macros - supports-color - ts-node dev: true - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + registry.npmmirror.com/@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==, tarball: https://registry.npmmirror.com/@jest/environment/-/environment-29.7.0.tgz} + name: '@jest/environment' + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - jest-mock: 29.7.0 + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 dev: true - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + registry.npmmirror.com/@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==, tarball: https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz} + name: '@jest/expect-utils' + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.6.3 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 dev: true - /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + registry.npmmirror.com/@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==, tarball: https://registry.npmmirror.com/@jest/expect/-/expect-29.7.0.tgz} + name: '@jest/expect' + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 + expect: registry.npmmirror.com/expect@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 transitivePeerDependencies: - supports-color dev: true - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + registry.npmmirror.com/@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==, tarball: https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz} + name: '@jest/fake-timers' + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.10.6 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@sinonjs/fake-timers': registry.npmmirror.com/@sinonjs/fake-timers@10.0.2 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 dev: true - /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + registry.npmmirror.com/@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==, tarball: https://registry.npmmirror.com/@jest/globals/-/globals-29.7.0.tgz} + name: '@jest/globals' + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/expect': registry.npmmirror.com/@jest/expect@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 transitivePeerDependencies: - supports-color dev: true - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + registry.npmmirror.com/@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==, tarball: https://registry.npmmirror.com/@jest/reporters/-/reporters-29.7.0.tgz} + name: '@jest/reporters' + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -855,176 +1502,213 @@ packages: node-notifier: optional: true dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.20 - '@types/node': 20.10.6 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.1 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.2.0 + '@bcoe/v8-coverage': registry.npmmirror.com/@bcoe/v8-coverage@0.2.3 + '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 + exit: registry.npmmirror.com/exit@0.1.2 + glob: registry.npmmirror.com/glob@7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument@6.0.1 + istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.1 + istanbul-lib-source-maps: registry.npmmirror.com/istanbul-lib-source-maps@4.0.1 + istanbul-reports: registry.npmmirror.com/istanbul-reports@3.1.5 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-worker: registry.npmmirror.com/jest-worker@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + string-length: registry.npmmirror.com/string-length@4.0.2 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + v8-to-istanbul: registry.npmmirror.com/v8-to-istanbul@9.1.3 transitivePeerDependencies: - supports-color dev: true - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + registry.npmmirror.com/@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, tarball: https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz} + name: '@jest/schemas' + version: 29.6.3 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@sinclair/typebox': 0.27.8 + '@sinclair/typebox': registry.npmmirror.com/@sinclair/typebox@0.27.8 dev: true - /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + registry.npmmirror.com/@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==, tarball: https://registry.npmmirror.com/@jest/source-map/-/source-map-29.6.3.tgz} + name: '@jest/source-map' + version: 29.6.3 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.20 - callsites: 3.1.0 - graceful-fs: 4.2.11 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + callsites: registry.npmmirror.com/callsites@3.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 dev: true - /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + registry.npmmirror.com/@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==, tarball: https://registry.npmmirror.com/@jest/test-result/-/test-result-29.7.0.tgz} + name: '@jest/test-result' + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 + '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 dev: true - /@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + registry.npmmirror.com/@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==, tarball: https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz} + name: '@jest/test-sequencer' + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 dev: true - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + registry.npmmirror.com/@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==, tarball: https://registry.npmmirror.com/@jest/transform/-/transform-29.7.0.tgz} + name: '@jest/transform' + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.7 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.20 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.5 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul@6.1.1 + chalk: registry.npmmirror.com/chalk@4.1.2 + convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify@2.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + pirates: registry.npmmirror.com/pirates@4.0.5 + slash: registry.npmmirror.com/slash@3.0.0 + write-file-atomic: registry.npmmirror.com/write-file-atomic@4.0.2 transitivePeerDependencies: - supports-color dev: true - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + registry.npmmirror.com/@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, tarball: https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz} + name: '@jest/types' + version: 29.6.3 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.10.6 - '@types/yargs': 17.0.32 - chalk: 4.1.2 + '@jest/schemas': registry.npmmirror.com/@jest/schemas@29.6.3 + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + '@types/istanbul-reports': registry.npmmirror.com/@types/istanbul-reports@3.0.4 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@types/yargs': registry.npmmirror.com/@types/yargs@17.0.31 + chalk: registry.npmmirror.com/chalk@4.1.2 dev: true - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz} + name: '@jridgewell/gen-mapping' + version: 0.3.3 engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array@1.1.2 + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 dev: true - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz} + name: '@jridgewell/resolve-uri' + version: 3.1.0 engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + registry.npmmirror.com/@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, tarball: https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz} + name: '@jridgewell/set-array' + version: 1.1.2 engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz} + name: '@jridgewell/sourcemap-codec' + version: 1.4.15 dev: true - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz} + name: '@jridgewell/trace-mapping' + version: 0.3.20 dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0 + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15 dev: true - /@kurkle/color@0.3.2: - resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} + registry.npmmirror.com/@kurkle/color@0.3.2: + resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==, tarball: https://registry.npmmirror.com/@kurkle/color/-/color-0.3.2.tgz} + name: '@kurkle/color' + version: 0.3.2 dev: false - /@ljharb/through@2.3.11: - resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==} + registry.npmmirror.com/@ljharb/through@2.3.11: + resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==, tarball: https://registry.npmmirror.com/@ljharb/through/-/through-2.3.11.tgz} + name: '@ljharb/through' + version: 2.3.11 engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: registry.npmmirror.com/call-bind@1.0.5 dev: true - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + registry.npmmirror.com/@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, tarball: https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz} + name: '@nodelib/fs.scandir' + version: 2.1.5 engines: {node: '>= 8'} dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@nodelib/fs.stat': registry.npmmirror.com/@nodelib/fs.stat@2.0.5 + run-parallel: registry.npmmirror.com/run-parallel@1.2.0 dev: true - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + registry.npmmirror.com/@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, tarball: https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz} + name: '@nodelib/fs.stat' + version: 2.0.5 engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + registry.npmmirror.com/@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, tarball: https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz} + name: '@nodelib/fs.walk' + version: 1.2.8 engines: {node: '>= 8'} dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.16.0 + '@nodelib/fs.scandir': registry.npmmirror.com/@nodelib/fs.scandir@2.1.5 + fastq: registry.npmmirror.com/fastq@1.15.0 dev: true - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + registry.npmmirror.com/@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, tarball: https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz} + name: '@pkgjs/parseargs' + version: 0.11.0 engines: {node: '>=14'} requiresBuild: true dev: true optional: true - /@puppeteer/browsers@1.4.6(typescript@5.1.6): - resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==} + registry.npmmirror.com/@puppeteer/browsers@1.4.6(typescript@5.1.6): + resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==, tarball: https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-1.4.6.tgz} + id: registry.npmmirror.com/@puppeteer/browsers/1.4.6 + name: '@puppeteer/browsers' + version: 1.4.6 engines: {node: '>=16.3.0'} hasBin: true peerDependencies: @@ -1033,221 +1717,294 @@ packages: typescript: optional: true dependencies: - debug: 4.3.4(supports-color@8.1.1) - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.3.0 - tar-fs: 3.0.4 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + extract-zip: registry.npmmirror.com/extract-zip@2.0.1 + progress: registry.npmmirror.com/progress@2.0.3 + proxy-agent: registry.npmmirror.com/proxy-agent@6.3.0 + tar-fs: registry.npmmirror.com/tar-fs@3.0.4 typescript: 5.1.6 - unbzip2-stream: 1.4.3 - yargs: 17.7.1 + unbzip2-stream: registry.npmmirror.com/unbzip2-stream@1.4.3 + yargs: registry.npmmirror.com/yargs@17.7.1 transitivePeerDependencies: - supports-color dev: true - /@puppeteer/browsers@1.9.0: - resolution: {integrity: sha512-QwguOLy44YBGC8vuPP2nmpX4MUN2FzWbsnvZJtiCzecU3lHmVZkaC1tq6rToi9a200m8RzlVtDyxCS0UIDrxUg==} + registry.npmmirror.com/@puppeteer/browsers@1.8.0: + resolution: {integrity: sha512-TkRHIV6k2D8OlUe8RtG+5jgOF/H98Myx0M6AOafC8DdNVOFiBSFa5cpRDtpm8LXOa9sVwe0+e6Q3FC56X/DZfg==, tarball: https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-1.8.0.tgz} + name: '@puppeteer/browsers' + version: 1.8.0 engines: {node: '>=16.3.0'} hasBin: true dependencies: - debug: 4.3.4(supports-color@8.1.1) - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.3.1 - tar-fs: 3.0.4 - unbzip2-stream: 1.4.3 - yargs: 17.7.2 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + extract-zip: registry.npmmirror.com/extract-zip@2.0.1 + progress: registry.npmmirror.com/progress@2.0.3 + proxy-agent: registry.npmmirror.com/proxy-agent@6.3.1 + tar-fs: registry.npmmirror.com/tar-fs@3.0.4 + unbzip2-stream: registry.npmmirror.com/unbzip2-stream@1.4.3 + yargs: registry.npmmirror.com/yargs@17.7.2 transitivePeerDependencies: - supports-color dev: true - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + registry.npmmirror.com/@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, tarball: https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz} + name: '@sinclair/typebox' + version: 0.27.8 dev: true - /@sindresorhus/is@5.6.0: - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + registry.npmmirror.com/@sindresorhus/is@5.3.0: + resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==, tarball: https://registry.npmmirror.com/@sindresorhus/is/-/is-5.3.0.tgz} + name: '@sindresorhus/is' + version: 5.3.0 engines: {node: '>=14.16'} dev: true - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} + registry.npmmirror.com/@sinonjs/commons@2.0.0: + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==, tarball: https://registry.npmmirror.com/@sinonjs/commons/-/commons-2.0.0.tgz} + name: '@sinonjs/commons' + version: 2.0.0 dependencies: - type-detect: 4.0.8 + type-detect: registry.npmmirror.com/type-detect@4.0.8 dev: true - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + registry.npmmirror.com/@sinonjs/fake-timers@10.0.2: + resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==, tarball: https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz} + name: '@sinonjs/fake-timers' + version: 10.0.2 dependencies: - '@sinonjs/commons': 3.0.0 + '@sinonjs/commons': registry.npmmirror.com/@sinonjs/commons@2.0.0 dev: true - /@szmarczak/http-timer@5.0.1: - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + registry.npmmirror.com/@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==, tarball: https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz} + name: '@szmarczak/http-timer' + version: 5.0.1 engines: {node: '>=14.16'} dependencies: - defer-to-connect: 2.0.1 + defer-to-connect: registry.npmmirror.com/defer-to-connect@2.0.1 dev: true - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + registry.npmmirror.com/@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, tarball: https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz} + name: '@tootallnate/once' + version: 2.0.0 engines: {node: '>= 10'} dev: true - /@tootallnate/quickjs-emscripten@0.23.0: - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + registry.npmmirror.com/@tootallnate/quickjs-emscripten@0.23.0: + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==, tarball: https://registry.npmmirror.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz} + name: '@tootallnate/quickjs-emscripten' + version: 0.23.0 dev: true - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + registry.npmmirror.com/@types/babel__core@7.20.4: + resolution: {integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==, tarball: https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.4.tgz} + name: '@types/babel__core' + version: 7.20.4 dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + '@types/babel__generator': registry.npmmirror.com/@types/babel__generator@7.6.7 + '@types/babel__template': registry.npmmirror.com/@types/babel__template@7.4.4 + '@types/babel__traverse': registry.npmmirror.com/@types/babel__traverse@7.20.4 dev: true - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + registry.npmmirror.com/@types/babel__generator@7.6.7: + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==, tarball: https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.7.tgz} + name: '@types/babel__generator' + version: 7.6.7 dependencies: - '@babel/types': 7.23.6 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 dev: true - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + registry.npmmirror.com/@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, tarball: https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz} + name: '@types/babel__template' + version: 7.4.4 dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 dev: true - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + registry.npmmirror.com/@types/babel__traverse@7.20.4: + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==, tarball: https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz} + name: '@types/babel__traverse' + version: 7.20.4 dependencies: - '@babel/types': 7.23.6 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 dev: true - /@types/codemirror@5.60.8: - resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} + registry.npmmirror.com/@types/codemirror@5.60.8: + resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==, tarball: https://registry.npmmirror.com/@types/codemirror/-/codemirror-5.60.8.tgz} + name: '@types/codemirror' + version: 5.60.8 dependencies: - '@types/tern': 0.23.9 + '@types/tern': registry.npmmirror.com/@types/tern@0.23.7 dev: true - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + registry.npmmirror.com/@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, tarball: https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz} + name: '@types/estree' + version: 1.0.5 dev: true - /@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + registry.npmmirror.com/@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, tarball: https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz} + name: '@types/graceful-fs' + version: 4.1.9 dependencies: - '@types/node': 20.10.6 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 dev: true - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + registry.npmmirror.com/@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==, tarball: https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz} + name: '@types/http-cache-semantics' + version: 4.0.4 dev: true - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, tarball: https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz} + name: '@types/istanbul-lib-coverage' + version: 2.0.6 dev: true - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + registry.npmmirror.com/@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, tarball: https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz} + name: '@types/istanbul-lib-report' + version: 3.0.3 dependencies: - '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 dev: true - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + registry.npmmirror.com/@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, tarball: https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz} + name: '@types/istanbul-reports' + version: 3.0.4 dependencies: - '@types/istanbul-lib-report': 3.0.3 + '@types/istanbul-lib-report': registry.npmmirror.com/@types/istanbul-lib-report@3.0.3 dev: true - /@types/jest@29.5.11: - resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==} + registry.npmmirror.com/@types/jest@29.5.11: + resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==, tarball: https://registry.npmmirror.com/@types/jest/-/jest-29.5.11.tgz} + name: '@types/jest' + version: 29.5.11 dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 + expect: registry.npmmirror.com/expect@29.7.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 dev: true - /@types/jsdom@20.0.1: - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + registry.npmmirror.com/@types/jsdom@20.0.1: + resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==, tarball: https://registry.npmmirror.com/@types/jsdom/-/jsdom-20.0.1.tgz} + name: '@types/jsdom' + version: 20.0.1 dependencies: - '@types/node': 20.10.6 - '@types/tough-cookie': 4.0.5 - parse5: 7.1.2 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@types/tough-cookie': registry.npmmirror.com/@types/tough-cookie@4.0.5 + parse5: registry.npmmirror.com/parse5@7.1.2 dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + registry.npmmirror.com/@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, tarball: https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz} + name: '@types/json-schema' + version: 7.0.15 dev: true - /@types/mocha@10.0.6: - resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} + registry.npmmirror.com/@types/mocha@10.0.4: + resolution: {integrity: sha512-xKU7bUjiFTIttpWaIZ9qvgg+22O1nmbA+HRxdlR+u6TWsGfmFdXrheJoK4fFxrHNVIOBDvDNKZG+LYBpMHpX3w==, tarball: https://registry.npmmirror.com/@types/mocha/-/mocha-10.0.4.tgz} + name: '@types/mocha' + version: 10.0.4 dev: true - /@types/node@20.10.6: - resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} + registry.npmmirror.com/@types/node@20.11.0: + resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==, tarball: https://registry.npmmirror.com/@types/node/-/node-20.11.0.tgz} + name: '@types/node' + version: 20.11.0 dependencies: - undici-types: 5.26.5 + undici-types: registry.npmmirror.com/undici-types@5.26.5 dev: true - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + registry.npmmirror.com/@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, tarball: https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz} + name: '@types/normalize-package-data' + version: 2.4.4 dev: true - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + registry.npmmirror.com/@types/semver@7.5.5: + resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==, tarball: https://registry.npmmirror.com/@types/semver/-/semver-7.5.5.tgz} + name: '@types/semver' + version: 7.5.5 dev: true - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + registry.npmmirror.com/@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, tarball: https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.3.tgz} + name: '@types/stack-utils' + version: 2.0.3 dev: true - /@types/tern@0.23.9: - resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} + registry.npmmirror.com/@types/tern@0.23.7: + resolution: {integrity: sha512-0YS9XCZ0LAhlP11HV9SqncUYyz9Ggsgc7Om/AmchKvoeFyj0qPaJmX6rJ93mJVExizWDzUMb49gAtVpI1uHd8Q==, tarball: https://registry.npmmirror.com/@types/tern/-/tern-0.23.7.tgz} + name: '@types/tern' + version: 0.23.7 dependencies: - '@types/estree': 1.0.5 + '@types/estree': registry.npmmirror.com/@types/estree@1.0.5 dev: true - /@types/tough-cookie@4.0.5: - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + registry.npmmirror.com/@types/tough-cookie@4.0.5: + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==, tarball: https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz} + name: '@types/tough-cookie' + version: 4.0.5 dev: true - /@types/vhtml@2.2.9: - resolution: {integrity: sha512-maEIRJb+PdK2FWDORl0a0aNUSGlniMl8pN+7WbanLzx1Gry4gLfsT0C9O/6JucPPBHCNrqDSImr2QcsUENLKUg==} + registry.npmmirror.com/@types/vhtml@2.2.9: + resolution: {integrity: sha512-maEIRJb+PdK2FWDORl0a0aNUSGlniMl8pN+7WbanLzx1Gry4gLfsT0C9O/6JucPPBHCNrqDSImr2QcsUENLKUg==, tarball: https://registry.npmmirror.com/@types/vhtml/-/vhtml-2.2.9.tgz} + name: '@types/vhtml' + version: 2.2.9 dev: true - /@types/which@2.0.2: - resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} + registry.npmmirror.com/@types/which@2.0.2: + resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==, tarball: https://registry.npmmirror.com/@types/which/-/which-2.0.2.tgz} + name: '@types/which' + version: 2.0.2 dev: true - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + registry.npmmirror.com/@types/ws@8.5.9: + resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==, tarball: https://registry.npmmirror.com/@types/ws/-/ws-8.5.9.tgz} + name: '@types/ws' + version: 8.5.9 dependencies: - '@types/node': 20.10.6 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 dev: true - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + registry.npmmirror.com/@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, tarball: https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz} + name: '@types/yargs-parser' + version: 21.0.3 dev: true - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + registry.npmmirror.com/@types/yargs@17.0.31: + resolution: {integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==, tarball: https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.31.tgz} + name: '@types/yargs' + version: 17.0.31 dependencies: - '@types/yargs-parser': 21.0.3 + '@types/yargs-parser': registry.npmmirror.com/@types/yargs-parser@21.0.3 dev: true - /@types/yauzl@2.10.3: - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + registry.npmmirror.com/@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, tarball: https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz} + name: '@types/yauzl' + version: 2.10.3 requiresBuild: true dependencies: - '@types/node': 20.10.6 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 dev: true optional: true - /@typescript-eslint/eslint-plugin@6.16.0(@typescript-eslint/parser@6.16.0)(eslint@8.56.0)(typescript@5.1.6): - resolution: {integrity: sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ==} + registry.npmmirror.com/@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.1.6): + resolution: {integrity: sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==, tarball: https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz} + id: registry.npmmirror.com/@typescript-eslint/eslint-plugin/6.18.1 + name: '@typescript-eslint/eslint-plugin' + version: 6.18.1 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -1257,26 +2014,29 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.16.0(eslint@8.56.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 6.16.0 - '@typescript-eslint/type-utils': 6.16.0(eslint@8.56.0)(typescript@5.1.6) - '@typescript-eslint/utils': 6.16.0(eslint@8.56.0)(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.16.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.1.6) + '@eslint-community/regexpp': registry.npmmirror.com/@eslint-community/regexpp@4.10.0 + '@typescript-eslint/parser': registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 + '@typescript-eslint/type-utils': registry.npmmirror.com/@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) + '@typescript-eslint/utils': registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmmirror.com/eslint@8.56.0 + graphemer: registry.npmmirror.com/graphemer@1.4.0 + ignore: registry.npmmirror.com/ignore@5.2.4 + natural-compare: registry.npmmirror.com/natural-compare@1.4.0 + semver: registry.npmmirror.com/semver@7.5.4 + ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.16.0(eslint@8.56.0)(typescript@5.1.6): - resolution: {integrity: sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==} + registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6): + resolution: {integrity: sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==, tarball: https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.18.1.tgz} + id: registry.npmmirror.com/@typescript-eslint/parser/6.18.1 + name: '@typescript-eslint/parser' + version: 6.18.1 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1285,27 +2045,32 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.16.0 - '@typescript-eslint/types': 6.16.0 - '@typescript-eslint/typescript-estree': 6.16.0(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.16.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 + '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 + '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) + '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmmirror.com/eslint@8.56.0 typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.16.0: - resolution: {integrity: sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==} + registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1: + resolution: {integrity: sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==, tarball: https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz} + name: '@typescript-eslint/scope-manager' + version: 6.18.1 engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.16.0 - '@typescript-eslint/visitor-keys': 6.16.0 + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 + '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 dev: true - /@typescript-eslint/type-utils@6.16.0(eslint@8.56.0)(typescript@5.1.6): - resolution: {integrity: sha512-ThmrEOcARmOnoyQfYkHw/DX2SEYBalVECmoldVuH6qagKROp/jMnfXpAU/pAIWub9c4YTxga+XwgAkoA0pxfmg==} + registry.npmmirror.com/@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.1.6): + resolution: {integrity: sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==, tarball: https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz} + id: registry.npmmirror.com/@typescript-eslint/type-utils/6.18.1 + name: '@typescript-eslint/type-utils' + version: 6.18.1 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1314,23 +2079,28 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.16.0(typescript@5.1.6) - '@typescript-eslint/utils': 6.16.0(eslint@8.56.0)(typescript@5.1.6) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 - ts-api-utils: 1.0.3(typescript@5.1.6) + '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) + '@typescript-eslint/utils': registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmmirror.com/eslint@8.56.0 + ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.16.0: - resolution: {integrity: sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==} + registry.npmmirror.com/@typescript-eslint/types@6.18.1: + resolution: {integrity: sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==, tarball: https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.18.1.tgz} + name: '@typescript-eslint/types' + version: 6.18.1 engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.16.0(typescript@5.1.6): - resolution: {integrity: sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==} + registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6): + resolution: {integrity: sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==, tarball: https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz} + id: registry.npmmirror.com/@typescript-eslint/typescript-estree/6.18.1 + name: '@typescript-eslint/typescript-estree' + version: 6.18.1 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -1338,78 +2108,88 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.16.0 - '@typescript-eslint/visitor-keys': 6.16.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.1.6) + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 + '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + globby: registry.npmmirror.com/globby@11.1.0 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + minimatch: registry.npmmirror.com/minimatch@9.0.3 + semver: registry.npmmirror.com/semver@7.5.4 + ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.16.0(eslint@8.56.0)(typescript@5.1.6): - resolution: {integrity: sha512-T83QPKrBm6n//q9mv7oiSvy/Xq/7Hyw9SzSEhMHJwznEmQayfBM87+oAlkNAMEO7/MjIwKyOHgBJbxB0s7gx2A==} + registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6): + resolution: {integrity: sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==, tarball: https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.18.1.tgz} + id: registry.npmmirror.com/@typescript-eslint/utils/6.18.1 + name: '@typescript-eslint/utils' + version: 6.18.1 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.16.0 - '@typescript-eslint/types': 6.16.0 - '@typescript-eslint/typescript-estree': 6.16.0(typescript@5.1.6) - eslint: 8.56.0 - semver: 7.5.4 + '@eslint-community/eslint-utils': registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0) + '@types/json-schema': registry.npmmirror.com/@types/json-schema@7.0.15 + '@types/semver': registry.npmmirror.com/@types/semver@7.5.5 + '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 + '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) + eslint: registry.npmmirror.com/eslint@8.56.0 + semver: registry.npmmirror.com/semver@7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.16.0: - resolution: {integrity: sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==} + registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1: + resolution: {integrity: sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==, tarball: https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz} + name: '@typescript-eslint/visitor-keys' + version: 6.18.1 engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.16.0 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + registry.npmmirror.com/@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, tarball: https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz} + name: '@ungap/structured-clone' + version: 1.2.0 dev: true - /@wdio/cli@8.27.1(typescript@5.1.6): - resolution: {integrity: sha512-RY9o4h0iN6UGpU31X5c9mu/TK2FlHtKtDaRJYunm5ycZvGahQcN+naYpea1ftDr4IpI2gGGlHxvEeHkJF7urDQ==} + registry.npmmirror.com/@wdio/cli@8.27.2(typescript@5.1.6): + resolution: {integrity: sha512-gRbwqjjczReWqLFZQX9iwTsCwGPFavJwL7iKSoIeAS645sM9PMmPW7mHzawmkFxqDDAyBWO3qFn4KV2H/2YfdA==, tarball: https://registry.npmmirror.com/@wdio/cli/-/cli-8.27.2.tgz} + id: registry.npmmirror.com/@wdio/cli/8.27.2 + name: '@wdio/cli' + version: 8.27.2 engines: {node: ^16.13 || >=18} hasBin: true dependencies: - '@types/node': 20.10.6 - '@wdio/config': 8.27.0 - '@wdio/globals': 8.27.0(typescript@5.1.6) - '@wdio/logger': 8.24.12 - '@wdio/protocols': 8.24.12 - '@wdio/types': 8.27.0 - '@wdio/utils': 8.27.0 - async-exit-hook: 2.0.1 - chalk: 5.3.0 - chokidar: 3.5.3 - cli-spinners: 2.9.2 - dotenv: 16.3.1 - ejs: 3.1.9 - execa: 8.0.1 - import-meta-resolve: 4.0.0 - inquirer: 9.2.12 - lodash.flattendeep: 4.4.0 - lodash.pickby: 4.6.0 - lodash.union: 4.6.0 - read-pkg-up: 10.1.0 - recursive-readdir: 2.2.3 - webdriverio: 8.27.0(typescript@5.1.6) - yargs: 17.7.2 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 + '@wdio/globals': registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/protocols': registry.npmmirror.com/@wdio/protocols@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + async-exit-hook: registry.npmmirror.com/async-exit-hook@2.0.1 + chalk: registry.npmmirror.com/chalk@5.3.0 + chokidar: registry.npmmirror.com/chokidar@3.5.3 + cli-spinners: registry.npmmirror.com/cli-spinners@2.9.1 + dotenv: registry.npmmirror.com/dotenv@16.3.1 + ejs: registry.npmmirror.com/ejs@3.1.9 + execa: registry.npmmirror.com/execa@8.0.1 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 + inquirer: registry.npmmirror.com/inquirer@9.2.12 + lodash.flattendeep: registry.npmmirror.com/lodash.flattendeep@4.4.0 + lodash.pickby: registry.npmmirror.com/lodash.pickby@4.6.0 + lodash.union: registry.npmmirror.com/lodash.union@4.6.0 + read-pkg-up: registry.npmmirror.com/read-pkg-up@10.1.0 + recursive-readdir: registry.npmmirror.com/recursive-readdir@2.2.3 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + yargs: registry.npmmirror.com/yargs@17.7.2 transitivePeerDependencies: - bufferutil - devtools @@ -1419,27 +2199,32 @@ packages: - utf-8-validate dev: true - /@wdio/config@8.27.0: - resolution: {integrity: sha512-zYM5daeiBVVAbQj0ASymAt0RUsocLVIwKiUHNa8gg/1GsZnztGjetXExSp1gXlxtMVM5xWUSKjh6ceFK79gWDQ==} + registry.npmmirror.com/@wdio/config@8.27.2: + resolution: {integrity: sha512-qR1r7K7/jsQhi9g5NiW40lgbvbzCcwwk8nz07hzTj6m8fQ8TXkQPob2fnrlDaNrXjzbZC4od0uv0a5fimK9YOQ==, tarball: https://registry.npmmirror.com/@wdio/config/-/config-8.27.2.tgz} + name: '@wdio/config' + version: 8.27.2 engines: {node: ^16.13 || >=18} dependencies: - '@wdio/logger': 8.24.12 - '@wdio/types': 8.27.0 - '@wdio/utils': 8.27.0 - decamelize: 6.0.0 - deepmerge-ts: 5.1.0 - glob: 10.3.10 - import-meta-resolve: 4.0.0 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + glob: registry.npmmirror.com/glob@10.3.10 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 transitivePeerDependencies: - supports-color dev: true - /@wdio/globals@8.27.0(typescript@5.1.6): - resolution: {integrity: sha512-HUPOIsrmxfF0LhU68lVsNGQGZkW/bWOvcCd8WxeaggTAH9JyxasxxfwzeCceAuhAvwtlwoMXITOpjAXO2mj38Q==} + registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6): + resolution: {integrity: sha512-kU9fsOD1HVSROgN0TkjH8+O2SWbd5hHzL952+YOifMHFtt05Ua/n5mqxTTVAWmxUMMCz6VOuySmBt2Dhd4NnKA==, tarball: https://registry.npmmirror.com/@wdio/globals/-/globals-8.27.2.tgz} + id: registry.npmmirror.com/@wdio/globals/8.27.2 + name: '@wdio/globals' + version: 8.27.2 engines: {node: ^16.13 || >=18} optionalDependencies: - expect-webdriverio: 4.7.2(typescript@5.1.6) - webdriverio: 8.27.0(typescript@5.1.6) + expect-webdriverio: registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6) + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) transitivePeerDependencies: - bufferutil - devtools @@ -1449,18 +2234,21 @@ packages: - utf-8-validate dev: true - /@wdio/local-runner@8.27.0(typescript@5.1.6): - resolution: {integrity: sha512-nxS17mhoLkXP20eoPMkz7tbMFMOQejSw0hZfkEvuDCNhJokr8ugp6IjYXL9f7yV9IB9UDGHox8WGY4ArSrOeBA==} + registry.npmmirror.com/@wdio/local-runner@8.27.2(typescript@5.1.6): + resolution: {integrity: sha512-7m0vEulOyriMPB1+559ioEdjXlLu7yseM3KfQapCdLqaqTWvURJlMSxiHZZwuHaVGKa6YBPNB7NhRcHoUsqsAg==, tarball: https://registry.npmmirror.com/@wdio/local-runner/-/local-runner-8.27.2.tgz} + id: registry.npmmirror.com/@wdio/local-runner/8.27.2 + name: '@wdio/local-runner' + version: 8.27.2 engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.10.6 - '@wdio/logger': 8.24.12 - '@wdio/repl': 8.24.12 - '@wdio/runner': 8.27.0(typescript@5.1.6) - '@wdio/types': 8.27.0 - async-exit-hook: 2.0.1 - split2: 4.2.0 - stream-buffers: 3.0.2 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/repl': registry.npmmirror.com/@wdio/repl@8.24.12 + '@wdio/runner': registry.npmmirror.com/@wdio/runner@8.27.2(typescript@5.1.6) + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + async-exit-hook: registry.npmmirror.com/async-exit-hook@2.0.1 + split2: registry.npmmirror.com/split2@4.2.0 + stream-buffers: registry.npmmirror.com/stream-buffers@3.0.2 transitivePeerDependencies: - bufferutil - devtools @@ -1470,67 +2258,80 @@ packages: - utf-8-validate dev: true - /@wdio/logger@8.24.12: - resolution: {integrity: sha512-QisOiVIWKTUCf1H7S+DOtC+gruhlpimQrUXfWMTeeh672PvAJYnTpOJDWA+BtXfsikkUYFAzAaq8SeMJk8rqKg==} + registry.npmmirror.com/@wdio/logger@8.24.12: + resolution: {integrity: sha512-QisOiVIWKTUCf1H7S+DOtC+gruhlpimQrUXfWMTeeh672PvAJYnTpOJDWA+BtXfsikkUYFAzAaq8SeMJk8rqKg==, tarball: https://registry.npmmirror.com/@wdio/logger/-/logger-8.24.12.tgz} + name: '@wdio/logger' + version: 8.24.12 engines: {node: ^16.13 || >=18} dependencies: - chalk: 5.3.0 - loglevel: 1.8.1 - loglevel-plugin-prefix: 0.8.4 - strip-ansi: 7.1.0 + chalk: registry.npmmirror.com/chalk@5.3.0 + loglevel: registry.npmmirror.com/loglevel@1.8.1 + loglevel-plugin-prefix: registry.npmmirror.com/loglevel-plugin-prefix@0.8.4 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 dev: true - /@wdio/mocha-framework@8.27.0: - resolution: {integrity: sha512-NaFUPv90ks1XlZy0qdUaJ5/ilBtiCCgTIxaPexshJiaVDT5cV+Igjag/O80HIcvqknOZpdKAR0I1ArQzhJrmcA==} + registry.npmmirror.com/@wdio/mocha-framework@8.27.2: + resolution: {integrity: sha512-R0PRW5X8VDJzpHPhtOGkcPFrcetDOYz9q//4uqvdtdKtngrp4goz2cVNEmnbXJDMUm5VHSYy2GW6YtsjWUxbkA==, tarball: https://registry.npmmirror.com/@wdio/mocha-framework/-/mocha-framework-8.27.2.tgz} + name: '@wdio/mocha-framework' + version: 8.27.2 engines: {node: ^16.13 || >=18} dependencies: - '@types/mocha': 10.0.6 - '@types/node': 20.10.6 - '@wdio/logger': 8.24.12 - '@wdio/types': 8.27.0 - '@wdio/utils': 8.27.0 - mocha: 10.2.0 + '@types/mocha': registry.npmmirror.com/@types/mocha@10.0.4 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + mocha: registry.npmmirror.com/mocha@10.2.0 transitivePeerDependencies: - supports-color dev: true - /@wdio/protocols@8.24.12: - resolution: {integrity: sha512-QnVj3FkapmVD3h2zoZk+ZQ8gevSj9D9MiIQIy8eOnY4FAneYZ9R9GvoW+mgNcCZO8S8++S/jZHetR8n+8Q808g==} + registry.npmmirror.com/@wdio/protocols@8.24.12: + resolution: {integrity: sha512-QnVj3FkapmVD3h2zoZk+ZQ8gevSj9D9MiIQIy8eOnY4FAneYZ9R9GvoW+mgNcCZO8S8++S/jZHetR8n+8Q808g==, tarball: https://registry.npmmirror.com/@wdio/protocols/-/protocols-8.24.12.tgz} + name: '@wdio/protocols' + version: 8.24.12 dev: true - /@wdio/repl@8.24.12: - resolution: {integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==} + registry.npmmirror.com/@wdio/repl@8.24.12: + resolution: {integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==, tarball: https://registry.npmmirror.com/@wdio/repl/-/repl-8.24.12.tgz} + name: '@wdio/repl' + version: 8.24.12 engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.10.6 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 dev: true - /@wdio/reporter@8.27.0: - resolution: {integrity: sha512-kBwsrHbsblmXfHSWlaOKXjPRPeT29WSKTUoCmzuTcCkhvbjY4TrEB0p04cpaM7uNqdIZTxHng54gZVaG/nZPiw==} + registry.npmmirror.com/@wdio/reporter@8.27.2: + resolution: {integrity: sha512-vMhoTVsowDmk6EXYgJ4nFBd6vvMFLIO3zUL4w/DCCkPDyjS9/6ggs/wpVSlrKxw9qisAph1Z4W9ngtNuhQQuwg==, tarball: https://registry.npmmirror.com/@wdio/reporter/-/reporter-8.27.2.tgz} + name: '@wdio/reporter' + version: 8.27.2 engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.10.6 - '@wdio/logger': 8.24.12 - '@wdio/types': 8.27.0 - diff: 5.1.0 - object-inspect: 1.13.1 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + diff: registry.npmmirror.com/diff@5.1.0 + object-inspect: registry.npmmirror.com/object-inspect@1.13.1 dev: true - /@wdio/runner@8.27.0(typescript@5.1.6): - resolution: {integrity: sha512-da332r2d1QXdRhMhsDxMObcqLZS0l/u14pHICNTvEHp+72gOttbjUDvdMHPQY6Ae5ul7AVVQ05qpmz9CX7TzOg==} + registry.npmmirror.com/@wdio/runner@8.27.2(typescript@5.1.6): + resolution: {integrity: sha512-a72dJ+7ap0DOrkrjx1ofYHzgDYzK0I7RjSGOEvi2cc+SwnwESHnwtPug5F3NfDFEMXV3Y3pN+E/yz81S27WpvQ==, tarball: https://registry.npmmirror.com/@wdio/runner/-/runner-8.27.2.tgz} + id: registry.npmmirror.com/@wdio/runner/8.27.2 + name: '@wdio/runner' + version: 8.27.2 engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.10.6 - '@wdio/config': 8.27.0 - '@wdio/globals': 8.27.0(typescript@5.1.6) - '@wdio/logger': 8.24.12 - '@wdio/types': 8.27.0 - '@wdio/utils': 8.27.0 - deepmerge-ts: 5.1.0 - expect-webdriverio: 4.7.2(typescript@5.1.6) - gaze: 1.1.3 - webdriver: 8.27.0 - webdriverio: 8.27.0(typescript@5.1.6) + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 + '@wdio/globals': registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + expect-webdriverio: registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6) + gaze: registry.npmmirror.com/gaze@1.1.3 + webdriver: registry.npmmirror.com/webdriver@8.27.2 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) transitivePeerDependencies: - bufferutil - devtools @@ -1540,729 +2341,898 @@ packages: - utf-8-validate dev: true - /@wdio/spec-reporter@8.27.0: - resolution: {integrity: sha512-EOXLBIr4oLzSDp/BQ86IqCulSF0jwEAj2EiMeY6dh9WXzBBtoR8WnoX/27xFoZ8GU2zetWC3EVnLJ0Ex8Up1mA==} + registry.npmmirror.com/@wdio/spec-reporter@8.27.2: + resolution: {integrity: sha512-2U1MALAHjUqDo3C+PYinN1wAnDBiy+kLG3GrTpMeIWZ2qZ6m1fRWt9GlADX7r07vhiRqShxy131nUenqeoF/qg==, tarball: https://registry.npmmirror.com/@wdio/spec-reporter/-/spec-reporter-8.27.2.tgz} + name: '@wdio/spec-reporter' + version: 8.27.2 engines: {node: ^16.13 || >=18} - deprecated: Invalid release dependencies: - '@wdio/reporter': 8.27.0 - '@wdio/types': 8.27.0 - chalk: 5.3.0 - easy-table: 1.2.0 - pretty-ms: 7.0.1 + '@wdio/reporter': registry.npmmirror.com/@wdio/reporter@8.27.2 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + chalk: registry.npmmirror.com/chalk@5.3.0 + easy-table: registry.npmmirror.com/easy-table@1.2.0 + pretty-ms: registry.npmmirror.com/pretty-ms@7.0.1 dev: true - /@wdio/types@8.27.0: - resolution: {integrity: sha512-LbP9FKh8r0uW9/dKhTIUCC1Su8PsP9TmzGKXkWt6/IMacgJiB/zW3u1CgyaLw9lG0UiQORHGoeJX9zB2HZAh4w==} + registry.npmmirror.com/@wdio/types@8.27.2: + resolution: {integrity: sha512-z/TtSQysEtAUNh+DooOs22G7xotTsJC2RcIZKaVtHY4Gl6lF+tn8kLRXD79jem2ta1byB1TpW62K366k1vzcLw==, tarball: https://registry.npmmirror.com/@wdio/types/-/types-8.27.2.tgz} + name: '@wdio/types' + version: 8.27.2 engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.10.6 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 dev: true - /@wdio/utils@8.27.0: - resolution: {integrity: sha512-4BY+JBQssVn003P5lA289uDMie3LtGinHze5btkcW9timB6VaU+EeZS4eKTPC0pziizLhteVvXYxv3YTpeeRfA==} + registry.npmmirror.com/@wdio/utils@8.27.2: + resolution: {integrity: sha512-jWxUhGjlZ4L3uOsP96oLKWjkITpoH/KPTtKzU7xdoVGhd1LXK4d/Fr8cTFTNkDBXM7yuM7C+EMmQ8HJHR55KTA==, tarball: https://registry.npmmirror.com/@wdio/utils/-/utils-8.27.2.tgz} + name: '@wdio/utils' + version: 8.27.2 engines: {node: ^16.13 || >=18} dependencies: - '@puppeteer/browsers': 1.9.0 - '@wdio/logger': 8.24.12 - '@wdio/types': 8.27.0 - decamelize: 6.0.0 - deepmerge-ts: 5.1.0 - edgedriver: 5.3.9 - geckodriver: 4.3.0 - get-port: 7.0.0 - import-meta-resolve: 4.0.0 - locate-app: 2.2.3 - safaridriver: 0.1.1 - split2: 4.2.0 - wait-port: 1.1.0 + '@puppeteer/browsers': registry.npmmirror.com/@puppeteer/browsers@1.8.0 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + edgedriver: registry.npmmirror.com/edgedriver@5.3.8 + geckodriver: registry.npmmirror.com/geckodriver@4.2.1 + get-port: registry.npmmirror.com/get-port@7.0.0 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 + locate-app: registry.npmmirror.com/locate-app@2.1.0 + safaridriver: registry.npmmirror.com/safaridriver@0.1.0 + split2: registry.npmmirror.com/split2@4.2.0 + wait-port: registry.npmmirror.com/wait-port@1.1.0 transitivePeerDependencies: - supports-color dev: true - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + registry.npmmirror.com/abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, tarball: https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz} + name: abab + version: 2.0.6 deprecated: Use your platform's native atob() and btoa() methods instead dev: true - /acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + registry.npmmirror.com/acorn-globals@7.0.1: + resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==, tarball: https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz} + name: acorn-globals + version: 7.0.1 dependencies: - acorn: 8.11.3 - acorn-walk: 8.3.1 + acorn: registry.npmmirror.com/acorn@8.11.2 + acorn-walk: registry.npmmirror.com/acorn-walk@8.3.0 dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, tarball: https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz} + id: registry.npmmirror.com/acorn-jsx/5.3.2 + name: acorn-jsx + version: 5.3.2 peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.3 + acorn: registry.npmmirror.com/acorn@8.11.2 dev: true - /acorn-walk@8.3.1: - resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} + registry.npmmirror.com/acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==, tarball: https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.0.tgz} + name: acorn-walk + version: 8.3.0 engines: {node: '>=0.4.0'} dev: true - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + registry.npmmirror.com/acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, tarball: https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz} + name: acorn + version: 8.11.2 engines: {node: '>=0.4.0'} hasBin: true dev: true - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + registry.npmmirror.com/agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, tarball: https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz} + name: agent-base + version: 6.0.2 engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + registry.npmmirror.com/agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==, tarball: https://registry.npmmirror.com/agent-base/-/agent-base-7.1.0.tgz} + name: agent-base + version: 7.1.0 engines: {node: '>= 14'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + registry.npmmirror.com/ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, tarball: https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz} + name: ajv + version: 6.12.6 dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 + fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify@2.1.0 + json-schema-traverse: registry.npmmirror.com/json-schema-traverse@0.4.1 + uri-js: registry.npmmirror.com/uri-js@4.4.1 dev: true - /ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + registry.npmmirror.com/ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==, tarball: https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz} + name: ansi-colors + version: 4.1.1 engines: {node: '>=6'} dev: true - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + registry.npmmirror.com/ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, tarball: https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz} + name: ansi-escapes + version: 4.3.2 engines: {node: '>=8'} dependencies: - type-fest: 0.21.3 + type-fest: registry.npmmirror.com/type-fest@0.21.3 dev: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + registry.npmmirror.com/ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz} + name: ansi-regex + version: 5.0.1 engines: {node: '>=8'} dev: true - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + registry.npmmirror.com/ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz} + name: ansi-regex + version: 6.0.1 engines: {node: '>=12'} dev: true - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + registry.npmmirror.com/ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz} + name: ansi-styles + version: 3.2.1 engines: {node: '>=4'} dependencies: - color-convert: 1.9.3 + color-convert: registry.npmmirror.com/color-convert@1.9.3 dev: true - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + registry.npmmirror.com/ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz} + name: ansi-styles + version: 4.3.0 engines: {node: '>=8'} dependencies: - color-convert: 2.0.1 + color-convert: registry.npmmirror.com/color-convert@2.0.1 dev: true - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + registry.npmmirror.com/ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz} + name: ansi-styles + version: 5.2.0 engines: {node: '>=10'} dev: true - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + registry.npmmirror.com/ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz} + name: ansi-styles + version: 6.2.1 engines: {node: '>=12'} dev: true - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + registry.npmmirror.com/anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, tarball: https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz} + name: anymatch + version: 3.1.3 engines: {node: '>= 8'} dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + picomatch: registry.npmmirror.com/picomatch@2.3.1 dev: true - /archiver-utils@4.0.1: - resolution: {integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==} + registry.npmmirror.com/archiver-utils@4.0.1: + resolution: {integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==, tarball: https://registry.npmmirror.com/archiver-utils/-/archiver-utils-4.0.1.tgz} + name: archiver-utils + version: 4.0.1 engines: {node: '>= 12.0.0'} dependencies: - glob: 8.1.0 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash: 4.17.21 - normalize-path: 3.0.0 - readable-stream: 3.6.2 + glob: registry.npmmirror.com/glob@8.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + lazystream: registry.npmmirror.com/lazystream@1.0.1 + lodash: registry.npmmirror.com/lodash@4.17.21 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 dev: true - /archiver@6.0.1: - resolution: {integrity: sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==} + registry.npmmirror.com/archiver@6.0.1: + resolution: {integrity: sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==, tarball: https://registry.npmmirror.com/archiver/-/archiver-6.0.1.tgz} + name: archiver + version: 6.0.1 engines: {node: '>= 12.0.0'} dependencies: - archiver-utils: 4.0.1 - async: 3.2.5 - buffer-crc32: 0.2.13 - readable-stream: 3.6.2 - readdir-glob: 1.1.3 - tar-stream: 3.1.6 - zip-stream: 5.0.1 + archiver-utils: registry.npmmirror.com/archiver-utils@4.0.1 + async: registry.npmmirror.com/async@3.2.5 + buffer-crc32: registry.npmmirror.com/buffer-crc32@0.2.13 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + readdir-glob: registry.npmmirror.com/readdir-glob@1.1.3 + tar-stream: registry.npmmirror.com/tar-stream@3.1.6 + zip-stream: registry.npmmirror.com/zip-stream@5.0.1 dev: true - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + registry.npmmirror.com/argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, tarball: https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz} + name: argparse + version: 1.0.10 dependencies: - sprintf-js: 1.0.3 + sprintf-js: registry.npmmirror.com/sprintf-js@1.0.3 dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + registry.npmmirror.com/argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, tarball: https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz} + name: argparse + version: 2.0.1 dev: true - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + registry.npmmirror.com/aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==, tarball: https://registry.npmmirror.com/aria-query/-/aria-query-5.1.3.tgz} + name: aria-query + version: 5.1.3 dependencies: - dequal: 2.0.3 + deep-equal: registry.npmmirror.com/deep-equal@2.2.1 dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + registry.npmmirror.com/array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==, tarball: https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz} + name: array-buffer-byte-length + version: 1.0.0 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + is-array-buffer: registry.npmmirror.com/is-array-buffer@3.0.2 dev: true - /arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + registry.npmmirror.com/array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, tarball: https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz} + name: array-union + version: 2.1.0 engines: {node: '>=8'} dev: true - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + registry.npmmirror.com/assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, tarball: https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz} + name: assertion-error + version: 1.1.0 dev: true - /ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + registry.npmmirror.com/ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==, tarball: https://registry.npmmirror.com/ast-types/-/ast-types-0.13.4.tgz} + name: ast-types + version: 0.13.4 engines: {node: '>=4'} dependencies: - tslib: 2.6.1 + tslib: registry.npmmirror.com/tslib@2.6.1 dev: true - /async-exit-hook@2.0.1: - resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + registry.npmmirror.com/async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==, tarball: https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz} + name: async-exit-hook + version: 2.0.1 engines: {node: '>=0.12.0'} dev: true - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + registry.npmmirror.com/async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==, tarball: https://registry.npmmirror.com/async/-/async-3.2.5.tgz} + name: async + version: 3.2.5 dev: true - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + registry.npmmirror.com/asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, tarball: https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz} + name: asynckit + version: 0.4.0 dev: true - /auto-changelog@2.4.0: - resolution: {integrity: sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==} - engines: {node: '>=8.3'} - hasBin: true - dependencies: - commander: 7.2.0 - handlebars: 4.7.8 - node-fetch: 2.7.0 - parse-github-url: 1.0.2 - semver: 7.5.4 - transitivePeerDependencies: - - encoding + registry.npmmirror.com/available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, tarball: https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz} + name: available-typed-arrays + version: 1.0.5 + engines: {node: '>= 0.4'} dev: true - /b4a@1.6.4: - resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + registry.npmmirror.com/b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==, tarball: https://registry.npmmirror.com/b4a/-/b4a-1.6.4.tgz} + name: b4a + version: 1.6.4 dev: true - /babel-jest@29.7.0(@babel/core@7.23.7): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + registry.npmmirror.com/babel-jest@29.7.0(@babel/core@7.23.3): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==, tarball: https://registry.npmmirror.com/babel-jest/-/babel-jest-29.7.0.tgz} + id: registry.npmmirror.com/babel-jest/29.7.0 + name: babel-jest + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.23.7 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.23.7) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@types/babel__core': registry.npmmirror.com/@types/babel__core@7.20.4 + babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul@6.1.1 + babel-preset-jest: registry.npmmirror.com/babel-preset-jest@29.6.3(@babel/core@7.23.3) + chalk: registry.npmmirror.com/chalk@4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + slash: registry.npmmirror.com/slash@3.0.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + registry.npmmirror.com/babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, tarball: https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz} + name: babel-plugin-istanbul + version: 6.1.1 engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + '@istanbuljs/load-nyc-config': registry.npmmirror.com/@istanbuljs/load-nyc-config@1.1.0 + '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 + istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument@5.2.1 + test-exclude: registry.npmmirror.com/test-exclude@6.0.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + registry.npmmirror.com/babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==, tarball: https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz} + name: babel-plugin-jest-hoist + version: 29.6.3 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 + '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + '@types/babel__core': registry.npmmirror.com/@types/babel__core@7.20.4 + '@types/babel__traverse': registry.npmmirror.com/@types/babel__traverse@7.20.4 dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.7): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, tarball: https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz} + id: registry.npmmirror.com/babel-preset-current-node-syntax/1.0.1 + name: babel-preset-current-node-syntax + version: 1.0.1 peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.7) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.23.7): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/plugin-syntax-async-generators': registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3) + '@babel/plugin-syntax-bigint': registry.npmmirror.com/@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-class-properties': registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3) + '@babel/plugin-syntax-import-meta': registry.npmmirror.com/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-json-strings': registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-logical-assignment-operators': registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-nullish-coalescing-operator': registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-numeric-separator': registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-object-rest-spread': registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-optional-catch-binding': registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-optional-chaining': registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-top-level-await': registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3) + dev: true + + registry.npmmirror.com/babel-preset-jest@29.6.3(@babel/core@7.23.3): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==, tarball: https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz} + id: registry.npmmirror.com/babel-preset-jest/29.6.3 + name: babel-preset-jest + version: 29.6.3 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.7) + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + babel-plugin-jest-hoist: registry.npmmirror.com/babel-plugin-jest-hoist@29.6.3 + babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3) dev: true - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + registry.npmmirror.com/balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, tarball: https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz} + name: balanced-match + version: 1.0.2 dev: true - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + registry.npmmirror.com/base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, tarball: https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz} + name: base64-js + version: 1.5.1 dev: true - /basic-ftp@5.0.4: - resolution: {integrity: sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==} + registry.npmmirror.com/basic-ftp@5.0.3: + resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==, tarball: https://registry.npmmirror.com/basic-ftp/-/basic-ftp-5.0.3.tgz} + name: basic-ftp + version: 5.0.3 engines: {node: '>=10.0.0'} dev: true - /big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + registry.npmmirror.com/big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==, tarball: https://registry.npmmirror.com/big-integer/-/big-integer-1.6.51.tgz} + name: big-integer + version: 1.6.51 engines: {node: '>=0.6'} dev: true - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + registry.npmmirror.com/binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, tarball: https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz} + name: binary-extensions + version: 2.2.0 engines: {node: '>=8'} dev: true - /binary@0.3.0: - resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + registry.npmmirror.com/binary@0.3.0: + resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==, tarball: https://registry.npmmirror.com/binary/-/binary-0.3.0.tgz} + name: binary + version: 0.3.0 dependencies: - buffers: 0.1.1 - chainsaw: 0.1.0 + buffers: registry.npmmirror.com/buffers@0.1.1 + chainsaw: registry.npmmirror.com/chainsaw@0.1.0 dev: true - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + registry.npmmirror.com/bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, tarball: https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz} + name: bl + version: 4.1.0 dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 + buffer: registry.npmmirror.com/buffer@5.7.1 + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 dev: true - /bluebird@3.4.7: - resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + registry.npmmirror.com/bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==, tarball: https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz} + name: bluebird + version: 3.4.7 dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + registry.npmmirror.com/brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz} + name: brace-expansion + version: 1.1.11 dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + balanced-match: registry.npmmirror.com/balanced-match@1.0.2 + concat-map: registry.npmmirror.com/concat-map@0.0.1 dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + registry.npmmirror.com/brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz} + name: brace-expansion + version: 2.0.1 dependencies: - balanced-match: 1.0.2 + balanced-match: registry.npmmirror.com/balanced-match@1.0.2 dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + registry.npmmirror.com/braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, tarball: https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz} + name: braces + version: 3.0.2 engines: {node: '>=8'} dependencies: - fill-range: 7.0.1 + fill-range: registry.npmmirror.com/fill-range@7.0.1 dev: true - /browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + registry.npmmirror.com/browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==, tarball: https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz} + name: browser-stdout + version: 1.3.1 dev: true - /browserslist@4.22.2: - resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + registry.npmmirror.com/browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==, tarball: https://registry.npmmirror.com/browserslist/-/browserslist-4.22.1.tgz} + name: browserslist + version: 4.22.1 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001572 - electron-to-chromium: 1.4.616 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.2) + caniuse-lite: registry.npmmirror.com/caniuse-lite@1.0.30001561 + electron-to-chromium: registry.npmmirror.com/electron-to-chromium@1.4.581 + node-releases: registry.npmmirror.com/node-releases@2.0.14 + update-browserslist-db: registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1) dev: true - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + registry.npmmirror.com/bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, tarball: https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz} + name: bser + version: 2.1.1 dependencies: - node-int64: 0.4.0 + node-int64: registry.npmmirror.com/node-int64@0.4.0 dev: true - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + registry.npmmirror.com/buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==, tarball: https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz} + name: buffer-crc32 + version: 0.2.13 dev: true - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + registry.npmmirror.com/buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, tarball: https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz} + name: buffer-from + version: 1.1.2 dev: true - /buffer-indexof-polyfill@1.0.2: - resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} + registry.npmmirror.com/buffer-indexof-polyfill@1.0.2: + resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==, tarball: https://registry.npmmirror.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz} + name: buffer-indexof-polyfill + version: 1.0.2 engines: {node: '>=0.10'} dev: true - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + registry.npmmirror.com/buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, tarball: https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz} + name: buffer + version: 5.7.1 dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 + base64-js: registry.npmmirror.com/base64-js@1.5.1 + ieee754: registry.npmmirror.com/ieee754@1.2.1 dev: true - /buffers@0.1.1: - resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + registry.npmmirror.com/buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==, tarball: https://registry.npmmirror.com/buffers/-/buffers-0.1.1.tgz} + name: buffers + version: 0.1.1 engines: {node: '>=0.2.0'} dev: true - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: true - - /cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + registry.npmmirror.com/cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==, tarball: https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz} + name: cacheable-lookup + version: 7.0.0 engines: {node: '>=14.16'} dev: true - /cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + registry.npmmirror.com/cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==, tarball: https://registry.npmmirror.com/cacheable-request/-/cacheable-request-10.2.14.tgz} + name: cacheable-request + version: 10.2.14 engines: {node: '>=14.16'} dependencies: - '@types/http-cache-semantics': 4.0.4 - get-stream: 6.0.1 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - mimic-response: 4.0.0 - normalize-url: 8.0.0 - responselike: 3.0.0 + '@types/http-cache-semantics': registry.npmmirror.com/@types/http-cache-semantics@4.0.4 + get-stream: registry.npmmirror.com/get-stream@6.0.1 + http-cache-semantics: registry.npmmirror.com/http-cache-semantics@4.1.1 + keyv: registry.npmmirror.com/keyv@4.5.4 + mimic-response: registry.npmmirror.com/mimic-response@4.0.0 + normalize-url: registry.npmmirror.com/normalize-url@8.0.0 + responselike: registry.npmmirror.com/responselike@3.0.0 dev: true - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + registry.npmmirror.com/call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==, tarball: https://registry.npmmirror.com/call-bind/-/call-bind-1.0.5.tgz} + name: call-bind + version: 1.0.5 dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 + function-bind: registry.npmmirror.com/function-bind@1.1.2 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + set-function-length: registry.npmmirror.com/set-function-length@1.1.1 dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + registry.npmmirror.com/callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, tarball: https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz} + name: callsites + version: 3.1.0 engines: {node: '>=6'} dev: true - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + registry.npmmirror.com/camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz} + name: camelcase + version: 5.3.1 engines: {node: '>=6'} dev: true - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + registry.npmmirror.com/camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz} + name: camelcase + version: 6.3.0 engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001572: - resolution: {integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==} + registry.npmmirror.com/caniuse-lite@1.0.30001561: + resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==, tarball: https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz} + name: caniuse-lite + version: 1.0.30001561 dev: true - /chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} + registry.npmmirror.com/chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==, tarball: https://registry.npmmirror.com/chai/-/chai-4.3.10.tgz} + name: chai + version: 4.3.10 engines: {node: '>=4'} dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: registry.npmmirror.com/assertion-error@1.1.0 + check-error: registry.npmmirror.com/check-error@1.0.3 + deep-eql: registry.npmmirror.com/deep-eql@4.1.3 + get-func-name: registry.npmmirror.com/get-func-name@2.0.2 + loupe: registry.npmmirror.com/loupe@2.3.7 + pathval: registry.npmmirror.com/pathval@1.1.1 + type-detect: registry.npmmirror.com/type-detect@4.0.8 dev: true - /chainsaw@0.1.0: - resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} + registry.npmmirror.com/chainsaw@0.1.0: + resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==, tarball: https://registry.npmmirror.com/chainsaw/-/chainsaw-0.1.0.tgz} + name: chainsaw + version: 0.1.0 dependencies: - traverse: 0.3.9 + traverse: registry.npmmirror.com/traverse@0.3.9 dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + registry.npmmirror.com/chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, tarball: https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz} + name: chalk + version: 2.4.2 engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@3.2.1 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@1.0.5 + supports-color: registry.npmmirror.com/supports-color@5.5.0 dev: true - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + registry.npmmirror.com/chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, tarball: https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz} + name: chalk + version: 4.1.2 + engines: {node: '>=10'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 + supports-color: registry.npmmirror.com/supports-color@7.2.0 dev: true - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + registry.npmmirror.com/chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, tarball: https://registry.npmmirror.com/chalk/-/chalk-5.3.0.tgz} + name: chalk + version: 5.3.0 engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + registry.npmmirror.com/char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, tarball: https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz} + name: char-regex + version: 1.0.2 engines: {node: '>=10'} dev: true - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + registry.npmmirror.com/chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, tarball: https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz} + name: chardet + version: 0.7.0 dev: true - /chart.js@4.4.1: - resolution: {integrity: sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==} + registry.npmmirror.com/chart.js@4.4.1: + resolution: {integrity: sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==, tarball: https://registry.npmmirror.com/chart.js/-/chart.js-4.4.1.tgz} + name: chart.js + version: 4.4.1 engines: {pnpm: '>=7'} dependencies: - '@kurkle/color': 0.3.2 + '@kurkle/color': registry.npmmirror.com/@kurkle/color@0.3.2 dev: false - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + registry.npmmirror.com/check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, tarball: https://registry.npmmirror.com/check-error/-/check-error-1.0.3.tgz} + name: check-error + version: 1.0.3 dependencies: - get-func-name: 2.0.2 + get-func-name: registry.npmmirror.com/get-func-name@2.0.2 dev: true - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + registry.npmmirror.com/chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz} + name: chokidar + version: 3.5.3 engines: {node: '>= 8.10.0'} dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 + anymatch: registry.npmmirror.com/anymatch@3.1.3 + braces: registry.npmmirror.com/braces@3.0.2 + glob-parent: registry.npmmirror.com/glob-parent@5.1.2 + is-binary-path: registry.npmmirror.com/is-binary-path@2.1.0 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + readdirp: registry.npmmirror.com/readdirp@3.6.0 optionalDependencies: - fsevents: 2.3.3 + fsevents: registry.npmmirror.com/fsevents@2.3.3 dev: true - /chromium-bidi@0.4.16(devtools-protocol@0.0.1147663): - resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==} + registry.npmmirror.com/chromium-bidi@0.4.16(devtools-protocol@0.0.1147663): + resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==, tarball: https://registry.npmmirror.com/chromium-bidi/-/chromium-bidi-0.4.16.tgz} + id: registry.npmmirror.com/chromium-bidi/0.4.16 + name: chromium-bidi + version: 0.4.16 peerDependencies: devtools-protocol: '*' dependencies: - devtools-protocol: 0.0.1147663 - mitt: 3.0.0 + devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1147663 + mitt: registry.npmmirror.com/mitt@3.0.0 dev: true - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + registry.npmmirror.com/ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, tarball: https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz} + name: ci-info + version: 3.9.0 engines: {node: '>=8'} dev: true - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + registry.npmmirror.com/cjs-module-lexer@1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==, tarball: https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz} + name: cjs-module-lexer + version: 1.2.2 dev: true - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + registry.npmmirror.com/cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, tarball: https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz} + name: cli-cursor + version: 3.1.0 engines: {node: '>=8'} dependencies: - restore-cursor: 3.1.0 + restore-cursor: registry.npmmirror.com/restore-cursor@3.1.0 dev: true - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + registry.npmmirror.com/cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==, tarball: https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.1.tgz} + name: cli-spinners + version: 2.9.1 engines: {node: '>=6'} dev: true - /cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + registry.npmmirror.com/cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==, tarball: https://registry.npmmirror.com/cli-width/-/cli-width-4.1.0.tgz} + name: cli-width + version: 4.1.0 engines: {node: '>= 12'} dev: true - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + registry.npmmirror.com/cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, tarball: https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz} + name: cliui + version: 7.0.4 dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + registry.npmmirror.com/cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, tarball: https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz} + name: cliui + version: 8.0.1 engines: {node: '>=12'} dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 dev: true - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + registry.npmmirror.com/clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, tarball: https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz} + name: clone + version: 1.0.4 engines: {node: '>=0.8'} requiresBuild: true dev: true - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + registry.npmmirror.com/co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, tarball: https://registry.npmmirror.com/co/-/co-4.6.0.tgz} + name: co + version: 4.6.0 engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + registry.npmmirror.com/collect-v8-coverage@1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==, tarball: https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz} + name: collect-v8-coverage + version: 1.0.1 dev: true - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + registry.npmmirror.com/color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz} + name: color-convert + version: 1.9.3 dependencies: - color-name: 1.1.3 + color-name: registry.npmmirror.com/color-name@1.1.3 dev: true - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + registry.npmmirror.com/color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz} + name: color-convert + version: 2.0.1 engines: {node: '>=7.0.0'} dependencies: - color-name: 1.1.4 + color-name: registry.npmmirror.com/color-name@1.1.4 dev: true - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + registry.npmmirror.com/color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz} + name: color-name + version: 1.1.3 dev: true - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + registry.npmmirror.com/color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz} + name: color-name + version: 1.1.4 dev: true - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + registry.npmmirror.com/combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, tarball: https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz} + name: combined-stream + version: 1.0.8 engines: {node: '>= 0.8'} dependencies: - delayed-stream: 1.0.0 - dev: true - - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + delayed-stream: registry.npmmirror.com/delayed-stream@1.0.0 dev: true - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + registry.npmmirror.com/commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, tarball: https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz} + name: commander + version: 9.5.0 engines: {node: ^12.20.0 || >=14} dev: true - /compress-commons@5.0.1: - resolution: {integrity: sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==} + registry.npmmirror.com/compress-commons@5.0.1: + resolution: {integrity: sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==, tarball: https://registry.npmmirror.com/compress-commons/-/compress-commons-5.0.1.tgz} + name: compress-commons + version: 5.0.1 engines: {node: '>= 12.0.0'} dependencies: - crc-32: 1.2.2 - crc32-stream: 5.0.0 - normalize-path: 3.0.0 - readable-stream: 3.6.2 + crc-32: registry.npmmirror.com/crc-32@1.2.2 + crc32-stream: registry.npmmirror.com/crc32-stream@5.0.0 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 dev: true - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + registry.npmmirror.com/concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, tarball: https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz} + name: concat-map + version: 0.0.1 dev: true - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + registry.npmmirror.com/convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz} + name: convert-source-map + version: 2.0.0 dev: true - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + registry.npmmirror.com/core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, tarball: https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz} + name: core-util-is + version: 1.0.3 dev: true - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + registry.npmmirror.com/crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, tarball: https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz} + name: crc-32 + version: 1.2.2 engines: {node: '>=0.8'} hasBin: true dev: true - /crc32-stream@5.0.0: - resolution: {integrity: sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==} + registry.npmmirror.com/crc32-stream@5.0.0: + resolution: {integrity: sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==, tarball: https://registry.npmmirror.com/crc32-stream/-/crc32-stream-5.0.0.tgz} + name: crc32-stream + version: 5.0.0 engines: {node: '>= 12.0.0'} dependencies: - crc-32: 1.2.2 - readable-stream: 3.6.2 + crc-32: registry.npmmirror.com/crc-32@1.2.2 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 dev: true - /create-jest@29.7.0(@types/node@20.10.6): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + registry.npmmirror.com/create-jest@29.7.0(@types/node@20.11.0): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==, tarball: https://registry.npmmirror.com/create-jest/-/create-jest-29.7.0.tgz} + id: registry.npmmirror.com/create-jest/29.7.0 + name: create-jest + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.10.6) - jest-util: 29.7.0 - prompts: 2.4.2 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + exit: registry.npmmirror.com/exit@0.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) + jest-util: registry.npmmirror.com/jest-util@29.7.0 + prompts: registry.npmmirror.com/prompts@2.4.2 transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -2270,83 +3240,90 @@ packages: - ts-node dev: true - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + registry.npmmirror.com/cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==, tarball: https://registry.npmmirror.com/cross-fetch/-/cross-fetch-4.0.0.tgz} + name: cross-fetch + version: 4.0.0 dependencies: - node-fetch: 2.7.0 + node-fetch: registry.npmmirror.com/node-fetch@2.7.0 transitivePeerDependencies: - encoding dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + registry.npmmirror.com/cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, tarball: https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz} + name: cross-spawn + version: 7.0.3 engines: {node: '>= 8'} dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + path-key: registry.npmmirror.com/path-key@3.1.1 + shebang-command: registry.npmmirror.com/shebang-command@2.0.0 + which: registry.npmmirror.com/which@2.0.2 dev: true - /crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + registry.npmmirror.com/css-shorthand-properties@1.1.1: + resolution: {integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==, tarball: https://registry.npmmirror.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz} + name: css-shorthand-properties + version: 1.1.1 dev: true - /css-shorthand-properties@1.1.1: - resolution: {integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==} + registry.npmmirror.com/css-value@0.0.1: + resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==, tarball: https://registry.npmmirror.com/css-value/-/css-value-0.0.1.tgz} + name: css-value + version: 0.0.1 dev: true - /css-value@0.0.1: - resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} + registry.npmmirror.com/cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==, tarball: https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz} + name: cssom + version: 0.3.8 dev: true - /cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + registry.npmmirror.com/cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==, tarball: https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz} + name: cssom + version: 0.5.0 dev: true - /cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - dev: true - - /cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + registry.npmmirror.com/cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==, tarball: https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz} + name: cssstyle + version: 2.3.0 engines: {node: '>=8'} dependencies: - cssom: 0.3.8 + cssom: registry.npmmirror.com/cssom@0.3.8 dev: true - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + registry.npmmirror.com/data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, tarball: https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz} + name: data-uri-to-buffer + version: 4.0.1 engines: {node: '>= 12'} dev: true - /data-uri-to-buffer@6.0.1: - resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==} + registry.npmmirror.com/data-uri-to-buffer@6.0.1: + resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==, tarball: https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz} + name: data-uri-to-buffer + version: 6.0.1 engines: {node: '>= 14'} dev: true - /data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} + registry.npmmirror.com/data-urls@3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==, tarball: https://registry.npmmirror.com/data-urls/-/data-urls-3.0.2.tgz} + name: data-urls + version: 3.0.2 engines: {node: '>=12'} dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - dev: true - - /debug@4.3.1: - resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 + abab: registry.npmmirror.com/abab@2.0.6 + whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype@3.0.0 + whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0 dev: true - /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, tarball: https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz} + id: registry.npmmirror.com/debug/4.3.4 + name: debug + version: 4.3.4 engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2354,33 +3331,43 @@ packages: supports-color: optional: true dependencies: - ms: 2.1.2 - supports-color: 8.1.1 + ms: registry.npmmirror.com/ms@2.1.2 + supports-color: registry.npmmirror.com/supports-color@8.1.1 dev: true - /decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + registry.npmmirror.com/decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==, tarball: https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz} + name: decamelize + version: 4.0.0 engines: {node: '>=10'} dev: true - /decamelize@6.0.0: - resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + registry.npmmirror.com/decamelize@6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==, tarball: https://registry.npmmirror.com/decamelize/-/decamelize-6.0.0.tgz} + name: decamelize + version: 6.0.0 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + registry.npmmirror.com/decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, tarball: https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz} + name: decimal.js + version: 10.4.3 dev: true - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + registry.npmmirror.com/decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, tarball: https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz} + name: decompress-response + version: 6.0.0 engines: {node: '>=10'} dependencies: - mimic-response: 3.1.0 + mimic-response: registry.npmmirror.com/mimic-response@3.1.0 dev: true - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + registry.npmmirror.com/dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==, tarball: https://registry.npmmirror.com/dedent/-/dedent-1.5.1.tgz} + name: dedent + version: 1.5.1 peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -2388,431 +3375,576 @@ packages: optional: true dev: true - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + registry.npmmirror.com/deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==, tarball: https://registry.npmmirror.com/deep-eql/-/deep-eql-4.1.3.tgz} + name: deep-eql + version: 4.1.3 engines: {node: '>=6'} dependencies: - type-detect: 4.0.8 + type-detect: registry.npmmirror.com/type-detect@4.0.8 dev: true - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + registry.npmmirror.com/deep-equal@2.2.1: + resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==, tarball: https://registry.npmmirror.com/deep-equal/-/deep-equal-2.2.1.tgz} + name: deep-equal + version: 2.2.1 + dependencies: + array-buffer-byte-length: registry.npmmirror.com/array-buffer-byte-length@1.0.0 + call-bind: registry.npmmirror.com/call-bind@1.0.5 + es-get-iterator: registry.npmmirror.com/es-get-iterator@1.1.3 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + is-arguments: registry.npmmirror.com/is-arguments@1.1.1 + is-array-buffer: registry.npmmirror.com/is-array-buffer@3.0.2 + is-date-object: registry.npmmirror.com/is-date-object@1.0.5 + is-regex: registry.npmmirror.com/is-regex@1.1.4 + is-shared-array-buffer: registry.npmmirror.com/is-shared-array-buffer@1.0.2 + isarray: registry.npmmirror.com/isarray@2.0.5 + object-is: registry.npmmirror.com/object-is@1.1.5 + object-keys: registry.npmmirror.com/object-keys@1.1.1 + object.assign: registry.npmmirror.com/object.assign@4.1.5 + regexp.prototype.flags: registry.npmmirror.com/regexp.prototype.flags@1.5.0 + side-channel: registry.npmmirror.com/side-channel@1.0.4 + which-boxed-primitive: registry.npmmirror.com/which-boxed-primitive@1.0.2 + which-collection: registry.npmmirror.com/which-collection@1.0.1 + which-typed-array: registry.npmmirror.com/which-typed-array@1.1.13 dev: true - /deepcopy@2.1.0: - resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==} + registry.npmmirror.com/deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, tarball: https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz} + name: deep-is + version: 0.1.4 + dev: true + + registry.npmmirror.com/deepcopy@2.1.0: + resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==, tarball: https://registry.npmmirror.com/deepcopy/-/deepcopy-2.1.0.tgz} + name: deepcopy + version: 2.1.0 dependencies: - type-detect: 4.0.8 + type-detect: registry.npmmirror.com/type-detect@4.0.8 dev: true - /deepmerge-ts@5.1.0: - resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==} + registry.npmmirror.com/deepmerge-ts@5.1.0: + resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==, tarball: https://registry.npmmirror.com/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz} + name: deepmerge-ts + version: 5.1.0 engines: {node: '>=16.0.0'} dev: true - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + registry.npmmirror.com/deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, tarball: https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz} + name: deepmerge + version: 4.3.1 engines: {node: '>=0.10.0'} dev: true - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + registry.npmmirror.com/defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, tarball: https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz} + name: defaults + version: 1.0.4 requiresBuild: true dependencies: - clone: 1.0.4 + clone: registry.npmmirror.com/clone@1.0.4 dev: true - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + registry.npmmirror.com/defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, tarball: https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz} + name: defer-to-connect + version: 2.0.1 engines: {node: '>=10'} dev: true - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + registry.npmmirror.com/define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==, tarball: https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.1.tgz} + name: define-data-property + version: 1.1.1 engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 dev: true - /degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} + registry.npmmirror.com/define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, tarball: https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz} + name: define-properties + version: 1.2.1 + engines: {node: '>= 0.4'} dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 + define-data-property: registry.npmmirror.com/define-data-property@1.1.1 + has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 + object-keys: registry.npmmirror.com/object-keys@1.1.1 dev: true - /degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + registry.npmmirror.com/degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==, tarball: https://registry.npmmirror.com/degenerator/-/degenerator-5.0.1.tgz} + name: degenerator + version: 5.0.1 engines: {node: '>= 14'} dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 + ast-types: registry.npmmirror.com/ast-types@0.13.4 + escodegen: registry.npmmirror.com/escodegen@2.1.0 + esprima: registry.npmmirror.com/esprima@4.0.1 dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + registry.npmmirror.com/delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, tarball: https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz} + name: delayed-stream + version: 1.0.0 engines: {node: '>=0.4.0'} dev: true - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true - - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + registry.npmmirror.com/detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, tarball: https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz} + name: detect-newline + version: 3.1.0 engines: {node: '>=8'} dev: true - /devtools-protocol@0.0.1147663: - resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} + registry.npmmirror.com/devtools-protocol@0.0.1147663: + resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==, tarball: https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz} + name: devtools-protocol + version: 0.0.1147663 dev: true - /devtools-protocol@0.0.1237913: - resolution: {integrity: sha512-Pxtmz2ZIqBkpU82HaIdsvCQBG94yTC4xajrEsWx9p38QKEfBCJktSazsHkrjf9j3dVVNPhg5LR21F6KWeXpjiQ==} + registry.npmmirror.com/devtools-protocol@0.0.1239539: + resolution: {integrity: sha512-uS7hZVqZxGyZwR8lX/8wWyNLGEYs1wWWxN7qeRC+wBZ4VM5JXYwCJg8hofEna5yX0W2cavpjHOE4ukHXLHlEaA==, tarball: https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1239539.tgz} + name: devtools-protocol + version: 0.0.1239539 dev: true - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + registry.npmmirror.com/diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, tarball: https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz} + name: diff-sequences + version: 29.6.3 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + registry.npmmirror.com/diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==, tarball: https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz} + name: diff + version: 5.0.0 engines: {node: '>=0.3.1'} dev: true - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + registry.npmmirror.com/diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==, tarball: https://registry.npmmirror.com/diff/-/diff-5.1.0.tgz} + name: diff + version: 5.1.0 engines: {node: '>=0.3.1'} dev: true - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + registry.npmmirror.com/dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, tarball: https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz} + name: dir-glob + version: 3.0.1 engines: {node: '>=8'} dependencies: - path-type: 4.0.0 + path-type: registry.npmmirror.com/path-type@4.0.0 dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + registry.npmmirror.com/doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, tarball: https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz} + name: doctrine + version: 3.0.0 engines: {node: '>=6.0.0'} dependencies: - esutils: 2.0.3 + esutils: registry.npmmirror.com/esutils@2.0.3 dev: true - /domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + registry.npmmirror.com/domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==, tarball: https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz} + name: domexception + version: 4.0.0 engines: {node: '>=12'} deprecated: Use your platform's native DOMException instead dependencies: - webidl-conversions: 7.0.0 + webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 dev: true - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + registry.npmmirror.com/dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, tarball: https://registry.npmmirror.com/dotenv/-/dotenv-16.3.1.tgz} + name: dotenv + version: 16.3.1 engines: {node: '>=12'} dev: true - /duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + registry.npmmirror.com/duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, tarball: https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz} + name: duplexer2 + version: 0.1.4 dependencies: - readable-stream: 2.3.8 + readable-stream: registry.npmmirror.com/readable-stream@2.3.8 dev: true - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + registry.npmmirror.com/eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, tarball: https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz} + name: eastasianwidth + version: 0.2.0 dev: true - /easy-table@1.2.0: - resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + registry.npmmirror.com/easy-table@1.2.0: + resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==, tarball: https://registry.npmmirror.com/easy-table/-/easy-table-1.2.0.tgz} + name: easy-table + version: 1.2.0 dependencies: - ansi-regex: 5.0.1 + ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 optionalDependencies: - wcwidth: 1.0.1 + wcwidth: registry.npmmirror.com/wcwidth@1.0.1 dev: true - /edge-paths@3.0.5: - resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==} + registry.npmmirror.com/edge-paths@3.0.5: + resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==, tarball: https://registry.npmmirror.com/edge-paths/-/edge-paths-3.0.5.tgz} + name: edge-paths + version: 3.0.5 engines: {node: '>=14.0.0'} dependencies: - '@types/which': 2.0.2 - which: 2.0.2 + '@types/which': registry.npmmirror.com/@types/which@2.0.2 + which: registry.npmmirror.com/which@2.0.2 dev: true - /edgedriver@5.3.9: - resolution: {integrity: sha512-G0wNgFMFRDnFfKaXG2R6HiyVHqhKwdQ3EgoxW3wPlns2wKqem7F+HgkWBcevN7Vz0nN4AXtskID7/6jsYDXcKw==} + registry.npmmirror.com/edgedriver@5.3.8: + resolution: {integrity: sha512-FWLPDuwJDeGGgtmlqTXb4lQi/HV9yylLo1F9O1g9TLqSemA5T6xH28seUIfyleVirLFtDQyKNUxKsMhMT4IfnA==, tarball: https://registry.npmmirror.com/edgedriver/-/edgedriver-5.3.8.tgz} + name: edgedriver + version: 5.3.8 hasBin: true requiresBuild: true dependencies: - '@wdio/logger': 8.24.12 - decamelize: 6.0.0 - edge-paths: 3.0.5 - node-fetch: 3.3.2 - unzipper: 0.10.14 - which: 4.0.0 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + edge-paths: registry.npmmirror.com/edge-paths@3.0.5 + node-fetch: registry.npmmirror.com/node-fetch@3.3.2 + unzipper: registry.npmmirror.com/unzipper@0.10.14 + which: registry.npmmirror.com/which@4.0.0 dev: true - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + registry.npmmirror.com/ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==, tarball: https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz} + name: ejs + version: 3.1.9 engines: {node: '>=0.10.0'} hasBin: true dependencies: - jake: 10.8.7 + jake: registry.npmmirror.com/jake@10.8.5 dev: true - /electron-to-chromium@1.4.616: - resolution: {integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==} + registry.npmmirror.com/electron-to-chromium@1.4.581: + resolution: {integrity: sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==, tarball: https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz} + name: electron-to-chromium + version: 1.4.581 dev: true - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + registry.npmmirror.com/emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, tarball: https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz} + name: emittery + version: 0.13.1 engines: {node: '>=12'} dev: true - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + registry.npmmirror.com/emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz} + name: emoji-regex + version: 8.0.0 dev: true - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + registry.npmmirror.com/emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz} + name: emoji-regex + version: 9.2.2 dev: true - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + registry.npmmirror.com/end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, tarball: https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz} + name: end-of-stream + version: 1.4.4 dependencies: - once: 1.4.0 + once: registry.npmmirror.com/once@1.4.0 dev: true - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + registry.npmmirror.com/entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, tarball: https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz} + name: entities + version: 4.5.0 engines: {node: '>=0.12'} dev: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + registry.npmmirror.com/error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, tarball: https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz} + name: error-ex + version: 1.3.2 + dependencies: + is-arrayish: registry.npmmirror.com/is-arrayish@0.2.1 + dev: true + + registry.npmmirror.com/es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==, tarball: https://registry.npmmirror.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz} + name: es-get-iterator + version: 1.1.3 dependencies: - is-arrayish: 0.2.1 + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + is-arguments: registry.npmmirror.com/is-arguments@1.1.1 + is-map: registry.npmmirror.com/is-map@2.0.2 + is-set: registry.npmmirror.com/is-set@2.0.2 + is-string: registry.npmmirror.com/is-string@1.0.7 + isarray: registry.npmmirror.com/isarray@2.0.5 + stop-iteration-iterator: registry.npmmirror.com/stop-iteration-iterator@1.0.0 dev: true - /esbuild@0.19.11: - resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + registry.npmmirror.com/esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.19.11.tgz} + name: esbuild + version: 0.19.11 engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.19.11 - '@esbuild/android-arm': 0.19.11 - '@esbuild/android-arm64': 0.19.11 - '@esbuild/android-x64': 0.19.11 - '@esbuild/darwin-arm64': 0.19.11 - '@esbuild/darwin-x64': 0.19.11 - '@esbuild/freebsd-arm64': 0.19.11 - '@esbuild/freebsd-x64': 0.19.11 - '@esbuild/linux-arm': 0.19.11 - '@esbuild/linux-arm64': 0.19.11 - '@esbuild/linux-ia32': 0.19.11 - '@esbuild/linux-loong64': 0.19.11 - '@esbuild/linux-mips64el': 0.19.11 - '@esbuild/linux-ppc64': 0.19.11 - '@esbuild/linux-riscv64': 0.19.11 - '@esbuild/linux-s390x': 0.19.11 - '@esbuild/linux-x64': 0.19.11 - '@esbuild/netbsd-x64': 0.19.11 - '@esbuild/openbsd-x64': 0.19.11 - '@esbuild/sunos-x64': 0.19.11 - '@esbuild/win32-arm64': 0.19.11 - '@esbuild/win32-ia32': 0.19.11 - '@esbuild/win32-x64': 0.19.11 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + '@esbuild/aix-ppc64': registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11 + '@esbuild/android-arm': registry.npmmirror.com/@esbuild/android-arm@0.19.11 + '@esbuild/android-arm64': registry.npmmirror.com/@esbuild/android-arm64@0.19.11 + '@esbuild/android-x64': registry.npmmirror.com/@esbuild/android-x64@0.19.11 + '@esbuild/darwin-arm64': registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11 + '@esbuild/darwin-x64': registry.npmmirror.com/@esbuild/darwin-x64@0.19.11 + '@esbuild/freebsd-arm64': registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11 + '@esbuild/freebsd-x64': registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11 + '@esbuild/linux-arm': registry.npmmirror.com/@esbuild/linux-arm@0.19.11 + '@esbuild/linux-arm64': registry.npmmirror.com/@esbuild/linux-arm64@0.19.11 + '@esbuild/linux-ia32': registry.npmmirror.com/@esbuild/linux-ia32@0.19.11 + '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64@0.19.11 + '@esbuild/linux-mips64el': registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11 + '@esbuild/linux-ppc64': registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11 + '@esbuild/linux-riscv64': registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11 + '@esbuild/linux-s390x': registry.npmmirror.com/@esbuild/linux-s390x@0.19.11 + '@esbuild/linux-x64': registry.npmmirror.com/@esbuild/linux-x64@0.19.11 + '@esbuild/netbsd-x64': registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11 + '@esbuild/openbsd-x64': registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11 + '@esbuild/sunos-x64': registry.npmmirror.com/@esbuild/sunos-x64@0.19.11 + '@esbuild/win32-arm64': registry.npmmirror.com/@esbuild/win32-arm64@0.19.11 + '@esbuild/win32-ia32': registry.npmmirror.com/@esbuild/win32-ia32@0.19.11 + '@esbuild/win32-x64': registry.npmmirror.com/@esbuild/win32-x64@0.19.11 + dev: true + + registry.npmmirror.com/escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, tarball: https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz} + name: escalade + version: 3.1.1 engines: {node: '>=6'} dev: true - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + registry.npmmirror.com/escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz} + name: escape-string-regexp + version: 1.0.5 engines: {node: '>=0.8.0'} dev: true - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + registry.npmmirror.com/escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz} + name: escape-string-regexp + version: 2.0.0 engines: {node: '>=8'} dev: true - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + registry.npmmirror.com/escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz} + name: escape-string-regexp + version: 4.0.0 engines: {node: '>=10'} dev: true - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + registry.npmmirror.com/escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz} + name: escape-string-regexp + version: 5.0.0 engines: {node: '>=12'} dev: true - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + registry.npmmirror.com/escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, tarball: https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz} + name: escodegen + version: 2.1.0 engines: {node: '>=6.0'} hasBin: true dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 + esprima: registry.npmmirror.com/esprima@4.0.1 + estraverse: registry.npmmirror.com/estraverse@5.3.0 + esutils: registry.npmmirror.com/esutils@2.0.3 optionalDependencies: - source-map: 0.6.1 + source-map: registry.npmmirror.com/source-map@0.6.1 dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + registry.npmmirror.com/eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, tarball: https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz} + name: eslint-scope + version: 7.2.2 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 + esrecurse: registry.npmmirror.com/esrecurse@4.3.0 + estraverse: registry.npmmirror.com/estraverse@5.3.0 dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + registry.npmmirror.com/eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, tarball: https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz} + name: eslint-visitor-keys + version: 3.4.3 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + registry.npmmirror.com/eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, tarball: https://registry.npmmirror.com/eslint/-/eslint-8.56.0.tgz} + name: eslint + version: 8.56.0 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.13 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - 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.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 + '@eslint-community/eslint-utils': registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': registry.npmmirror.com/@eslint-community/regexpp@4.10.0 + '@eslint/eslintrc': registry.npmmirror.com/@eslint/eslintrc@2.1.4 + '@eslint/js': registry.npmmirror.com/@eslint/js@8.56.0 + '@humanwhocodes/config-array': registry.npmmirror.com/@humanwhocodes/config-array@0.11.13 + '@humanwhocodes/module-importer': registry.npmmirror.com/@humanwhocodes/module-importer@1.0.1 + '@nodelib/fs.walk': registry.npmmirror.com/@nodelib/fs.walk@1.2.8 + '@ungap/structured-clone': registry.npmmirror.com/@ungap/structured-clone@1.2.0 + ajv: registry.npmmirror.com/ajv@6.12.6 + chalk: registry.npmmirror.com/chalk@4.1.2 + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + doctrine: registry.npmmirror.com/doctrine@3.0.0 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 + eslint-scope: registry.npmmirror.com/eslint-scope@7.2.2 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 + espree: registry.npmmirror.com/espree@9.6.1 + esquery: registry.npmmirror.com/esquery@1.5.0 + esutils: registry.npmmirror.com/esutils@2.0.3 + fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 + file-entry-cache: registry.npmmirror.com/file-entry-cache@6.0.1 + find-up: registry.npmmirror.com/find-up@5.0.0 + glob-parent: registry.npmmirror.com/glob-parent@6.0.2 + globals: registry.npmmirror.com/globals@13.23.0 + graphemer: registry.npmmirror.com/graphemer@1.4.0 + ignore: registry.npmmirror.com/ignore@5.2.4 + imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + is-path-inside: registry.npmmirror.com/is-path-inside@3.0.3 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + json-stable-stringify-without-jsonify: registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1 + levn: registry.npmmirror.com/levn@0.4.1 + lodash.merge: registry.npmmirror.com/lodash.merge@4.6.2 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + natural-compare: registry.npmmirror.com/natural-compare@1.4.0 + optionator: registry.npmmirror.com/optionator@0.9.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + text-table: registry.npmmirror.com/text-table@0.2.0 transitivePeerDependencies: - supports-color dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + registry.npmmirror.com/espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, tarball: https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz} + name: espree + version: 9.6.1 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 + acorn: registry.npmmirror.com/acorn@8.11.2 + acorn-jsx: registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.11.2) + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + registry.npmmirror.com/esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, tarball: https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz} + name: esprima + version: 4.0.1 engines: {node: '>=4'} hasBin: true dev: true - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + registry.npmmirror.com/esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, tarball: https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz} + name: esquery + version: 1.5.0 engines: {node: '>=0.10'} dependencies: - estraverse: 5.3.0 + estraverse: registry.npmmirror.com/estraverse@5.3.0 dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + registry.npmmirror.com/esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, tarball: https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz} + name: esrecurse + version: 4.3.0 engines: {node: '>=4.0'} dependencies: - estraverse: 5.3.0 + estraverse: registry.npmmirror.com/estraverse@5.3.0 dev: true - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + registry.npmmirror.com/estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, tarball: https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz} + name: estraverse + version: 5.3.0 engines: {node: '>=4.0'} dev: true - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + registry.npmmirror.com/esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, tarball: https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz} + name: esutils + version: 2.0.3 engines: {node: '>=0.10.0'} dev: true - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + registry.npmmirror.com/execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, tarball: https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz} + name: execa + version: 5.1.1 engines: {node: '>=10'} dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + get-stream: registry.npmmirror.com/get-stream@6.0.1 + human-signals: registry.npmmirror.com/human-signals@2.1.0 + is-stream: registry.npmmirror.com/is-stream@2.0.1 + merge-stream: registry.npmmirror.com/merge-stream@2.0.0 + npm-run-path: registry.npmmirror.com/npm-run-path@4.0.1 + onetime: registry.npmmirror.com/onetime@5.1.2 + signal-exit: registry.npmmirror.com/signal-exit@3.0.7 + strip-final-newline: registry.npmmirror.com/strip-final-newline@2.0.0 + dev: true + + registry.npmmirror.com/execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, tarball: https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz} + name: execa + version: 8.0.1 engines: {node: '>=16.17'} dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.2.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + get-stream: registry.npmmirror.com/get-stream@8.0.1 + human-signals: registry.npmmirror.com/human-signals@5.0.0 + is-stream: registry.npmmirror.com/is-stream@3.0.0 + merge-stream: registry.npmmirror.com/merge-stream@2.0.0 + npm-run-path: registry.npmmirror.com/npm-run-path@5.1.0 + onetime: registry.npmmirror.com/onetime@6.0.0 + signal-exit: registry.npmmirror.com/signal-exit@4.1.0 + strip-final-newline: registry.npmmirror.com/strip-final-newline@3.0.0 + dev: true + + registry.npmmirror.com/exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, tarball: https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz} + name: exit + version: 0.1.2 engines: {node: '>= 0.8.0'} dev: true - /expect-webdriverio@4.7.2(typescript@5.1.6): - resolution: {integrity: sha512-aR/L0NrleB7lZCdJK9yNijuJajmNKo+DDaUheSY0Sqiopwg2X2B+kAnuWYSc2XCL0IdPTN3JcplXj+IOGQN51g==} + registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6): + resolution: {integrity: sha512-JD5aboj/tCiMXdEPCpt3BA0xL3DBhNu1MoiOdBGT9LT+9COIXoDG6Ks6h5S4c4PNwLs6xSeU8s7XxFAmBPu45Q==, tarball: https://registry.npmmirror.com/expect-webdriverio/-/expect-webdriverio-4.8.1.tgz} + id: registry.npmmirror.com/expect-webdriverio/4.8.1 + name: expect-webdriverio + version: 4.8.1 engines: {node: '>=16 || >=18 || >=20'} dependencies: - expect: 29.7.0 - jest-matcher-utils: 29.7.0 - lodash.isequal: 4.5.0 + expect: registry.npmmirror.com/expect@29.7.0 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + lodash.isequal: registry.npmmirror.com/lodash.isequal@4.5.0 optionalDependencies: - '@wdio/globals': 8.27.0(typescript@5.1.6) - '@wdio/logger': 8.24.12 - webdriverio: 8.27.0(typescript@5.1.6) + '@wdio/globals': registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) transitivePeerDependencies: - bufferutil - devtools @@ -2822,924 +3954,1330 @@ packages: - utf-8-validate dev: true - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + registry.npmmirror.com/expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==, tarball: https://registry.npmmirror.com/expect/-/expect-29.7.0.tgz} + name: expect + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + '@jest/expect-utils': registry.npmmirror.com/@jest/expect-utils@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 dev: true - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + registry.npmmirror.com/external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, tarball: https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz} + name: external-editor + version: 3.1.0 engines: {node: '>=4'} dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 + chardet: registry.npmmirror.com/chardet@0.7.0 + iconv-lite: registry.npmmirror.com/iconv-lite@0.4.24 + tmp: registry.npmmirror.com/tmp@0.0.33 dev: true - /extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + registry.npmmirror.com/extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==, tarball: https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz} + name: extract-zip + version: 2.0.1 engines: {node: '>= 10.17.0'} hasBin: true dependencies: - debug: 4.3.4(supports-color@8.1.1) - get-stream: 5.2.0 - yauzl: 2.10.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + get-stream: registry.npmmirror.com/get-stream@5.2.0 + yauzl: registry.npmmirror.com/yauzl@2.10.0 optionalDependencies: - '@types/yauzl': 2.10.3 + '@types/yauzl': registry.npmmirror.com/@types/yauzl@2.10.3 transitivePeerDependencies: - supports-color dev: true - /fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + registry.npmmirror.com/fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==, tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz} + name: fast-deep-equal + version: 2.0.1 dev: true - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + registry.npmmirror.com/fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz} + name: fast-deep-equal + version: 3.1.3 dev: true - /fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + registry.npmmirror.com/fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, tarball: https://registry.npmmirror.com/fast-fifo/-/fast-fifo-1.3.2.tgz} + name: fast-fifo + version: 1.3.2 dev: true - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + registry.npmmirror.com/fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, tarball: https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz} + name: fast-glob + version: 3.3.2 engines: {node: '>=8.6.0'} dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 + '@nodelib/fs.stat': registry.npmmirror.com/@nodelib/fs.stat@2.0.5 + '@nodelib/fs.walk': registry.npmmirror.com/@nodelib/fs.walk@1.2.8 + glob-parent: registry.npmmirror.com/glob-parent@5.1.2 + merge2: registry.npmmirror.com/merge2@1.4.1 + micromatch: registry.npmmirror.com/micromatch@4.0.5 dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + registry.npmmirror.com/fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, tarball: https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz} + name: fast-json-stable-stringify + version: 2.1.0 dev: true - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + registry.npmmirror.com/fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, tarball: https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz} + name: fast-levenshtein + version: 2.0.6 dev: true - /fastq@1.16.0: - resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + registry.npmmirror.com/fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, tarball: https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz} + name: fastq + version: 1.15.0 dependencies: - reusify: 1.0.4 + reusify: registry.npmmirror.com/reusify@1.0.4 dev: true - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + registry.npmmirror.com/fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, tarball: https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz} + name: fb-watchman + version: 2.0.2 dependencies: - bser: 2.1.1 + bser: registry.npmmirror.com/bser@2.1.1 dev: true - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + registry.npmmirror.com/fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==, tarball: https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz} + name: fd-slicer + version: 1.1.0 dependencies: - pend: 1.2.0 + pend: registry.npmmirror.com/pend@1.2.0 dev: true - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + registry.npmmirror.com/fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, tarball: https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz} + name: fetch-blob + version: 3.2.0 engines: {node: ^12.20 || >= 14.13} dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 + node-domexception: registry.npmmirror.com/node-domexception@1.0.0 + web-streams-polyfill: registry.npmmirror.com/web-streams-polyfill@3.2.1 dev: true - /figures@5.0.0: - resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + registry.npmmirror.com/figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==, tarball: https://registry.npmmirror.com/figures/-/figures-5.0.0.tgz} + name: figures + version: 5.0.0 engines: {node: '>=14'} dependencies: - escape-string-regexp: 5.0.0 - is-unicode-supported: 1.3.0 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@5.0.0 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported@1.3.0 dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + registry.npmmirror.com/file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, tarball: https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz} + name: file-entry-cache + version: 6.0.1 engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.2.0 + flat-cache: registry.npmmirror.com/flat-cache@3.1.1 dev: true - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + registry.npmmirror.com/filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, tarball: https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz} + name: filelist + version: 1.0.4 dependencies: - minimatch: 5.1.6 + minimatch: registry.npmmirror.com/minimatch@5.1.6 dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + registry.npmmirror.com/fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, tarball: https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz} + name: fill-range + version: 7.0.1 engines: {node: '>=8'} dependencies: - to-regex-range: 5.0.1 + to-regex-range: registry.npmmirror.com/to-regex-range@5.0.1 dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + registry.npmmirror.com/find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, tarball: https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz} + name: find-up + version: 4.1.0 engines: {node: '>=8'} dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 + locate-path: registry.npmmirror.com/locate-path@5.0.0 + path-exists: registry.npmmirror.com/path-exists@4.0.0 dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + registry.npmmirror.com/find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, tarball: https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz} + name: find-up + version: 5.0.0 engines: {node: '>=10'} dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 + locate-path: registry.npmmirror.com/locate-path@6.0.0 + path-exists: registry.npmmirror.com/path-exists@4.0.0 dev: true - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + registry.npmmirror.com/find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==, tarball: https://registry.npmmirror.com/find-up/-/find-up-6.3.0.tgz} + name: find-up + version: 6.3.0 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 + locate-path: registry.npmmirror.com/locate-path@7.2.0 + path-exists: registry.npmmirror.com/path-exists@5.0.0 dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + registry.npmmirror.com/flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==, tarball: https://registry.npmmirror.com/flat-cache/-/flat-cache-3.1.1.tgz} + name: flat-cache + version: 3.1.1 + engines: {node: '>=12.0.0'} dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 + flatted: registry.npmmirror.com/flatted@3.2.9 + keyv: registry.npmmirror.com/keyv@4.5.4 + rimraf: registry.npmmirror.com/rimraf@3.0.2 dev: true - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + registry.npmmirror.com/flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, tarball: https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz} + name: flat + version: 5.0.2 hasBin: true dev: true - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + registry.npmmirror.com/flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, tarball: https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz} + name: flatted + version: 3.2.9 dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + registry.npmmirror.com/for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, tarball: https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz} + name: for-each + version: 0.3.3 + dependencies: + is-callable: registry.npmmirror.com/is-callable@1.2.7 + dev: true + + registry.npmmirror.com/foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, tarball: https://registry.npmmirror.com/foreground-child/-/foreground-child-3.1.1.tgz} + name: foreground-child + version: 3.1.1 engines: {node: '>=14'} dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + signal-exit: registry.npmmirror.com/signal-exit@4.1.0 dev: true - /form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + registry.npmmirror.com/form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==, tarball: https://registry.npmmirror.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz} + name: form-data-encoder + version: 2.1.4 engines: {node: '>= 14.17'} dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + registry.npmmirror.com/form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, tarball: https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz} + name: form-data + version: 4.0.0 engines: {node: '>= 6'} dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 + asynckit: registry.npmmirror.com/asynckit@0.4.0 + combined-stream: registry.npmmirror.com/combined-stream@1.0.8 + mime-types: registry.npmmirror.com/mime-types@2.1.35 dev: true - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + registry.npmmirror.com/formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, tarball: https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz} + name: formdata-polyfill + version: 4.0.10 engines: {node: '>=12.20.0'} dependencies: - fetch-blob: 3.2.0 + fetch-blob: registry.npmmirror.com/fetch-blob@3.2.0 dev: true - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + registry.npmmirror.com/fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, tarball: https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz} + name: fs-extra + version: 8.1.0 engines: {node: '>=6 <7 || >=8'} dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jsonfile: registry.npmmirror.com/jsonfile@4.0.0 + universalify: registry.npmmirror.com/universalify@0.1.2 dev: true - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + registry.npmmirror.com/fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, tarball: https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz} + name: fs.realpath + version: 1.0.0 dev: true - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + registry.npmmirror.com/fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz} + name: fsevents + version: 2.3.3 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true dev: true optional: true - /fstream@1.0.12: - resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + registry.npmmirror.com/fsrs.js@1.1.0: + resolution: {integrity: sha512-DEihBx081nENpNjrSvCopPVi9Ilh+u+ELYOKQmshfSz+DgC/B0hxFFMQnqy2ibWAm9zjyR/bWvaz86xEA4MIcA==, tarball: https://registry.npmmirror.com/fsrs.js/-/fsrs.js-1.1.0.tgz} + name: fsrs.js + version: 1.1.0 + engines: {node: '>=10'} + dependencies: + deepcopy: registry.npmmirror.com/deepcopy@2.1.0 + dev: true + + registry.npmmirror.com/fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==, tarball: https://registry.npmmirror.com/fstream/-/fstream-1.0.12.tgz} + name: fstream + version: 1.0.12 engines: {node: '>=0.6'} dependencies: - graceful-fs: 4.2.11 - inherits: 2.0.4 - mkdirp: 0.5.6 - rimraf: 2.7.1 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + inherits: registry.npmmirror.com/inherits@2.0.4 + mkdirp: registry.npmmirror.com/mkdirp@0.5.6 + rimraf: registry.npmmirror.com/rimraf@2.7.1 + dev: true + + registry.npmmirror.com/function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz} + name: function-bind + version: 1.1.2 dev: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + registry.npmmirror.com/functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, tarball: https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz} + name: functions-have-names + version: 1.2.3 dev: true - /gaze@1.1.3: - resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==} + registry.npmmirror.com/gaze@1.1.3: + resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==, tarball: https://registry.npmmirror.com/gaze/-/gaze-1.1.3.tgz} + name: gaze + version: 1.1.3 engines: {node: '>= 4.0.0'} dependencies: - globule: 1.3.4 + globule: registry.npmmirror.com/globule@1.3.4 dev: true - /geckodriver@4.3.0: - resolution: {integrity: sha512-QfpvxFsMORwKpvnLslkHCr3NTCczHAvkte6+pQGsiUZXKBe6mO4TTb727b+9KMVSK6XZqhR6ZwImKdP+F5vS6A==} + registry.npmmirror.com/geckodriver@4.2.1: + resolution: {integrity: sha512-4m/CRk0OI8MaANRuFIahvOxYTSjlNAO2p9JmE14zxueknq6cdtB5M9UGRQ8R9aMV0bLGNVHHDnDXmoXdOwJfWg==, tarball: https://registry.npmmirror.com/geckodriver/-/geckodriver-4.2.1.tgz} + name: geckodriver + version: 4.2.1 engines: {node: ^16.13 || >=18 || >=20} hasBin: true requiresBuild: true dependencies: - '@wdio/logger': 8.24.12 - decamelize: 6.0.0 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - node-fetch: 3.3.2 - tar-fs: 3.0.4 - unzipper: 0.10.14 - which: 4.0.0 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + node-fetch: registry.npmmirror.com/node-fetch@3.3.2 + tar-fs: registry.npmmirror.com/tar-fs@3.0.4 + unzipper: registry.npmmirror.com/unzipper@0.10.14 + which: registry.npmmirror.com/which@4.0.0 transitivePeerDependencies: - supports-color dev: true - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + registry.npmmirror.com/gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, tarball: https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz} + name: gensync + version: 1.0.0-beta.2 engines: {node: '>=6.9.0'} dev: true - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + registry.npmmirror.com/get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, tarball: https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz} + name: get-caller-file + version: 2.0.5 engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + registry.npmmirror.com/get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, tarball: https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.2.tgz} + name: get-func-name + version: 2.0.2 dev: true - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + registry.npmmirror.com/get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==, tarball: https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz} + name: get-intrinsic + version: 1.2.2 dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 + function-bind: registry.npmmirror.com/function-bind@1.1.2 + has-proto: registry.npmmirror.com/has-proto@1.0.1 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + hasown: registry.npmmirror.com/hasown@2.0.0 dev: true - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + registry.npmmirror.com/get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, tarball: https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz} + name: get-package-type + version: 0.1.0 engines: {node: '>=8.0.0'} dev: true - /get-port@7.0.0: - resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} + registry.npmmirror.com/get-port@7.0.0: + resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==, tarball: https://registry.npmmirror.com/get-port/-/get-port-7.0.0.tgz} + name: get-port + version: 7.0.0 engines: {node: '>=16'} dev: true - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + registry.npmmirror.com/get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz} + name: get-stream + version: 5.2.0 engines: {node: '>=8'} dependencies: - pump: 3.0.0 + pump: registry.npmmirror.com/pump@3.0.0 dev: true - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + registry.npmmirror.com/get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz} + name: get-stream + version: 6.0.1 engines: {node: '>=10'} dev: true - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + registry.npmmirror.com/get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz} + name: get-stream + version: 8.0.1 engines: {node: '>=16'} dev: true - /get-uri@6.0.2: - resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==} + registry.npmmirror.com/get-uri@6.0.2: + resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==, tarball: https://registry.npmmirror.com/get-uri/-/get-uri-6.0.2.tgz} + name: get-uri + version: 6.0.2 engines: {node: '>= 14'} dependencies: - basic-ftp: 5.0.4 - data-uri-to-buffer: 6.0.1 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 8.1.0 + basic-ftp: registry.npmmirror.com/basic-ftp@5.0.3 + data-uri-to-buffer: registry.npmmirror.com/data-uri-to-buffer@6.0.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + fs-extra: registry.npmmirror.com/fs-extra@8.1.0 transitivePeerDependencies: - supports-color dev: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + registry.npmmirror.com/glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz} + name: glob-parent + version: 5.1.2 engines: {node: '>= 6'} dependencies: - is-glob: 4.0.3 + is-glob: registry.npmmirror.com/is-glob@4.0.3 dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + registry.npmmirror.com/glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz} + name: glob-parent + version: 6.0.2 engines: {node: '>=10.13.0'} dependencies: - is-glob: 4.0.3 + is-glob: registry.npmmirror.com/is-glob@4.0.3 dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + registry.npmmirror.com/glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==, tarball: https://registry.npmmirror.com/glob/-/glob-10.3.10.tgz} + name: glob + version: 10.3.10 engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 + foreground-child: registry.npmmirror.com/foreground-child@3.1.1 + jackspeak: registry.npmmirror.com/jackspeak@2.3.6 + minimatch: registry.npmmirror.com/minimatch@9.0.3 + minipass: registry.npmmirror.com/minipass@7.0.4 + path-scurry: registry.npmmirror.com/path-scurry@1.10.1 dev: true - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + registry.npmmirror.com/glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==, tarball: https://registry.npmmirror.com/glob/-/glob-7.1.7.tgz} + name: glob + version: 7.1.7 dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.0.8 - once: 1.4.0 - path-is-absolute: 1.0.1 + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + once: registry.npmmirror.com/once@1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 dev: true - /glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + registry.npmmirror.com/glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, tarball: https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz} + name: glob + version: 7.2.0 dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + once: registry.npmmirror.com/once@1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + registry.npmmirror.com/glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, tarball: https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz} + name: glob + version: 7.2.3 dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + once: registry.npmmirror.com/once@1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 dev: true - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + registry.npmmirror.com/glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, tarball: https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz} + name: glob + version: 8.1.0 engines: {node: '>=12'} dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@5.1.6 + once: registry.npmmirror.com/once@1.4.0 dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + registry.npmmirror.com/globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, tarball: https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz} + name: globals + version: 11.12.0 engines: {node: '>=4'} dev: true - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + registry.npmmirror.com/globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, tarball: https://registry.npmmirror.com/globals/-/globals-13.23.0.tgz} + name: globals + version: 13.23.0 engines: {node: '>=8'} dependencies: - type-fest: 0.20.2 + type-fest: registry.npmmirror.com/type-fest@0.20.2 dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + registry.npmmirror.com/globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, tarball: https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz} + name: globby + version: 11.1.0 engines: {node: '>=10'} dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 + array-union: registry.npmmirror.com/array-union@2.1.0 + dir-glob: registry.npmmirror.com/dir-glob@3.0.1 + fast-glob: registry.npmmirror.com/fast-glob@3.3.2 + ignore: registry.npmmirror.com/ignore@5.2.4 + merge2: registry.npmmirror.com/merge2@1.4.1 + slash: registry.npmmirror.com/slash@3.0.0 dev: true - /globule@1.3.4: - resolution: {integrity: sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==} + registry.npmmirror.com/globule@1.3.4: + resolution: {integrity: sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==, tarball: https://registry.npmmirror.com/globule/-/globule-1.3.4.tgz} + name: globule + version: 1.3.4 engines: {node: '>= 0.10'} dependencies: - glob: 7.1.7 - lodash: 4.17.21 - minimatch: 3.0.8 + glob: registry.npmmirror.com/glob@7.1.7 + lodash: registry.npmmirror.com/lodash@4.17.21 + minimatch: registry.npmmirror.com/minimatch@3.0.8 dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + registry.npmmirror.com/gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, tarball: https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz} + name: gopd + version: 1.0.1 dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 dev: true - /got@12.6.1: - resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + registry.npmmirror.com/got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==, tarball: https://registry.npmmirror.com/got/-/got-12.6.1.tgz} + name: got + version: 12.6.1 engines: {node: '>=14.16'} dependencies: - '@sindresorhus/is': 5.6.0 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 - decompress-response: 6.0.0 - form-data-encoder: 2.1.4 - get-stream: 6.0.1 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 3.0.0 + '@sindresorhus/is': registry.npmmirror.com/@sindresorhus/is@5.3.0 + '@szmarczak/http-timer': registry.npmmirror.com/@szmarczak/http-timer@5.0.1 + cacheable-lookup: registry.npmmirror.com/cacheable-lookup@7.0.0 + cacheable-request: registry.npmmirror.com/cacheable-request@10.2.14 + decompress-response: registry.npmmirror.com/decompress-response@6.0.0 + form-data-encoder: registry.npmmirror.com/form-data-encoder@2.1.4 + get-stream: registry.npmmirror.com/get-stream@6.0.1 + http2-wrapper: registry.npmmirror.com/http2-wrapper@2.2.1 + lowercase-keys: registry.npmmirror.com/lowercase-keys@3.0.0 + p-cancelable: registry.npmmirror.com/p-cancelable@3.0.0 + responselike: registry.npmmirror.com/responselike@3.0.0 dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + registry.npmmirror.com/graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz} + name: graceful-fs + version: 4.2.11 dev: true - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + registry.npmmirror.com/grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, tarball: https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz} + name: grapheme-splitter + version: 1.0.4 dev: true - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + registry.npmmirror.com/graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, tarball: https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz} + name: graphemer + version: 1.4.0 dev: true - /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.17.4 + registry.npmmirror.com/has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, tarball: https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz} + name: has-bigints + version: 1.0.2 dev: true - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + registry.npmmirror.com/has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz} + name: has-flag + version: 3.0.0 engines: {node: '>=4'} dev: true - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + registry.npmmirror.com/has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz} + name: has-flag + version: 4.0.0 engines: {node: '>=8'} dev: true - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + registry.npmmirror.com/has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==, tarball: https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz} + name: has-property-descriptors + version: 1.0.1 dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + dev: true + + registry.npmmirror.com/has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, tarball: https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz} + name: has-proto + version: 1.0.1 + engines: {node: '>= 0.4'} dev: true - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + registry.npmmirror.com/has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, tarball: https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz} + name: has-symbols + version: 1.0.3 engines: {node: '>= 0.4'} dev: true - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + registry.npmmirror.com/has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, tarball: https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz} + name: has-tostringtag + version: 1.0.0 engines: {node: '>= 0.4'} + dependencies: + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + dev: true + + registry.npmmirror.com/has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==, tarball: https://registry.npmmirror.com/has/-/has-1.0.4.tgz} + name: has + version: 1.0.4 + engines: {node: '>= 0.4.0'} dev: true - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + registry.npmmirror.com/hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, tarball: https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz} + name: hasown + version: 2.0.0 engines: {node: '>= 0.4'} dependencies: - function-bind: 1.1.2 + function-bind: registry.npmmirror.com/function-bind@1.1.2 dev: true - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + registry.npmmirror.com/he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, tarball: https://registry.npmmirror.com/he/-/he-1.2.0.tgz} + name: he + version: 1.2.0 hasBin: true dev: true - /hosted-git-info@7.0.1: - resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} + registry.npmmirror.com/hosted-git-info@7.0.1: + resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==, tarball: https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz} + name: hosted-git-info + version: 7.0.1 engines: {node: ^16.14.0 || >=18.0.0} dependencies: - lru-cache: 10.1.0 + lru-cache: registry.npmmirror.com/lru-cache@10.0.2 dev: true - /html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + registry.npmmirror.com/html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==, tarball: https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz} + name: html-encoding-sniffer + version: 3.0.0 engines: {node: '>=12'} dependencies: - whatwg-encoding: 2.0.0 + whatwg-encoding: registry.npmmirror.com/whatwg-encoding@2.0.0 dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + registry.npmmirror.com/html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, tarball: https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz} + name: html-escaper + version: 2.0.2 dev: true - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + registry.npmmirror.com/http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, tarball: https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz} + name: http-cache-semantics + version: 4.1.1 dev: true - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + registry.npmmirror.com/http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, tarball: https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz} + name: http-proxy-agent + version: 5.0.0 engines: {node: '>= 6'} dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + '@tootallnate/once': registry.npmmirror.com/@tootallnate/once@2.0.0 + agent-base: registry.npmmirror.com/agent-base@6.0.2 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + registry.npmmirror.com/http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==, tarball: https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz} + name: http-proxy-agent + version: 7.0.0 engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + registry.npmmirror.com/http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==, tarball: https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz} + name: http2-wrapper + version: 2.2.1 engines: {node: '>=10.19.0'} dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 + quick-lru: registry.npmmirror.com/quick-lru@5.1.1 + resolve-alpn: registry.npmmirror.com/resolve-alpn@1.2.1 dev: true - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + registry.npmmirror.com/https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, tarball: https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz} + name: https-proxy-agent + version: 5.0.1 engines: {node: '>= 6'} dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + agent-base: registry.npmmirror.com/agent-base@6.0.2 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + registry.npmmirror.com/https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, tarball: https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz} + name: https-proxy-agent + version: 7.0.2 engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + registry.npmmirror.com/human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, tarball: https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz} + name: human-signals + version: 2.1.0 engines: {node: '>=10.17.0'} dev: true - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + registry.npmmirror.com/human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, tarball: https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz} + name: human-signals + version: 5.0.0 engines: {node: '>=16.17.0'} dev: true - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + registry.npmmirror.com/iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz} + name: iconv-lite + version: 0.4.24 engines: {node: '>=0.10.0'} dependencies: - safer-buffer: 2.1.2 + safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + registry.npmmirror.com/iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz} + name: iconv-lite + version: 0.6.3 engines: {node: '>=0.10.0'} dependencies: - safer-buffer: 2.1.2 + safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 dev: true - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + registry.npmmirror.com/ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, tarball: https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz} + name: ieee754 + version: 1.2.1 dev: true - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + registry.npmmirror.com/ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, tarball: https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz} + name: ignore + version: 5.2.4 engines: {node: '>= 4'} dev: true - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + registry.npmmirror.com/import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, tarball: https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz} + name: import-fresh + version: 3.3.0 engines: {node: '>=6'} dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 + parent-module: registry.npmmirror.com/parent-module@1.0.1 + resolve-from: registry.npmmirror.com/resolve-from@4.0.0 dev: true - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + registry.npmmirror.com/import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, tarball: https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz} + name: import-local + version: 3.1.0 engines: {node: '>=8'} hasBin: true dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 + pkg-dir: registry.npmmirror.com/pkg-dir@4.2.0 + resolve-cwd: registry.npmmirror.com/resolve-cwd@3.0.0 dev: true - /import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + registry.npmmirror.com/import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==, tarball: https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz} + name: import-meta-resolve + version: 4.0.0 dev: true - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + registry.npmmirror.com/imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, tarball: https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz} + name: imurmurhash + version: 0.1.4 engines: {node: '>=0.8.19'} dev: true - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + registry.npmmirror.com/inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, tarball: https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz} + name: inflight + version: 1.0.6 dependencies: - once: 1.4.0 - wrappy: 1.0.2 + once: registry.npmmirror.com/once@1.4.0 + wrappy: registry.npmmirror.com/wrappy@1.0.2 dev: true - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + registry.npmmirror.com/inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz} + name: inherits + version: 2.0.4 dev: true - /inquirer@9.2.12: - resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} + registry.npmmirror.com/inquirer@9.2.12: + resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==, tarball: https://registry.npmmirror.com/inquirer/-/inquirer-9.2.12.tgz} + name: inquirer + version: 9.2.12 engines: {node: '>=14.18.0'} dependencies: - '@ljharb/through': 2.3.11 - ansi-escapes: 4.3.2 - chalk: 5.3.0 - cli-cursor: 3.1.0 - cli-width: 4.1.0 - external-editor: 3.1.0 - figures: 5.0.0 - lodash: 4.17.21 - mute-stream: 1.0.0 - ora: 5.4.1 - run-async: 3.0.0 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 + '@ljharb/through': registry.npmmirror.com/@ljharb/through@2.3.11 + ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 + chalk: registry.npmmirror.com/chalk@5.3.0 + cli-cursor: registry.npmmirror.com/cli-cursor@3.1.0 + cli-width: registry.npmmirror.com/cli-width@4.1.0 + external-editor: registry.npmmirror.com/external-editor@3.1.0 + figures: registry.npmmirror.com/figures@5.0.0 + lodash: registry.npmmirror.com/lodash@4.17.21 + mute-stream: registry.npmmirror.com/mute-stream@1.0.0 + ora: registry.npmmirror.com/ora@5.4.1 + run-async: registry.npmmirror.com/run-async@3.0.0 + rxjs: registry.npmmirror.com/rxjs@7.8.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@6.2.0 + dev: true + + registry.npmmirror.com/internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==, tarball: https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz} + name: internal-slot + version: 1.0.5 + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + has: registry.npmmirror.com/has@1.0.4 + side-channel: registry.npmmirror.com/side-channel@1.0.4 dev: true - /ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} + registry.npmmirror.com/ip@1.1.8: + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==, tarball: https://registry.npmmirror.com/ip/-/ip-1.1.8.tgz} + name: ip + version: 1.1.8 + dev: true + + registry.npmmirror.com/ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==, tarball: https://registry.npmmirror.com/ip/-/ip-2.0.0.tgz} + name: ip + version: 2.0.0 + dev: true + + registry.npmmirror.com/is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, tarball: https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz} + name: is-arguments + version: 1.1.1 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 dev: true - /ip@1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} + registry.npmmirror.com/is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==, tarball: https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz} + name: is-array-buffer + version: 3.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + is-typed-array: registry.npmmirror.com/is-typed-array@1.1.10 dev: true - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + registry.npmmirror.com/is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, tarball: https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz} + name: is-arrayish + version: 0.2.1 dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + registry.npmmirror.com/is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, tarball: https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz} + name: is-bigint + version: 1.0.4 + dependencies: + has-bigints: registry.npmmirror.com/has-bigints@1.0.2 dev: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + registry.npmmirror.com/is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, tarball: https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz} + name: is-binary-path + version: 2.1.0 engines: {node: '>=8'} dependencies: - binary-extensions: 2.2.0 + binary-extensions: registry.npmmirror.com/binary-extensions@2.2.0 + dev: true + + registry.npmmirror.com/is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, tarball: https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz} + name: is-boolean-object + version: 1.1.2 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 dev: true - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + registry.npmmirror.com/is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, tarball: https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz} + name: is-callable + version: 1.2.7 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, tarball: https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz} + name: is-core-module + version: 2.13.1 + dependencies: + hasown: registry.npmmirror.com/hasown@2.0.0 + dev: true + + registry.npmmirror.com/is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, tarball: https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz} + name: is-date-object + version: 1.0.5 + engines: {node: '>= 0.4'} dependencies: - hasown: 2.0.0 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 dev: true - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + registry.npmmirror.com/is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, tarball: https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz} + name: is-extglob + version: 2.1.1 engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + registry.npmmirror.com/is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, tarball: https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz} + name: is-fullwidth-code-point + version: 3.0.0 engines: {node: '>=8'} dev: true - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + registry.npmmirror.com/is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, tarball: https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz} + name: is-generator-fn + version: 2.1.0 engines: {node: '>=6'} dev: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + registry.npmmirror.com/is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, tarball: https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz} + name: is-glob + version: 4.0.3 engines: {node: '>=0.10.0'} dependencies: - is-extglob: 2.1.1 + is-extglob: registry.npmmirror.com/is-extglob@2.1.1 dev: true - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + registry.npmmirror.com/is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, tarball: https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz} + name: is-interactive + version: 1.0.0 engines: {node: '>=8'} dev: true - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + registry.npmmirror.com/is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==, tarball: https://registry.npmmirror.com/is-map/-/is-map-2.0.2.tgz} + name: is-map + version: 2.0.2 + dev: true + + registry.npmmirror.com/is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, tarball: https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz} + name: is-number-object + version: 1.0.7 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, tarball: https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz} + name: is-number + version: 7.0.0 engines: {node: '>=0.12.0'} dev: true - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + registry.npmmirror.com/is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, tarball: https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz} + name: is-path-inside + version: 3.0.3 engines: {node: '>=8'} dev: true - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + registry.npmmirror.com/is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz} + name: is-plain-obj + version: 2.1.0 engines: {node: '>=8'} dev: true - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + registry.npmmirror.com/is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz} + name: is-plain-obj + version: 4.1.0 engines: {node: '>=12'} dev: true - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + registry.npmmirror.com/is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, tarball: https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz} + name: is-potential-custom-element-name + version: 1.0.1 + dev: true + + registry.npmmirror.com/is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, tarball: https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz} + name: is-regex + version: 1.1.4 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==, tarball: https://registry.npmmirror.com/is-set/-/is-set-2.0.2.tgz} + name: is-set + version: 2.0.2 + dev: true + + registry.npmmirror.com/is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, tarball: https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz} + name: is-shared-array-buffer + version: 1.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 dev: true - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + registry.npmmirror.com/is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz} + name: is-stream + version: 2.0.1 engines: {node: '>=8'} dev: true - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + registry.npmmirror.com/is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz} + name: is-stream + version: 3.0.0 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + registry.npmmirror.com/is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, tarball: https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz} + name: is-string + version: 1.0.7 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, tarball: https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz} + name: is-symbol + version: 1.0.4 + engines: {node: '>= 0.4'} + dependencies: + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + dev: true + + registry.npmmirror.com/is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==, tarball: https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz} + name: is-typed-array + version: 1.1.10 + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 + call-bind: registry.npmmirror.com/call-bind@1.0.5 + for-each: registry.npmmirror.com/for-each@0.3.3 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz} + name: is-unicode-supported + version: 0.1.0 engines: {node: '>=10'} dev: true - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + registry.npmmirror.com/is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==, tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz} + name: is-unicode-supported + version: 1.3.0 engines: {node: '>=12'} dev: true - /is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + registry.npmmirror.com/is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==, tarball: https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.1.tgz} + name: is-weakmap + version: 2.0.1 dev: true - /is2@2.0.9: - resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} - engines: {node: '>=v0.10.0'} + registry.npmmirror.com/is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==, tarball: https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.2.tgz} + name: is-weakset + version: 2.0.2 dependencies: - deep-is: 0.1.4 - ip-regex: 4.3.0 - is-url: 1.2.4 + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + dev: true + + registry.npmmirror.com/isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, tarball: https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz} + name: isarray + version: 1.0.0 dev: true - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + registry.npmmirror.com/isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, tarball: https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz} + name: isarray + version: 2.0.5 dev: true - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + registry.npmmirror.com/isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, tarball: https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz} + name: isexe + version: 2.0.0 dev: true - /isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + registry.npmmirror.com/isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, tarball: https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz} + name: isexe + version: 3.1.1 engines: {node: '>=16'} dev: true - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + registry.npmmirror.com/istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, tarball: https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz} + name: istanbul-lib-coverage + version: 3.2.2 engines: {node: '>=8'} dev: true - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + registry.npmmirror.com/istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, tarball: https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz} + name: istanbul-lib-instrument + version: 5.2.1 engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.7 - '@babel/parser': 7.23.6 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + semver: registry.npmmirror.com/semver@6.3.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} + registry.npmmirror.com/istanbul-lib-instrument@6.0.1: + resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==, tarball: https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz} + name: istanbul-lib-instrument + version: 6.0.1 engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.7 - '@babel/parser': 7.23.6 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.5.4 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + semver: registry.npmmirror.com/semver@7.5.4 transitivePeerDependencies: - supports-color dev: true - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + registry.npmmirror.com/istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, tarball: https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz} + name: istanbul-lib-report + version: 3.0.1 engines: {node: '>=10'} dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + make-dir: registry.npmmirror.com/make-dir@4.0.0 + supports-color: registry.npmmirror.com/supports-color@7.2.0 dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + registry.npmmirror.com/istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, tarball: https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz} + name: istanbul-lib-source-maps + version: 4.0.1 engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + source-map: registry.npmmirror.com/source-map@0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + registry.npmmirror.com/istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==, tarball: https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz} + name: istanbul-reports + version: 3.1.5 engines: {node: '>=8'} dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 + html-escaper: registry.npmmirror.com/html-escaper@2.0.2 + istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.1 dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + registry.npmmirror.com/jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, tarball: https://registry.npmmirror.com/jackspeak/-/jackspeak-2.3.6.tgz} + name: jackspeak + version: 2.3.6 engines: {node: '>=14'} dependencies: - '@isaacs/cliui': 8.0.2 + '@isaacs/cliui': registry.npmmirror.com/@isaacs/cliui@8.0.2 optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + '@pkgjs/parseargs': registry.npmmirror.com/@pkgjs/parseargs@0.11.0 dev: true - /jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + registry.npmmirror.com/jake@10.8.5: + resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==, tarball: https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz} + name: jake + version: 10.8.5 engines: {node: '>=10'} hasBin: true dependencies: - async: 3.2.5 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 + async: registry.npmmirror.com/async@3.2.5 + chalk: registry.npmmirror.com/chalk@4.1.2 + filelist: registry.npmmirror.com/filelist@1.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 dev: true - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + registry.npmmirror.com/jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==, tarball: https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz} + name: jest-changed-files + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - execa: 5.1.1 - jest-util: 29.7.0 - p-limit: 3.1.0 + execa: registry.npmmirror.com/execa@5.1.1 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + p-limit: registry.npmmirror.com/p-limit@3.1.0 dev: true - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + registry.npmmirror.com/jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==, tarball: https://registry.npmmirror.com/jest-circus/-/jest-circus-29.7.0.tgz} + name: jest-circus + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.1 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.0.4 - slash: 3.0.0 - stack-utils: 2.0.6 + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/expect': registry.npmmirror.com/@jest/expect@29.7.0 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + co: registry.npmmirror.com/co@4.6.0 + dedent: registry.npmmirror.com/dedent@1.5.1 + is-generator-fn: registry.npmmirror.com/is-generator-fn@2.1.0 + jest-each: registry.npmmirror.com/jest-each@29.7.0 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + p-limit: registry.npmmirror.com/p-limit@3.1.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + pure-rand: registry.npmmirror.com/pure-rand@6.0.4 + slash: registry.npmmirror.com/slash@3.0.0 + stack-utils: registry.npmmirror.com/stack-utils@2.0.6 transitivePeerDependencies: - babel-plugin-macros - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.10.6): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + registry.npmmirror.com/jest-cli@29.7.0(@types/node@20.11.0): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==, tarball: https://registry.npmmirror.com/jest-cli/-/jest-cli-29.7.0.tgz} + id: registry.npmmirror.com/jest-cli/29.7.0 + name: jest-cli + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -3748,17 +5286,17 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.10.6) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.10.6) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 + '@jest/core': registry.npmmirror.com/@jest/core@29.7.0 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + create-jest: registry.npmmirror.com/create-jest@29.7.0(@types/node@20.11.0) + exit: registry.npmmirror.com/exit@0.1.2 + import-local: registry.npmmirror.com/import-local@3.1.0 + jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + yargs: registry.npmmirror.com/yargs@17.7.2 transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -3766,8 +5304,11 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.10.6): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==, tarball: https://registry.npmmirror.com/jest-config/-/jest-config-29.7.0.tgz} + id: registry.npmmirror.com/jest-config/29.7.0 + name: jest-config + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -3778,64 +5319,72 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.7 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - babel-jest: 29.7.0(@babel/core@7.23.7) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@jest/test-sequencer': registry.npmmirror.com/@jest/test-sequencer@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + babel-jest: registry.npmmirror.com/babel-jest@29.7.0(@babel/core@7.23.3) + chalk: registry.npmmirror.com/chalk@4.1.2 + ci-info: registry.npmmirror.com/ci-info@3.9.0 + deepmerge: registry.npmmirror.com/deepmerge@4.3.1 + glob: registry.npmmirror.com/glob@7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-circus: registry.npmmirror.com/jest-circus@29.7.0 + jest-environment-node: registry.npmmirror.com/jest-environment-node@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-runner: registry.npmmirror.com/jest-runner@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + parse-json: registry.npmmirror.com/parse-json@5.2.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 transitivePeerDependencies: - babel-plugin-macros - supports-color dev: true - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + registry.npmmirror.com/jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==, tarball: https://registry.npmmirror.com/jest-diff/-/jest-diff-29.7.0.tgz} + name: jest-diff + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + diff-sequences: registry.npmmirror.com/diff-sequences@29.6.3 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 dev: true - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + registry.npmmirror.com/jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==, tarball: https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.7.0.tgz} + name: jest-docblock + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - detect-newline: 3.1.0 + detect-newline: registry.npmmirror.com/detect-newline@3.1.0 dev: true - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + registry.npmmirror.com/jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==, tarball: https://registry.npmmirror.com/jest-each/-/jest-each-29.7.0.tgz} + name: jest-each + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 dev: true - /jest-environment-jsdom@29.7.0: - resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} + registry.npmmirror.com/jest-environment-jsdom@29.7.0: + resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==, tarball: https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz} + name: jest-environment-jsdom + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: canvas: ^2.5.0 @@ -3843,104 +5392,117 @@ packages: canvas: optional: true dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/jsdom': 20.0.1 - '@types/node': 20.10.6 - jest-mock: 29.7.0 - jest-util: 29.7.0 - jsdom: 20.0.3 + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/jsdom': registry.npmmirror.com/@types/jsdom@20.0.1 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jsdom: registry.npmmirror.com/jsdom@20.0.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + registry.npmmirror.com/jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==, tarball: https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz} + name: jest-environment-node + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - - /jest-expect-message@1.1.3: - resolution: {integrity: sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==} + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 dev: true - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + registry.npmmirror.com/jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, tarball: https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.6.3.tgz} + name: jest-get-type + version: 29.6.3 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + registry.npmmirror.com/jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==, tarball: https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz} + name: jest-haste-map + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 20.10.6 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.5 - walker: 1.0.8 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/graceful-fs': registry.npmmirror.com/@types/graceful-fs@4.1.9 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + anymatch: registry.npmmirror.com/anymatch@3.1.3 + fb-watchman: registry.npmmirror.com/fb-watchman@2.0.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-worker: registry.npmmirror.com/jest-worker@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + walker: registry.npmmirror.com/walker@1.0.8 optionalDependencies: - fsevents: 2.3.3 + fsevents: registry.npmmirror.com/fsevents@2.3.3 dev: true - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + registry.npmmirror.com/jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==, tarball: https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz} + name: jest-leak-detector + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 dev: true - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + registry.npmmirror.com/jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==, tarball: https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz} + name: jest-matcher-utils + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-diff: registry.npmmirror.com/jest-diff@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 dev: true - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + registry.npmmirror.com/jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==, tarball: https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.7.0.tgz} + name: jest-message-util + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.23.5 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/stack-utils': registry.npmmirror.com/@types/stack-utils@2.0.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + stack-utils: registry.npmmirror.com/stack-utils@2.0.6 dev: true - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + registry.npmmirror.com/jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==, tarball: https://registry.npmmirror.com/jest-mock/-/jest-mock-29.7.0.tgz} + name: jest-mock + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - jest-util: 29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + registry.npmmirror.com/jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, tarball: https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz} + id: registry.npmmirror.com/jest-pnp-resolver/1.2.3 + name: jest-pnp-resolver + version: 1.2.3 engines: {node: '>=6'} peerDependencies: jest-resolve: '*' @@ -3948,176 +5510,199 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 29.7.0 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 dev: true - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + registry.npmmirror.com/jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==, tarball: https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz} + name: jest-regex-util + version: 29.6.3 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + registry.npmmirror.com/jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==, tarball: https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz} + name: jest-resolve-dependencies + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 transitivePeerDependencies: - supports-color dev: true - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + registry.npmmirror.com/jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==, tarball: https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.7.0.tgz} + name: jest-resolve + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.8 - resolve.exports: 2.0.2 - slash: 3.0.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-pnp-resolver: registry.npmmirror.com/jest-pnp-resolver@1.2.3(jest-resolve@29.7.0) + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + resolve: registry.npmmirror.com/resolve@1.22.8 + resolve.exports: registry.npmmirror.com/resolve.exports@2.0.2 + slash: registry.npmmirror.com/slash@3.0.0 dev: true - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + registry.npmmirror.com/jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==, tarball: https://registry.npmmirror.com/jest-runner/-/jest-runner-29.7.0.tgz} + name: jest-runner + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 + '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + emittery: registry.npmmirror.com/emittery@0.13.1 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-docblock: registry.npmmirror.com/jest-docblock@29.7.0 + jest-environment-node: registry.npmmirror.com/jest-environment-node@29.7.0 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-leak-detector: registry.npmmirror.com/jest-leak-detector@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-watcher: registry.npmmirror.com/jest-watcher@29.7.0 + jest-worker: registry.npmmirror.com/jest-worker@29.7.0 + p-limit: registry.npmmirror.com/p-limit@3.1.0 + source-map-support: registry.npmmirror.com/source-map-support@0.5.13 transitivePeerDependencies: - supports-color dev: true - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + registry.npmmirror.com/jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==, tarball: https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.7.0.tgz} + name: jest-runtime + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 + '@jest/globals': registry.npmmirror.com/@jest/globals@29.7.0 + '@jest/source-map': registry.npmmirror.com/@jest/source-map@29.6.3 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + cjs-module-lexer: registry.npmmirror.com/cjs-module-lexer@1.2.2 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 + glob: registry.npmmirror.com/glob@7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + strip-bom: registry.npmmirror.com/strip-bom@4.0.0 transitivePeerDependencies: - supports-color dev: true - - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.23.7 - '@babel/generator': 7.23.6 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) - '@babel/types': 7.23.6 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.7) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.5.4 + + registry.npmmirror.com/jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==, tarball: https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz} + name: jest-snapshot + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/generator': registry.npmmirror.com/@babel/generator@7.23.3 + '@babel/plugin-syntax-jsx': registry.npmmirror.com/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3) + '@babel/plugin-syntax-typescript': registry.npmmirror.com/@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3) + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + '@jest/expect-utils': registry.npmmirror.com/@jest/expect-utils@29.7.0 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3) + chalk: registry.npmmirror.com/chalk@4.1.2 + expect: registry.npmmirror.com/expect@29.7.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-diff: registry.npmmirror.com/jest-diff@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + natural-compare: registry.npmmirror.com/natural-compare@1.4.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + semver: registry.npmmirror.com/semver@7.5.4 transitivePeerDependencies: - supports-color dev: true - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + registry.npmmirror.com/jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, tarball: https://registry.npmmirror.com/jest-util/-/jest-util-29.7.0.tgz} + name: jest-util + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + ci-info: registry.npmmirror.com/ci-info@3.9.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + picomatch: registry.npmmirror.com/picomatch@2.3.1 dev: true - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + registry.npmmirror.com/jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==, tarball: https://registry.npmmirror.com/jest-validate/-/jest-validate-29.7.0.tgz} + name: jest-validate + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + camelcase: registry.npmmirror.com/camelcase@6.3.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + leven: registry.npmmirror.com/leven@3.1.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 dev: true - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + registry.npmmirror.com/jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==, tarball: https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.7.0.tgz} + name: jest-watcher + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.10.6 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 + chalk: registry.npmmirror.com/chalk@4.1.2 + emittery: registry.npmmirror.com/emittery@0.13.1 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + string-length: registry.npmmirror.com/string-length@4.0.2 dev: true - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + registry.npmmirror.com/jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==, tarball: https://registry.npmmirror.com/jest-worker/-/jest-worker-29.7.0.tgz} + name: jest-worker + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.10.6 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + merge-stream: registry.npmmirror.com/merge-stream@2.0.0 + supports-color: registry.npmmirror.com/supports-color@8.1.1 dev: true - /jest@29.7.0(@types/node@20.10.6): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==, tarball: https://registry.npmmirror.com/jest/-/jest-29.7.0.tgz} + id: registry.npmmirror.com/jest/29.7.0 + name: jest + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -4126,10 +5711,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0 - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.10.6) + '@jest/core': registry.npmmirror.com/@jest/core@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + import-local: registry.npmmirror.com/import-local@3.1.0 + jest-cli: registry.npmmirror.com/jest-cli@29.7.0(@types/node@20.11.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4137,27 +5722,35 @@ packages: - ts-node dev: true - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + registry.npmmirror.com/js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, tarball: https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz} + name: js-tokens + version: 4.0.0 dev: true - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + registry.npmmirror.com/js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz} + name: js-yaml + version: 3.14.1 hasBin: true dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + argparse: registry.npmmirror.com/argparse@1.0.10 + esprima: registry.npmmirror.com/esprima@4.0.1 dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + registry.npmmirror.com/js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz} + name: js-yaml + version: 4.1.0 hasBin: true dependencies: - argparse: 2.0.1 + argparse: registry.npmmirror.com/argparse@2.0.1 dev: true - /jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} + registry.npmmirror.com/jsdom@20.0.3: + resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==, tarball: https://registry.npmmirror.com/jsdom/-/jsdom-20.0.3.tgz} + name: jsdom + version: 20.0.3 engines: {node: '>=14'} peerDependencies: canvas: ^2.5.0 @@ -4165,460 +5758,576 @@ packages: canvas: optional: true dependencies: - abab: 2.0.6 - acorn: 8.11.3 - acorn-globals: 7.0.1 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.4.3 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 7.1.2 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - ws: 8.16.0 - xml-name-validator: 4.0.0 + abab: registry.npmmirror.com/abab@2.0.6 + acorn: registry.npmmirror.com/acorn@8.11.2 + acorn-globals: registry.npmmirror.com/acorn-globals@7.0.1 + cssom: registry.npmmirror.com/cssom@0.5.0 + cssstyle: registry.npmmirror.com/cssstyle@2.3.0 + data-urls: registry.npmmirror.com/data-urls@3.0.2 + decimal.js: registry.npmmirror.com/decimal.js@10.4.3 + domexception: registry.npmmirror.com/domexception@4.0.0 + escodegen: registry.npmmirror.com/escodegen@2.1.0 + form-data: registry.npmmirror.com/form-data@4.0.0 + html-encoding-sniffer: registry.npmmirror.com/html-encoding-sniffer@3.0.0 + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@5.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@5.0.1 + is-potential-custom-element-name: registry.npmmirror.com/is-potential-custom-element-name@1.0.1 + nwsapi: registry.npmmirror.com/nwsapi@2.2.4 + parse5: registry.npmmirror.com/parse5@7.1.2 + saxes: registry.npmmirror.com/saxes@6.0.0 + symbol-tree: registry.npmmirror.com/symbol-tree@3.2.4 + tough-cookie: registry.npmmirror.com/tough-cookie@4.1.2 + w3c-xmlserializer: registry.npmmirror.com/w3c-xmlserializer@4.0.0 + webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 + whatwg-encoding: registry.npmmirror.com/whatwg-encoding@2.0.0 + whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype@3.0.0 + whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0 + ws: registry.npmmirror.com/ws@8.14.2 + xml-name-validator: registry.npmmirror.com/xml-name-validator@4.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + registry.npmmirror.com/jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, tarball: https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz} + name: jsesc + version: 2.5.2 engines: {node: '>=4'} hasBin: true dev: true - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + registry.npmmirror.com/json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, tarball: https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz} + name: json-buffer + version: 3.0.1 dev: true - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + registry.npmmirror.com/json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz} + name: json-parse-even-better-errors + version: 2.3.1 dev: true - /json-parse-even-better-errors@3.0.1: - resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} + registry.npmmirror.com/json-parse-even-better-errors@3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==, tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz} + name: json-parse-even-better-errors + version: 3.0.0 engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + registry.npmmirror.com/json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, tarball: https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz} + name: json-schema-traverse + version: 0.4.1 dev: true - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, tarball: https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz} + name: json-stable-stringify-without-jsonify + version: 1.0.1 dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + registry.npmmirror.com/json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, tarball: https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz} + name: json5 + version: 2.2.3 engines: {node: '>=6'} hasBin: true dev: true - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.1 + registry.npmmirror.com/jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, tarball: https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz} + name: jsonfile + version: 4.0.0 optionalDependencies: - graceful-fs: 4.2.11 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 dev: true - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + registry.npmmirror.com/keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, tarball: https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz} + name: keyv + version: 4.5.4 dependencies: - json-buffer: 3.0.1 + json-buffer: registry.npmmirror.com/json-buffer@3.0.1 dev: true - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + registry.npmmirror.com/kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, tarball: https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz} + name: kleur + version: 3.0.3 engines: {node: '>=6'} dev: true - /ky@0.33.3: - resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==} + registry.npmmirror.com/ky@0.33.3: + resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==, tarball: https://registry.npmmirror.com/ky/-/ky-0.33.3.tgz} + name: ky + version: 0.33.3 engines: {node: '>=14.16'} dev: true - /lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + registry.npmmirror.com/lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==, tarball: https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz} + name: lazystream + version: 1.0.1 engines: {node: '>= 0.6.3'} dependencies: - readable-stream: 2.3.8 + readable-stream: registry.npmmirror.com/readable-stream@2.3.8 dev: true - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + registry.npmmirror.com/leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, tarball: https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz} + name: leven + version: 3.1.0 engines: {node: '>=6'} dev: true - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + registry.npmmirror.com/levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, tarball: https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz} + name: levn + version: 0.4.1 engines: {node: '>= 0.8.0'} dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 + type-check: registry.npmmirror.com/type-check@0.4.0 dev: true - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + registry.npmmirror.com/lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, tarball: https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz} + name: lines-and-columns + version: 1.2.4 dev: true - /lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + registry.npmmirror.com/lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==, tarball: https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz} + name: lines-and-columns + version: 2.0.4 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /listenercount@1.0.1: - resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} + registry.npmmirror.com/listenercount@1.0.1: + resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==, tarball: https://registry.npmmirror.com/listenercount/-/listenercount-1.0.1.tgz} + name: listenercount + version: 1.0.1 dev: true - /locate-app@2.2.3: - resolution: {integrity: sha512-3FAWZ/afqGa283tCL6f7HX1zkf0ZJkdBwPWn6Fykh3f6sP5zaKKI6/rUNGZYgBh59u/NXLcRwM5uBhJ8Q9isUQ==} + registry.npmmirror.com/locate-app@2.1.0: + resolution: {integrity: sha512-rcVo/iLUxrd9d0lrmregK/Z5Y5NCpSwf9KlMbPpOHmKmdxdQY1Fj8NDQ5QymJTryCsBLqwmniFv2f3JKbk9Bvg==, tarball: https://registry.npmmirror.com/locate-app/-/locate-app-2.1.0.tgz} + name: locate-app + version: 2.1.0 dependencies: - n12: 1.8.6 - type-fest: 2.13.0 - userhome: 1.0.0 + n12: registry.npmmirror.com/n12@0.4.0 + type-fest: registry.npmmirror.com/type-fest@2.13.0 + userhome: registry.npmmirror.com/userhome@1.0.0 dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + registry.npmmirror.com/locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz} + name: locate-path + version: 5.0.0 engines: {node: '>=8'} dependencies: - p-locate: 4.1.0 + p-locate: registry.npmmirror.com/p-locate@4.1.0 dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + registry.npmmirror.com/locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz} + name: locate-path + version: 6.0.0 engines: {node: '>=10'} dependencies: - p-locate: 5.0.0 + p-locate: registry.npmmirror.com/p-locate@5.0.0 dev: true - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + registry.npmmirror.com/locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-7.2.0.tgz} + name: locate-path + version: 7.2.0 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - p-locate: 6.0.0 - dev: true - - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + p-locate: registry.npmmirror.com/p-locate@6.0.0 dev: true - /lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + registry.npmmirror.com/lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==, tarball: https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz} + name: lodash.clonedeep + version: 4.5.0 dev: true - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - requiresBuild: true + registry.npmmirror.com/lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==, tarball: https://registry.npmmirror.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz} + name: lodash.flattendeep + version: 4.4.0 dev: true - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + registry.npmmirror.com/lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, tarball: https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz} + name: lodash.isequal + version: 4.5.0 dev: true - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + registry.npmmirror.com/lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, tarball: https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz} + name: lodash.merge + version: 4.6.2 dev: true - /lodash.pickby@4.6.0: - resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} + registry.npmmirror.com/lodash.pickby@4.6.0: + resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==, tarball: https://registry.npmmirror.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz} + name: lodash.pickby + version: 4.6.0 dev: true - /lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + registry.npmmirror.com/lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==, tarball: https://registry.npmmirror.com/lodash.union/-/lodash.union-4.6.0.tgz} + name: lodash.union + version: 4.6.0 dev: true - /lodash.zip@4.2.0: - resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + registry.npmmirror.com/lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==, tarball: https://registry.npmmirror.com/lodash.zip/-/lodash.zip-4.2.0.tgz} + name: lodash.zip + version: 4.2.0 dev: true - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + registry.npmmirror.com/lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz} + name: lodash + version: 4.17.21 dev: true - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + registry.npmmirror.com/log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, tarball: https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz} + name: log-symbols + version: 4.1.0 engines: {node: '>=10'} dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported@0.1.0 dev: true - /loglevel-plugin-prefix@0.8.4: - resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + registry.npmmirror.com/loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==, tarball: https://registry.npmmirror.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz} + name: loglevel-plugin-prefix + version: 0.8.4 dev: true - /loglevel@1.8.1: - resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} + registry.npmmirror.com/loglevel@1.8.1: + resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==, tarball: https://registry.npmmirror.com/loglevel/-/loglevel-1.8.1.tgz} + name: loglevel + version: 1.8.1 engines: {node: '>= 0.6.0'} dev: true - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + registry.npmmirror.com/loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, tarball: https://registry.npmmirror.com/loupe/-/loupe-2.3.7.tgz} + name: loupe + version: 2.3.7 dependencies: - get-func-name: 2.0.2 + get-func-name: registry.npmmirror.com/get-func-name@2.0.2 dev: true - /lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + registry.npmmirror.com/lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==, tarball: https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz} + name: lowercase-keys + version: 3.0.0 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + registry.npmmirror.com/lru-cache@10.0.2: + resolution: {integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-10.0.2.tgz} + name: lru-cache + version: 10.0.2 engines: {node: 14 || >=16.14} + dependencies: + semver: registry.npmmirror.com/semver@7.5.4 dev: true - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + registry.npmmirror.com/lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz} + name: lru-cache + version: 5.1.1 dependencies: - yallist: 3.1.1 + yallist: registry.npmmirror.com/yallist@3.1.1 dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + registry.npmmirror.com/lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz} + name: lru-cache + version: 6.0.0 engines: {node: '>=10'} dependencies: - yallist: 4.0.0 + yallist: registry.npmmirror.com/yallist@4.0.0 dev: true - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + registry.npmmirror.com/lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz} + name: lru-cache + version: 7.18.3 engines: {node: '>=12'} dev: true - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + registry.npmmirror.com/make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-4.0.0.tgz} + name: make-dir + version: 4.0.0 engines: {node: '>=10'} dependencies: - semver: 7.5.4 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + semver: registry.npmmirror.com/semver@7.5.4 dev: true - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + registry.npmmirror.com/makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, tarball: https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz} + name: makeerror + version: 1.0.12 dependencies: - tmpl: 1.0.5 + tmpl: registry.npmmirror.com/tmpl@1.0.5 dev: true - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + registry.npmmirror.com/merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, tarball: https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz} + name: merge-stream + version: 2.0.0 dev: true - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + registry.npmmirror.com/merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, tarball: https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz} + name: merge2 + version: 1.4.1 engines: {node: '>= 8'} dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + registry.npmmirror.com/micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, tarball: https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz} + name: micromatch + version: 4.0.5 engines: {node: '>=8.6'} dependencies: - braces: 3.0.2 - picomatch: 2.3.1 + braces: registry.npmmirror.com/braces@3.0.2 + picomatch: registry.npmmirror.com/picomatch@2.3.1 dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + registry.npmmirror.com/mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, tarball: https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz} + name: mime-db + version: 1.52.0 engines: {node: '>= 0.6'} dev: true - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + registry.npmmirror.com/mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, tarball: https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz} + name: mime-types + version: 2.1.35 engines: {node: '>= 0.6'} dependencies: - mime-db: 1.52.0 + mime-db: registry.npmmirror.com/mime-db@1.52.0 dev: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + registry.npmmirror.com/mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, tarball: https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz} + name: mimic-fn + version: 2.1.0 engines: {node: '>=6'} dev: true - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + registry.npmmirror.com/mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, tarball: https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz} + name: mimic-fn + version: 4.0.0 engines: {node: '>=12'} dev: true - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + registry.npmmirror.com/mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz} + name: mimic-response + version: 3.1.0 engines: {node: '>=10'} dev: true - /mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + registry.npmmirror.com/mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==, tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-4.0.0.tgz} + name: mimic-response + version: 4.0.0 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + registry.npmmirror.com/minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.0.8.tgz} + name: minimatch + version: 3.0.8 dependencies: - brace-expansion: 1.1.11 + brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 dev: true - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + registry.npmmirror.com/minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz} + name: minimatch + version: 3.1.2 dependencies: - brace-expansion: 1.1.11 + brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 dev: true - /minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + registry.npmmirror.com/minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.0.1.tgz} + name: minimatch + version: 5.0.1 engines: {node: '>=10'} dependencies: - brace-expansion: 2.0.1 + brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + registry.npmmirror.com/minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz} + name: minimatch + version: 5.1.6 engines: {node: '>=10'} dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 + brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + registry.npmmirror.com/minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz} + name: minimatch + version: 9.0.3 engines: {node: '>=16 || 14 >=14.17'} dependencies: - brace-expansion: 2.0.1 + brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + registry.npmmirror.com/minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, tarball: https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz} + name: minimist + version: 1.2.8 dev: true - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + registry.npmmirror.com/minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, tarball: https://registry.npmmirror.com/minipass/-/minipass-7.0.4.tgz} + name: minipass + version: 7.0.4 engines: {node: '>=16 || 14 >=14.17'} dev: true - /mitt@3.0.0: - resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} + registry.npmmirror.com/mitt@3.0.0: + resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==, tarball: https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz} + name: mitt + version: 3.0.0 dev: true - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + registry.npmmirror.com/mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, tarball: https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz} + name: mkdirp-classic + version: 0.5.3 dev: true - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + registry.npmmirror.com/mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, tarball: https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz} + name: mkdirp + version: 0.5.6 hasBin: true dependencies: - minimist: 1.2.8 + minimist: registry.npmmirror.com/minimist@1.2.8 dev: true - /mocha@10.2.0: - resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} + registry.npmmirror.com/mocha@10.2.0: + resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==, tarball: https://registry.npmmirror.com/mocha/-/mocha-10.2.0.tgz} + name: mocha + version: 10.2.0 engines: {node: '>= 14.0.0'} hasBin: true dependencies: - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.0.1 - ms: 2.1.3 - nanoid: 3.3.3 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - dev: true - - /moment@2.29.4: - resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} - dev: true - - /moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + ansi-colors: registry.npmmirror.com/ansi-colors@4.1.1 + browser-stdout: registry.npmmirror.com/browser-stdout@1.3.1 + chokidar: registry.npmmirror.com/chokidar@3.5.3 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + diff: registry.npmmirror.com/diff@5.0.0 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 + find-up: registry.npmmirror.com/find-up@5.0.0 + glob: registry.npmmirror.com/glob@7.2.0 + he: registry.npmmirror.com/he@1.2.0 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + log-symbols: registry.npmmirror.com/log-symbols@4.1.0 + minimatch: registry.npmmirror.com/minimatch@5.0.1 + ms: registry.npmmirror.com/ms@2.1.3 + nanoid: registry.npmmirror.com/nanoid@3.3.3 + serialize-javascript: registry.npmmirror.com/serialize-javascript@6.0.0 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 + supports-color: registry.npmmirror.com/supports-color@8.1.1 + workerpool: registry.npmmirror.com/workerpool@6.2.1 + yargs: registry.npmmirror.com/yargs@16.2.0 + yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 + yargs-unparser: registry.npmmirror.com/yargs-unparser@2.0.0 + dev: true + + registry.npmmirror.com/moment@2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==, tarball: https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz} + name: moment + version: 2.29.4 + dev: true + + registry.npmmirror.com/moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==, tarball: https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz} + name: moment + version: 2.30.1 dev: true - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + registry.npmmirror.com/ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz} + name: ms + version: 2.1.2 dev: true - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + registry.npmmirror.com/ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz} + name: ms + version: 2.1.3 dev: true - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + registry.npmmirror.com/mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, tarball: https://registry.npmmirror.com/mute-stream/-/mute-stream-1.0.0.tgz} + name: mute-stream + version: 1.0.0 engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /n12@1.8.6: - resolution: {integrity: sha512-a+9bk4vwyYkBtoo1ONHLakCME4pl+qXZteHcDH3+91Wxa365SgxcXP4X0bLHYjoIR4u+b/yE8IJeQPJqhJpodQ==} + registry.npmmirror.com/n12@0.4.0: + resolution: {integrity: sha512-p/hj4zQ8d3pbbFLQuN1K9honUxiDDhueOWyFLw/XgBv+wZCE44bcLH4CIcsolOceJQduh4Jf7m/LfaTxyGmGtQ==, tarball: https://registry.npmmirror.com/n12/-/n12-0.4.0.tgz} + name: n12 + version: 0.4.0 dev: true - /nanoid@3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} + registry.npmmirror.com/nanoid@3.3.3: + resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==, tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.3.tgz} + name: nanoid + version: 3.3.3 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + registry.npmmirror.com/natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, tarball: https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz} + name: natural-compare + version: 1.4.0 dev: true - /netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + registry.npmmirror.com/netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==, tarball: https://registry.npmmirror.com/netmask/-/netmask-2.0.2.tgz} + name: netmask + version: 2.0.2 engines: {node: '>= 0.4.0'} dev: true - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + registry.npmmirror.com/node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, tarball: https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz} + name: node-domexception + version: 1.0.0 engines: {node: '>=10.5.0'} dev: true - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + registry.npmmirror.com/node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz} + name: node-fetch + version: 2.7.0 engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -4626,430 +6335,568 @@ packages: encoding: optional: true dependencies: - whatwg-url: 5.0.0 + whatwg-url: registry.npmmirror.com/whatwg-url@5.0.0 dev: true - /node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + registry.npmmirror.com/node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-3.3.2.tgz} + name: node-fetch + version: 3.3.2 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 + data-uri-to-buffer: registry.npmmirror.com/data-uri-to-buffer@4.0.1 + fetch-blob: registry.npmmirror.com/fetch-blob@3.2.0 + formdata-polyfill: registry.npmmirror.com/formdata-polyfill@4.0.10 dev: true - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + registry.npmmirror.com/node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, tarball: https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz} + name: node-int64 + version: 0.4.0 dev: true - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + registry.npmmirror.com/node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz} + name: node-releases + version: 2.0.14 dev: true - /normalize-package-data@6.0.0: - resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + registry.npmmirror.com/normalize-package-data@6.0.0: + resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==, tarball: https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz} + name: normalize-package-data + version: 6.0.0 engines: {node: ^16.14.0 || >=18.0.0} dependencies: - hosted-git-info: 7.0.1 - is-core-module: 2.13.1 - semver: 7.5.4 - validate-npm-package-license: 3.0.4 + hosted-git-info: registry.npmmirror.com/hosted-git-info@7.0.1 + is-core-module: registry.npmmirror.com/is-core-module@2.13.1 + semver: registry.npmmirror.com/semver@7.5.4 + validate-npm-package-license: registry.npmmirror.com/validate-npm-package-license@3.0.4 dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + registry.npmmirror.com/normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, tarball: https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz} + name: normalize-path + version: 3.0.0 engines: {node: '>=0.10.0'} dev: true - /normalize-url@8.0.0: - resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + registry.npmmirror.com/normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==, tarball: https://registry.npmmirror.com/normalize-url/-/normalize-url-8.0.0.tgz} + name: normalize-url + version: 8.0.0 engines: {node: '>=14.16'} dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + registry.npmmirror.com/npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz} + name: npm-run-path + version: 4.0.1 engines: {node: '>=8'} dependencies: - path-key: 3.1.1 + path-key: registry.npmmirror.com/path-key@3.1.1 dev: true - /npm-run-path@5.2.0: - resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + registry.npmmirror.com/npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==, tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz} + name: npm-run-path + version: 5.1.0 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - path-key: 4.0.0 + path-key: registry.npmmirror.com/path-key@4.0.0 + dev: true + + registry.npmmirror.com/nwsapi@2.2.4: + resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==, tarball: https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.4.tgz} + name: nwsapi + version: 2.2.4 + dev: true + + registry.npmmirror.com/object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz} + name: object-inspect + version: 1.13.1 + dev: true + + registry.npmmirror.com/object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, tarball: https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz} + name: object-is + version: 1.1.5 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + define-properties: registry.npmmirror.com/define-properties@1.2.1 dev: true - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + registry.npmmirror.com/object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, tarball: https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz} + name: object-keys + version: 1.1.1 + engines: {node: '>= 0.4'} dev: true - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + registry.npmmirror.com/object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, tarball: https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz} + name: object.assign + version: 4.1.5 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + define-properties: registry.npmmirror.com/define-properties@1.2.1 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + object-keys: registry.npmmirror.com/object-keys@1.1.1 dev: true - /obsidian@1.4.11(@codemirror/state@6.4.0)(@codemirror/view@6.23.0): - resolution: {integrity: sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==} + registry.npmmirror.com/obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0): + resolution: {integrity: sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==, tarball: https://registry.npmmirror.com/obsidian/-/obsidian-1.4.11.tgz} + id: registry.npmmirror.com/obsidian/1.4.11 + name: obsidian + version: 1.4.11 peerDependencies: '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 dependencies: - '@codemirror/state': 6.4.0 - '@codemirror/view': 6.23.0 - '@types/codemirror': 5.60.8 - moment: 2.29.4 + '@codemirror/state': registry.npmmirror.com/@codemirror/state@6.3.1 + '@codemirror/view': registry.npmmirror.com/@codemirror/view@6.22.0 + '@types/codemirror': registry.npmmirror.com/@types/codemirror@5.60.8 + moment: registry.npmmirror.com/moment@2.29.4 dev: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + registry.npmmirror.com/once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, tarball: https://registry.npmmirror.com/once/-/once-1.4.0.tgz} + name: once + version: 1.4.0 dependencies: - wrappy: 1.0.2 + wrappy: registry.npmmirror.com/wrappy@1.0.2 dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + registry.npmmirror.com/onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, tarball: https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz} + name: onetime + version: 5.1.2 engines: {node: '>=6'} dependencies: - mimic-fn: 2.1.0 + mimic-fn: registry.npmmirror.com/mimic-fn@2.1.0 dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + registry.npmmirror.com/onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, tarball: https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz} + name: onetime + version: 6.0.0 engines: {node: '>=12'} dependencies: - mimic-fn: 4.0.0 + mimic-fn: registry.npmmirror.com/mimic-fn@4.0.0 dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + registry.npmmirror.com/optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, tarball: https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz} + name: optionator + version: 0.9.3 engines: {node: '>= 0.8.0'} dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 + '@aashutoshrathi/word-wrap': registry.npmmirror.com/@aashutoshrathi/word-wrap@1.2.6 + deep-is: registry.npmmirror.com/deep-is@0.1.4 + fast-levenshtein: registry.npmmirror.com/fast-levenshtein@2.0.6 + levn: registry.npmmirror.com/levn@0.4.1 + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 + type-check: registry.npmmirror.com/type-check@0.4.0 dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + registry.npmmirror.com/ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, tarball: https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz} + name: ora + version: 5.4.1 engines: {node: '>=10'} dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 + bl: registry.npmmirror.com/bl@4.1.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + cli-cursor: registry.npmmirror.com/cli-cursor@3.1.0 + cli-spinners: registry.npmmirror.com/cli-spinners@2.9.1 + is-interactive: registry.npmmirror.com/is-interactive@1.0.0 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported@0.1.0 + log-symbols: registry.npmmirror.com/log-symbols@4.1.0 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wcwidth: registry.npmmirror.com/wcwidth@1.0.1 dev: true - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + registry.npmmirror.com/os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, tarball: https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz} + name: os-tmpdir + version: 1.0.2 engines: {node: '>=0.10.0'} dev: true - /p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + registry.npmmirror.com/p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==, tarball: https://registry.npmmirror.com/p-cancelable/-/p-cancelable-3.0.0.tgz} + name: p-cancelable + version: 3.0.0 engines: {node: '>=12.20'} dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + registry.npmmirror.com/p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz} + name: p-limit + version: 2.3.0 engines: {node: '>=6'} dependencies: - p-try: 2.2.0 + p-try: registry.npmmirror.com/p-try@2.2.0 dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + registry.npmmirror.com/p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz} + name: p-limit + version: 3.1.0 engines: {node: '>=10'} dependencies: - yocto-queue: 0.1.0 + yocto-queue: registry.npmmirror.com/yocto-queue@0.1.0 dev: true - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + registry.npmmirror.com/p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-4.0.0.tgz} + name: p-limit + version: 4.0.0 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - yocto-queue: 1.0.0 + yocto-queue: registry.npmmirror.com/yocto-queue@1.0.0 dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + registry.npmmirror.com/p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz} + name: p-locate + version: 4.1.0 engines: {node: '>=8'} dependencies: - p-limit: 2.3.0 + p-limit: registry.npmmirror.com/p-limit@2.3.0 dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + registry.npmmirror.com/p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz} + name: p-locate + version: 5.0.0 engines: {node: '>=10'} dependencies: - p-limit: 3.1.0 + p-limit: registry.npmmirror.com/p-limit@3.1.0 dev: true - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + registry.npmmirror.com/p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-6.0.0.tgz} + name: p-locate + version: 6.0.0 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - p-limit: 4.0.0 + p-limit: registry.npmmirror.com/p-limit@4.0.0 dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + registry.npmmirror.com/p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, tarball: https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz} + name: p-try + version: 2.2.0 engines: {node: '>=6'} dev: true - /pac-proxy-agent@7.0.1: - resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} + registry.npmmirror.com/pac-proxy-agent@7.0.1: + resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==, tarball: https://registry.npmmirror.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz} + name: pac-proxy-agent + version: 7.0.1 engines: {node: '>= 14'} dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - get-uri: 6.0.2 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - pac-resolver: 7.0.0 - socks-proxy-agent: 8.0.2 + '@tootallnate/quickjs-emscripten': registry.npmmirror.com/@tootallnate/quickjs-emscripten@0.23.0 + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + get-uri: registry.npmmirror.com/get-uri@6.0.2 + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + pac-resolver: registry.npmmirror.com/pac-resolver@7.0.0 + socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 transitivePeerDependencies: - supports-color dev: true - /pac-resolver@7.0.0: - resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} + registry.npmmirror.com/pac-resolver@7.0.0: + resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==, tarball: https://registry.npmmirror.com/pac-resolver/-/pac-resolver-7.0.0.tgz} + name: pac-resolver + version: 7.0.0 engines: {node: '>= 14'} dependencies: - degenerator: 5.0.1 - ip: 1.1.8 - netmask: 2.0.2 + degenerator: registry.npmmirror.com/degenerator@5.0.1 + ip: registry.npmmirror.com/ip@1.1.8 + netmask: registry.npmmirror.com/netmask@2.0.2 dev: true - /pagerank.js@1.0.2: - resolution: {integrity: sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw==} - dev: false - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + registry.npmmirror.com/parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, tarball: https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz} + name: parent-module + version: 1.0.1 engines: {node: '>=6'} dependencies: - callsites: 3.1.0 - dev: true - - /parse-github-url@1.0.2: - resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} - engines: {node: '>=0.10.0'} - hasBin: true + callsites: registry.npmmirror.com/callsites@3.1.0 dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + registry.npmmirror.com/parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, tarball: https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz} + name: parse-json + version: 5.2.0 engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + error-ex: registry.npmmirror.com/error-ex@1.3.2 + json-parse-even-better-errors: registry.npmmirror.com/json-parse-even-better-errors@2.3.1 + lines-and-columns: registry.npmmirror.com/lines-and-columns@1.2.4 dev: true - /parse-json@7.1.1: - resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + registry.npmmirror.com/parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==, tarball: https://registry.npmmirror.com/parse-json/-/parse-json-7.1.1.tgz} + name: parse-json + version: 7.1.1 engines: {node: '>=16'} dependencies: - '@babel/code-frame': 7.23.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 3.0.1 - lines-and-columns: 2.0.4 - type-fest: 3.13.1 + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + error-ex: registry.npmmirror.com/error-ex@1.3.2 + json-parse-even-better-errors: registry.npmmirror.com/json-parse-even-better-errors@3.0.0 + lines-and-columns: registry.npmmirror.com/lines-and-columns@2.0.4 + type-fest: registry.npmmirror.com/type-fest@3.13.1 dev: true - /parse-ms@2.1.0: - resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + registry.npmmirror.com/parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==, tarball: https://registry.npmmirror.com/parse-ms/-/parse-ms-2.1.0.tgz} + name: parse-ms + version: 2.1.0 engines: {node: '>=6'} dev: true - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + registry.npmmirror.com/parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, tarball: https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz} + name: parse5 + version: 7.1.2 dependencies: - entities: 4.5.0 + entities: registry.npmmirror.com/entities@4.5.0 dev: true - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + registry.npmmirror.com/path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz} + name: path-exists + version: 4.0.0 engines: {node: '>=8'} dev: true - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + registry.npmmirror.com/path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-5.0.0.tgz} + name: path-exists + version: 5.0.0 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + registry.npmmirror.com/path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, tarball: https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz} + name: path-is-absolute + version: 1.0.1 engines: {node: '>=0.10.0'} dev: true - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + registry.npmmirror.com/path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, tarball: https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz} + name: path-key + version: 3.1.1 engines: {node: '>=8'} dev: true - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + registry.npmmirror.com/path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, tarball: https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz} + name: path-key + version: 4.0.0 engines: {node: '>=12'} dev: true - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + registry.npmmirror.com/path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, tarball: https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz} + name: path-parse + version: 1.0.7 dev: true - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + registry.npmmirror.com/path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, tarball: https://registry.npmmirror.com/path-scurry/-/path-scurry-1.10.1.tgz} + name: path-scurry + version: 1.10.1 engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.1.0 - minipass: 7.0.4 + lru-cache: registry.npmmirror.com/lru-cache@10.0.2 + minipass: registry.npmmirror.com/minipass@7.0.4 dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + registry.npmmirror.com/path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, tarball: https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz} + name: path-type + version: 4.0.0 engines: {node: '>=8'} dev: true - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + registry.npmmirror.com/pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, tarball: https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz} + name: pathval + version: 1.1.1 dev: true - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + registry.npmmirror.com/pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==, tarball: https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz} + name: pend + version: 1.2.0 dev: true - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + registry.npmmirror.com/picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, tarball: https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz} + name: picocolors + version: 1.0.0 dev: true - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + registry.npmmirror.com/picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, tarball: https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz} + name: picomatch + version: 2.3.1 engines: {node: '>=8.6'} dev: true - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + registry.npmmirror.com/pirates@4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==, tarball: https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz} + name: pirates + version: 4.0.5 engines: {node: '>= 6'} dev: true - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + registry.npmmirror.com/pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, tarball: https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz} + name: pkg-dir + version: 4.2.0 engines: {node: '>=8'} dependencies: - find-up: 4.1.0 + find-up: registry.npmmirror.com/find-up@4.1.0 dev: true - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + registry.npmmirror.com/prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, tarball: https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz} + name: prelude-ls + version: 1.2.1 engines: {node: '>= 0.8.0'} dev: true - /prettier@3.1.1: - resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} + registry.npmmirror.com/prettier@3.2.2: + resolution: {integrity: sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==, tarball: https://registry.npmmirror.com/prettier/-/prettier-3.2.2.tgz} + name: prettier + version: 3.2.2 engines: {node: '>=14'} hasBin: true dev: true - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + registry.npmmirror.com/pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, tarball: https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz} + name: pretty-format + version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 + '@jest/schemas': registry.npmmirror.com/@jest/schemas@29.6.3 + ansi-styles: registry.npmmirror.com/ansi-styles@5.2.0 + react-is: registry.npmmirror.com/react-is@18.2.0 dev: true - /pretty-ms@7.0.1: - resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + registry.npmmirror.com/pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==, tarball: https://registry.npmmirror.com/pretty-ms/-/pretty-ms-7.0.1.tgz} + name: pretty-ms + version: 7.0.1 engines: {node: '>=10'} dependencies: - parse-ms: 2.1.0 + parse-ms: registry.npmmirror.com/parse-ms@2.1.0 dev: true - /process-exists@4.1.0: - resolution: {integrity: sha512-BBJoiorUKoP2AuM5q/yKwIfT1YWRHsaxjW+Ayu9erLhqKOfnXzzVVML0XTYoQZuI1YvcWKmc1dh06DEy4+KzfA==} - engines: {node: '>=10'} - dependencies: - ps-list: 6.3.0 + registry.npmmirror.com/process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, tarball: https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz} + name: process-nextick-args + version: 2.0.1 dev: true - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + registry.npmmirror.com/progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==, tarball: https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz} + name: progress + version: 2.0.3 engines: {node: '>=0.4.0'} dev: true - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + registry.npmmirror.com/prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, tarball: https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz} + name: prompts + version: 2.4.2 engines: {node: '>= 6'} dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 + kleur: registry.npmmirror.com/kleur@3.0.3 + sisteransi: registry.npmmirror.com/sisteransi@1.0.5 dev: true - /proxy-agent@6.3.0: - resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} + registry.npmmirror.com/proxy-agent@6.3.0: + resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==, tarball: https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.3.0.tgz} + name: proxy-agent + version: 6.3.0 engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + lru-cache: registry.npmmirror.com/lru-cache@7.18.3 + pac-proxy-agent: registry.npmmirror.com/pac-proxy-agent@7.0.1 + proxy-from-env: registry.npmmirror.com/proxy-from-env@1.1.0 + socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 transitivePeerDependencies: - supports-color dev: true - /proxy-agent@6.3.1: - resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + registry.npmmirror.com/proxy-agent@6.3.1: + resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==, tarball: https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.3.1.tgz} + name: proxy-agent + version: 6.3.1 engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + lru-cache: registry.npmmirror.com/lru-cache@7.18.3 + pac-proxy-agent: registry.npmmirror.com/pac-proxy-agent@7.0.1 + proxy-from-env: registry.npmmirror.com/proxy-from-env@1.1.0 + socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 transitivePeerDependencies: - supports-color dev: true - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + registry.npmmirror.com/proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, tarball: https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz} + name: proxy-from-env + version: 1.1.0 dev: true - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + registry.npmmirror.com/psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, tarball: https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz} + name: psl + version: 1.9.0 dev: true - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + registry.npmmirror.com/pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, tarball: https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz} + name: pump + version: 3.0.0 dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 + end-of-stream: registry.npmmirror.com/end-of-stream@1.4.4 + once: registry.npmmirror.com/once@1.4.0 dev: true - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + registry.npmmirror.com/punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, tarball: https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz} + name: punycode + version: 2.3.1 engines: {node: '>=6'} dev: true - /puppeteer-core@20.9.0(typescript@5.1.6): - resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==} + registry.npmmirror.com/puppeteer-core@20.9.0(typescript@5.1.6): + resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==, tarball: https://registry.npmmirror.com/puppeteer-core/-/puppeteer-core-20.9.0.tgz} + id: registry.npmmirror.com/puppeteer-core/20.9.0 + name: puppeteer-core + version: 20.9.0 engines: {node: '>=16.3.0'} peerDependencies: typescript: '>= 4.7.4' @@ -5057,13 +6904,13 @@ packages: typescript: optional: true dependencies: - '@puppeteer/browsers': 1.4.6(typescript@5.1.6) - chromium-bidi: 0.4.16(devtools-protocol@0.0.1147663) - cross-fetch: 4.0.0 - debug: 4.3.4(supports-color@8.1.1) - devtools-protocol: 0.0.1147663 + '@puppeteer/browsers': registry.npmmirror.com/@puppeteer/browsers@1.4.6(typescript@5.1.6) + chromium-bidi: registry.npmmirror.com/chromium-bidi@0.4.16(devtools-protocol@0.0.1147663) + cross-fetch: registry.npmmirror.com/cross-fetch@4.0.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1147663 typescript: 5.1.6 - ws: 8.13.0 + ws: registry.npmmirror.com/ws@8.13.0 transitivePeerDependencies: - bufferutil - encoding @@ -5071,588 +6918,795 @@ packages: - utf-8-validate dev: true - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + registry.npmmirror.com/pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==, tarball: https://registry.npmmirror.com/pure-rand/-/pure-rand-6.0.4.tgz} + name: pure-rand + version: 6.0.4 dev: true - /query-selector-shadow-dom@1.0.1: - resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} + registry.npmmirror.com/query-selector-shadow-dom@1.0.1: + resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==, tarball: https://registry.npmmirror.com/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz} + name: query-selector-shadow-dom + version: 1.0.1 dev: true - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + registry.npmmirror.com/querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, tarball: https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz} + name: querystringify + version: 2.2.0 dev: true - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + registry.npmmirror.com/queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, tarball: https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz} + name: queue-microtask + version: 1.2.3 dev: true - /queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + registry.npmmirror.com/queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==, tarball: https://registry.npmmirror.com/queue-tick/-/queue-tick-1.0.1.tgz} + name: queue-tick + version: 1.0.1 dev: true - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + registry.npmmirror.com/quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, tarball: https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz} + name: quick-lru + version: 5.1.1 engines: {node: '>=10'} dev: true - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + registry.npmmirror.com/randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, tarball: https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz} + name: randombytes + version: 2.1.0 dependencies: - safe-buffer: 5.2.1 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + registry.npmmirror.com/react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, tarball: https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz} + name: react-is + version: 18.2.0 dev: true - /read-pkg-up@10.1.0: - resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} + registry.npmmirror.com/read-pkg-up@10.1.0: + resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==, tarball: https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-10.1.0.tgz} + name: read-pkg-up + version: 10.1.0 engines: {node: '>=16'} dependencies: - find-up: 6.3.0 - read-pkg: 8.1.0 - type-fest: 4.9.0 + find-up: registry.npmmirror.com/find-up@6.3.0 + read-pkg: registry.npmmirror.com/read-pkg@8.1.0 + type-fest: registry.npmmirror.com/type-fest@4.7.1 dev: true - /read-pkg@8.1.0: - resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} + registry.npmmirror.com/read-pkg@8.1.0: + resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==, tarball: https://registry.npmmirror.com/read-pkg/-/read-pkg-8.1.0.tgz} + name: read-pkg + version: 8.1.0 engines: {node: '>=16'} dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.0 - parse-json: 7.1.1 - type-fest: 4.9.0 + '@types/normalize-package-data': registry.npmmirror.com/@types/normalize-package-data@2.4.4 + normalize-package-data: registry.npmmirror.com/normalize-package-data@6.0.0 + parse-json: registry.npmmirror.com/parse-json@7.1.1 + type-fest: registry.npmmirror.com/type-fest@4.7.1 dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + registry.npmmirror.com/readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz} + name: readable-stream + version: 2.3.8 dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 + core-util-is: registry.npmmirror.com/core-util-is@1.0.3 + inherits: registry.npmmirror.com/inherits@2.0.4 + isarray: registry.npmmirror.com/isarray@1.0.0 + process-nextick-args: registry.npmmirror.com/process-nextick-args@2.0.1 + safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 + string_decoder: registry.npmmirror.com/string_decoder@1.1.1 + util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + registry.npmmirror.com/readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz} + name: readable-stream + version: 3.6.2 engines: {node: '>= 6'} dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 + inherits: registry.npmmirror.com/inherits@2.0.4 + string_decoder: registry.npmmirror.com/string_decoder@1.3.0 + util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 dev: true - /readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + registry.npmmirror.com/readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==, tarball: https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz} + name: readdir-glob + version: 1.1.3 dependencies: - minimatch: 5.1.6 + minimatch: registry.npmmirror.com/minimatch@5.1.6 dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + registry.npmmirror.com/readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, tarball: https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz} + name: readdirp + version: 3.6.0 engines: {node: '>=8.10.0'} dependencies: - picomatch: 2.3.1 + picomatch: registry.npmmirror.com/picomatch@2.3.1 dev: true - /recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + registry.npmmirror.com/recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==, tarball: https://registry.npmmirror.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz} + name: recursive-readdir + version: 2.2.3 engines: {node: '>=6.0.0'} dependencies: - minimatch: 3.1.2 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + dev: true + + registry.npmmirror.com/regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==, tarball: https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz} + name: regexp.prototype.flags + version: 1.5.0 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + define-properties: registry.npmmirror.com/define-properties@1.2.1 + functions-have-names: registry.npmmirror.com/functions-have-names@1.2.3 dev: true - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + registry.npmmirror.com/require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, tarball: https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz} + name: require-directory + version: 2.1.1 engines: {node: '>=0.10.0'} dev: true - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + registry.npmmirror.com/requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, tarball: https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz} + name: requires-port + version: 1.0.0 dev: true - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + registry.npmmirror.com/resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, tarball: https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz} + name: resolve-alpn + version: 1.2.1 dev: true - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + registry.npmmirror.com/resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, tarball: https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz} + name: resolve-cwd + version: 3.0.0 engines: {node: '>=8'} dependencies: - resolve-from: 5.0.0 + resolve-from: registry.npmmirror.com/resolve-from@5.0.0 dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + registry.npmmirror.com/resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz} + name: resolve-from + version: 4.0.0 engines: {node: '>=4'} dev: true - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + registry.npmmirror.com/resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz} + name: resolve-from + version: 5.0.0 engines: {node: '>=8'} dev: true - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + registry.npmmirror.com/resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==, tarball: https://registry.npmmirror.com/resolve.exports/-/resolve.exports-2.0.2.tgz} + name: resolve.exports + version: 2.0.2 engines: {node: '>=10'} dev: true - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + registry.npmmirror.com/resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, tarball: https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz} + name: resolve + version: 1.22.8 hasBin: true dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + is-core-module: registry.npmmirror.com/is-core-module@2.13.1 + path-parse: registry.npmmirror.com/path-parse@1.0.7 + supports-preserve-symlinks-flag: registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0 dev: true - /responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + registry.npmmirror.com/responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==, tarball: https://registry.npmmirror.com/responselike/-/responselike-3.0.0.tgz} + name: responselike + version: 3.0.0 engines: {node: '>=14.16'} dependencies: - lowercase-keys: 3.0.0 + lowercase-keys: registry.npmmirror.com/lowercase-keys@3.0.0 dev: true - /resq@1.11.0: - resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==} + registry.npmmirror.com/resq@1.11.0: + resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==, tarball: https://registry.npmmirror.com/resq/-/resq-1.11.0.tgz} + name: resq + version: 1.11.0 dependencies: - fast-deep-equal: 2.0.1 + fast-deep-equal: registry.npmmirror.com/fast-deep-equal@2.0.1 dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + registry.npmmirror.com/restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, tarball: https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz} + name: restore-cursor + version: 3.1.0 engines: {node: '>=8'} dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 + onetime: registry.npmmirror.com/onetime@5.1.2 + signal-exit: registry.npmmirror.com/signal-exit@3.0.7 dev: true - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + registry.npmmirror.com/reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, tarball: https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz} + name: reusify + version: 1.0.4 engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rgb2hex@0.2.5: - resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} + registry.npmmirror.com/rgb2hex@0.2.5: + resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==, tarball: https://registry.npmmirror.com/rgb2hex/-/rgb2hex-0.2.5.tgz} + name: rgb2hex + version: 0.2.5 dev: true - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + registry.npmmirror.com/rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, tarball: https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz} + name: rimraf + version: 2.7.1 hasBin: true dependencies: - glob: 7.2.3 + glob: registry.npmmirror.com/glob@7.2.3 dev: true - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + registry.npmmirror.com/rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, tarball: https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz} + name: rimraf + version: 3.0.2 hasBin: true dependencies: - glob: 7.2.3 + glob: registry.npmmirror.com/glob@7.2.3 dev: true - /run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + registry.npmmirror.com/run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==, tarball: https://registry.npmmirror.com/run-async/-/run-async-3.0.0.tgz} + name: run-async + version: 3.0.0 engines: {node: '>=0.12.0'} dev: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + registry.npmmirror.com/run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, tarball: https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz} + name: run-parallel + version: 1.2.0 dependencies: - queue-microtask: 1.2.3 + queue-microtask: registry.npmmirror.com/queue-microtask@1.2.3 dev: true - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + registry.npmmirror.com/rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, tarball: https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz} + name: rxjs + version: 7.8.1 dependencies: - tslib: 2.6.1 + tslib: registry.npmmirror.com/tslib@2.6.1 dev: true - /safaridriver@0.1.1: - resolution: {integrity: sha512-dpCmh2EYKh9G61nR+ve0w2+WW2YJX59Rtke0pUoUXbvGKPDLK+NcL7I3VBS1UcGJbA6ptQTT82JcGwJHALD0kQ==} + registry.npmmirror.com/safaridriver@0.1.0: + resolution: {integrity: sha512-azzzIP3gR1TB9bVPv7QO4Zjw0rR1BWEU/s2aFdUMN48gxDjxEB13grAEuXDmkKPgE74cObymDxmAmZnL3clj4w==, tarball: https://registry.npmmirror.com/safaridriver/-/safaridriver-0.1.0.tgz} + name: safaridriver + version: 0.1.0 dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + registry.npmmirror.com/safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz} + name: safe-buffer + version: 5.1.2 dev: true - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + registry.npmmirror.com/safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz} + name: safe-buffer + version: 5.2.1 dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + registry.npmmirror.com/safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, tarball: https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz} + name: safer-buffer + version: 2.1.2 dev: true - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + registry.npmmirror.com/saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, tarball: https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz} + name: saxes + version: 6.0.0 engines: {node: '>=v12.22.7'} dependencies: - xmlchars: 2.2.0 + xmlchars: registry.npmmirror.com/xmlchars@2.2.0 dev: true - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + registry.npmmirror.com/semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, tarball: https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz} + name: semver + version: 6.3.1 hasBin: true dev: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + registry.npmmirror.com/semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, tarball: https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz} + name: semver + version: 7.5.4 engines: {node: '>=10'} hasBin: true dependencies: - lru-cache: 6.0.0 + lru-cache: registry.npmmirror.com/lru-cache@6.0.0 dev: true - /serialize-error@11.0.3: - resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} + registry.npmmirror.com/serialize-error@11.0.3: + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==, tarball: https://registry.npmmirror.com/serialize-error/-/serialize-error-11.0.3.tgz} + name: serialize-error + version: 11.0.3 engines: {node: '>=14.16'} dependencies: - type-fest: 2.19.0 + type-fest: registry.npmmirror.com/type-fest@2.19.0 dev: true - /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + registry.npmmirror.com/serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==, tarball: https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz} + name: serialize-javascript + version: 6.0.0 dependencies: - randombytes: 2.1.0 + randombytes: registry.npmmirror.com/randombytes@2.1.0 dev: true - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + registry.npmmirror.com/set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==, tarball: https://registry.npmmirror.com/set-function-length/-/set-function-length-1.1.1.tgz} + name: set-function-length + version: 1.1.1 engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 + define-data-property: registry.npmmirror.com/define-data-property@1.1.1 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 dev: true - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + registry.npmmirror.com/setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, tarball: https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz} + name: setimmediate + version: 1.0.5 dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + registry.npmmirror.com/shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, tarball: https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz} + name: shebang-command + version: 2.0.0 engines: {node: '>=8'} dependencies: - shebang-regex: 3.0.0 + shebang-regex: registry.npmmirror.com/shebang-regex@3.0.0 dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + registry.npmmirror.com/shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, tarball: https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz} + name: shebang-regex + version: 3.0.0 engines: {node: '>=8'} dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + registry.npmmirror.com/side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, tarball: https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz} + name: side-channel + version: 1.0.4 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + object-inspect: registry.npmmirror.com/object-inspect@1.13.1 dev: true - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + registry.npmmirror.com/signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz} + name: signal-exit + version: 3.0.7 dev: true - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + registry.npmmirror.com/signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz} + name: signal-exit + version: 4.1.0 engines: {node: '>=14'} dev: true - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + registry.npmmirror.com/sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, tarball: https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz} + name: sisteransi + version: 1.0.5 dev: true - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + registry.npmmirror.com/slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, tarball: https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz} + name: slash + version: 3.0.0 engines: {node: '>=8'} dev: true - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + registry.npmmirror.com/smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, tarball: https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz} + name: smart-buffer + version: 4.2.0 engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} dev: true - /socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + registry.npmmirror.com/socks-proxy-agent@8.0.2: + resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==, tarball: https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz} + name: socks-proxy-agent + version: 8.0.2 engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.7.1 + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + socks: registry.npmmirror.com/socks@2.7.1 transitivePeerDependencies: - supports-color dev: true - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + registry.npmmirror.com/socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==, tarball: https://registry.npmmirror.com/socks/-/socks-2.7.1.tgz} + name: socks + version: 2.7.1 engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} dependencies: - ip: 2.0.0 - smart-buffer: 4.2.0 + ip: registry.npmmirror.com/ip@2.0.0 + smart-buffer: registry.npmmirror.com/smart-buffer@4.2.0 dev: true - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + registry.npmmirror.com/source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, tarball: https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz} + name: source-map-support + version: 0.5.13 dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 + buffer-from: registry.npmmirror.com/buffer-from@1.1.2 + source-map: registry.npmmirror.com/source-map@0.6.1 dev: true - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + registry.npmmirror.com/source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz} + name: source-map + version: 0.6.1 engines: {node: '>=0.10.0'} dev: true - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + registry.npmmirror.com/spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, tarball: https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz} + name: spdx-correct + version: 3.2.0 dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 + spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 + spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.16 dev: true - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + registry.npmmirror.com/spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, tarball: https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz} + name: spdx-exceptions + version: 2.3.0 dev: true - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + registry.npmmirror.com/spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, tarball: https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz} + name: spdx-expression-parse + version: 3.0.1 dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 + spdx-exceptions: registry.npmmirror.com/spdx-exceptions@2.3.0 + spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.16 dev: true - /spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + registry.npmmirror.com/spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==, tarball: https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz} + name: spdx-license-ids + version: 3.0.16 dev: true - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + registry.npmmirror.com/split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, tarball: https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz} + name: split2 + version: 4.2.0 engines: {node: '>= 10.x'} dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + registry.npmmirror.com/sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, tarball: https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz} + name: sprintf-js + version: 1.0.3 dev: true - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + registry.npmmirror.com/stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, tarball: https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz} + name: stack-utils + version: 2.0.6 engines: {node: '>=10'} dependencies: - escape-string-regexp: 2.0.0 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@2.0.0 + dev: true + + registry.npmmirror.com/stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==, tarball: https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz} + name: stop-iteration-iterator + version: 1.0.0 + engines: {node: '>= 0.4'} + dependencies: + internal-slot: registry.npmmirror.com/internal-slot@1.0.5 dev: true - /stream-buffers@3.0.2: - resolution: {integrity: sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==} + registry.npmmirror.com/stream-buffers@3.0.2: + resolution: {integrity: sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==, tarball: https://registry.npmmirror.com/stream-buffers/-/stream-buffers-3.0.2.tgz} + name: stream-buffers + version: 3.0.2 engines: {node: '>= 0.10.0'} dev: true - /streamx@2.15.6: - resolution: {integrity: sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==} + registry.npmmirror.com/streamx@2.15.4: + resolution: {integrity: sha512-uSXKl88bibiUCQ1eMpItRljCzDENcDx18rsfDmV79r0e/ThfrAwxG4Y2FarQZ2G4/21xcOKmFFd1Hue+ZIDwHw==, tarball: https://registry.npmmirror.com/streamx/-/streamx-2.15.4.tgz} + name: streamx + version: 2.15.4 dependencies: - fast-fifo: 1.3.2 - queue-tick: 1.0.1 + fast-fifo: registry.npmmirror.com/fast-fifo@1.3.2 + queue-tick: registry.npmmirror.com/queue-tick@1.0.1 dev: true - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + registry.npmmirror.com/string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, tarball: https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz} + name: string-length + version: 4.0.2 engines: {node: '>=10'} dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 + char-regex: registry.npmmirror.com/char-regex@1.0.2 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + registry.npmmirror.com/string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, tarball: https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz} + name: string-width + version: 4.2.3 engines: {node: '>=8'} dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 + emoji-regex: registry.npmmirror.com/emoji-regex@8.0.0 + is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point@3.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + registry.npmmirror.com/string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, tarball: https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz} + name: string-width + version: 5.1.2 engines: {node: '>=12'} dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + eastasianwidth: registry.npmmirror.com/eastasianwidth@0.2.0 + emoji-regex: registry.npmmirror.com/emoji-regex@9.2.2 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + registry.npmmirror.com/string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz} + name: string_decoder + version: 1.1.1 dependencies: - safe-buffer: 5.1.2 + safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + registry.npmmirror.com/string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz} + name: string_decoder + version: 1.3.0 dependencies: - safe-buffer: 5.2.1 + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + registry.npmmirror.com/strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz} + name: strip-ansi + version: 6.0.1 engines: {node: '>=8'} dependencies: - ansi-regex: 5.0.1 + ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 dev: true - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + registry.npmmirror.com/strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz} + name: strip-ansi + version: 7.1.0 engines: {node: '>=12'} dependencies: - ansi-regex: 6.0.1 + ansi-regex: registry.npmmirror.com/ansi-regex@6.0.1 dev: true - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + registry.npmmirror.com/strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, tarball: https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz} + name: strip-bom + version: 4.0.0 engines: {node: '>=8'} dev: true - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + registry.npmmirror.com/strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, tarball: https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz} + name: strip-final-newline + version: 2.0.0 engines: {node: '>=6'} dev: true - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + registry.npmmirror.com/strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, tarball: https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz} + name: strip-final-newline + version: 3.0.0 engines: {node: '>=12'} dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + registry.npmmirror.com/strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, tarball: https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz} + name: strip-json-comments + version: 3.1.1 engines: {node: '>=8'} dev: true - /style-mod@4.1.0: - resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==} + registry.npmmirror.com/style-mod@4.1.0: + resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==, tarball: https://registry.npmmirror.com/style-mod/-/style-mod-4.1.0.tgz} + name: style-mod + version: 4.1.0 dev: true - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + registry.npmmirror.com/supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz} + name: supports-color + version: 5.5.0 engines: {node: '>=4'} dependencies: - has-flag: 3.0.0 + has-flag: registry.npmmirror.com/has-flag@3.0.0 dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + registry.npmmirror.com/supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz} + name: supports-color + version: 7.2.0 engines: {node: '>=8'} dependencies: - has-flag: 4.0.0 + has-flag: registry.npmmirror.com/has-flag@4.0.0 dev: true - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + registry.npmmirror.com/supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz} + name: supports-color + version: 8.1.1 engines: {node: '>=10'} dependencies: - has-flag: 4.0.0 + has-flag: registry.npmmirror.com/has-flag@4.0.0 dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, tarball: https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz} + name: supports-preserve-symlinks-flag + version: 1.0.0 engines: {node: '>= 0.4'} dev: true - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true - - /tar-fs@3.0.4: - resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} - dependencies: - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 3.1.6 + registry.npmmirror.com/symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, tarball: https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz} + name: symbol-tree + version: 3.2.4 dev: true - /tar-stream@3.1.6: - resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + registry.npmmirror.com/tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==, tarball: https://registry.npmmirror.com/tar-fs/-/tar-fs-3.0.4.tgz} + name: tar-fs + version: 3.0.4 dependencies: - b4a: 1.6.4 - fast-fifo: 1.3.2 - streamx: 2.15.6 + mkdirp-classic: registry.npmmirror.com/mkdirp-classic@0.5.3 + pump: registry.npmmirror.com/pump@3.0.0 + tar-stream: registry.npmmirror.com/tar-stream@3.1.6 dev: true - /tcp-port-used@1.0.2: - resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} + registry.npmmirror.com/tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==, tarball: https://registry.npmmirror.com/tar-stream/-/tar-stream-3.1.6.tgz} + name: tar-stream + version: 3.1.6 dependencies: - debug: 4.3.1 - is2: 2.0.9 - transitivePeerDependencies: - - supports-color + b4a: registry.npmmirror.com/b4a@1.6.4 + fast-fifo: registry.npmmirror.com/fast-fifo@1.3.2 + streamx: registry.npmmirror.com/streamx@2.15.4 dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + registry.npmmirror.com/test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, tarball: https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz} + name: test-exclude + version: 6.0.0 engines: {node: '>=8'} dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 + '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 + glob: registry.npmmirror.com/glob@7.2.3 + minimatch: registry.npmmirror.com/minimatch@3.1.2 dev: true - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + registry.npmmirror.com/text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, tarball: https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz} + name: text-table + version: 0.2.0 dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + registry.npmmirror.com/through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, tarball: https://registry.npmmirror.com/through/-/through-2.3.8.tgz} + name: through + version: 2.3.8 dev: true - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + registry.npmmirror.com/tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, tarball: https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz} + name: tmp + version: 0.0.33 engines: {node: '>=0.6.0'} dependencies: - os-tmpdir: 1.0.2 + os-tmpdir: registry.npmmirror.com/os-tmpdir@1.0.2 dev: true - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + registry.npmmirror.com/tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, tarball: https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz} + name: tmpl + version: 1.0.5 dev: true - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + registry.npmmirror.com/to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, tarball: https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz} + name: to-fast-properties + version: 2.0.0 engines: {node: '>=4'} dev: true - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + registry.npmmirror.com/to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, tarball: https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz} + name: to-regex-range + version: 5.0.1 engines: {node: '>=8.0'} dependencies: - is-number: 7.0.0 + is-number: registry.npmmirror.com/is-number@7.0.0 dev: true - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + registry.npmmirror.com/tough-cookie@4.1.2: + resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==, tarball: https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.2.tgz} + name: tough-cookie + version: 4.1.2 engines: {node: '>=6'} dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 + psl: registry.npmmirror.com/psl@1.9.0 + punycode: registry.npmmirror.com/punycode@2.3.1 + universalify: registry.npmmirror.com/universalify@0.2.0 + url-parse: registry.npmmirror.com/url-parse@1.5.10 dev: true - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + registry.npmmirror.com/tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, tarball: https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz} + name: tr46 + version: 0.0.3 dev: true - /tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + registry.npmmirror.com/tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==, tarball: https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz} + name: tr46 + version: 3.0.0 engines: {node: '>=12'} dependencies: - punycode: 2.3.1 + punycode: registry.npmmirror.com/punycode@2.3.1 dev: true - /traverse@0.3.9: - resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} + registry.npmmirror.com/traverse@0.3.9: + resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==, tarball: https://registry.npmmirror.com/traverse/-/traverse-0.3.9.tgz} + name: traverse + version: 0.3.9 dev: true - /ts-api-utils@1.0.3(typescript@5.1.6): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, tarball: https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz} + id: registry.npmmirror.com/ts-api-utils/1.0.3 + name: ts-api-utils + version: 1.0.3 engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' @@ -5660,280 +7714,270 @@ packages: typescript: 5.1.6 dev: true - /ts-jest@29.1.1(@babel/core@7.23.7)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.23.7 - bs-logger: 0.2.6 - esbuild: 0.19.11 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.10.6) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.1.6 - yargs-parser: 21.1.1 - dev: true - - /tslib@2.6.1: - resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + registry.npmmirror.com/tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==, tarball: https://registry.npmmirror.com/tslib/-/tslib-2.6.1.tgz} + name: tslib + version: 2.6.1 dev: true - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + registry.npmmirror.com/type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, tarball: https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz} + name: type-check + version: 0.4.0 engines: {node: '>= 0.8.0'} dependencies: - prelude-ls: 1.2.1 + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + registry.npmmirror.com/type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, tarball: https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz} + name: type-detect + version: 4.0.8 engines: {node: '>=4'} dev: true - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + registry.npmmirror.com/type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz} + name: type-fest + version: 0.20.2 engines: {node: '>=10'} dev: true - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + registry.npmmirror.com/type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz} + name: type-fest + version: 0.21.3 engines: {node: '>=10'} dev: true - /type-fest@2.13.0: - resolution: {integrity: sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==} + registry.npmmirror.com/type-fest@2.13.0: + resolution: {integrity: sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-2.13.0.tgz} + name: type-fest + version: 2.13.0 engines: {node: '>=12.20'} dev: true - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + registry.npmmirror.com/type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz} + name: type-fest + version: 2.19.0 engines: {node: '>=12.20'} dev: true - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + registry.npmmirror.com/type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-3.13.1.tgz} + name: type-fest + version: 3.13.1 engines: {node: '>=14.16'} dev: true - /type-fest@4.9.0: - resolution: {integrity: sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==} + registry.npmmirror.com/type-fest@4.7.1: + resolution: {integrity: sha512-iWr8RUmzAJRfhZugX9O7nZE6pCxDU8CZ3QxsLuTnGcBLJpCaP2ll3s4eMTBoFnU/CeXY/5rfQSuAEsTGJO4y8A==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-4.7.1.tgz} + name: type-fest + version: 4.7.1 engines: {node: '>=16'} dev: true - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + registry.npmmirror.com/uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, tarball: https://registry.npmmirror.com/uglify-js/-/uglify-js-3.17.4.tgz} + name: uglify-js + version: 3.17.4 engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true dev: true optional: true - /unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + registry.npmmirror.com/unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==, tarball: https://registry.npmmirror.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz} + name: unbzip2-stream + version: 1.4.3 dependencies: - buffer: 5.7.1 - through: 2.3.8 + buffer: registry.npmmirror.com/buffer@5.7.1 + through: registry.npmmirror.com/through@2.3.8 dev: true - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + registry.npmmirror.com/undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, tarball: https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz} + name: undici-types + version: 5.26.5 dev: true - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + registry.npmmirror.com/universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, tarball: https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz} + name: universalify + version: 0.1.2 engines: {node: '>= 4.0.0'} dev: true - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + registry.npmmirror.com/universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, tarball: https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz} + name: universalify + version: 0.2.0 engines: {node: '>= 4.0.0'} dev: true - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true - - /unzipper@0.10.14: - resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} - dependencies: - big-integer: 1.6.52 - binary: 0.3.0 - bluebird: 3.4.7 - buffer-indexof-polyfill: 1.0.2 - duplexer2: 0.1.4 - fstream: 1.0.12 - graceful-fs: 4.2.11 - listenercount: 1.0.1 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.22.2): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + registry.npmmirror.com/unzipper@0.10.14: + resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==, tarball: https://registry.npmmirror.com/unzipper/-/unzipper-0.10.14.tgz} + name: unzipper + version: 0.10.14 + dependencies: + big-integer: registry.npmmirror.com/big-integer@1.6.51 + binary: registry.npmmirror.com/binary@0.3.0 + bluebird: registry.npmmirror.com/bluebird@3.4.7 + buffer-indexof-polyfill: registry.npmmirror.com/buffer-indexof-polyfill@1.0.2 + duplexer2: registry.npmmirror.com/duplexer2@0.1.4 + fstream: registry.npmmirror.com/fstream@1.0.12 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + listenercount: registry.npmmirror.com/listenercount@1.0.1 + readable-stream: registry.npmmirror.com/readable-stream@2.3.8 + setimmediate: registry.npmmirror.com/setimmediate@1.0.5 + dev: true + + registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, tarball: https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz} + id: registry.npmmirror.com/update-browserslist-db/1.0.13 + name: update-browserslist-db + version: 1.0.13 hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.22.2 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: registry.npmmirror.com/browserslist@4.22.1 + escalade: registry.npmmirror.com/escalade@3.1.1 + picocolors: registry.npmmirror.com/picocolors@1.0.0 dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + registry.npmmirror.com/uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, tarball: https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz} + name: uri-js + version: 4.4.1 dependencies: - punycode: 2.3.1 + punycode: registry.npmmirror.com/punycode@2.3.1 dev: true - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + registry.npmmirror.com/url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, tarball: https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz} + name: url-parse + version: 1.5.10 dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 + querystringify: registry.npmmirror.com/querystringify@2.2.0 + requires-port: registry.npmmirror.com/requires-port@1.0.0 dev: true - /userhome@1.0.0: - resolution: {integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==} + registry.npmmirror.com/userhome@1.0.0: + resolution: {integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==, tarball: https://registry.npmmirror.com/userhome/-/userhome-1.0.0.tgz} + name: userhome + version: 1.0.0 engines: {node: '>= 0.8.0'} dev: true - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + registry.npmmirror.com/util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, tarball: https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz} + name: util-deprecate + version: 1.0.2 dev: true - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + registry.npmmirror.com/v8-to-istanbul@9.1.3: + resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==, tarball: https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz} + name: v8-to-istanbul + version: 9.1.3 engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.20 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 dev: true - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + registry.npmmirror.com/validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, tarball: https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz} + name: validate-npm-package-license + version: 3.0.4 dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 + spdx-correct: registry.npmmirror.com/spdx-correct@3.2.0 + spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 dev: true - /vhtml@2.2.0: - resolution: {integrity: sha512-TPXrXrxBOslRUVnlVkiAqhoXneiertIg86bdvzionrUYhEuiROvyPZNiiP6GIIJ2Q7oPNVyEtIx8gMAZZE9lCQ==} - dev: true - - /w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + registry.npmmirror.com/w3c-keyname@2.2.6: + resolution: {integrity: sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==, tarball: https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz} + name: w3c-keyname + version: 2.2.6 dev: true - /w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + registry.npmmirror.com/w3c-xmlserializer@4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==, tarball: https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz} + name: w3c-xmlserializer + version: 4.0.0 engines: {node: '>=14'} dependencies: - xml-name-validator: 4.0.0 + xml-name-validator: registry.npmmirror.com/xml-name-validator@4.0.0 dev: true - /wait-port@1.1.0: - resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} + registry.npmmirror.com/wait-port@1.1.0: + resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==, tarball: https://registry.npmmirror.com/wait-port/-/wait-port-1.1.0.tgz} + name: wait-port + version: 1.1.0 engines: {node: '>=10'} hasBin: true dependencies: - chalk: 4.1.2 - commander: 9.5.0 - debug: 4.3.4(supports-color@8.1.1) + chalk: registry.npmmirror.com/chalk@4.1.2 + commander: registry.npmmirror.com/commander@9.5.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + registry.npmmirror.com/walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, tarball: https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz} + name: walker + version: 1.0.8 dependencies: - defaults: 1.0.4 + makeerror: registry.npmmirror.com/makeerror@1.0.12 dev: true - /wdio-chromedriver-service@8.1.1(webdriverio@8.27.0): - resolution: {integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==} - engines: {node: ^16.13 || >=18} - peerDependencies: - '@wdio/types': ^7.0.0 || ^8.0.0-alpha.219 - chromedriver: '*' - webdriverio: ^7.0.0 || ^8.0.0-alpha.219 - peerDependenciesMeta: - '@wdio/types': - optional: true - chromedriver: - optional: true + registry.npmmirror.com/wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, tarball: https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz} + name: wcwidth + version: 1.0.1 dependencies: - '@wdio/logger': 8.24.12 - fs-extra: 11.2.0 - split2: 4.2.0 - tcp-port-used: 1.0.2 - webdriverio: 8.27.0(typescript@5.1.6) - transitivePeerDependencies: - - supports-color + defaults: registry.npmmirror.com/defaults@1.0.4 dev: true - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + registry.npmmirror.com/web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, tarball: https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz} + name: web-streams-polyfill + version: 3.2.1 engines: {node: '>= 8'} dev: true - /webdriver@8.27.0: - resolution: {integrity: sha512-n1IA+rR3u84XxU9swiKUM06BkEC0GDimfZkBML57cny+utQOUbdM/mBpqCUnkWX/RBz/p2EfHdKNyOs3/REaog==} + registry.npmmirror.com/webdriver@8.27.2: + resolution: {integrity: sha512-vY2Lr0ZNr83n0v8PjLCXtJwR9E7QGycJVS+ev2G72gI54/rFwLv58HMSbJNn8CtE27VkhtewMUPlDpSkj5wGPQ==, tarball: https://registry.npmmirror.com/webdriver/-/webdriver-8.27.2.tgz} + name: webdriver + version: 8.27.2 engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.10.6 - '@types/ws': 8.5.10 - '@wdio/config': 8.27.0 - '@wdio/logger': 8.24.12 - '@wdio/protocols': 8.24.12 - '@wdio/types': 8.27.0 - '@wdio/utils': 8.27.0 - deepmerge-ts: 5.1.0 - got: 12.6.1 - ky: 0.33.3 - ws: 8.16.0 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@types/ws': registry.npmmirror.com/@types/ws@8.5.9 + '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/protocols': registry.npmmirror.com/@wdio/protocols@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + got: registry.npmmirror.com/got@12.6.1 + ky: registry.npmmirror.com/ky@0.33.3 + ws: registry.npmmirror.com/ws@8.14.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /webdriverio@8.27.0(typescript@5.1.6): - resolution: {integrity: sha512-Qh5VCiBjEmxnmXcL1QEFoDzFqTtaWKrXriuU5G0yHKCModGAt2G7IHTkAok3CpmkVJfZpEvY630aP1MvgDtFhw==} + registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6): + resolution: {integrity: sha512-X6PhKE8e8XsB33Q/KSS1zYKP2Rqkq2Nef0YKOhQO+5OTlTkeqMCjnEtyRcfmdtfAwT0DEFqMnGnUKEbTajFC4Q==, tarball: https://registry.npmmirror.com/webdriverio/-/webdriverio-8.27.2.tgz} + id: registry.npmmirror.com/webdriverio/8.27.2 + name: webdriverio + version: 8.27.2 engines: {node: ^16.13 || >=18} peerDependencies: devtools: ^8.14.0 @@ -5941,30 +7985,30 @@ packages: devtools: optional: true dependencies: - '@types/node': 20.10.6 - '@wdio/config': 8.27.0 - '@wdio/logger': 8.24.12 - '@wdio/protocols': 8.24.12 - '@wdio/repl': 8.24.12 - '@wdio/types': 8.27.0 - '@wdio/utils': 8.27.0 - archiver: 6.0.1 - aria-query: 5.3.0 - css-shorthand-properties: 1.1.1 - css-value: 0.0.1 - devtools-protocol: 0.0.1237913 - grapheme-splitter: 1.0.4 - import-meta-resolve: 4.0.0 - is-plain-obj: 4.1.0 - lodash.clonedeep: 4.5.0 - lodash.zip: 4.2.0 - minimatch: 9.0.3 - puppeteer-core: 20.9.0(typescript@5.1.6) - query-selector-shadow-dom: 1.0.1 - resq: 1.11.0 - rgb2hex: 0.2.5 - serialize-error: 11.0.3 - webdriver: 8.27.0 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/protocols': registry.npmmirror.com/@wdio/protocols@8.24.12 + '@wdio/repl': registry.npmmirror.com/@wdio/repl@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + archiver: registry.npmmirror.com/archiver@6.0.1 + aria-query: registry.npmmirror.com/aria-query@5.1.3 + css-shorthand-properties: registry.npmmirror.com/css-shorthand-properties@1.1.1 + css-value: registry.npmmirror.com/css-value@0.0.1 + devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1239539 + grapheme-splitter: registry.npmmirror.com/grapheme-splitter@1.0.4 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 + is-plain-obj: registry.npmmirror.com/is-plain-obj@4.1.0 + lodash.clonedeep: registry.npmmirror.com/lodash.clonedeep@4.5.0 + lodash.zip: registry.npmmirror.com/lodash.zip@4.2.0 + minimatch: registry.npmmirror.com/minimatch@9.0.3 + puppeteer-core: registry.npmmirror.com/puppeteer-core@20.9.0(typescript@5.1.6) + query-selector-shadow-dom: registry.npmmirror.com/query-selector-shadow-dom@1.0.1 + resq: registry.npmmirror.com/resq@1.11.0 + rgb2hex: registry.npmmirror.com/rgb2hex@0.2.5 + serialize-error: registry.npmmirror.com/serialize-error@11.0.3 + webdriver: registry.npmmirror.com/webdriver@8.27.2 transitivePeerDependencies: - bufferutil - encoding @@ -5973,107 +8017,169 @@ packages: - utf-8-validate dev: true - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + registry.npmmirror.com/webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz} + name: webidl-conversions + version: 3.0.1 dev: true - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + registry.npmmirror.com/webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz} + name: webidl-conversions + version: 7.0.0 engines: {node: '>=12'} dev: true - /whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + registry.npmmirror.com/whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==, tarball: https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz} + name: whatwg-encoding + version: 2.0.0 engines: {node: '>=12'} dependencies: - iconv-lite: 0.6.3 + iconv-lite: registry.npmmirror.com/iconv-lite@0.6.3 dev: true - /whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + registry.npmmirror.com/whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, tarball: https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz} + name: whatwg-mimetype + version: 3.0.0 engines: {node: '>=12'} dev: true - /whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + registry.npmmirror.com/whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz} + name: whatwg-url + version: 11.0.0 engines: {node: '>=12'} dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 + tr46: registry.npmmirror.com/tr46@3.0.0 + webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 dev: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + registry.npmmirror.com/whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz} + name: whatwg-url + version: 5.0.0 dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 + tr46: registry.npmmirror.com/tr46@0.0.3 + webidl-conversions: registry.npmmirror.com/webidl-conversions@3.0.1 + dev: true + + registry.npmmirror.com/which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, tarball: https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz} + name: which-boxed-primitive + version: 1.0.2 + dependencies: + is-bigint: registry.npmmirror.com/is-bigint@1.0.4 + is-boolean-object: registry.npmmirror.com/is-boolean-object@1.1.2 + is-number-object: registry.npmmirror.com/is-number-object@1.0.7 + is-string: registry.npmmirror.com/is-string@1.0.7 + is-symbol: registry.npmmirror.com/is-symbol@1.0.4 + dev: true + + registry.npmmirror.com/which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==, tarball: https://registry.npmmirror.com/which-collection/-/which-collection-1.0.1.tgz} + name: which-collection + version: 1.0.1 + dependencies: + is-map: registry.npmmirror.com/is-map@2.0.2 + is-set: registry.npmmirror.com/is-set@2.0.2 + is-weakmap: registry.npmmirror.com/is-weakmap@2.0.1 + is-weakset: registry.npmmirror.com/is-weakset@2.0.2 + dev: true + + registry.npmmirror.com/which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==, tarball: https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.13.tgz} + name: which-typed-array + version: 1.1.13 + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 + call-bind: registry.npmmirror.com/call-bind@1.0.5 + for-each: registry.npmmirror.com/for-each@0.3.3 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + registry.npmmirror.com/which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, tarball: https://registry.npmmirror.com/which/-/which-2.0.2.tgz} + name: which + version: 2.0.2 engines: {node: '>= 8'} hasBin: true dependencies: - isexe: 2.0.0 + isexe: registry.npmmirror.com/isexe@2.0.0 dev: true - /which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + registry.npmmirror.com/which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, tarball: https://registry.npmmirror.com/which/-/which-4.0.0.tgz} + name: which + version: 4.0.0 engines: {node: ^16.13.0 || >=18.0.0} hasBin: true dependencies: - isexe: 3.1.1 + isexe: registry.npmmirror.com/isexe@3.1.1 dev: true - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true - - /workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + registry.npmmirror.com/workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==, tarball: https://registry.npmmirror.com/workerpool/-/workerpool-6.2.1.tgz} + name: workerpool + version: 6.2.1 dev: true - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + registry.npmmirror.com/wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz} + name: wrap-ansi + version: 6.2.0 engines: {node: '>=8'} dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 + ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + registry.npmmirror.com/wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz} + name: wrap-ansi + version: 7.0.0 engines: {node: '>=10'} dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 + ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + registry.npmmirror.com/wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz} + name: wrap-ansi + version: 8.1.0 engines: {node: '>=12'} dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 + ansi-styles: registry.npmmirror.com/ansi-styles@6.2.1 + string-width: registry.npmmirror.com/string-width@5.1.2 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + registry.npmmirror.com/wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, tarball: https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz} + name: wrappy + version: 1.0.2 dev: true - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + registry.npmmirror.com/write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, tarball: https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz} + name: write-file-atomic + version: 4.0.2 engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 + imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 + signal-exit: registry.npmmirror.com/signal-exit@3.0.7 dev: true - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + registry.npmmirror.com/ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==, tarball: https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz} + name: ws + version: 8.13.0 engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -6085,8 +8191,10 @@ packages: optional: true dev: true - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + registry.npmmirror.com/ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, tarball: https://registry.npmmirror.com/ws/-/ws-8.14.2.tgz} + name: ws + version: 8.14.2 engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -6098,109 +8206,139 @@ packages: optional: true dev: true - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + registry.npmmirror.com/xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==, tarball: https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz} + name: xml-name-validator + version: 4.0.0 engines: {node: '>=12'} dev: true - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + registry.npmmirror.com/xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, tarball: https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz} + name: xmlchars + version: 2.2.0 dev: true - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + registry.npmmirror.com/y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, tarball: https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz} + name: y18n + version: 5.0.8 engines: {node: '>=10'} dev: true - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + registry.npmmirror.com/yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, tarball: https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz} + name: yallist + version: 3.1.1 dev: true - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + registry.npmmirror.com/yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, tarball: https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz} + name: yallist + version: 4.0.0 dev: true - /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + registry.npmmirror.com/yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz} + name: yargs-parser + version: 20.2.4 engines: {node: '>=10'} dev: true - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + registry.npmmirror.com/yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz} + name: yargs-parser + version: 21.1.1 engines: {node: '>=12'} dev: true - /yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + registry.npmmirror.com/yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==, tarball: https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz} + name: yargs-unparser + version: 2.0.0 engines: {node: '>=10'} dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 + camelcase: registry.npmmirror.com/camelcase@6.3.0 + decamelize: registry.npmmirror.com/decamelize@4.0.0 + flat: registry.npmmirror.com/flat@5.0.2 + is-plain-obj: registry.npmmirror.com/is-plain-obj@2.1.0 dev: true - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + registry.npmmirror.com/yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, tarball: https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz} + name: yargs + version: 16.2.0 engines: {node: '>=10'} dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 + cliui: registry.npmmirror.com/cliui@7.0.4 + escalade: registry.npmmirror.com/escalade@3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 + require-directory: registry.npmmirror.com/require-directory@2.1.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + y18n: registry.npmmirror.com/y18n@5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 dev: true - /yargs@17.7.1: - resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + registry.npmmirror.com/yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==, tarball: https://registry.npmmirror.com/yargs/-/yargs-17.7.1.tgz} + name: yargs + version: 17.7.1 engines: {node: '>=12'} 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.8 - yargs-parser: 21.1.1 + cliui: registry.npmmirror.com/cliui@8.0.1 + escalade: registry.npmmirror.com/escalade@3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 + require-directory: registry.npmmirror.com/require-directory@2.1.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + y18n: registry.npmmirror.com/y18n@5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser@21.1.1 dev: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + registry.npmmirror.com/yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, tarball: https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz} + name: yargs + version: 17.7.2 engines: {node: '>=12'} 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.8 - yargs-parser: 21.1.1 + cliui: registry.npmmirror.com/cliui@8.0.1 + escalade: registry.npmmirror.com/escalade@3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 + require-directory: registry.npmmirror.com/require-directory@2.1.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + y18n: registry.npmmirror.com/y18n@5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser@21.1.1 dev: true - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + registry.npmmirror.com/yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==, tarball: https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz} + name: yauzl + version: 2.10.0 dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 + buffer-crc32: registry.npmmirror.com/buffer-crc32@0.2.13 + fd-slicer: registry.npmmirror.com/fd-slicer@1.1.0 dev: true - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + registry.npmmirror.com/yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz} + name: yocto-queue + version: 0.1.0 engines: {node: '>=10'} dev: true - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + registry.npmmirror.com/yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.0.0.tgz} + name: yocto-queue + version: 1.0.0 engines: {node: '>=12.20'} dev: true - /zip-stream@5.0.1: - resolution: {integrity: sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==} + registry.npmmirror.com/zip-stream@5.0.1: + resolution: {integrity: sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==, tarball: https://registry.npmmirror.com/zip-stream/-/zip-stream-5.0.1.tgz} + name: zip-stream + version: 5.0.1 engines: {node: '>= 12.0.0'} dependencies: - archiver-utils: 4.0.1 - compress-commons: 5.0.1 - readable-stream: 3.6.2 + archiver-utils: registry.npmmirror.com/archiver-utils@4.0.1 + compress-commons: registry.npmmirror.com/compress-commons@5.0.1 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 dev: true diff --git a/src/QuestionType.ts b/src/QuestionType.ts index c6254d91..f2bc7a06 100644 --- a/src/QuestionType.ts +++ b/src/QuestionType.ts @@ -112,7 +112,7 @@ class QuestionType_Cloze implements IQuestionTypeHandler { deletionEnd: number = deletionStart + m[0].length; front = questionText.substring(0, deletionStart) + - QuestionType_ClozeUtil.renderClozeFront() + + QuestionType_ClozeUtil.renderClozeFront(m[0].length) + questionText.substring(deletionEnd); front = QuestionType_ClozeUtil.removeClozeTokens(front, settings); back = diff --git a/src/algorithms/anki.ts b/src/algorithms/anki.ts index 588530d0..f044d74b 100644 --- a/src/algorithms/anki.ts +++ b/src/algorithms/anki.ts @@ -160,8 +160,8 @@ export class AnkiAlgorithm extends SrsAlgorithm { lastitval > newdata.lastInterval ? lastitval : iter > 1 - ? this.settings.graduatingInterval - : newdata.lastInterval; + ? this.settings.graduatingInterval + : newdata.lastInterval; newdata.iteration = iter; item.data = deepcopy(newdata); } diff --git a/src/gui/reviewresponse-modal.tsx b/src/gui/reviewresponse-modal.tsx index c2548403..f597f06a 100644 --- a/src/gui/reviewresponse-modal.tsx +++ b/src/gui/reviewresponse-modal.tsx @@ -273,8 +273,8 @@ export class reviewResponseModal { this.responseInterval == null ? `${text}` : Platform.isMobile - ? textInterval(this.responseInterval[index], true) - : `${text} - ${textInterval(this.responseInterval[index], false)}`; + ? textInterval(this.responseInterval[index], true) + : `${text} - ${textInterval(this.responseInterval[index], false)}`; } return text; } diff --git a/tests/unit/util/utils.test.ts b/tests/unit/util/utils.test.ts index 321469a2..49e0c511 100644 --- a/tests/unit/util/utils.test.ts +++ b/tests/unit/util/utils.test.ts @@ -1,3 +1,4 @@ +import { YAML_FRONT_MATTER_REGEX } from "src/constants"; import { literalStringReplace } from "src/util/utils"; describe("literalStringReplace", () => { From 088b72d3d1716d1f51f26fdaf477f3cc388f6ddd Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 14 Jan 2024 14:08:50 +0800 Subject: [PATCH 093/155] fix merge --- src/lang/helpers.ts | 2 +- tests/unit/NoteEaseList.test.ts | 8 ++++++++ tests/unit/scheduling.test.ts | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/lang/helpers.ts b/src/lang/helpers.ts index 5076117f..02e7b43d 100644 --- a/src/lang/helpers.ts +++ b/src/lang/helpers.ts @@ -83,7 +83,7 @@ export function t(str: keyof typeof en, params?: Record): strin console.error(`SRS error: Locale ${moment.locale()} not found.`); } - const result = (locale && locale[str]) || en[str] || str; + const result = (locale && locale[str]) || en[str]; if (params) { return interpolate(result, params); diff --git a/tests/unit/NoteEaseList.test.ts b/tests/unit/NoteEaseList.test.ts index 4f5c4b81..ac70a99b 100644 --- a/tests/unit/NoteEaseList.test.ts +++ b/tests/unit/NoteEaseList.test.ts @@ -20,3 +20,11 @@ test("getEaseByPath", async () => { list.setEaseForPath("Known path", 100); expect(list.getEaseByPath("Known path")).toEqual(100); }); + +test("setEaseByPath", async () => { + let list: NoteEaseList = new NoteEaseList(DEFAULT_SETTINGS); + + list.setEaseForPath("Known path", 100); + list.setEaseForPath("Known path", 50); + expect(list.getEaseByPath("Known path")).toEqual(75); +}); diff --git a/tests/unit/scheduling.test.ts b/tests/unit/scheduling.test.ts index 36152e3e..ee1e34d3 100644 --- a/tests/unit/scheduling.test.ts +++ b/tests/unit/scheduling.test.ts @@ -134,6 +134,8 @@ test("Test load balancing", () => { }); test("Test textInterval - desktop", () => { + expect(textInterval(0.01, false)).toEqual("14.4minute(s)"); + expect(textInterval(0.5, false)).toEqual("12hour(s)"); expect(textInterval(1, false)).toEqual("1 day(s)"); expect(textInterval(41, false)).toEqual("1.3 month(s)"); expect(textInterval(366, false)).toEqual("1 year(s)"); @@ -141,6 +143,8 @@ test("Test textInterval - desktop", () => { }); test("Test textInterval - mobile", () => { + expect(textInterval(0.01, true)).toEqual("14.4min"); + expect(textInterval(0.5, true)).toEqual("12h"); expect(textInterval(1, true)).toEqual("1d"); expect(textInterval(41, true)).toEqual("1.3m"); expect(textInterval(366, true)).toEqual("1y"); From 29ab434b982615a9a617feb6486b134069002188 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 14 Jan 2024 15:02:47 +0800 Subject: [PATCH 094/155] git action write --- .github/workflows/pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index dd36789c..6a781c8c 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -37,6 +37,7 @@ jobs: needs: validate runs-on: ubuntu-latest # if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'Newdea/obsidian-spaced-repetition-recall' + permissions: write-all steps: - name: Checkout From edae48120339a6fb95bee650c5fba2a6aa4be9cb Mon Sep 17 00:00:00 2001 From: Newdea Date: Sun, 14 Jan 2024 07:04:34 +0000 Subject: [PATCH 095/155] Prettified Code! --- docs/README_ZH.md | 2 +- docs/changelog.md | 18 +- ...77\347\224\250\346\225\231\347\250\213.md" | 30 +- pnpm-lock.yaml | 20001 +++++++++------- src/algorithms/anki.ts | 4 +- src/gui/reviewresponse-modal.tsx | 4 +- 6 files changed, 11721 insertions(+), 8338 deletions(-) diff --git a/docs/README_ZH.md b/docs/README_ZH.md index 895dc328..5c580934 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -44,7 +44,7 @@ github: https://github.com/open-spaced-repetition/obsidian-spaced-repetition-rec 1. 从[最新发布](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/releases/)中下载压缩包(已包括 main.js, manifest.json, styles.css); 2. 在 `Vault-name/.obsidian/plugins` 中,把刚下的文件解压(应是`obsidian-spaced-repetition-recall`文件夹)放入`plugins`文件夹下,; -3. 重启Obsidan 开启插件,就可以使用了。 +3. 重启 Obsidan 开启插件,就可以使用了。 ## Thanks diff --git a/docs/changelog.md b/docs/changelog.md index c675116b..dad24e7b 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -11,12 +11,12 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). ## [1.10.5.5] 元旦快乐~ -- feat: 显示浮栏复习笔记且笔记在**阅读/预览**视图时,可使用数字快捷键(0重来,1,2,3简单) +- feat: 显示浮栏复习笔记且笔记在**阅读/预览**视图时,可使用数字快捷键(0 重来,1,2,3 简单) - close #29, 并删除部分调试代码; - fix #31, 数据位置修改后无法保存设置; -- fix #32, 无复习标签时,即可手动untrack; -- new: #32, 添加设置项,在删除笔记中复习标签时,同步untrack操作(默认false,不同步); -- fix: 在从另一设备同步过来较新的trackedfiles.json数据后,插件还是用旧数据的问题, 需再次打开卡片面板/(点击状态栏/命令行)打开一篇笔记复习,才会用新数据; +- fix #32, 无复习标签时,即可手动 untrack; +- new: #32, 添加设置项,在删除笔记中复习标签时,同步 untrack 操作(默认 false,不同步); +- fix: 在从另一设备同步过来较新的 trackedfiles.json 数据后,插件还是用旧数据的问题, 需再次打开卡片面板/(点击状态栏/命令行)打开一篇笔记复习,才会用新数据; - 优化: 重构、数据结构调整; - @@ -51,8 +51,8 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - 代码重构; - fix #21:review_state 为 0 无法使用 optimizer 的问题; - fix: 数据位置更新失败的问题; -- close #26: [Interval时间的展示](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues/26) -- new: 查看数据item info,(效果不太好,暂时可用而已); +- close #26: [Interval 时间的展示](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues/26) +- new: 查看数据 item info,(效果不太好,暂时可用而已); - update: [使用教程](./%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B.md); ## [1.10.1.11] @@ -75,16 +75,16 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fix #9: View statistics NAN - enchance #10: 点击到卡组标签名对应那行就可以打开卡片 by [@WwwZMing](https://github.com/WwwZMing) -- 其他一些小bugs修复 +- 其他一些小 bugs 修复 ## [1.10.1.7] - 新增:卡片中打开笔记; - 与主分支同步; - 新增:在更新插件后,弹出更新说明; -- 新增:设置中可跳转到issue的链接; +- 新增:设置中可跳转到 issue 的链接; - 新增:打赏码; -- 修复:一些小bugs. +- 修复:一些小 bugs. ## [1.10.1.6] diff --git "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" index c0e6ca5f..8675fe56 100644 --- "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" +++ "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" @@ -1,12 +1,12 @@ ## 教程 -### 快速入手Quick Guide +### 快速入手 Quick Guide -#### CASE1: 没有使用原SR插件,直接使用这个插件 +#### CASE1: 没有使用原 SR 插件,直接使用这个插件 推荐设置 -- 数据位置: in plugin/vault/specified folder (不能保存在笔记中) - 算法: Fsrs(用这个修改版插件应该都是冲这个来的😄️) +- 数据位置: in plugin/vault/specified folder (不能保存在笔记中) - 算法: Fsrs(用这个修改版插件应该都是冲这个来的 😄️) ![image](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/assets/9208450/a22d23df-5d11-4b19-9007-e1530e2808be) 算法对应的具体参数设置,可参考[FSRS v4](https://github.com/open-spaced-repetition/fsrs4anki/wiki/The-Algorithm#fsrs-v4) @@ -18,7 +18,7 @@ 其他,参照[@st3v3nmw's ReadMe](https://github.com/st3v3nmw/obsidian-spaced-repetition#readme) & [recall plugin's ReadMe](https://github.com/martin-jw/obsidian-recall) -#### CASE2: 从原SR插件转入 +#### CASE2: 从原 SR 插件转入 **备份笔记库!!!** **备份笔记库!!!** @@ -28,9 +28,9 @@ 建议: 1. 先关闭原插件,避免冲突。 -2. 备份笔记库(因在设置中修改DataLocation后,会删除笔记内容中的复习信息,另存到 单独文件 tracked_files.json。 ) -3. 关闭Obsidian.md,复制原插件的`obsidian-spaced-repetition/data.json` 到 `obsidian-spaced-repetition-recall/data.json`,再打开Obsidan.md。 -4. 如果是想用FSRS算法,需要按上述CASE1推荐设置。 +2. 备份笔记库(因在设置中修改 DataLocation 后,会删除笔记内容中的复习信息,另存到 单独文件 tracked_files.json。 ) +3. 关闭 Obsidian.md,复制原插件的`obsidian-spaced-repetition/data.json` 到 `obsidian-spaced-repetition-recall/data.json`,再打开 Obsidan.md。 +4. 如果是想用 FSRS 算法,需要按上述 CASE1 推荐设置。 --- @@ -39,7 +39,7 @@ #### 添加笔记 可在笔记中添加复习笔记对应的标签,或通过命令行/菜单栏[tracking notes](https://github.com/martin-jw/obsidian-recall#tracking-notes)。 -通过命令行/菜单栏untrack Note可不再对该笔记复习(需笔记中没有复习标签);通过设置项`untrackWithReviewTag`,可以在删除笔记中复习标签后,就不再对该笔记复习. +通过命令行/菜单栏 untrack Note 可不再对该笔记复习(需笔记中没有复习标签);通过设置项`untrackWithReviewTag`,可以在删除笔记中复习标签后,就不再对该笔记复习. 添加文件夹中的笔记,可在文件夹上右键, (un)track All Notes ![image](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/assets/9208450/163f397c-cc8f-49a6-ab6f-cb929cf91d2d) @@ -59,7 +59,7 @@ 通过命令行,或电脑端点击状态栏/右侧边栏的笔记就可以打开复习笔记。通过命令行、悬浮栏或菜单栏可反馈记忆程度 - 电脑端,在悬浮栏单击右键,可以关闭浮栏、设置 时间间隔显隐; -- 电脑端,在打开浮栏且笔记在**阅读/预览**视图(非编辑视图)时,可使用数字快捷键(0重来,1,2,3简单)反馈记忆程度; +- 电脑端,在打开浮栏且笔记在**阅读/预览**视图(非编辑视图)时,可使用数字快捷键(0 重来,1,2,3 简单)反馈记忆程度; - 移动端,从浮栏向上滑 关闭浮栏,长按浮栏 设置 时间间隔显隐。 - 时间间隔显隐 建议:复习类不显示,渐进总结/增量写作显示; @@ -78,7 +78,7 @@ 通过命令行,`SR Item Info`,可查看当前/所有笔记的复习信息 -#### 算法Algorithms +#### 算法 Algorithms 不同算法参数不同,请尽量使用一个算法,不要反复切换算法。 [默认的 Anki 优化算法](./en/algorithms.md)、[Anki 算法](https://github.com/martin-jw/obsidian-recall#currently-available-algorithms) 、 @@ -90,14 +90,14 @@ 不建议使用!!! **不建议使用!!!** -打开设置Logging-->调试信息,即可在命令行中使用以下功能(**日常使用不建议打开**)。 +打开设置 Logging-->调试信息,即可在命令行中使用以下功能(**日常使用不建议打开**)。 -输出数据项Print Data: 在调试窗口中输出数据 +输出数据项 Print Data: 在调试窗口中输出数据 -重置数据Reset Data:删除所有复习数据; +重置数据 Reset Data:删除所有复习数据; -更新数据项Update Items: 更新数据中的无效数据为默认数据。 +更新数据项 Update Items: 更新数据中的无效数据为默认数据。 -清除无效数据Prune Data: 清除数据中的无效数据,会导致数据项id修改,进而会影响Fsrs的optimizer无法有效处理部分数据。 +清除无效数据 Prune Data: 清除数据中的无效数据,会导致数据项 id 修改,进而会影响 Fsrs 的 optimizer 无法有效处理部分数据。 _其它命令仅开发调试时使用,可不必关注。_ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b400b32..058e4d1a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,8344 +1,11727 @@ -lockfileVersion: '6.0' +lockfileVersion: "6.0" settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - chart.js: - specifier: ^4.4.1 - version: registry.npmmirror.com/chart.js@4.4.1 - pagerank.js: - specifier: ^1.0.2 - version: 1.0.2 + chart.js: + specifier: ^4.4.1 + version: registry.npmmirror.com/chart.js@4.4.1 + pagerank.js: + specifier: ^1.0.2 + version: 1.0.2 devDependencies: - '@popperjs/core': - specifier: ^2.11.8 - version: 2.11.8 - '@types/jest': - specifier: ^29.5.11 - version: registry.npmmirror.com/@types/jest@29.5.11 - '@types/node': - specifier: ^20.10.6 - version: registry.npmmirror.com/@types/node@20.11.0 - '@types/vhtml': - specifier: ^2.2.9 - version: registry.npmmirror.com/@types/vhtml@2.2.9 - '@typescript-eslint/eslint-plugin': - specifier: ^6.16.0 - version: registry.npmmirror.com/@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.1.6) - '@typescript-eslint/parser': - specifier: ^6.16.0 - version: registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6) - '@wdio/cli': - specifier: ^8.27.1 - version: registry.npmmirror.com/@wdio/cli@8.27.2(typescript@5.1.6) - '@wdio/local-runner': - specifier: ^8.27.0 - version: registry.npmmirror.com/@wdio/local-runner@8.27.2(typescript@5.1.6) - '@wdio/mocha-framework': - specifier: ^8.27.0 - version: registry.npmmirror.com/@wdio/mocha-framework@8.27.2 - '@wdio/spec-reporter': - specifier: ^8.27.0 - version: registry.npmmirror.com/@wdio/spec-reporter@8.27.2 - auto-changelog: - specifier: ^2.4.0 - version: 2.4.0 - builtin-modules: - specifier: ^3.3.0 - version: 3.3.0 - chai: - specifier: ^4.3.10 - version: registry.npmmirror.com/chai@4.3.10 - deepcopy: - specifier: ^2.1.0 - version: 2.1.0 - esbuild: - specifier: ~0.19.11 - version: registry.npmmirror.com/esbuild@0.19.11 - eslint: - specifier: ^8.56.0 - version: registry.npmmirror.com/eslint@8.56.0 - fsrs.js: - specifier: 1.1.0 - version: registry.npmmirror.com/fsrs.js@1.1.0 - jest: - specifier: ^29.7.0 - version: registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0) - jest-environment-jsdom: - specifier: ^29.7.0 - version: registry.npmmirror.com/jest-environment-jsdom@29.7.0 - jest-expect-message: - specifier: ^1.1.3 - version: 1.1.3 - moment: - specifier: ^2.30.1 - version: registry.npmmirror.com/moment@2.30.1 - obsidian: - specifier: ^1.4.11 - version: registry.npmmirror.com/obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0) - prettier: - specifier: ^3.1.1 - version: registry.npmmirror.com/prettier@3.2.2 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.23.3)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6) - tslib: - specifier: 2.6.1 - version: 2.6.1 - typescript: - specifier: 5.1.6 - version: 5.1.6 - vhtml: - specifier: ^2.2.0 - version: 2.2.0 - wdio-chromedriver-service: - specifier: ^8.1.1 - version: 8.1.1(webdriverio@8.27.2) + "@popperjs/core": + specifier: ^2.11.8 + version: 2.11.8 + "@types/jest": + specifier: ^29.5.11 + version: registry.npmmirror.com/@types/jest@29.5.11 + "@types/node": + specifier: ^20.10.6 + version: registry.npmmirror.com/@types/node@20.11.0 + "@types/vhtml": + specifier: ^2.2.9 + version: registry.npmmirror.com/@types/vhtml@2.2.9 + "@typescript-eslint/eslint-plugin": + specifier: ^6.16.0 + version: registry.npmmirror.com/@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.1.6) + "@typescript-eslint/parser": + specifier: ^6.16.0 + version: registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6) + "@wdio/cli": + specifier: ^8.27.1 + version: registry.npmmirror.com/@wdio/cli@8.27.2(typescript@5.1.6) + "@wdio/local-runner": + specifier: ^8.27.0 + version: registry.npmmirror.com/@wdio/local-runner@8.27.2(typescript@5.1.6) + "@wdio/mocha-framework": + specifier: ^8.27.0 + version: registry.npmmirror.com/@wdio/mocha-framework@8.27.2 + "@wdio/spec-reporter": + specifier: ^8.27.0 + version: registry.npmmirror.com/@wdio/spec-reporter@8.27.2 + auto-changelog: + specifier: ^2.4.0 + version: 2.4.0 + builtin-modules: + specifier: ^3.3.0 + version: 3.3.0 + chai: + specifier: ^4.3.10 + version: registry.npmmirror.com/chai@4.3.10 + deepcopy: + specifier: ^2.1.0 + version: 2.1.0 + esbuild: + specifier: ~0.19.11 + version: registry.npmmirror.com/esbuild@0.19.11 + eslint: + specifier: ^8.56.0 + version: registry.npmmirror.com/eslint@8.56.0 + fsrs.js: + specifier: 1.1.0 + version: registry.npmmirror.com/fsrs.js@1.1.0 + jest: + specifier: ^29.7.0 + version: registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0) + jest-environment-jsdom: + specifier: ^29.7.0 + version: registry.npmmirror.com/jest-environment-jsdom@29.7.0 + jest-expect-message: + specifier: ^1.1.3 + version: 1.1.3 + moment: + specifier: ^2.30.1 + version: registry.npmmirror.com/moment@2.30.1 + obsidian: + specifier: ^1.4.11 + version: registry.npmmirror.com/obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0) + prettier: + specifier: ^3.1.1 + version: registry.npmmirror.com/prettier@3.2.2 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.23.3)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6) + tslib: + specifier: 2.6.1 + version: 2.6.1 + typescript: + specifier: 5.1.6 + version: 5.1.6 + vhtml: + specifier: ^2.2.0 + version: 2.2.0 + wdio-chromedriver-service: + specifier: ^8.1.1 + version: 8.1.1(webdriverio@8.27.2) packages: - - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - '@types/yargs': 17.0.31 - chalk: registry.npmmirror.com/chalk@4.1.2 - dev: true - - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: true - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true - - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - dependencies: - '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 - dev: true - - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 - dev: true - - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true - - /@types/yargs@17.0.31: - resolution: {integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==} - dependencies: - '@types/yargs-parser': 21.0.3 - dev: true - - /@wdio/logger@8.16.17: - resolution: {integrity: sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==} - engines: {node: ^16.13 || >=18} - dependencies: - chalk: 5.2.0 - loglevel: 1.8.1 - loglevel-plugin-prefix: 0.8.4 - strip-ansi: 7.1.0 - dev: true - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /auto-changelog@2.4.0: - resolution: {integrity: sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==} - engines: {node: '>=8.3'} - hasBin: true - dependencies: - commander: 7.2.0 - handlebars: 4.7.8 - node-fetch: 2.7.0 - parse-github-url: 1.0.2 - semver: 7.5.0 - transitivePeerDependencies: - - encoding - dev: true - - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@5.2.0: - resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: true - - /debug@4.3.1: - resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /deepcopy@2.1.0: - resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: registry.npmmirror.com/uglify-js@3.17.4 - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} - dev: true - - /is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - dev: true - - /is2@2.0.9: - resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} - engines: {node: '>=v0.10.0'} - dependencies: - deep-is: 0.1.4 - ip-regex: 4.3.0 - is-url: 1.2.4 - dev: true - - /jest-expect-message@1.1.3: - resolution: {integrity: sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==} - dev: true - - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - dev: true - - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - - /loglevel-plugin-prefix@0.8.4: - resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} - dev: true - - /loglevel@1.8.1: - resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} - engines: {node: '>= 0.6.0'} - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true - - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /pagerank.js@1.0.2: - resolution: {integrity: sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw==} - dev: false - - /parse-github-url@1.0.2: - resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} - engines: {node: '>=0.10.0'} - hasBin: true - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /semver@7.5.0: - resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: true - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /tcp-port-used@1.0.2: - resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} - dependencies: - debug: 4.3.1 - is2: 2.0.9 - transitivePeerDependencies: - - supports-color - dev: true - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true - - /ts-jest@29.1.1(@babel/core@7.23.3)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': + /@jest/schemas@29.6.3: + resolution: + { + integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@sinclair/typebox": 0.27.8 + dev: true + + /@jest/types@29.6.3: + resolution: + { + integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/schemas": 29.6.3 + "@types/istanbul-lib-coverage": 2.0.6 + "@types/istanbul-reports": 3.0.4 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + "@types/yargs": 17.0.31 + chalk: registry.npmmirror.com/chalk@4.1.2 + dev: true + + /@popperjs/core@2.11.8: + resolution: + { + integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==, + } + dev: true + + /@sinclair/typebox@0.27.8: + resolution: + { + integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, + } + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: + { + integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, + } + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: + { + integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, + } + dependencies: + "@types/istanbul-lib-coverage": registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: + { + integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, + } + dependencies: + "@types/istanbul-lib-report": 3.0.3 + dev: true + + /@types/yargs-parser@21.0.3: + resolution: + { + integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, + } + dev: true + + /@types/yargs@17.0.31: + resolution: + { + integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==, + } + dependencies: + "@types/yargs-parser": 21.0.3 + dev: true + + /@wdio/logger@8.16.17: + resolution: + { + integrity: sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==, + } + engines: { node: ^16.13 || >=18 } + dependencies: + chalk: 5.2.0 + loglevel: 1.8.1 + loglevel-plugin-prefix: 0.8.4 + strip-ansi: 7.1.0 + dev: true + + /ansi-regex@6.0.1: + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: ">=12" } + dev: true + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + dev: true + + /auto-changelog@2.4.0: + resolution: + { + integrity: sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==, + } + engines: { node: ">=8.3" } + hasBin: true + dependencies: + commander: 7.2.0 + handlebars: 4.7.8 + node-fetch: 2.7.0 + parse-github-url: 1.0.2 + semver: 7.5.0 + transitivePeerDependencies: + - encoding + dev: true + + /bs-logger@0.2.6: + resolution: + { + integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, + } + engines: { node: ">= 6" } + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /builtin-modules@3.3.0: + resolution: + { + integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, + } + engines: { node: ">=6" } + dev: true + + /chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.2.0: + resolution: + { + integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: true + + /ci-info@3.9.0: + resolution: + { + integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, + } + engines: { node: ">=8" } + dev: true + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + dev: true + + /commander@7.2.0: + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: ">= 10" } + dev: true + + /debug@4.3.1: + resolution: + { + integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + dev: true + + /deepcopy@2.1.0: + resolution: + { + integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==, + } + dependencies: + type-detect: 4.0.8 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + dev: true + + /fs-extra@11.1.1: + resolution: + { + integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==, + } + engines: { node: ">=14.14" } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + dev: true + + /handlebars@4.7.8: + resolution: + { + integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==, + } + engines: { node: ">=0.4.7" } + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: registry.npmmirror.com/uglify-js@3.17.4 + dev: true + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + dev: true + + /ip-regex@4.3.0: + resolution: + { + integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==, + } + engines: { node: ">=8" } + dev: true + + /is-url@1.2.4: + resolution: + { + integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==, + } + dev: true + + /is2@2.0.9: + resolution: + { + integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==, + } + engines: { node: ">=v0.10.0" } + dependencies: + deep-is: 0.1.4 + ip-regex: 4.3.0 + is-url: 1.2.4 + dev: true + + /jest-expect-message@1.1.3: + resolution: + { + integrity: sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==, + } + dev: true + + /jest-util@29.7.0: + resolution: + { + integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/types": 29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } + hasBin: true + dev: true + + /jsonfile@6.1.0: + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + dev: true + + /lodash.memoize@4.1.2: + resolution: + { + integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, + } + dev: true + + /loglevel-plugin-prefix@0.8.4: + resolution: + { + integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==, + } + dev: true + + /loglevel@1.8.1: + resolution: + { + integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==, + } + engines: { node: ">= 0.6.0" } + dev: true + + /lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + dependencies: + yallist: 4.0.0 + dev: true + + /make-error@1.3.6: + resolution: + { + integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, + } + dev: true + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + dev: true + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + dev: true + + /neo-async@2.6.2: + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } + dev: true + + /node-fetch@2.7.0: + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /pagerank.js@1.0.2: + resolution: + { + integrity: sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw==, + } + dev: false + + /parse-github-url@1.0.2: + resolution: + { + integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==, + } + engines: { node: ">=0.10.0" } + hasBin: true + dev: true + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + dev: true + + /semver@7.5.0: + resolution: + { + integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + dev: true + + /split2@4.2.0: + resolution: + { + integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, + } + engines: { node: ">= 10.x" } + dev: true + + /strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } + dependencies: + ansi-regex: 6.0.1 + dev: true + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + dev: true + + /tcp-port-used@1.0.2: + resolution: + { + integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==, + } + dependencies: + debug: 4.3.1 + is2: 2.0.9 + transitivePeerDependencies: + - supports-color + dev: true + + /tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + dev: true + + /ts-jest@29.1.1(@babel/core@7.23.3)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6): + resolution: + { + integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==, + } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + esbuild: "*" + jest: ^29.0.0 + typescript: ">=4.3 <6" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + bs-logger: 0.2.6 + esbuild: registry.npmmirror.com/esbuild@0.19.11 + fast-json-stable-stringify: 2.1.0 + jest: registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.1.6 + yargs-parser: 21.1.1 + dev: true + + /tslib@2.6.1: + resolution: + { + integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==, + } + dev: true + + /type-detect@4.0.8: + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + } + engines: { node: ">=4" } + dev: true + + /typescript@5.1.6: + resolution: + { + integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==, + } + engines: { node: ">=14.17" } + hasBin: true + dev: true + + /universalify@2.0.1: + resolution: + { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: ">= 10.0.0" } + dev: true + + /vhtml@2.2.0: + resolution: + { + integrity: sha512-TPXrXrxBOslRUVnlVkiAqhoXneiertIg86bdvzionrUYhEuiROvyPZNiiP6GIIJ2Q7oPNVyEtIx8gMAZZE9lCQ==, + } + dev: true + + /wdio-chromedriver-service@8.1.1(webdriverio@8.27.2): + resolution: + { + integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==, + } + engines: { node: ^16.13 || >=18 } + peerDependencies: + "@wdio/types": ^7.0.0 || ^8.0.0-alpha.219 + chromedriver: "*" + webdriverio: ^7.0.0 || ^8.0.0-alpha.219 + peerDependenciesMeta: + "@wdio/types": + optional: true + chromedriver: + optional: true + dependencies: + "@wdio/logger": 8.16.17 + fs-extra: 11.1.1 + split2: 4.2.0 + tcp-port-used: 1.0.2 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + transitivePeerDependencies: + - supports-color + dev: true + + /webidl-conversions@3.0.1: + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } + dev: true + + /whatwg-url@5.0.0: + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /wordwrap@1.0.0: + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } + dev: true + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + dev: true + + /yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/@aashutoshrathi/word-wrap@1.2.6: + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + tarball: https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz, + } + name: "@aashutoshrathi/word-wrap" + version: 1.2.6 + engines: { node: ">=0.10.0" } + dev: true + + registry.npmmirror.com/@ampproject/remapping@2.2.1: + resolution: + { + integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, + tarball: https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz, + } + name: "@ampproject/remapping" + version: 2.2.1 + engines: { node: ">=6.0.0" } + dependencies: + "@jridgewell/gen-mapping": registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 + "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + dev: true + + registry.npmmirror.com/@babel/code-frame@7.22.13: + resolution: + { + integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==, + tarball: https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz, + } + name: "@babel/code-frame" + version: 7.22.13 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/highlight": registry.npmmirror.com/@babel/highlight@7.22.20 + chalk: registry.npmmirror.com/chalk@2.4.2 + dev: true + + registry.npmmirror.com/@babel/compat-data@7.23.3: + resolution: + { + integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==, + tarball: https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.3.tgz, + } + name: "@babel/compat-data" + version: 7.23.3 + engines: { node: ">=6.9.0" } + dev: true + + registry.npmmirror.com/@babel/core@7.23.3: + resolution: + { + integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==, + tarball: https://registry.npmmirror.com/@babel/core/-/core-7.23.3.tgz, + } + name: "@babel/core" + version: 7.23.3 + engines: { node: ">=6.9.0" } + dependencies: + "@ampproject/remapping": registry.npmmirror.com/@ampproject/remapping@2.2.1 + "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 + "@babel/generator": registry.npmmirror.com/@babel/generator@7.23.3 + "@babel/helper-compilation-targets": registry.npmmirror.com/@babel/helper-compilation-targets@7.22.15 + "@babel/helper-module-transforms": registry.npmmirror.com/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3) + "@babel/helpers": registry.npmmirror.com/@babel/helpers@7.23.2 + "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 + "@babel/template": registry.npmmirror.com/@babel/template@7.22.15 + "@babel/traverse": registry.npmmirror.com/@babel/traverse@7.23.3 + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + gensync: registry.npmmirror.com/gensync@1.0.0-beta.2 + json5: registry.npmmirror.com/json5@2.2.3 + semver: registry.npmmirror.com/semver@6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/generator@7.23.3: + resolution: + { + integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==, + tarball: https://registry.npmmirror.com/@babel/generator/-/generator-7.23.3.tgz, + } + name: "@babel/generator" + version: 7.23.3 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + "@jridgewell/gen-mapping": registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 + "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + jsesc: registry.npmmirror.com/jsesc@2.5.2 + dev: true + + registry.npmmirror.com/@babel/helper-compilation-targets@7.22.15: + resolution: + { + integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==, + tarball: https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz, + } + name: "@babel/helper-compilation-targets" + version: 7.22.15 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/compat-data": registry.npmmirror.com/@babel/compat-data@7.23.3 + "@babel/helper-validator-option": registry.npmmirror.com/@babel/helper-validator-option@7.22.15 + browserslist: registry.npmmirror.com/browserslist@4.22.1 + lru-cache: registry.npmmirror.com/lru-cache@5.1.1 + semver: registry.npmmirror.com/semver@6.3.1 + dev: true + + registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20: + resolution: + { + integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, + tarball: https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz, + } + name: "@babel/helper-environment-visitor" + version: 7.22.20 + engines: { node: ">=6.9.0" } + dev: true + + registry.npmmirror.com/@babel/helper-function-name@7.23.0: + resolution: + { + integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, + tarball: https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz, + } + name: "@babel/helper-function-name" + version: 7.23.0 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/template": registry.npmmirror.com/@babel/template@7.22.15 + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/helper-hoist-variables@7.22.5: + resolution: + { + integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, + tarball: https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz, + } + name: "@babel/helper-hoist-variables" + version: 7.22.5 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/helper-module-imports@7.22.15: + resolution: + { + integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, + tarball: https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz, + } + name: "@babel/helper-module-imports" + version: 7.22.15 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + resolution: + { + integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, + tarball: https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz, + } + id: registry.npmmirror.com/@babel/helper-module-transforms/7.23.3 + name: "@babel/helper-module-transforms" + version: 7.23.3 + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-environment-visitor": registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20 + "@babel/helper-module-imports": registry.npmmirror.com/@babel/helper-module-imports@7.22.15 + "@babel/helper-simple-access": registry.npmmirror.com/@babel/helper-simple-access@7.22.5 + "@babel/helper-split-export-declaration": registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6 + "@babel/helper-validator-identifier": registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 + dev: true + + registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5: + resolution: + { + integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, + tarball: https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz, + } + name: "@babel/helper-plugin-utils" + version: 7.22.5 + engines: { node: ">=6.9.0" } + dev: true + + registry.npmmirror.com/@babel/helper-simple-access@7.22.5: + resolution: + { + integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, + tarball: https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz, + } + name: "@babel/helper-simple-access" + version: 7.22.5 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6: + resolution: + { + integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, + tarball: https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz, + } + name: "@babel/helper-split-export-declaration" + version: 7.22.6 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/helper-string-parser@7.22.5: + resolution: + { + integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, + tarball: https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz, + } + name: "@babel/helper-string-parser" + version: 7.22.5 + engines: { node: ">=6.9.0" } + dev: true + + registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20: + resolution: + { + integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, + tarball: https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz, + } + name: "@babel/helper-validator-identifier" + version: 7.22.20 + engines: { node: ">=6.9.0" } + dev: true + + registry.npmmirror.com/@babel/helper-validator-option@7.22.15: + resolution: + { + integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==, + tarball: https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz, + } + name: "@babel/helper-validator-option" + version: 7.22.15 + engines: { node: ">=6.9.0" } + dev: true + + registry.npmmirror.com/@babel/helpers@7.23.2: + resolution: + { + integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==, + tarball: https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.2.tgz, + } + name: "@babel/helpers" + version: 7.23.2 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/template": registry.npmmirror.com/@babel/template@7.22.15 + "@babel/traverse": registry.npmmirror.com/@babel/traverse@7.23.3 + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/highlight@7.22.20: + resolution: + { + integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==, + tarball: https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.20.tgz, + } + name: "@babel/highlight" + version: 7.22.20 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-validator-identifier": registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 + chalk: registry.npmmirror.com/chalk@2.4.2 + js-tokens: registry.npmmirror.com/js-tokens@4.0.0 + dev: true + + registry.npmmirror.com/@babel/parser@7.23.3: + resolution: + { + integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==, + tarball: https://registry.npmmirror.com/@babel/parser/-/parser-7.23.3.tgz, + } + name: "@babel/parser" + version: 7.23.3 + engines: { node: ">=6.0.0" } + hasBin: true + dependencies: + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3): + resolution: + { + integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-async-generators/7.8.4 + name: "@babel/plugin-syntax-async-generators" + version: 7.8.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3): + resolution: + { + integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-bigint/7.8.3 + name: "@babel/plugin-syntax-bigint" + version: 7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3): + resolution: + { + integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-class-properties/7.12.13 + name: "@babel/plugin-syntax-class-properties" + version: 7.12.13 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3): + resolution: + { + integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-import-meta/7.10.4 + name: "@babel/plugin-syntax-import-meta" + version: 7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3): + resolution: + { + integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-json-strings/7.8.3 + name: "@babel/plugin-syntax-json-strings" + version: 7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3): + resolution: + { + integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-jsx/7.23.3 + name: "@babel/plugin-syntax-jsx" + version: 7.23.3 + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3): + resolution: + { + integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/7.10.4 + name: "@babel/plugin-syntax-logical-assignment-operators" + version: 7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3): + resolution: + { + integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3 + name: "@babel/plugin-syntax-nullish-coalescing-operator" + version: 7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3): + resolution: + { + integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/7.10.4 + name: "@babel/plugin-syntax-numeric-separator" + version: 7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3): + resolution: + { + integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/7.8.3 + name: "@babel/plugin-syntax-object-rest-spread" + version: 7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3): + resolution: + { + integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/7.8.3 + name: "@babel/plugin-syntax-optional-catch-binding" + version: 7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3): + resolution: + { + integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/7.8.3 + name: "@babel/plugin-syntax-optional-chaining" + version: 7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3): + resolution: + { + integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-top-level-await/7.14.5 + name: "@babel/plugin-syntax-top-level-await" + version: 7.14.5 + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3): + resolution: + { + integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==, + tarball: https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz, + } + id: registry.npmmirror.com/@babel/plugin-syntax-typescript/7.23.3 + name: "@babel/plugin-syntax-typescript" + version: 7.23.3 + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/template@7.22.15: + resolution: + { + integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, + tarball: https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz, + } + name: "@babel/template" + version: 7.22.15 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 + "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/traverse@7.23.3: + resolution: + { + integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==, + tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.3.tgz, + } + name: "@babel/traverse" + version: 7.23.3 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 + "@babel/generator": registry.npmmirror.com/@babel/generator@7.23.3 + "@babel/helper-environment-visitor": registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20 + "@babel/helper-function-name": registry.npmmirror.com/@babel/helper-function-name@7.23.0 + "@babel/helper-hoist-variables": registry.npmmirror.com/@babel/helper-hoist-variables@7.22.5 + "@babel/helper-split-export-declaration": registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6 + "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + globals: registry.npmmirror.com/globals@11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/types@7.23.3: + resolution: + { + integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==, + tarball: https://registry.npmmirror.com/@babel/types/-/types-7.23.3.tgz, + } + name: "@babel/types" + version: 7.23.3 + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-string-parser": registry.npmmirror.com/@babel/helper-string-parser@7.22.5 + "@babel/helper-validator-identifier": registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 + to-fast-properties: registry.npmmirror.com/to-fast-properties@2.0.0 + dev: true + + registry.npmmirror.com/@bcoe/v8-coverage@0.2.3: + resolution: + { + integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, + tarball: https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz, + } + name: "@bcoe/v8-coverage" + version: 0.2.3 + dev: true + + registry.npmmirror.com/@codemirror/state@6.3.1: + resolution: + { + integrity: sha512-88e4HhMtKJyw6fKprGaN/yZfiaoGYOi2nM45YCUC6R/kex9sxFWBDGatS1vk4lMgnWmdIIB9tk8Gj1LmL8YfvA==, + tarball: https://registry.npmmirror.com/@codemirror/state/-/state-6.3.1.tgz, + } + name: "@codemirror/state" + version: 6.3.1 + dev: true + + registry.npmmirror.com/@codemirror/view@6.22.0: + resolution: + { + integrity: sha512-6zLj4YIoIpfTGKrDMTbeZRpa8ih4EymMCKmddEDcJWrCdp/N1D46B38YEz4creTb4T177AVS9EyXkLeC/HL2jA==, + tarball: https://registry.npmmirror.com/@codemirror/view/-/view-6.22.0.tgz, + } + name: "@codemirror/view" + version: 6.22.0 + dependencies: + "@codemirror/state": registry.npmmirror.com/@codemirror/state@6.3.1 + style-mod: registry.npmmirror.com/style-mod@4.1.0 + w3c-keyname: registry.npmmirror.com/w3c-keyname@2.2.6 + dev: true + + registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11: + resolution: + { + integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==, + tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz, + } + name: "@esbuild/aix-ppc64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true optional: true - babel-jest: - optional: true - esbuild: + + registry.npmmirror.com/@esbuild/android-arm64@0.19.11: + resolution: + { + integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==, + tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz, + } + name: "@esbuild/android-arm64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true optional: true - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - bs-logger: 0.2.6 - esbuild: registry.npmmirror.com/esbuild@0.19.11 - fast-json-stable-stringify: 2.1.0 - jest: registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.1.6 - yargs-parser: 21.1.1 - dev: true - - /tslib@2.6.1: - resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true - - /vhtml@2.2.0: - resolution: {integrity: sha512-TPXrXrxBOslRUVnlVkiAqhoXneiertIg86bdvzionrUYhEuiROvyPZNiiP6GIIJ2Q7oPNVyEtIx8gMAZZE9lCQ==} - dev: true - - /wdio-chromedriver-service@8.1.1(webdriverio@8.27.2): - resolution: {integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==} - engines: {node: ^16.13 || >=18} - peerDependencies: - '@wdio/types': ^7.0.0 || ^8.0.0-alpha.219 - chromedriver: '*' - webdriverio: ^7.0.0 || ^8.0.0-alpha.219 - peerDependenciesMeta: - '@wdio/types': + + registry.npmmirror.com/@esbuild/android-arm@0.19.11: + resolution: + { + integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==, + tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz, + } + name: "@esbuild/android-arm" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true optional: true - chromedriver: + + registry.npmmirror.com/@esbuild/android-x64@0.19.11: + resolution: + { + integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==, + tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz, + } + name: "@esbuild/android-x64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true optional: true - dependencies: - '@wdio/logger': 8.16.17 - fs-extra: 11.1.1 - split2: 4.2.0 - tcp-port-used: 1.0.2 - webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) - transitivePeerDependencies: - - supports-color - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: true - - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, tarball: https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz} - name: '@aashutoshrathi/word-wrap' - version: 1.2.6 - engines: {node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, tarball: https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz} - name: '@ampproject/remapping' - version: 2.2.1 - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 - '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - dev: true - - registry.npmmirror.com/@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==, tarball: https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz} - name: '@babel/code-frame' - version: 7.22.13 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': registry.npmmirror.com/@babel/highlight@7.22.20 - chalk: registry.npmmirror.com/chalk@2.4.2 - dev: true - - registry.npmmirror.com/@babel/compat-data@7.23.3: - resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==, tarball: https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.3.tgz} - name: '@babel/compat-data' - version: 7.23.3 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/@babel/core@7.23.3: - resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==, tarball: https://registry.npmmirror.com/@babel/core/-/core-7.23.3.tgz} - name: '@babel/core' - version: 7.23.3 - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': registry.npmmirror.com/@ampproject/remapping@2.2.1 - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 - '@babel/generator': registry.npmmirror.com/@babel/generator@7.23.3 - '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets@7.22.15 - '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3) - '@babel/helpers': registry.npmmirror.com/@babel/helpers@7.23.2 - '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 - '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 - '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.23.3 - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - gensync: registry.npmmirror.com/gensync@1.0.0-beta.2 - json5: registry.npmmirror.com/json5@2.2.3 - semver: registry.npmmirror.com/semver@6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/generator@7.23.3: - resolution: {integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==, tarball: https://registry.npmmirror.com/@babel/generator/-/generator-7.23.3.tgz} - name: '@babel/generator' - version: 7.23.3 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 - '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - jsesc: registry.npmmirror.com/jsesc@2.5.2 - dev: true - - registry.npmmirror.com/@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==, tarball: https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz} - name: '@babel/helper-compilation-targets' - version: 7.22.15 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': registry.npmmirror.com/@babel/compat-data@7.23.3 - '@babel/helper-validator-option': registry.npmmirror.com/@babel/helper-validator-option@7.22.15 - browserslist: registry.npmmirror.com/browserslist@4.22.1 - lru-cache: registry.npmmirror.com/lru-cache@5.1.1 - semver: registry.npmmirror.com/semver@6.3.1 - dev: true - - registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, tarball: https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz} - name: '@babel/helper-environment-visitor' - version: 7.22.20 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, tarball: https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz} - name: '@babel/helper-function-name' - version: 7.23.0 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, tarball: https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz} - name: '@babel/helper-hoist-variables' - version: 7.22.5 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, tarball: https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz} - name: '@babel/helper-module-imports' - version: 7.22.15 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, tarball: https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz} - id: registry.npmmirror.com/@babel/helper-module-transforms/7.23.3 - name: '@babel/helper-module-transforms' - version: 7.23.3 - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20 - '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports@7.22.15 - '@babel/helper-simple-access': registry.npmmirror.com/@babel/helper-simple-access@7.22.5 - '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6 - '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 - dev: true - - registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, tarball: https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz} - name: '@babel/helper-plugin-utils' - version: 7.22.5 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, tarball: https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz} - name: '@babel/helper-simple-access' - version: 7.22.5 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, tarball: https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz} - name: '@babel/helper-split-export-declaration' - version: 7.22.6 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, tarball: https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz} - name: '@babel/helper-string-parser' - version: 7.22.5 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, tarball: https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz} - name: '@babel/helper-validator-identifier' - version: 7.22.20 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==, tarball: https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz} - name: '@babel/helper-validator-option' - version: 7.22.15 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/@babel/helpers@7.23.2: - resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==, tarball: https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.2.tgz} - name: '@babel/helpers' - version: 7.23.2 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 - '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.23.3 - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==, tarball: https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.20.tgz} - name: '@babel/highlight' - version: 7.22.20 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 - chalk: registry.npmmirror.com/chalk@2.4.2 - js-tokens: registry.npmmirror.com/js-tokens@4.0.0 - dev: true - - registry.npmmirror.com/@babel/parser@7.23.3: - resolution: {integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==, tarball: https://registry.npmmirror.com/@babel/parser/-/parser-7.23.3.tgz} - name: '@babel/parser' - version: 7.23.3 - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-async-generators/7.8.4 - name: '@babel/plugin-syntax-async-generators' - version: 7.8.4 - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-bigint/7.8.3 - name: '@babel/plugin-syntax-bigint' - version: 7.8.3 - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-class-properties/7.12.13 - name: '@babel/plugin-syntax-class-properties' - version: 7.12.13 - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-import-meta/7.10.4 - name: '@babel/plugin-syntax-import-meta' - version: 7.10.4 - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-json-strings/7.8.3 - name: '@babel/plugin-syntax-json-strings' - version: 7.8.3 - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-jsx/7.23.3 - name: '@babel/plugin-syntax-jsx' - version: 7.23.3 - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/7.10.4 - name: '@babel/plugin-syntax-logical-assignment-operators' - version: 7.10.4 - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3 - name: '@babel/plugin-syntax-nullish-coalescing-operator' - version: 7.8.3 - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/7.10.4 - name: '@babel/plugin-syntax-numeric-separator' - version: 7.10.4 - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/7.8.3 - name: '@babel/plugin-syntax-object-rest-spread' - version: 7.8.3 - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/7.8.3 - name: '@babel/plugin-syntax-optional-catch-binding' - version: 7.8.3 - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/7.8.3 - name: '@babel/plugin-syntax-optional-chaining' - version: 7.8.3 - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-top-level-await/7.14.5 - name: '@babel/plugin-syntax-top-level-await' - version: 7.14.5 - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-typescript/7.23.3 - name: '@babel/plugin-syntax-typescript' - version: 7.23.3 - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, tarball: https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz} - name: '@babel/template' - version: 7.22.15 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 - '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/traverse@7.23.3: - resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==, tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.3.tgz} - name: '@babel/traverse' - version: 7.23.3 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 - '@babel/generator': registry.npmmirror.com/@babel/generator@7.23.3 - '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20 - '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name@7.23.0 - '@babel/helper-hoist-variables': registry.npmmirror.com/@babel/helper-hoist-variables@7.22.5 - '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6 - '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - globals: registry.npmmirror.com/globals@11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/types@7.23.3: - resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==, tarball: https://registry.npmmirror.com/@babel/types/-/types-7.23.3.tgz} - name: '@babel/types' - version: 7.23.3 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': registry.npmmirror.com/@babel/helper-string-parser@7.22.5 - '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 - to-fast-properties: registry.npmmirror.com/to-fast-properties@2.0.0 - dev: true - - registry.npmmirror.com/@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, tarball: https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz} - name: '@bcoe/v8-coverage' - version: 0.2.3 - dev: true - - registry.npmmirror.com/@codemirror/state@6.3.1: - resolution: {integrity: sha512-88e4HhMtKJyw6fKprGaN/yZfiaoGYOi2nM45YCUC6R/kex9sxFWBDGatS1vk4lMgnWmdIIB9tk8Gj1LmL8YfvA==, tarball: https://registry.npmmirror.com/@codemirror/state/-/state-6.3.1.tgz} - name: '@codemirror/state' - version: 6.3.1 - dev: true - - registry.npmmirror.com/@codemirror/view@6.22.0: - resolution: {integrity: sha512-6zLj4YIoIpfTGKrDMTbeZRpa8ih4EymMCKmddEDcJWrCdp/N1D46B38YEz4creTb4T177AVS9EyXkLeC/HL2jA==, tarball: https://registry.npmmirror.com/@codemirror/view/-/view-6.22.0.tgz} - name: '@codemirror/view' - version: 6.22.0 - dependencies: - '@codemirror/state': registry.npmmirror.com/@codemirror/state@6.3.1 - style-mod: registry.npmmirror.com/style-mod@4.1.0 - w3c-keyname: registry.npmmirror.com/w3c-keyname@2.2.6 - dev: true - - registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11: - resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==, tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz} - name: '@esbuild/aix-ppc64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/android-arm64@0.19.11: - resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz} - name: '@esbuild/android-arm64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/android-arm@0.19.11: - resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz} - name: '@esbuild/android-arm' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/android-x64@0.19.11: - resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz} - name: '@esbuild/android-x64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11: - resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz} - name: '@esbuild/darwin-arm64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/darwin-x64@0.19.11: - resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz} - name: '@esbuild/darwin-x64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11: - resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz} - name: '@esbuild/freebsd-arm64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11: - resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz} - name: '@esbuild/freebsd-x64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-arm64@0.19.11: - resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz} - name: '@esbuild/linux-arm64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-arm@0.19.11: - resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz} - name: '@esbuild/linux-arm' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-ia32@0.19.11: - resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz} - name: '@esbuild/linux-ia32' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-loong64@0.19.11: - resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz} - name: '@esbuild/linux-loong64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11: - resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz} - name: '@esbuild/linux-mips64el' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11: - resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz} - name: '@esbuild/linux-ppc64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11: - resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz} - name: '@esbuild/linux-riscv64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-s390x@0.19.11: - resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz} - name: '@esbuild/linux-s390x' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/linux-x64@0.19.11: - resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz} - name: '@esbuild/linux-x64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11: - resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz} - name: '@esbuild/netbsd-x64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11: - resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz} - name: '@esbuild/openbsd-x64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/sunos-x64@0.19.11: - resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz} - name: '@esbuild/sunos-x64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/win32-arm64@0.19.11: - resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz} - name: '@esbuild/win32-arm64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/win32-ia32@0.19.11: - resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz} - name: '@esbuild/win32-ia32' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@esbuild/win32-x64@0.19.11: - resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz} - name: '@esbuild/win32-x64' - version: 0.19.11 - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, tarball: https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz} - id: registry.npmmirror.com/@eslint-community/eslint-utils/4.4.0 - name: '@eslint-community/eslint-utils' - version: 4.4.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: registry.npmmirror.com/eslint@8.56.0 - eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 - dev: true - - registry.npmmirror.com/@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, tarball: https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz} - name: '@eslint-community/regexpp' - version: 4.10.0 - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - registry.npmmirror.com/@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, tarball: https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz} - name: '@eslint/eslintrc' - version: 2.1.4 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: registry.npmmirror.com/ajv@6.12.6 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - espree: registry.npmmirror.com/espree@9.6.1 - globals: registry.npmmirror.com/globals@13.23.0 - ignore: registry.npmmirror.com/ignore@5.2.4 - import-fresh: registry.npmmirror.com/import-fresh@3.3.0 - js-yaml: registry.npmmirror.com/js-yaml@4.1.0 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, tarball: https://registry.npmmirror.com/@eslint/js/-/js-8.56.0.tgz} - name: '@eslint/js' - version: 8.56.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - registry.npmmirror.com/@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, tarball: https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz} - name: '@humanwhocodes/config-array' - version: 0.11.13 - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': registry.npmmirror.com/@humanwhocodes/object-schema@2.0.1 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - minimatch: registry.npmmirror.com/minimatch@3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, tarball: https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz} - name: '@humanwhocodes/module-importer' - version: 1.0.1 - engines: {node: '>=12.22'} - dev: true - - registry.npmmirror.com/@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, tarball: https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz} - name: '@humanwhocodes/object-schema' - version: 2.0.1 - dev: true - - registry.npmmirror.com/@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, tarball: https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz} - name: '@isaacs/cliui' - version: 8.0.2 - engines: {node: '>=12'} - dependencies: - string-width: registry.npmmirror.com/string-width@5.1.2 - string-width-cjs: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 - strip-ansi-cjs: registry.npmmirror.com/strip-ansi@6.0.1 - wrap-ansi: registry.npmmirror.com/wrap-ansi@8.1.0 - wrap-ansi-cjs: registry.npmmirror.com/wrap-ansi@7.0.0 - dev: true - - registry.npmmirror.com/@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, tarball: https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz} - name: '@istanbuljs/load-nyc-config' - version: 1.1.0 - engines: {node: '>=8'} - dependencies: - camelcase: registry.npmmirror.com/camelcase@5.3.1 - find-up: registry.npmmirror.com/find-up@4.1.0 - get-package-type: registry.npmmirror.com/get-package-type@0.1.0 - js-yaml: registry.npmmirror.com/js-yaml@3.14.1 - resolve-from: registry.npmmirror.com/resolve-from@5.0.0 - dev: true - - registry.npmmirror.com/@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, tarball: https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz} - name: '@istanbuljs/schema' - version: 0.1.3 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==, tarball: https://registry.npmmirror.com/@jest/console/-/console-29.7.0.tgz} - name: '@jest/console' - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - dev: true - - registry.npmmirror.com/@jest/core@29.7.0: - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==, tarball: https://registry.npmmirror.com/@jest/core/-/core-29.7.0.tgz} - name: '@jest/core' - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: + + registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11: + resolution: + { + integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==, + tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz, + } + name: "@esbuild/darwin-arm64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true optional: true - dependencies: - '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 - '@jest/reporters': registry.npmmirror.com/@jest/reporters@29.7.0 - '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 - '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 - chalk: registry.npmmirror.com/chalk@4.1.2 - ci-info: registry.npmmirror.com/ci-info@3.9.0 - exit: registry.npmmirror.com/exit@0.1.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-changed-files: registry.npmmirror.com/jest-changed-files@29.7.0 - jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 - jest-resolve-dependencies: registry.npmmirror.com/jest-resolve-dependencies@29.7.0 - jest-runner: registry.npmmirror.com/jest-runner@29.7.0 - jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 - jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-validate: registry.npmmirror.com/jest-validate@29.7.0 - jest-watcher: registry.npmmirror.com/jest-watcher@29.7.0 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - registry.npmmirror.com/@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==, tarball: https://registry.npmmirror.com/@jest/environment/-/environment-29.7.0.tgz} - name: '@jest/environment' - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - dev: true - - registry.npmmirror.com/@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==, tarball: https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz} - name: '@jest/expect-utils' - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - dev: true - - registry.npmmirror.com/@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==, tarball: https://registry.npmmirror.com/@jest/expect/-/expect-29.7.0.tgz} - name: '@jest/expect' - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: registry.npmmirror.com/expect@29.7.0 - jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==, tarball: https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz} - name: '@jest/fake-timers' - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@sinonjs/fake-timers': registry.npmmirror.com/@sinonjs/fake-timers@10.0.2 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - dev: true - - registry.npmmirror.com/@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==, tarball: https://registry.npmmirror.com/@jest/globals/-/globals-29.7.0.tgz} - name: '@jest/globals' - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 - '@jest/expect': registry.npmmirror.com/@jest/expect@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==, tarball: https://registry.npmmirror.com/@jest/reporters/-/reporters-29.7.0.tgz} - name: '@jest/reporters' - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: + + registry.npmmirror.com/@esbuild/darwin-x64@0.19.11: + resolution: + { + integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==, + tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz, + } + name: "@esbuild/darwin-x64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true optional: true - dependencies: - '@bcoe/v8-coverage': registry.npmmirror.com/@bcoe/v8-coverage@0.2.3 - '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 - '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 - '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 - exit: registry.npmmirror.com/exit@0.1.2 - glob: registry.npmmirror.com/glob@7.2.3 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 - istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument@6.0.1 - istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.1 - istanbul-lib-source-maps: registry.npmmirror.com/istanbul-lib-source-maps@4.0.1 - istanbul-reports: registry.npmmirror.com/istanbul-reports@3.1.5 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-worker: registry.npmmirror.com/jest-worker@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - string-length: registry.npmmirror.com/string-length@4.0.2 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - v8-to-istanbul: registry.npmmirror.com/v8-to-istanbul@9.1.3 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, tarball: https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz} - name: '@jest/schemas' - version: 29.6.3 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': registry.npmmirror.com/@sinclair/typebox@0.27.8 - dev: true - - registry.npmmirror.com/@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==, tarball: https://registry.npmmirror.com/@jest/source-map/-/source-map-29.6.3.tgz} - name: '@jest/source-map' - version: 29.6.3 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - callsites: registry.npmmirror.com/callsites@3.1.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - dev: true - - registry.npmmirror.com/@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==, tarball: https://registry.npmmirror.com/@jest/test-result/-/test-result-29.7.0.tgz} - name: '@jest/test-result' - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 - collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 - dev: true - - registry.npmmirror.com/@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==, tarball: https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz} - name: '@jest/test-sequencer' - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - dev: true - - registry.npmmirror.com/@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==, tarball: https://registry.npmmirror.com/@jest/transform/-/transform-29.7.0.tgz} - name: '@jest/transform' - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul@6.1.1 - chalk: registry.npmmirror.com/chalk@4.1.2 - convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 - fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify@2.1.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - pirates: registry.npmmirror.com/pirates@4.0.5 - slash: registry.npmmirror.com/slash@3.0.0 - write-file-atomic: registry.npmmirror.com/write-file-atomic@4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, tarball: https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz} - name: '@jest/types' - version: 29.6.3 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': registry.npmmirror.com/@jest/schemas@29.6.3 - '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 - '@types/istanbul-reports': registry.npmmirror.com/@types/istanbul-reports@3.0.4 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - '@types/yargs': registry.npmmirror.com/@types/yargs@17.0.31 - chalk: registry.npmmirror.com/chalk@4.1.2 - dev: true - - registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz} - name: '@jridgewell/gen-mapping' - version: 0.3.3 - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array@1.1.2 - '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15 - '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - dev: true - - registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz} - name: '@jridgewell/resolve-uri' - version: 3.1.0 - engines: {node: '>=6.0.0'} - dev: true - - registry.npmmirror.com/@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, tarball: https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz} - name: '@jridgewell/set-array' - version: 1.1.2 - engines: {node: '>=6.0.0'} - dev: true - - registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz} - name: '@jridgewell/sourcemap-codec' - version: 1.4.15 - dev: true - - registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz} - name: '@jridgewell/trace-mapping' - version: 0.3.20 - dependencies: - '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0 - '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15 - dev: true - - registry.npmmirror.com/@kurkle/color@0.3.2: - resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==, tarball: https://registry.npmmirror.com/@kurkle/color/-/color-0.3.2.tgz} - name: '@kurkle/color' - version: 0.3.2 - dev: false - - registry.npmmirror.com/@ljharb/through@2.3.11: - resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==, tarball: https://registry.npmmirror.com/@ljharb/through/-/through-2.3.11.tgz} - name: '@ljharb/through' - version: 2.3.11 - engines: {node: '>= 0.4'} - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - dev: true - - registry.npmmirror.com/@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, tarball: https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz} - name: '@nodelib/fs.scandir' - version: 2.1.5 - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': registry.npmmirror.com/@nodelib/fs.stat@2.0.5 - run-parallel: registry.npmmirror.com/run-parallel@1.2.0 - dev: true - - registry.npmmirror.com/@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, tarball: https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz} - name: '@nodelib/fs.stat' - version: 2.0.5 - engines: {node: '>= 8'} - dev: true - - registry.npmmirror.com/@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, tarball: https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz} - name: '@nodelib/fs.walk' - version: 1.2.8 - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': registry.npmmirror.com/@nodelib/fs.scandir@2.1.5 - fastq: registry.npmmirror.com/fastq@1.15.0 - dev: true - - registry.npmmirror.com/@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, tarball: https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz} - name: '@pkgjs/parseargs' - version: 0.11.0 - engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/@puppeteer/browsers@1.4.6(typescript@5.1.6): - resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==, tarball: https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-1.4.6.tgz} - id: registry.npmmirror.com/@puppeteer/browsers/1.4.6 - name: '@puppeteer/browsers' - version: 1.4.6 - engines: {node: '>=16.3.0'} - hasBin: true - peerDependencies: - typescript: '>= 4.7.4' - peerDependenciesMeta: - typescript: + + registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11: + resolution: + { + integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==, + tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz, + } + name: "@esbuild/freebsd-arm64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true optional: true - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - extract-zip: registry.npmmirror.com/extract-zip@2.0.1 - progress: registry.npmmirror.com/progress@2.0.3 - proxy-agent: registry.npmmirror.com/proxy-agent@6.3.0 - tar-fs: registry.npmmirror.com/tar-fs@3.0.4 - typescript: 5.1.6 - unbzip2-stream: registry.npmmirror.com/unbzip2-stream@1.4.3 - yargs: registry.npmmirror.com/yargs@17.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@puppeteer/browsers@1.8.0: - resolution: {integrity: sha512-TkRHIV6k2D8OlUe8RtG+5jgOF/H98Myx0M6AOafC8DdNVOFiBSFa5cpRDtpm8LXOa9sVwe0+e6Q3FC56X/DZfg==, tarball: https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-1.8.0.tgz} - name: '@puppeteer/browsers' - version: 1.8.0 - engines: {node: '>=16.3.0'} - hasBin: true - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - extract-zip: registry.npmmirror.com/extract-zip@2.0.1 - progress: registry.npmmirror.com/progress@2.0.3 - proxy-agent: registry.npmmirror.com/proxy-agent@6.3.1 - tar-fs: registry.npmmirror.com/tar-fs@3.0.4 - unbzip2-stream: registry.npmmirror.com/unbzip2-stream@1.4.3 - yargs: registry.npmmirror.com/yargs@17.7.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, tarball: https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz} - name: '@sinclair/typebox' - version: 0.27.8 - dev: true - - registry.npmmirror.com/@sindresorhus/is@5.3.0: - resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==, tarball: https://registry.npmmirror.com/@sindresorhus/is/-/is-5.3.0.tgz} - name: '@sindresorhus/is' - version: 5.3.0 - engines: {node: '>=14.16'} - dev: true - - registry.npmmirror.com/@sinonjs/commons@2.0.0: - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==, tarball: https://registry.npmmirror.com/@sinonjs/commons/-/commons-2.0.0.tgz} - name: '@sinonjs/commons' - version: 2.0.0 - dependencies: - type-detect: registry.npmmirror.com/type-detect@4.0.8 - dev: true - - registry.npmmirror.com/@sinonjs/fake-timers@10.0.2: - resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==, tarball: https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz} - name: '@sinonjs/fake-timers' - version: 10.0.2 - dependencies: - '@sinonjs/commons': registry.npmmirror.com/@sinonjs/commons@2.0.0 - dev: true - - registry.npmmirror.com/@szmarczak/http-timer@5.0.1: - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==, tarball: https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz} - name: '@szmarczak/http-timer' - version: 5.0.1 - engines: {node: '>=14.16'} - dependencies: - defer-to-connect: registry.npmmirror.com/defer-to-connect@2.0.1 - dev: true - - registry.npmmirror.com/@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, tarball: https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz} - name: '@tootallnate/once' - version: 2.0.0 - engines: {node: '>= 10'} - dev: true - - registry.npmmirror.com/@tootallnate/quickjs-emscripten@0.23.0: - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==, tarball: https://registry.npmmirror.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz} - name: '@tootallnate/quickjs-emscripten' - version: 0.23.0 - dev: true - - registry.npmmirror.com/@types/babel__core@7.20.4: - resolution: {integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==, tarball: https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.4.tgz} - name: '@types/babel__core' - version: 7.20.4 - dependencies: - '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - '@types/babel__generator': registry.npmmirror.com/@types/babel__generator@7.6.7 - '@types/babel__template': registry.npmmirror.com/@types/babel__template@7.4.4 - '@types/babel__traverse': registry.npmmirror.com/@types/babel__traverse@7.20.4 - dev: true - - registry.npmmirror.com/@types/babel__generator@7.6.7: - resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==, tarball: https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.7.tgz} - name: '@types/babel__generator' - version: 7.6.7 - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, tarball: https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz} - name: '@types/babel__template' - version: 7.4.4 - dependencies: - '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@types/babel__traverse@7.20.4: - resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==, tarball: https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz} - name: '@types/babel__traverse' - version: 7.20.4 - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@types/codemirror@5.60.8: - resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==, tarball: https://registry.npmmirror.com/@types/codemirror/-/codemirror-5.60.8.tgz} - name: '@types/codemirror' - version: 5.60.8 - dependencies: - '@types/tern': registry.npmmirror.com/@types/tern@0.23.7 - dev: true - - registry.npmmirror.com/@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, tarball: https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz} - name: '@types/estree' - version: 1.0.5 - dev: true - - registry.npmmirror.com/@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, tarball: https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz} - name: '@types/graceful-fs' - version: 4.1.9 - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - dev: true - - registry.npmmirror.com/@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==, tarball: https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz} - name: '@types/http-cache-semantics' - version: 4.0.4 - dev: true - - registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, tarball: https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz} - name: '@types/istanbul-lib-coverage' - version: 2.0.6 - dev: true - - registry.npmmirror.com/@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, tarball: https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz} - name: '@types/istanbul-lib-report' - version: 3.0.3 - dependencies: - '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 - dev: true - - registry.npmmirror.com/@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, tarball: https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz} - name: '@types/istanbul-reports' - version: 3.0.4 - dependencies: - '@types/istanbul-lib-report': registry.npmmirror.com/@types/istanbul-lib-report@3.0.3 - dev: true - - registry.npmmirror.com/@types/jest@29.5.11: - resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==, tarball: https://registry.npmmirror.com/@types/jest/-/jest-29.5.11.tgz} - name: '@types/jest' - version: 29.5.11 - dependencies: - expect: registry.npmmirror.com/expect@29.7.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/@types/jsdom@20.0.1: - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==, tarball: https://registry.npmmirror.com/@types/jsdom/-/jsdom-20.0.1.tgz} - name: '@types/jsdom' - version: 20.0.1 - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - '@types/tough-cookie': registry.npmmirror.com/@types/tough-cookie@4.0.5 - parse5: registry.npmmirror.com/parse5@7.1.2 - dev: true - - registry.npmmirror.com/@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, tarball: https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz} - name: '@types/json-schema' - version: 7.0.15 - dev: true - - registry.npmmirror.com/@types/mocha@10.0.4: - resolution: {integrity: sha512-xKU7bUjiFTIttpWaIZ9qvgg+22O1nmbA+HRxdlR+u6TWsGfmFdXrheJoK4fFxrHNVIOBDvDNKZG+LYBpMHpX3w==, tarball: https://registry.npmmirror.com/@types/mocha/-/mocha-10.0.4.tgz} - name: '@types/mocha' - version: 10.0.4 - dev: true - - registry.npmmirror.com/@types/node@20.11.0: - resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==, tarball: https://registry.npmmirror.com/@types/node/-/node-20.11.0.tgz} - name: '@types/node' - version: 20.11.0 - dependencies: - undici-types: registry.npmmirror.com/undici-types@5.26.5 - dev: true - - registry.npmmirror.com/@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, tarball: https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz} - name: '@types/normalize-package-data' - version: 2.4.4 - dev: true - - registry.npmmirror.com/@types/semver@7.5.5: - resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==, tarball: https://registry.npmmirror.com/@types/semver/-/semver-7.5.5.tgz} - name: '@types/semver' - version: 7.5.5 - dev: true - - registry.npmmirror.com/@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, tarball: https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.3.tgz} - name: '@types/stack-utils' - version: 2.0.3 - dev: true - - registry.npmmirror.com/@types/tern@0.23.7: - resolution: {integrity: sha512-0YS9XCZ0LAhlP11HV9SqncUYyz9Ggsgc7Om/AmchKvoeFyj0qPaJmX6rJ93mJVExizWDzUMb49gAtVpI1uHd8Q==, tarball: https://registry.npmmirror.com/@types/tern/-/tern-0.23.7.tgz} - name: '@types/tern' - version: 0.23.7 - dependencies: - '@types/estree': registry.npmmirror.com/@types/estree@1.0.5 - dev: true - - registry.npmmirror.com/@types/tough-cookie@4.0.5: - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==, tarball: https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz} - name: '@types/tough-cookie' - version: 4.0.5 - dev: true - - registry.npmmirror.com/@types/vhtml@2.2.9: - resolution: {integrity: sha512-maEIRJb+PdK2FWDORl0a0aNUSGlniMl8pN+7WbanLzx1Gry4gLfsT0C9O/6JucPPBHCNrqDSImr2QcsUENLKUg==, tarball: https://registry.npmmirror.com/@types/vhtml/-/vhtml-2.2.9.tgz} - name: '@types/vhtml' - version: 2.2.9 - dev: true - - registry.npmmirror.com/@types/which@2.0.2: - resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==, tarball: https://registry.npmmirror.com/@types/which/-/which-2.0.2.tgz} - name: '@types/which' - version: 2.0.2 - dev: true - - registry.npmmirror.com/@types/ws@8.5.9: - resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==, tarball: https://registry.npmmirror.com/@types/ws/-/ws-8.5.9.tgz} - name: '@types/ws' - version: 8.5.9 - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - dev: true - - registry.npmmirror.com/@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, tarball: https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz} - name: '@types/yargs-parser' - version: 21.0.3 - dev: true - - registry.npmmirror.com/@types/yargs@17.0.31: - resolution: {integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==, tarball: https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.31.tgz} - name: '@types/yargs' - version: 17.0.31 - dependencies: - '@types/yargs-parser': registry.npmmirror.com/@types/yargs-parser@21.0.3 - dev: true - - registry.npmmirror.com/@types/yauzl@2.10.3: - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, tarball: https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz} - name: '@types/yauzl' - version: 2.10.3 - requiresBuild: true - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - dev: true - optional: true - - registry.npmmirror.com/@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.1.6): - resolution: {integrity: sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==, tarball: https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz} - id: registry.npmmirror.com/@typescript-eslint/eslint-plugin/6.18.1 - name: '@typescript-eslint/eslint-plugin' - version: 6.18.1 - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + + registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11: + resolution: + { + integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==, + tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz, + } + name: "@esbuild/freebsd-x64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true optional: true - dependencies: - '@eslint-community/regexpp': registry.npmmirror.com/@eslint-community/regexpp@4.10.0 - '@typescript-eslint/parser': registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 - '@typescript-eslint/type-utils': registry.npmmirror.com/@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) - '@typescript-eslint/utils': registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) - '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - eslint: registry.npmmirror.com/eslint@8.56.0 - graphemer: registry.npmmirror.com/graphemer@1.4.0 - ignore: registry.npmmirror.com/ignore@5.2.4 - natural-compare: registry.npmmirror.com/natural-compare@1.4.0 - semver: registry.npmmirror.com/semver@7.5.4 - ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6): - resolution: {integrity: sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==, tarball: https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.18.1.tgz} - id: registry.npmmirror.com/@typescript-eslint/parser/6.18.1 - name: '@typescript-eslint/parser' - version: 6.18.1 - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + + registry.npmmirror.com/@esbuild/linux-arm64@0.19.11: + resolution: + { + integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==, + tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz, + } + name: "@esbuild/linux-arm64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 - '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 - '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) - '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - eslint: registry.npmmirror.com/eslint@8.56.0 - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1: - resolution: {integrity: sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==, tarball: https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz} - name: '@typescript-eslint/scope-manager' - version: 6.18.1 - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 - '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 - dev: true - - registry.npmmirror.com/@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.1.6): - resolution: {integrity: sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==, tarball: https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz} - id: registry.npmmirror.com/@typescript-eslint/type-utils/6.18.1 - name: '@typescript-eslint/type-utils' - version: 6.18.1 - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + + registry.npmmirror.com/@esbuild/linux-arm@0.19.11: + resolution: + { + integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==, + tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz, + } + name: "@esbuild/linux-arm" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) - '@typescript-eslint/utils': registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - eslint: registry.npmmirror.com/eslint@8.56.0 - ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@typescript-eslint/types@6.18.1: - resolution: {integrity: sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==, tarball: https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.18.1.tgz} - name: '@typescript-eslint/types' - version: 6.18.1 - engines: {node: ^16.0.0 || >=18.0.0} - dev: true - - registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6): - resolution: {integrity: sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==, tarball: https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz} - id: registry.npmmirror.com/@typescript-eslint/typescript-estree/6.18.1 - name: '@typescript-eslint/typescript-estree' - version: 6.18.1 - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: + + registry.npmmirror.com/@esbuild/linux-ia32@0.19.11: + resolution: + { + integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==, + tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz, + } + name: "@esbuild/linux-ia32" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 - '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - globby: registry.npmmirror.com/globby@11.1.0 - is-glob: registry.npmmirror.com/is-glob@4.0.3 - minimatch: registry.npmmirror.com/minimatch@9.0.3 - semver: registry.npmmirror.com/semver@7.5.4 - ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6): - resolution: {integrity: sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==, tarball: https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.18.1.tgz} - id: registry.npmmirror.com/@typescript-eslint/utils/6.18.1 - name: '@typescript-eslint/utils' - version: 6.18.1 - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0) - '@types/json-schema': registry.npmmirror.com/@types/json-schema@7.0.15 - '@types/semver': registry.npmmirror.com/@types/semver@7.5.5 - '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 - '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 - '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) - eslint: registry.npmmirror.com/eslint@8.56.0 - semver: registry.npmmirror.com/semver@7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1: - resolution: {integrity: sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==, tarball: https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz} - name: '@typescript-eslint/visitor-keys' - version: 6.18.1 - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 - eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 - dev: true - - registry.npmmirror.com/@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, tarball: https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz} - name: '@ungap/structured-clone' - version: 1.2.0 - dev: true - - registry.npmmirror.com/@wdio/cli@8.27.2(typescript@5.1.6): - resolution: {integrity: sha512-gRbwqjjczReWqLFZQX9iwTsCwGPFavJwL7iKSoIeAS645sM9PMmPW7mHzawmkFxqDDAyBWO3qFn4KV2H/2YfdA==, tarball: https://registry.npmmirror.com/@wdio/cli/-/cli-8.27.2.tgz} - id: registry.npmmirror.com/@wdio/cli/8.27.2 - name: '@wdio/cli' - version: 8.27.2 - engines: {node: ^16.13 || >=18} - hasBin: true - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 - '@wdio/globals': registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - '@wdio/protocols': registry.npmmirror.com/@wdio/protocols@8.24.12 - '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 - '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 - async-exit-hook: registry.npmmirror.com/async-exit-hook@2.0.1 - chalk: registry.npmmirror.com/chalk@5.3.0 - chokidar: registry.npmmirror.com/chokidar@3.5.3 - cli-spinners: registry.npmmirror.com/cli-spinners@2.9.1 - dotenv: registry.npmmirror.com/dotenv@16.3.1 - ejs: registry.npmmirror.com/ejs@3.1.9 - execa: registry.npmmirror.com/execa@8.0.1 - import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 - inquirer: registry.npmmirror.com/inquirer@9.2.12 - lodash.flattendeep: registry.npmmirror.com/lodash.flattendeep@4.4.0 - lodash.pickby: registry.npmmirror.com/lodash.pickby@4.6.0 - lodash.union: registry.npmmirror.com/lodash.union@4.6.0 - read-pkg-up: registry.npmmirror.com/read-pkg-up@10.1.0 - recursive-readdir: registry.npmmirror.com/recursive-readdir@2.2.3 - webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) - yargs: registry.npmmirror.com/yargs@17.7.2 - transitivePeerDependencies: - - bufferutil - - devtools - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/@wdio/config@8.27.2: - resolution: {integrity: sha512-qR1r7K7/jsQhi9g5NiW40lgbvbzCcwwk8nz07hzTj6m8fQ8TXkQPob2fnrlDaNrXjzbZC4od0uv0a5fimK9YOQ==, tarball: https://registry.npmmirror.com/@wdio/config/-/config-8.27.2.tgz} - name: '@wdio/config' - version: 8.27.2 - engines: {node: ^16.13 || >=18} - dependencies: - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 - '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 - decamelize: registry.npmmirror.com/decamelize@6.0.0 - deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 - glob: registry.npmmirror.com/glob@10.3.10 - import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6): - resolution: {integrity: sha512-kU9fsOD1HVSROgN0TkjH8+O2SWbd5hHzL952+YOifMHFtt05Ua/n5mqxTTVAWmxUMMCz6VOuySmBt2Dhd4NnKA==, tarball: https://registry.npmmirror.com/@wdio/globals/-/globals-8.27.2.tgz} - id: registry.npmmirror.com/@wdio/globals/8.27.2 - name: '@wdio/globals' - version: 8.27.2 - engines: {node: ^16.13 || >=18} - optionalDependencies: - expect-webdriverio: registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6) - webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) - transitivePeerDependencies: - - bufferutil - - devtools - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/@wdio/local-runner@8.27.2(typescript@5.1.6): - resolution: {integrity: sha512-7m0vEulOyriMPB1+559ioEdjXlLu7yseM3KfQapCdLqaqTWvURJlMSxiHZZwuHaVGKa6YBPNB7NhRcHoUsqsAg==, tarball: https://registry.npmmirror.com/@wdio/local-runner/-/local-runner-8.27.2.tgz} - id: registry.npmmirror.com/@wdio/local-runner/8.27.2 - name: '@wdio/local-runner' - version: 8.27.2 - engines: {node: ^16.13 || >=18} - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - '@wdio/repl': registry.npmmirror.com/@wdio/repl@8.24.12 - '@wdio/runner': registry.npmmirror.com/@wdio/runner@8.27.2(typescript@5.1.6) - '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 - async-exit-hook: registry.npmmirror.com/async-exit-hook@2.0.1 - split2: registry.npmmirror.com/split2@4.2.0 - stream-buffers: registry.npmmirror.com/stream-buffers@3.0.2 - transitivePeerDependencies: - - bufferutil - - devtools - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/@wdio/logger@8.24.12: - resolution: {integrity: sha512-QisOiVIWKTUCf1H7S+DOtC+gruhlpimQrUXfWMTeeh672PvAJYnTpOJDWA+BtXfsikkUYFAzAaq8SeMJk8rqKg==, tarball: https://registry.npmmirror.com/@wdio/logger/-/logger-8.24.12.tgz} - name: '@wdio/logger' - version: 8.24.12 - engines: {node: ^16.13 || >=18} - dependencies: - chalk: registry.npmmirror.com/chalk@5.3.0 - loglevel: registry.npmmirror.com/loglevel@1.8.1 - loglevel-plugin-prefix: registry.npmmirror.com/loglevel-plugin-prefix@0.8.4 - strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 - dev: true - - registry.npmmirror.com/@wdio/mocha-framework@8.27.2: - resolution: {integrity: sha512-R0PRW5X8VDJzpHPhtOGkcPFrcetDOYz9q//4uqvdtdKtngrp4goz2cVNEmnbXJDMUm5VHSYy2GW6YtsjWUxbkA==, tarball: https://registry.npmmirror.com/@wdio/mocha-framework/-/mocha-framework-8.27.2.tgz} - name: '@wdio/mocha-framework' - version: 8.27.2 - engines: {node: ^16.13 || >=18} - dependencies: - '@types/mocha': registry.npmmirror.com/@types/mocha@10.0.4 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 - '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 - mocha: registry.npmmirror.com/mocha@10.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@wdio/protocols@8.24.12: - resolution: {integrity: sha512-QnVj3FkapmVD3h2zoZk+ZQ8gevSj9D9MiIQIy8eOnY4FAneYZ9R9GvoW+mgNcCZO8S8++S/jZHetR8n+8Q808g==, tarball: https://registry.npmmirror.com/@wdio/protocols/-/protocols-8.24.12.tgz} - name: '@wdio/protocols' - version: 8.24.12 - dev: true - - registry.npmmirror.com/@wdio/repl@8.24.12: - resolution: {integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==, tarball: https://registry.npmmirror.com/@wdio/repl/-/repl-8.24.12.tgz} - name: '@wdio/repl' - version: 8.24.12 - engines: {node: ^16.13 || >=18} - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - dev: true - - registry.npmmirror.com/@wdio/reporter@8.27.2: - resolution: {integrity: sha512-vMhoTVsowDmk6EXYgJ4nFBd6vvMFLIO3zUL4w/DCCkPDyjS9/6ggs/wpVSlrKxw9qisAph1Z4W9ngtNuhQQuwg==, tarball: https://registry.npmmirror.com/@wdio/reporter/-/reporter-8.27.2.tgz} - name: '@wdio/reporter' - version: 8.27.2 - engines: {node: ^16.13 || >=18} - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 - diff: registry.npmmirror.com/diff@5.1.0 - object-inspect: registry.npmmirror.com/object-inspect@1.13.1 - dev: true - - registry.npmmirror.com/@wdio/runner@8.27.2(typescript@5.1.6): - resolution: {integrity: sha512-a72dJ+7ap0DOrkrjx1ofYHzgDYzK0I7RjSGOEvi2cc+SwnwESHnwtPug5F3NfDFEMXV3Y3pN+E/yz81S27WpvQ==, tarball: https://registry.npmmirror.com/@wdio/runner/-/runner-8.27.2.tgz} - id: registry.npmmirror.com/@wdio/runner/8.27.2 - name: '@wdio/runner' - version: 8.27.2 - engines: {node: ^16.13 || >=18} - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 - '@wdio/globals': registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 - '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 - deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 - expect-webdriverio: registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6) - gaze: registry.npmmirror.com/gaze@1.1.3 - webdriver: registry.npmmirror.com/webdriver@8.27.2 - webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) - transitivePeerDependencies: - - bufferutil - - devtools - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/@wdio/spec-reporter@8.27.2: - resolution: {integrity: sha512-2U1MALAHjUqDo3C+PYinN1wAnDBiy+kLG3GrTpMeIWZ2qZ6m1fRWt9GlADX7r07vhiRqShxy131nUenqeoF/qg==, tarball: https://registry.npmmirror.com/@wdio/spec-reporter/-/spec-reporter-8.27.2.tgz} - name: '@wdio/spec-reporter' - version: 8.27.2 - engines: {node: ^16.13 || >=18} - dependencies: - '@wdio/reporter': registry.npmmirror.com/@wdio/reporter@8.27.2 - '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 - chalk: registry.npmmirror.com/chalk@5.3.0 - easy-table: registry.npmmirror.com/easy-table@1.2.0 - pretty-ms: registry.npmmirror.com/pretty-ms@7.0.1 - dev: true - - registry.npmmirror.com/@wdio/types@8.27.2: - resolution: {integrity: sha512-z/TtSQysEtAUNh+DooOs22G7xotTsJC2RcIZKaVtHY4Gl6lF+tn8kLRXD79jem2ta1byB1TpW62K366k1vzcLw==, tarball: https://registry.npmmirror.com/@wdio/types/-/types-8.27.2.tgz} - name: '@wdio/types' - version: 8.27.2 - engines: {node: ^16.13 || >=18} - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - dev: true - - registry.npmmirror.com/@wdio/utils@8.27.2: - resolution: {integrity: sha512-jWxUhGjlZ4L3uOsP96oLKWjkITpoH/KPTtKzU7xdoVGhd1LXK4d/Fr8cTFTNkDBXM7yuM7C+EMmQ8HJHR55KTA==, tarball: https://registry.npmmirror.com/@wdio/utils/-/utils-8.27.2.tgz} - name: '@wdio/utils' - version: 8.27.2 - engines: {node: ^16.13 || >=18} - dependencies: - '@puppeteer/browsers': registry.npmmirror.com/@puppeteer/browsers@1.8.0 - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 - decamelize: registry.npmmirror.com/decamelize@6.0.0 - deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 - edgedriver: registry.npmmirror.com/edgedriver@5.3.8 - geckodriver: registry.npmmirror.com/geckodriver@4.2.1 - get-port: registry.npmmirror.com/get-port@7.0.0 - import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 - locate-app: registry.npmmirror.com/locate-app@2.1.0 - safaridriver: registry.npmmirror.com/safaridriver@0.1.0 - split2: registry.npmmirror.com/split2@4.2.0 - wait-port: registry.npmmirror.com/wait-port@1.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, tarball: https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz} - name: abab - version: 2.0.6 - deprecated: Use your platform's native atob() and btoa() methods instead - dev: true - - registry.npmmirror.com/acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==, tarball: https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz} - name: acorn-globals - version: 7.0.1 - dependencies: - acorn: registry.npmmirror.com/acorn@8.11.2 - acorn-walk: registry.npmmirror.com/acorn-walk@8.3.0 - dev: true - - registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.11.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, tarball: https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz} - id: registry.npmmirror.com/acorn-jsx/5.3.2 - name: acorn-jsx - version: 5.3.2 - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: registry.npmmirror.com/acorn@8.11.2 - dev: true - - registry.npmmirror.com/acorn-walk@8.3.0: - resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==, tarball: https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.0.tgz} - name: acorn-walk - version: 8.3.0 - engines: {node: '>=0.4.0'} - dev: true - - registry.npmmirror.com/acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, tarball: https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz} - name: acorn - version: 8.11.2 - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - registry.npmmirror.com/agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, tarball: https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz} - name: agent-base - version: 6.0.2 - engines: {node: '>= 6.0.0'} - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==, tarball: https://registry.npmmirror.com/agent-base/-/agent-base-7.1.0.tgz} - name: agent-base - version: 7.1.0 - engines: {node: '>= 14'} - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, tarball: https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz} - name: ajv - version: 6.12.6 - dependencies: - fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 - fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify@2.1.0 - json-schema-traverse: registry.npmmirror.com/json-schema-traverse@0.4.1 - uri-js: registry.npmmirror.com/uri-js@4.4.1 - dev: true - - registry.npmmirror.com/ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==, tarball: https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz} - name: ansi-colors - version: 4.1.1 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, tarball: https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz} - name: ansi-escapes - version: 4.3.2 - engines: {node: '>=8'} - dependencies: - type-fest: registry.npmmirror.com/type-fest@0.21.3 - dev: true - - registry.npmmirror.com/ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz} - name: ansi-regex - version: 5.0.1 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz} - name: ansi-regex - version: 6.0.1 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz} - name: ansi-styles - version: 3.2.1 - engines: {node: '>=4'} - dependencies: - color-convert: registry.npmmirror.com/color-convert@1.9.3 - dev: true - - registry.npmmirror.com/ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz} - name: ansi-styles - version: 4.3.0 - engines: {node: '>=8'} - dependencies: - color-convert: registry.npmmirror.com/color-convert@2.0.1 - dev: true - - registry.npmmirror.com/ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz} - name: ansi-styles - version: 5.2.0 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz} - name: ansi-styles - version: 6.2.1 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, tarball: https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz} - name: anymatch - version: 3.1.3 - engines: {node: '>= 8'} - dependencies: - normalize-path: registry.npmmirror.com/normalize-path@3.0.0 - picomatch: registry.npmmirror.com/picomatch@2.3.1 - dev: true - - registry.npmmirror.com/archiver-utils@4.0.1: - resolution: {integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==, tarball: https://registry.npmmirror.com/archiver-utils/-/archiver-utils-4.0.1.tgz} - name: archiver-utils - version: 4.0.1 - engines: {node: '>= 12.0.0'} - dependencies: - glob: registry.npmmirror.com/glob@8.1.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - lazystream: registry.npmmirror.com/lazystream@1.0.1 - lodash: registry.npmmirror.com/lodash@4.17.21 - normalize-path: registry.npmmirror.com/normalize-path@3.0.0 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - dev: true - - registry.npmmirror.com/archiver@6.0.1: - resolution: {integrity: sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==, tarball: https://registry.npmmirror.com/archiver/-/archiver-6.0.1.tgz} - name: archiver - version: 6.0.1 - engines: {node: '>= 12.0.0'} - dependencies: - archiver-utils: registry.npmmirror.com/archiver-utils@4.0.1 - async: registry.npmmirror.com/async@3.2.5 - buffer-crc32: registry.npmmirror.com/buffer-crc32@0.2.13 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - readdir-glob: registry.npmmirror.com/readdir-glob@1.1.3 - tar-stream: registry.npmmirror.com/tar-stream@3.1.6 - zip-stream: registry.npmmirror.com/zip-stream@5.0.1 - dev: true - - registry.npmmirror.com/argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, tarball: https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz} - name: argparse - version: 1.0.10 - dependencies: - sprintf-js: registry.npmmirror.com/sprintf-js@1.0.3 - dev: true - - registry.npmmirror.com/argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, tarball: https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz} - name: argparse - version: 2.0.1 - dev: true - - registry.npmmirror.com/aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==, tarball: https://registry.npmmirror.com/aria-query/-/aria-query-5.1.3.tgz} - name: aria-query - version: 5.1.3 - dependencies: - deep-equal: registry.npmmirror.com/deep-equal@2.2.1 - dev: true - - registry.npmmirror.com/array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==, tarball: https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz} - name: array-buffer-byte-length - version: 1.0.0 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - is-array-buffer: registry.npmmirror.com/is-array-buffer@3.0.2 - dev: true - - registry.npmmirror.com/array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, tarball: https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz} - name: array-union - version: 2.1.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, tarball: https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz} - name: assertion-error - version: 1.1.0 - dev: true - - registry.npmmirror.com/ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==, tarball: https://registry.npmmirror.com/ast-types/-/ast-types-0.13.4.tgz} - name: ast-types - version: 0.13.4 - engines: {node: '>=4'} - dependencies: - tslib: registry.npmmirror.com/tslib@2.6.1 - dev: true - - registry.npmmirror.com/async-exit-hook@2.0.1: - resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==, tarball: https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz} - name: async-exit-hook - version: 2.0.1 - engines: {node: '>=0.12.0'} - dev: true - - registry.npmmirror.com/async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==, tarball: https://registry.npmmirror.com/async/-/async-3.2.5.tgz} - name: async - version: 3.2.5 - dev: true - - registry.npmmirror.com/asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, tarball: https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz} - name: asynckit - version: 0.4.0 - dev: true - - registry.npmmirror.com/available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, tarball: https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz} - name: available-typed-arrays - version: 1.0.5 - engines: {node: '>= 0.4'} - dev: true - - registry.npmmirror.com/b4a@1.6.4: - resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==, tarball: https://registry.npmmirror.com/b4a/-/b4a-1.6.4.tgz} - name: b4a - version: 1.6.4 - dev: true - - registry.npmmirror.com/babel-jest@29.7.0(@babel/core@7.23.3): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==, tarball: https://registry.npmmirror.com/babel-jest/-/babel-jest-29.7.0.tgz} - id: registry.npmmirror.com/babel-jest/29.7.0 - name: babel-jest - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 - '@types/babel__core': registry.npmmirror.com/@types/babel__core@7.20.4 - babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul@6.1.1 - babel-preset-jest: registry.npmmirror.com/babel-preset-jest@29.6.3(@babel/core@7.23.3) - chalk: registry.npmmirror.com/chalk@4.1.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - slash: registry.npmmirror.com/slash@3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, tarball: https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz} - name: babel-plugin-istanbul - version: 6.1.1 - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - '@istanbuljs/load-nyc-config': registry.npmmirror.com/@istanbuljs/load-nyc-config@1.1.0 - '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 - istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument@5.2.1 - test-exclude: registry.npmmirror.com/test-exclude@6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==, tarball: https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz} - name: babel-plugin-jest-hoist - version: 29.6.3 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - '@types/babel__core': registry.npmmirror.com/@types/babel__core@7.20.4 - '@types/babel__traverse': registry.npmmirror.com/@types/babel__traverse@7.20.4 - dev: true - - registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, tarball: https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz} - id: registry.npmmirror.com/babel-preset-current-node-syntax/1.0.1 - name: babel-preset-current-node-syntax - version: 1.0.1 - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/plugin-syntax-async-generators': registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3) - '@babel/plugin-syntax-bigint': registry.npmmirror.com/@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-class-properties': registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3) - '@babel/plugin-syntax-import-meta': registry.npmmirror.com/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3) - '@babel/plugin-syntax-json-strings': registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-logical-assignment-operators': registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3) - '@babel/plugin-syntax-nullish-coalescing-operator': registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-numeric-separator': registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3) - '@babel/plugin-syntax-object-rest-spread': registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-optional-catch-binding': registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-optional-chaining': registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3) - '@babel/plugin-syntax-top-level-await': registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3) - dev: true - - registry.npmmirror.com/babel-preset-jest@29.6.3(@babel/core@7.23.3): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==, tarball: https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz} - id: registry.npmmirror.com/babel-preset-jest/29.6.3 - name: babel-preset-jest - version: 29.6.3 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - babel-plugin-jest-hoist: registry.npmmirror.com/babel-plugin-jest-hoist@29.6.3 - babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3) - dev: true - - registry.npmmirror.com/balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, tarball: https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz} - name: balanced-match - version: 1.0.2 - dev: true - - registry.npmmirror.com/base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, tarball: https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz} - name: base64-js - version: 1.5.1 - dev: true - - registry.npmmirror.com/basic-ftp@5.0.3: - resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==, tarball: https://registry.npmmirror.com/basic-ftp/-/basic-ftp-5.0.3.tgz} - name: basic-ftp - version: 5.0.3 - engines: {node: '>=10.0.0'} - dev: true - - registry.npmmirror.com/big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==, tarball: https://registry.npmmirror.com/big-integer/-/big-integer-1.6.51.tgz} - name: big-integer - version: 1.6.51 - engines: {node: '>=0.6'} - dev: true - - registry.npmmirror.com/binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, tarball: https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz} - name: binary-extensions - version: 2.2.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/binary@0.3.0: - resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==, tarball: https://registry.npmmirror.com/binary/-/binary-0.3.0.tgz} - name: binary - version: 0.3.0 - dependencies: - buffers: registry.npmmirror.com/buffers@0.1.1 - chainsaw: registry.npmmirror.com/chainsaw@0.1.0 - dev: true - - registry.npmmirror.com/bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, tarball: https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz} - name: bl - version: 4.1.0 - dependencies: - buffer: registry.npmmirror.com/buffer@5.7.1 - inherits: registry.npmmirror.com/inherits@2.0.4 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - dev: true - - registry.npmmirror.com/bluebird@3.4.7: - resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==, tarball: https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz} - name: bluebird - version: 3.4.7 - dev: true - - registry.npmmirror.com/brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz} - name: brace-expansion - version: 1.1.11 - dependencies: - balanced-match: registry.npmmirror.com/balanced-match@1.0.2 - concat-map: registry.npmmirror.com/concat-map@0.0.1 - dev: true - - registry.npmmirror.com/brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz} - name: brace-expansion - version: 2.0.1 - dependencies: - balanced-match: registry.npmmirror.com/balanced-match@1.0.2 - dev: true - - registry.npmmirror.com/braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, tarball: https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz} - name: braces - version: 3.0.2 - engines: {node: '>=8'} - dependencies: - fill-range: registry.npmmirror.com/fill-range@7.0.1 - dev: true - - registry.npmmirror.com/browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==, tarball: https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz} - name: browser-stdout - version: 1.3.1 - dev: true - - registry.npmmirror.com/browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==, tarball: https://registry.npmmirror.com/browserslist/-/browserslist-4.22.1.tgz} - name: browserslist - version: 4.22.1 - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: registry.npmmirror.com/caniuse-lite@1.0.30001561 - electron-to-chromium: registry.npmmirror.com/electron-to-chromium@1.4.581 - node-releases: registry.npmmirror.com/node-releases@2.0.14 - update-browserslist-db: registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1) - dev: true - - registry.npmmirror.com/bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, tarball: https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz} - name: bser - version: 2.1.1 - dependencies: - node-int64: registry.npmmirror.com/node-int64@0.4.0 - dev: true - - registry.npmmirror.com/buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==, tarball: https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz} - name: buffer-crc32 - version: 0.2.13 - dev: true - - registry.npmmirror.com/buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, tarball: https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz} - name: buffer-from - version: 1.1.2 - dev: true - - registry.npmmirror.com/buffer-indexof-polyfill@1.0.2: - resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==, tarball: https://registry.npmmirror.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz} - name: buffer-indexof-polyfill - version: 1.0.2 - engines: {node: '>=0.10'} - dev: true - - registry.npmmirror.com/buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, tarball: https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz} - name: buffer - version: 5.7.1 - dependencies: - base64-js: registry.npmmirror.com/base64-js@1.5.1 - ieee754: registry.npmmirror.com/ieee754@1.2.1 - dev: true - - registry.npmmirror.com/buffers@0.1.1: - resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==, tarball: https://registry.npmmirror.com/buffers/-/buffers-0.1.1.tgz} - name: buffers - version: 0.1.1 - engines: {node: '>=0.2.0'} - dev: true - - registry.npmmirror.com/cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==, tarball: https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz} - name: cacheable-lookup - version: 7.0.0 - engines: {node: '>=14.16'} - dev: true - - registry.npmmirror.com/cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==, tarball: https://registry.npmmirror.com/cacheable-request/-/cacheable-request-10.2.14.tgz} - name: cacheable-request - version: 10.2.14 - engines: {node: '>=14.16'} - dependencies: - '@types/http-cache-semantics': registry.npmmirror.com/@types/http-cache-semantics@4.0.4 - get-stream: registry.npmmirror.com/get-stream@6.0.1 - http-cache-semantics: registry.npmmirror.com/http-cache-semantics@4.1.1 - keyv: registry.npmmirror.com/keyv@4.5.4 - mimic-response: registry.npmmirror.com/mimic-response@4.0.0 - normalize-url: registry.npmmirror.com/normalize-url@8.0.0 - responselike: registry.npmmirror.com/responselike@3.0.0 - dev: true - - registry.npmmirror.com/call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==, tarball: https://registry.npmmirror.com/call-bind/-/call-bind-1.0.5.tgz} - name: call-bind - version: 1.0.5 - dependencies: - function-bind: registry.npmmirror.com/function-bind@1.1.2 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - set-function-length: registry.npmmirror.com/set-function-length@1.1.1 - dev: true - - registry.npmmirror.com/callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, tarball: https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz} - name: callsites - version: 3.1.0 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz} - name: camelcase - version: 5.3.1 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz} - name: camelcase - version: 6.3.0 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/caniuse-lite@1.0.30001561: - resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==, tarball: https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz} - name: caniuse-lite - version: 1.0.30001561 - dev: true - - registry.npmmirror.com/chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==, tarball: https://registry.npmmirror.com/chai/-/chai-4.3.10.tgz} - name: chai - version: 4.3.10 - engines: {node: '>=4'} - dependencies: - assertion-error: registry.npmmirror.com/assertion-error@1.1.0 - check-error: registry.npmmirror.com/check-error@1.0.3 - deep-eql: registry.npmmirror.com/deep-eql@4.1.3 - get-func-name: registry.npmmirror.com/get-func-name@2.0.2 - loupe: registry.npmmirror.com/loupe@2.3.7 - pathval: registry.npmmirror.com/pathval@1.1.1 - type-detect: registry.npmmirror.com/type-detect@4.0.8 - dev: true - - registry.npmmirror.com/chainsaw@0.1.0: - resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==, tarball: https://registry.npmmirror.com/chainsaw/-/chainsaw-0.1.0.tgz} - name: chainsaw - version: 0.1.0 - dependencies: - traverse: registry.npmmirror.com/traverse@0.3.9 - dev: true - - registry.npmmirror.com/chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, tarball: https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz} - name: chalk - version: 2.4.2 - engines: {node: '>=4'} - dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles@3.2.1 - escape-string-regexp: registry.npmmirror.com/escape-string-regexp@1.0.5 - supports-color: registry.npmmirror.com/supports-color@5.5.0 - dev: true - - registry.npmmirror.com/chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, tarball: https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz} - name: chalk - version: 4.1.2 - engines: {node: '>=10'} - dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 - supports-color: registry.npmmirror.com/supports-color@7.2.0 - dev: true - - registry.npmmirror.com/chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, tarball: https://registry.npmmirror.com/chalk/-/chalk-5.3.0.tgz} - name: chalk - version: 5.3.0 - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - registry.npmmirror.com/char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, tarball: https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz} - name: char-regex - version: 1.0.2 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, tarball: https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz} - name: chardet - version: 0.7.0 - dev: true - - registry.npmmirror.com/chart.js@4.4.1: - resolution: {integrity: sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==, tarball: https://registry.npmmirror.com/chart.js/-/chart.js-4.4.1.tgz} - name: chart.js - version: 4.4.1 - engines: {pnpm: '>=7'} - dependencies: - '@kurkle/color': registry.npmmirror.com/@kurkle/color@0.3.2 - dev: false - - registry.npmmirror.com/check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, tarball: https://registry.npmmirror.com/check-error/-/check-error-1.0.3.tgz} - name: check-error - version: 1.0.3 - dependencies: - get-func-name: registry.npmmirror.com/get-func-name@2.0.2 - dev: true - - registry.npmmirror.com/chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz} - name: chokidar - version: 3.5.3 - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: registry.npmmirror.com/anymatch@3.1.3 - braces: registry.npmmirror.com/braces@3.0.2 - glob-parent: registry.npmmirror.com/glob-parent@5.1.2 - is-binary-path: registry.npmmirror.com/is-binary-path@2.1.0 - is-glob: registry.npmmirror.com/is-glob@4.0.3 - normalize-path: registry.npmmirror.com/normalize-path@3.0.0 - readdirp: registry.npmmirror.com/readdirp@3.6.0 - optionalDependencies: - fsevents: registry.npmmirror.com/fsevents@2.3.3 - dev: true - - registry.npmmirror.com/chromium-bidi@0.4.16(devtools-protocol@0.0.1147663): - resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==, tarball: https://registry.npmmirror.com/chromium-bidi/-/chromium-bidi-0.4.16.tgz} - id: registry.npmmirror.com/chromium-bidi/0.4.16 - name: chromium-bidi - version: 0.4.16 - peerDependencies: - devtools-protocol: '*' - dependencies: - devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1147663 - mitt: registry.npmmirror.com/mitt@3.0.0 - dev: true - - registry.npmmirror.com/ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, tarball: https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz} - name: ci-info - version: 3.9.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/cjs-module-lexer@1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==, tarball: https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz} - name: cjs-module-lexer - version: 1.2.2 - dev: true - - registry.npmmirror.com/cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, tarball: https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz} - name: cli-cursor - version: 3.1.0 - engines: {node: '>=8'} - dependencies: - restore-cursor: registry.npmmirror.com/restore-cursor@3.1.0 - dev: true - - registry.npmmirror.com/cli-spinners@2.9.1: - resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==, tarball: https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.1.tgz} - name: cli-spinners - version: 2.9.1 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==, tarball: https://registry.npmmirror.com/cli-width/-/cli-width-4.1.0.tgz} - name: cli-width - version: 4.1.0 - engines: {node: '>= 12'} - dev: true - - registry.npmmirror.com/cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, tarball: https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz} - name: cliui - version: 7.0.4 - dependencies: - string-width: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 - dev: true - - registry.npmmirror.com/cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, tarball: https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz} - name: cliui - version: 8.0.1 - engines: {node: '>=12'} - dependencies: - string-width: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 - dev: true - - registry.npmmirror.com/clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, tarball: https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz} - name: clone - version: 1.0.4 - engines: {node: '>=0.8'} - requiresBuild: true - dev: true - - registry.npmmirror.com/co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, tarball: https://registry.npmmirror.com/co/-/co-4.6.0.tgz} - name: co - version: 4.6.0 - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - registry.npmmirror.com/collect-v8-coverage@1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==, tarball: https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz} - name: collect-v8-coverage - version: 1.0.1 - dev: true - - registry.npmmirror.com/color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz} - name: color-convert - version: 1.9.3 - dependencies: - color-name: registry.npmmirror.com/color-name@1.1.3 - dev: true - - registry.npmmirror.com/color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz} - name: color-convert - version: 2.0.1 - engines: {node: '>=7.0.0'} - dependencies: - color-name: registry.npmmirror.com/color-name@1.1.4 - dev: true - - registry.npmmirror.com/color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz} - name: color-name - version: 1.1.3 - dev: true - - registry.npmmirror.com/color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz} - name: color-name - version: 1.1.4 - dev: true - - registry.npmmirror.com/combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, tarball: https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz} - name: combined-stream - version: 1.0.8 - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: registry.npmmirror.com/delayed-stream@1.0.0 - dev: true - - registry.npmmirror.com/commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, tarball: https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz} - name: commander - version: 9.5.0 - engines: {node: ^12.20.0 || >=14} - dev: true - - registry.npmmirror.com/compress-commons@5.0.1: - resolution: {integrity: sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==, tarball: https://registry.npmmirror.com/compress-commons/-/compress-commons-5.0.1.tgz} - name: compress-commons - version: 5.0.1 - engines: {node: '>= 12.0.0'} - dependencies: - crc-32: registry.npmmirror.com/crc-32@1.2.2 - crc32-stream: registry.npmmirror.com/crc32-stream@5.0.0 - normalize-path: registry.npmmirror.com/normalize-path@3.0.0 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - dev: true - - registry.npmmirror.com/concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, tarball: https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz} - name: concat-map - version: 0.0.1 - dev: true - - registry.npmmirror.com/convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz} - name: convert-source-map - version: 2.0.0 - dev: true - - registry.npmmirror.com/core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, tarball: https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz} - name: core-util-is - version: 1.0.3 - dev: true - - registry.npmmirror.com/crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, tarball: https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz} - name: crc-32 - version: 1.2.2 - engines: {node: '>=0.8'} - hasBin: true - dev: true - - registry.npmmirror.com/crc32-stream@5.0.0: - resolution: {integrity: sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==, tarball: https://registry.npmmirror.com/crc32-stream/-/crc32-stream-5.0.0.tgz} - name: crc32-stream - version: 5.0.0 - engines: {node: '>= 12.0.0'} - dependencies: - crc-32: registry.npmmirror.com/crc-32@1.2.2 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - dev: true - - registry.npmmirror.com/create-jest@29.7.0(@types/node@20.11.0): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==, tarball: https://registry.npmmirror.com/create-jest/-/create-jest-29.7.0.tgz} - id: registry.npmmirror.com/create-jest/29.7.0 - name: create-jest - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - dependencies: - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - chalk: registry.npmmirror.com/chalk@4.1.2 - exit: registry.npmmirror.com/exit@0.1.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) - jest-util: registry.npmmirror.com/jest-util@29.7.0 - prompts: registry.npmmirror.com/prompts@2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - registry.npmmirror.com/cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==, tarball: https://registry.npmmirror.com/cross-fetch/-/cross-fetch-4.0.0.tgz} - name: cross-fetch - version: 4.0.0 - dependencies: - node-fetch: registry.npmmirror.com/node-fetch@2.7.0 - transitivePeerDependencies: - - encoding - dev: true - - registry.npmmirror.com/cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, tarball: https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz} - name: cross-spawn - version: 7.0.3 - engines: {node: '>= 8'} - dependencies: - path-key: registry.npmmirror.com/path-key@3.1.1 - shebang-command: registry.npmmirror.com/shebang-command@2.0.0 - which: registry.npmmirror.com/which@2.0.2 - dev: true - - registry.npmmirror.com/css-shorthand-properties@1.1.1: - resolution: {integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==, tarball: https://registry.npmmirror.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz} - name: css-shorthand-properties - version: 1.1.1 - dev: true - - registry.npmmirror.com/css-value@0.0.1: - resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==, tarball: https://registry.npmmirror.com/css-value/-/css-value-0.0.1.tgz} - name: css-value - version: 0.0.1 - dev: true - - registry.npmmirror.com/cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==, tarball: https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz} - name: cssom - version: 0.3.8 - dev: true - - registry.npmmirror.com/cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==, tarball: https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz} - name: cssom - version: 0.5.0 - dev: true - - registry.npmmirror.com/cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==, tarball: https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz} - name: cssstyle - version: 2.3.0 - engines: {node: '>=8'} - dependencies: - cssom: registry.npmmirror.com/cssom@0.3.8 - dev: true - - registry.npmmirror.com/data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, tarball: https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz} - name: data-uri-to-buffer - version: 4.0.1 - engines: {node: '>= 12'} - dev: true - - registry.npmmirror.com/data-uri-to-buffer@6.0.1: - resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==, tarball: https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz} - name: data-uri-to-buffer - version: 6.0.1 - engines: {node: '>= 14'} - dev: true - - registry.npmmirror.com/data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==, tarball: https://registry.npmmirror.com/data-urls/-/data-urls-3.0.2.tgz} - name: data-urls - version: 3.0.2 - engines: {node: '>=12'} - dependencies: - abab: registry.npmmirror.com/abab@2.0.6 - whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype@3.0.0 - whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0 - dev: true - - registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, tarball: https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz} - id: registry.npmmirror.com/debug/4.3.4 - name: debug - version: 4.3.4 - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: + + registry.npmmirror.com/@esbuild/linux-loong64@0.19.11: + resolution: + { + integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==, + tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz, + } + name: "@esbuild/linux-loong64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - ms: registry.npmmirror.com/ms@2.1.2 - supports-color: registry.npmmirror.com/supports-color@8.1.1 - dev: true - - registry.npmmirror.com/decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==, tarball: https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz} - name: decamelize - version: 4.0.0 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/decamelize@6.0.0: - resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==, tarball: https://registry.npmmirror.com/decamelize/-/decamelize-6.0.0.tgz} - name: decamelize - version: 6.0.0 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - registry.npmmirror.com/decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, tarball: https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz} - name: decimal.js - version: 10.4.3 - dev: true - - registry.npmmirror.com/decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, tarball: https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz} - name: decompress-response - version: 6.0.0 - engines: {node: '>=10'} - dependencies: - mimic-response: registry.npmmirror.com/mimic-response@3.1.0 - dev: true - - registry.npmmirror.com/dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==, tarball: https://registry.npmmirror.com/dedent/-/dedent-1.5.1.tgz} - name: dedent - version: 1.5.1 - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: + + registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11: + resolution: + { + integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==, + tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz, + } + name: "@esbuild/linux-mips64el" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true optional: true - dev: true - - registry.npmmirror.com/deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==, tarball: https://registry.npmmirror.com/deep-eql/-/deep-eql-4.1.3.tgz} - name: deep-eql - version: 4.1.3 - engines: {node: '>=6'} - dependencies: - type-detect: registry.npmmirror.com/type-detect@4.0.8 - dev: true - - registry.npmmirror.com/deep-equal@2.2.1: - resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==, tarball: https://registry.npmmirror.com/deep-equal/-/deep-equal-2.2.1.tgz} - name: deep-equal - version: 2.2.1 - dependencies: - array-buffer-byte-length: registry.npmmirror.com/array-buffer-byte-length@1.0.0 - call-bind: registry.npmmirror.com/call-bind@1.0.5 - es-get-iterator: registry.npmmirror.com/es-get-iterator@1.1.3 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - is-arguments: registry.npmmirror.com/is-arguments@1.1.1 - is-array-buffer: registry.npmmirror.com/is-array-buffer@3.0.2 - is-date-object: registry.npmmirror.com/is-date-object@1.0.5 - is-regex: registry.npmmirror.com/is-regex@1.1.4 - is-shared-array-buffer: registry.npmmirror.com/is-shared-array-buffer@1.0.2 - isarray: registry.npmmirror.com/isarray@2.0.5 - object-is: registry.npmmirror.com/object-is@1.1.5 - object-keys: registry.npmmirror.com/object-keys@1.1.1 - object.assign: registry.npmmirror.com/object.assign@4.1.5 - regexp.prototype.flags: registry.npmmirror.com/regexp.prototype.flags@1.5.0 - side-channel: registry.npmmirror.com/side-channel@1.0.4 - which-boxed-primitive: registry.npmmirror.com/which-boxed-primitive@1.0.2 - which-collection: registry.npmmirror.com/which-collection@1.0.1 - which-typed-array: registry.npmmirror.com/which-typed-array@1.1.13 - dev: true - - registry.npmmirror.com/deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, tarball: https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz} - name: deep-is - version: 0.1.4 - dev: true - - registry.npmmirror.com/deepcopy@2.1.0: - resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==, tarball: https://registry.npmmirror.com/deepcopy/-/deepcopy-2.1.0.tgz} - name: deepcopy - version: 2.1.0 - dependencies: - type-detect: registry.npmmirror.com/type-detect@4.0.8 - dev: true - - registry.npmmirror.com/deepmerge-ts@5.1.0: - resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==, tarball: https://registry.npmmirror.com/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz} - name: deepmerge-ts - version: 5.1.0 - engines: {node: '>=16.0.0'} - dev: true - - registry.npmmirror.com/deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, tarball: https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz} - name: deepmerge - version: 4.3.1 - engines: {node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, tarball: https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz} - name: defaults - version: 1.0.4 - requiresBuild: true - dependencies: - clone: registry.npmmirror.com/clone@1.0.4 - dev: true - - registry.npmmirror.com/defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, tarball: https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz} - name: defer-to-connect - version: 2.0.1 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==, tarball: https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.1.tgz} - name: define-data-property - version: 1.1.1 - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - gopd: registry.npmmirror.com/gopd@1.0.1 - has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 - dev: true - - registry.npmmirror.com/define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, tarball: https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz} - name: define-properties - version: 1.2.1 - engines: {node: '>= 0.4'} - dependencies: - define-data-property: registry.npmmirror.com/define-data-property@1.1.1 - has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 - object-keys: registry.npmmirror.com/object-keys@1.1.1 - dev: true - - registry.npmmirror.com/degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==, tarball: https://registry.npmmirror.com/degenerator/-/degenerator-5.0.1.tgz} - name: degenerator - version: 5.0.1 - engines: {node: '>= 14'} - dependencies: - ast-types: registry.npmmirror.com/ast-types@0.13.4 - escodegen: registry.npmmirror.com/escodegen@2.1.0 - esprima: registry.npmmirror.com/esprima@4.0.1 - dev: true - - registry.npmmirror.com/delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, tarball: https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz} - name: delayed-stream - version: 1.0.0 - engines: {node: '>=0.4.0'} - dev: true - - registry.npmmirror.com/detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, tarball: https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz} - name: detect-newline - version: 3.1.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/devtools-protocol@0.0.1147663: - resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==, tarball: https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz} - name: devtools-protocol - version: 0.0.1147663 - dev: true - - registry.npmmirror.com/devtools-protocol@0.0.1239539: - resolution: {integrity: sha512-uS7hZVqZxGyZwR8lX/8wWyNLGEYs1wWWxN7qeRC+wBZ4VM5JXYwCJg8hofEna5yX0W2cavpjHOE4ukHXLHlEaA==, tarball: https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1239539.tgz} - name: devtools-protocol - version: 0.0.1239539 - dev: true - - registry.npmmirror.com/diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, tarball: https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz} - name: diff-sequences - version: 29.6.3 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - registry.npmmirror.com/diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==, tarball: https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz} - name: diff - version: 5.0.0 - engines: {node: '>=0.3.1'} - dev: true - - registry.npmmirror.com/diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==, tarball: https://registry.npmmirror.com/diff/-/diff-5.1.0.tgz} - name: diff - version: 5.1.0 - engines: {node: '>=0.3.1'} - dev: true - - registry.npmmirror.com/dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, tarball: https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz} - name: dir-glob - version: 3.0.1 - engines: {node: '>=8'} - dependencies: - path-type: registry.npmmirror.com/path-type@4.0.0 - dev: true - - registry.npmmirror.com/doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, tarball: https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz} - name: doctrine - version: 3.0.0 - engines: {node: '>=6.0.0'} - dependencies: - esutils: registry.npmmirror.com/esutils@2.0.3 - dev: true - - registry.npmmirror.com/domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==, tarball: https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz} - name: domexception - version: 4.0.0 - engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead - dependencies: - webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 - dev: true - - registry.npmmirror.com/dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, tarball: https://registry.npmmirror.com/dotenv/-/dotenv-16.3.1.tgz} - name: dotenv - version: 16.3.1 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, tarball: https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz} - name: duplexer2 - version: 0.1.4 - dependencies: - readable-stream: registry.npmmirror.com/readable-stream@2.3.8 - dev: true - - registry.npmmirror.com/eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, tarball: https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz} - name: eastasianwidth - version: 0.2.0 - dev: true - - registry.npmmirror.com/easy-table@1.2.0: - resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==, tarball: https://registry.npmmirror.com/easy-table/-/easy-table-1.2.0.tgz} - name: easy-table - version: 1.2.0 - dependencies: - ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 - optionalDependencies: - wcwidth: registry.npmmirror.com/wcwidth@1.0.1 - dev: true - - registry.npmmirror.com/edge-paths@3.0.5: - resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==, tarball: https://registry.npmmirror.com/edge-paths/-/edge-paths-3.0.5.tgz} - name: edge-paths - version: 3.0.5 - engines: {node: '>=14.0.0'} - dependencies: - '@types/which': registry.npmmirror.com/@types/which@2.0.2 - which: registry.npmmirror.com/which@2.0.2 - dev: true - - registry.npmmirror.com/edgedriver@5.3.8: - resolution: {integrity: sha512-FWLPDuwJDeGGgtmlqTXb4lQi/HV9yylLo1F9O1g9TLqSemA5T6xH28seUIfyleVirLFtDQyKNUxKsMhMT4IfnA==, tarball: https://registry.npmmirror.com/edgedriver/-/edgedriver-5.3.8.tgz} - name: edgedriver - version: 5.3.8 - hasBin: true - requiresBuild: true - dependencies: - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - decamelize: registry.npmmirror.com/decamelize@6.0.0 - edge-paths: registry.npmmirror.com/edge-paths@3.0.5 - node-fetch: registry.npmmirror.com/node-fetch@3.3.2 - unzipper: registry.npmmirror.com/unzipper@0.10.14 - which: registry.npmmirror.com/which@4.0.0 - dev: true - - registry.npmmirror.com/ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==, tarball: https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz} - name: ejs - version: 3.1.9 - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - jake: registry.npmmirror.com/jake@10.8.5 - dev: true - - registry.npmmirror.com/electron-to-chromium@1.4.581: - resolution: {integrity: sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==, tarball: https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz} - name: electron-to-chromium - version: 1.4.581 - dev: true - - registry.npmmirror.com/emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, tarball: https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz} - name: emittery - version: 0.13.1 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz} - name: emoji-regex - version: 8.0.0 - dev: true - - registry.npmmirror.com/emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz} - name: emoji-regex - version: 9.2.2 - dev: true - - registry.npmmirror.com/end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, tarball: https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz} - name: end-of-stream - version: 1.4.4 - dependencies: - once: registry.npmmirror.com/once@1.4.0 - dev: true - - registry.npmmirror.com/entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, tarball: https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz} - name: entities - version: 4.5.0 - engines: {node: '>=0.12'} - dev: true - - registry.npmmirror.com/error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, tarball: https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz} - name: error-ex - version: 1.3.2 - dependencies: - is-arrayish: registry.npmmirror.com/is-arrayish@0.2.1 - dev: true - - registry.npmmirror.com/es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==, tarball: https://registry.npmmirror.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz} - name: es-get-iterator - version: 1.1.3 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - has-symbols: registry.npmmirror.com/has-symbols@1.0.3 - is-arguments: registry.npmmirror.com/is-arguments@1.1.1 - is-map: registry.npmmirror.com/is-map@2.0.2 - is-set: registry.npmmirror.com/is-set@2.0.2 - is-string: registry.npmmirror.com/is-string@1.0.7 - isarray: registry.npmmirror.com/isarray@2.0.5 - stop-iteration-iterator: registry.npmmirror.com/stop-iteration-iterator@1.0.0 - dev: true - - registry.npmmirror.com/esbuild@0.19.11: - resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.19.11.tgz} - name: esbuild - version: 0.19.11 - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11 - '@esbuild/android-arm': registry.npmmirror.com/@esbuild/android-arm@0.19.11 - '@esbuild/android-arm64': registry.npmmirror.com/@esbuild/android-arm64@0.19.11 - '@esbuild/android-x64': registry.npmmirror.com/@esbuild/android-x64@0.19.11 - '@esbuild/darwin-arm64': registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11 - '@esbuild/darwin-x64': registry.npmmirror.com/@esbuild/darwin-x64@0.19.11 - '@esbuild/freebsd-arm64': registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11 - '@esbuild/freebsd-x64': registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11 - '@esbuild/linux-arm': registry.npmmirror.com/@esbuild/linux-arm@0.19.11 - '@esbuild/linux-arm64': registry.npmmirror.com/@esbuild/linux-arm64@0.19.11 - '@esbuild/linux-ia32': registry.npmmirror.com/@esbuild/linux-ia32@0.19.11 - '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64@0.19.11 - '@esbuild/linux-mips64el': registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11 - '@esbuild/linux-ppc64': registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11 - '@esbuild/linux-riscv64': registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11 - '@esbuild/linux-s390x': registry.npmmirror.com/@esbuild/linux-s390x@0.19.11 - '@esbuild/linux-x64': registry.npmmirror.com/@esbuild/linux-x64@0.19.11 - '@esbuild/netbsd-x64': registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11 - '@esbuild/openbsd-x64': registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11 - '@esbuild/sunos-x64': registry.npmmirror.com/@esbuild/sunos-x64@0.19.11 - '@esbuild/win32-arm64': registry.npmmirror.com/@esbuild/win32-arm64@0.19.11 - '@esbuild/win32-ia32': registry.npmmirror.com/@esbuild/win32-ia32@0.19.11 - '@esbuild/win32-x64': registry.npmmirror.com/@esbuild/win32-x64@0.19.11 - dev: true - - registry.npmmirror.com/escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, tarball: https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz} - name: escalade - version: 3.1.1 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz} - name: escape-string-regexp - version: 1.0.5 - engines: {node: '>=0.8.0'} - dev: true - - registry.npmmirror.com/escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz} - name: escape-string-regexp - version: 2.0.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz} - name: escape-string-regexp - version: 4.0.0 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz} - name: escape-string-regexp - version: 5.0.0 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, tarball: https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz} - name: escodegen - version: 2.1.0 - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: registry.npmmirror.com/esprima@4.0.1 - estraverse: registry.npmmirror.com/estraverse@5.3.0 - esutils: registry.npmmirror.com/esutils@2.0.3 - optionalDependencies: - source-map: registry.npmmirror.com/source-map@0.6.1 - dev: true - - registry.npmmirror.com/eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, tarball: https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz} - name: eslint-scope - version: 7.2.2 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: registry.npmmirror.com/esrecurse@4.3.0 - estraverse: registry.npmmirror.com/estraverse@5.3.0 - dev: true - - registry.npmmirror.com/eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, tarball: https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz} - name: eslint-visitor-keys - version: 3.4.3 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - registry.npmmirror.com/eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, tarball: https://registry.npmmirror.com/eslint/-/eslint-8.56.0.tgz} - name: eslint - version: 8.56.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': registry.npmmirror.com/@eslint-community/regexpp@4.10.0 - '@eslint/eslintrc': registry.npmmirror.com/@eslint/eslintrc@2.1.4 - '@eslint/js': registry.npmmirror.com/@eslint/js@8.56.0 - '@humanwhocodes/config-array': registry.npmmirror.com/@humanwhocodes/config-array@0.11.13 - '@humanwhocodes/module-importer': registry.npmmirror.com/@humanwhocodes/module-importer@1.0.1 - '@nodelib/fs.walk': registry.npmmirror.com/@nodelib/fs.walk@1.2.8 - '@ungap/structured-clone': registry.npmmirror.com/@ungap/structured-clone@1.2.0 - ajv: registry.npmmirror.com/ajv@6.12.6 - chalk: registry.npmmirror.com/chalk@4.1.2 - cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - doctrine: registry.npmmirror.com/doctrine@3.0.0 - escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 - eslint-scope: registry.npmmirror.com/eslint-scope@7.2.2 - eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 - espree: registry.npmmirror.com/espree@9.6.1 - esquery: registry.npmmirror.com/esquery@1.5.0 - esutils: registry.npmmirror.com/esutils@2.0.3 - fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 - file-entry-cache: registry.npmmirror.com/file-entry-cache@6.0.1 - find-up: registry.npmmirror.com/find-up@5.0.0 - glob-parent: registry.npmmirror.com/glob-parent@6.0.2 - globals: registry.npmmirror.com/globals@13.23.0 - graphemer: registry.npmmirror.com/graphemer@1.4.0 - ignore: registry.npmmirror.com/ignore@5.2.4 - imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 - is-glob: registry.npmmirror.com/is-glob@4.0.3 - is-path-inside: registry.npmmirror.com/is-path-inside@3.0.3 - js-yaml: registry.npmmirror.com/js-yaml@4.1.0 - json-stable-stringify-without-jsonify: registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1 - levn: registry.npmmirror.com/levn@0.4.1 - lodash.merge: registry.npmmirror.com/lodash.merge@4.6.2 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - natural-compare: registry.npmmirror.com/natural-compare@1.4.0 - optionator: registry.npmmirror.com/optionator@0.9.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - text-table: registry.npmmirror.com/text-table@0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, tarball: https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz} - name: espree - version: 9.6.1 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: registry.npmmirror.com/acorn@8.11.2 - acorn-jsx: registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.11.2) - eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 - dev: true - - registry.npmmirror.com/esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, tarball: https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz} - name: esprima - version: 4.0.1 - engines: {node: '>=4'} - hasBin: true - dev: true - - registry.npmmirror.com/esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, tarball: https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz} - name: esquery - version: 1.5.0 - engines: {node: '>=0.10'} - dependencies: - estraverse: registry.npmmirror.com/estraverse@5.3.0 - dev: true - - registry.npmmirror.com/esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, tarball: https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz} - name: esrecurse - version: 4.3.0 - engines: {node: '>=4.0'} - dependencies: - estraverse: registry.npmmirror.com/estraverse@5.3.0 - dev: true - - registry.npmmirror.com/estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, tarball: https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz} - name: estraverse - version: 5.3.0 - engines: {node: '>=4.0'} - dev: true - - registry.npmmirror.com/esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, tarball: https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz} - name: esutils - version: 2.0.3 - engines: {node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, tarball: https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz} - name: execa - version: 5.1.1 - engines: {node: '>=10'} - dependencies: - cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 - get-stream: registry.npmmirror.com/get-stream@6.0.1 - human-signals: registry.npmmirror.com/human-signals@2.1.0 - is-stream: registry.npmmirror.com/is-stream@2.0.1 - merge-stream: registry.npmmirror.com/merge-stream@2.0.0 - npm-run-path: registry.npmmirror.com/npm-run-path@4.0.1 - onetime: registry.npmmirror.com/onetime@5.1.2 - signal-exit: registry.npmmirror.com/signal-exit@3.0.7 - strip-final-newline: registry.npmmirror.com/strip-final-newline@2.0.0 - dev: true - - registry.npmmirror.com/execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, tarball: https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz} - name: execa - version: 8.0.1 - engines: {node: '>=16.17'} - dependencies: - cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 - get-stream: registry.npmmirror.com/get-stream@8.0.1 - human-signals: registry.npmmirror.com/human-signals@5.0.0 - is-stream: registry.npmmirror.com/is-stream@3.0.0 - merge-stream: registry.npmmirror.com/merge-stream@2.0.0 - npm-run-path: registry.npmmirror.com/npm-run-path@5.1.0 - onetime: registry.npmmirror.com/onetime@6.0.0 - signal-exit: registry.npmmirror.com/signal-exit@4.1.0 - strip-final-newline: registry.npmmirror.com/strip-final-newline@3.0.0 - dev: true - - registry.npmmirror.com/exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, tarball: https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz} - name: exit - version: 0.1.2 - engines: {node: '>= 0.8.0'} - dev: true - - registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6): - resolution: {integrity: sha512-JD5aboj/tCiMXdEPCpt3BA0xL3DBhNu1MoiOdBGT9LT+9COIXoDG6Ks6h5S4c4PNwLs6xSeU8s7XxFAmBPu45Q==, tarball: https://registry.npmmirror.com/expect-webdriverio/-/expect-webdriverio-4.8.1.tgz} - id: registry.npmmirror.com/expect-webdriverio/4.8.1 - name: expect-webdriverio - version: 4.8.1 - engines: {node: '>=16 || >=18 || >=20'} - dependencies: - expect: registry.npmmirror.com/expect@29.7.0 - jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 - lodash.isequal: registry.npmmirror.com/lodash.isequal@4.5.0 - optionalDependencies: - '@wdio/globals': registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) - transitivePeerDependencies: - - bufferutil - - devtools - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==, tarball: https://registry.npmmirror.com/expect/-/expect-29.7.0.tgz} - name: expect - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': registry.npmmirror.com/@jest/expect-utils@29.7.0 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - dev: true - - registry.npmmirror.com/external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, tarball: https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz} - name: external-editor - version: 3.1.0 - engines: {node: '>=4'} - dependencies: - chardet: registry.npmmirror.com/chardet@0.7.0 - iconv-lite: registry.npmmirror.com/iconv-lite@0.4.24 - tmp: registry.npmmirror.com/tmp@0.0.33 - dev: true - - registry.npmmirror.com/extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==, tarball: https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz} - name: extract-zip - version: 2.0.1 - engines: {node: '>= 10.17.0'} - hasBin: true - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - get-stream: registry.npmmirror.com/get-stream@5.2.0 - yauzl: registry.npmmirror.com/yauzl@2.10.0 - optionalDependencies: - '@types/yauzl': registry.npmmirror.com/@types/yauzl@2.10.3 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==, tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz} - name: fast-deep-equal - version: 2.0.1 - dev: true - - registry.npmmirror.com/fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz} - name: fast-deep-equal - version: 3.1.3 - dev: true - - registry.npmmirror.com/fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, tarball: https://registry.npmmirror.com/fast-fifo/-/fast-fifo-1.3.2.tgz} - name: fast-fifo - version: 1.3.2 - dev: true - - registry.npmmirror.com/fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, tarball: https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz} - name: fast-glob - version: 3.3.2 - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': registry.npmmirror.com/@nodelib/fs.stat@2.0.5 - '@nodelib/fs.walk': registry.npmmirror.com/@nodelib/fs.walk@1.2.8 - glob-parent: registry.npmmirror.com/glob-parent@5.1.2 - merge2: registry.npmmirror.com/merge2@1.4.1 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - dev: true - - registry.npmmirror.com/fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, tarball: https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz} - name: fast-json-stable-stringify - version: 2.1.0 - dev: true - - registry.npmmirror.com/fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, tarball: https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz} - name: fast-levenshtein - version: 2.0.6 - dev: true - - registry.npmmirror.com/fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, tarball: https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz} - name: fastq - version: 1.15.0 - dependencies: - reusify: registry.npmmirror.com/reusify@1.0.4 - dev: true - - registry.npmmirror.com/fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, tarball: https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz} - name: fb-watchman - version: 2.0.2 - dependencies: - bser: registry.npmmirror.com/bser@2.1.1 - dev: true - - registry.npmmirror.com/fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==, tarball: https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz} - name: fd-slicer - version: 1.1.0 - dependencies: - pend: registry.npmmirror.com/pend@1.2.0 - dev: true - - registry.npmmirror.com/fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, tarball: https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz} - name: fetch-blob - version: 3.2.0 - engines: {node: ^12.20 || >= 14.13} - dependencies: - node-domexception: registry.npmmirror.com/node-domexception@1.0.0 - web-streams-polyfill: registry.npmmirror.com/web-streams-polyfill@3.2.1 - dev: true - - registry.npmmirror.com/figures@5.0.0: - resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==, tarball: https://registry.npmmirror.com/figures/-/figures-5.0.0.tgz} - name: figures - version: 5.0.0 - engines: {node: '>=14'} - dependencies: - escape-string-regexp: registry.npmmirror.com/escape-string-regexp@5.0.0 - is-unicode-supported: registry.npmmirror.com/is-unicode-supported@1.3.0 - dev: true - - registry.npmmirror.com/file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, tarball: https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz} - name: file-entry-cache - version: 6.0.1 - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: registry.npmmirror.com/flat-cache@3.1.1 - dev: true - - registry.npmmirror.com/filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, tarball: https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz} - name: filelist - version: 1.0.4 - dependencies: - minimatch: registry.npmmirror.com/minimatch@5.1.6 - dev: true - - registry.npmmirror.com/fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, tarball: https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz} - name: fill-range - version: 7.0.1 - engines: {node: '>=8'} - dependencies: - to-regex-range: registry.npmmirror.com/to-regex-range@5.0.1 - dev: true - - registry.npmmirror.com/find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, tarball: https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz} - name: find-up - version: 4.1.0 - engines: {node: '>=8'} - dependencies: - locate-path: registry.npmmirror.com/locate-path@5.0.0 - path-exists: registry.npmmirror.com/path-exists@4.0.0 - dev: true - - registry.npmmirror.com/find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, tarball: https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz} - name: find-up - version: 5.0.0 - engines: {node: '>=10'} - dependencies: - locate-path: registry.npmmirror.com/locate-path@6.0.0 - path-exists: registry.npmmirror.com/path-exists@4.0.0 - dev: true - - registry.npmmirror.com/find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==, tarball: https://registry.npmmirror.com/find-up/-/find-up-6.3.0.tgz} - name: find-up - version: 6.3.0 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - locate-path: registry.npmmirror.com/locate-path@7.2.0 - path-exists: registry.npmmirror.com/path-exists@5.0.0 - dev: true - - registry.npmmirror.com/flat-cache@3.1.1: - resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==, tarball: https://registry.npmmirror.com/flat-cache/-/flat-cache-3.1.1.tgz} - name: flat-cache - version: 3.1.1 - engines: {node: '>=12.0.0'} - dependencies: - flatted: registry.npmmirror.com/flatted@3.2.9 - keyv: registry.npmmirror.com/keyv@4.5.4 - rimraf: registry.npmmirror.com/rimraf@3.0.2 - dev: true - - registry.npmmirror.com/flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, tarball: https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz} - name: flat - version: 5.0.2 - hasBin: true - dev: true - - registry.npmmirror.com/flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, tarball: https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz} - name: flatted - version: 3.2.9 - dev: true - - registry.npmmirror.com/for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, tarball: https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz} - name: for-each - version: 0.3.3 - dependencies: - is-callable: registry.npmmirror.com/is-callable@1.2.7 - dev: true - - registry.npmmirror.com/foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, tarball: https://registry.npmmirror.com/foreground-child/-/foreground-child-3.1.1.tgz} - name: foreground-child - version: 3.1.1 - engines: {node: '>=14'} - dependencies: - cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 - signal-exit: registry.npmmirror.com/signal-exit@4.1.0 - dev: true - - registry.npmmirror.com/form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==, tarball: https://registry.npmmirror.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz} - name: form-data-encoder - version: 2.1.4 - engines: {node: '>= 14.17'} - dev: true - - registry.npmmirror.com/form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, tarball: https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz} - name: form-data - version: 4.0.0 - engines: {node: '>= 6'} - dependencies: - asynckit: registry.npmmirror.com/asynckit@0.4.0 - combined-stream: registry.npmmirror.com/combined-stream@1.0.8 - mime-types: registry.npmmirror.com/mime-types@2.1.35 - dev: true - - registry.npmmirror.com/formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, tarball: https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz} - name: formdata-polyfill - version: 4.0.10 - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: registry.npmmirror.com/fetch-blob@3.2.0 - dev: true - - registry.npmmirror.com/fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, tarball: https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz} - name: fs-extra - version: 8.1.0 - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jsonfile: registry.npmmirror.com/jsonfile@4.0.0 - universalify: registry.npmmirror.com/universalify@0.1.2 - dev: true - - registry.npmmirror.com/fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, tarball: https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz} - name: fs.realpath - version: 1.0.0 - dev: true - - registry.npmmirror.com/fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz} - name: fsevents - version: 2.3.3 - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/fsrs.js@1.1.0: - resolution: {integrity: sha512-DEihBx081nENpNjrSvCopPVi9Ilh+u+ELYOKQmshfSz+DgC/B0hxFFMQnqy2ibWAm9zjyR/bWvaz86xEA4MIcA==, tarball: https://registry.npmmirror.com/fsrs.js/-/fsrs.js-1.1.0.tgz} - name: fsrs.js - version: 1.1.0 - engines: {node: '>=10'} - dependencies: - deepcopy: registry.npmmirror.com/deepcopy@2.1.0 - dev: true - - registry.npmmirror.com/fstream@1.0.12: - resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==, tarball: https://registry.npmmirror.com/fstream/-/fstream-1.0.12.tgz} - name: fstream - version: 1.0.12 - engines: {node: '>=0.6'} - dependencies: - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - inherits: registry.npmmirror.com/inherits@2.0.4 - mkdirp: registry.npmmirror.com/mkdirp@0.5.6 - rimraf: registry.npmmirror.com/rimraf@2.7.1 - dev: true - - registry.npmmirror.com/function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz} - name: function-bind - version: 1.1.2 - dev: true - - registry.npmmirror.com/functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, tarball: https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz} - name: functions-have-names - version: 1.2.3 - dev: true - - registry.npmmirror.com/gaze@1.1.3: - resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==, tarball: https://registry.npmmirror.com/gaze/-/gaze-1.1.3.tgz} - name: gaze - version: 1.1.3 - engines: {node: '>= 4.0.0'} - dependencies: - globule: registry.npmmirror.com/globule@1.3.4 - dev: true - - registry.npmmirror.com/geckodriver@4.2.1: - resolution: {integrity: sha512-4m/CRk0OI8MaANRuFIahvOxYTSjlNAO2p9JmE14zxueknq6cdtB5M9UGRQ8R9aMV0bLGNVHHDnDXmoXdOwJfWg==, tarball: https://registry.npmmirror.com/geckodriver/-/geckodriver-4.2.1.tgz} - name: geckodriver - version: 4.2.1 - engines: {node: ^16.13 || >=18 || >=20} - hasBin: true - requiresBuild: true - dependencies: - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - decamelize: registry.npmmirror.com/decamelize@6.0.0 - http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 - https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 - node-fetch: registry.npmmirror.com/node-fetch@3.3.2 - tar-fs: registry.npmmirror.com/tar-fs@3.0.4 - unzipper: registry.npmmirror.com/unzipper@0.10.14 - which: registry.npmmirror.com/which@4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, tarball: https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz} - name: gensync - version: 1.0.0-beta.2 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, tarball: https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz} - name: get-caller-file - version: 2.0.5 - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - registry.npmmirror.com/get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, tarball: https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.2.tgz} - name: get-func-name - version: 2.0.2 - dev: true - - registry.npmmirror.com/get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==, tarball: https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz} - name: get-intrinsic - version: 1.2.2 - dependencies: - function-bind: registry.npmmirror.com/function-bind@1.1.2 - has-proto: registry.npmmirror.com/has-proto@1.0.1 - has-symbols: registry.npmmirror.com/has-symbols@1.0.3 - hasown: registry.npmmirror.com/hasown@2.0.0 - dev: true - - registry.npmmirror.com/get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, tarball: https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz} - name: get-package-type - version: 0.1.0 - engines: {node: '>=8.0.0'} - dev: true - - registry.npmmirror.com/get-port@7.0.0: - resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==, tarball: https://registry.npmmirror.com/get-port/-/get-port-7.0.0.tgz} - name: get-port - version: 7.0.0 - engines: {node: '>=16'} - dev: true - - registry.npmmirror.com/get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz} - name: get-stream - version: 5.2.0 - engines: {node: '>=8'} - dependencies: - pump: registry.npmmirror.com/pump@3.0.0 - dev: true - - registry.npmmirror.com/get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz} - name: get-stream - version: 6.0.1 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz} - name: get-stream - version: 8.0.1 - engines: {node: '>=16'} - dev: true - - registry.npmmirror.com/get-uri@6.0.2: - resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==, tarball: https://registry.npmmirror.com/get-uri/-/get-uri-6.0.2.tgz} - name: get-uri - version: 6.0.2 - engines: {node: '>= 14'} - dependencies: - basic-ftp: registry.npmmirror.com/basic-ftp@5.0.3 - data-uri-to-buffer: registry.npmmirror.com/data-uri-to-buffer@6.0.1 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - fs-extra: registry.npmmirror.com/fs-extra@8.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz} - name: glob-parent - version: 5.1.2 - engines: {node: '>= 6'} - dependencies: - is-glob: registry.npmmirror.com/is-glob@4.0.3 - dev: true - - registry.npmmirror.com/glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz} - name: glob-parent - version: 6.0.2 - engines: {node: '>=10.13.0'} - dependencies: - is-glob: registry.npmmirror.com/is-glob@4.0.3 - dev: true - - registry.npmmirror.com/glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==, tarball: https://registry.npmmirror.com/glob/-/glob-10.3.10.tgz} - name: glob - version: 10.3.10 - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: registry.npmmirror.com/foreground-child@3.1.1 - jackspeak: registry.npmmirror.com/jackspeak@2.3.6 - minimatch: registry.npmmirror.com/minimatch@9.0.3 - minipass: registry.npmmirror.com/minipass@7.0.4 - path-scurry: registry.npmmirror.com/path-scurry@1.10.1 - dev: true - - registry.npmmirror.com/glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==, tarball: https://registry.npmmirror.com/glob/-/glob-7.1.7.tgz} - name: glob - version: 7.1.7 - dependencies: - fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 - inflight: registry.npmmirror.com/inflight@1.0.6 - inherits: registry.npmmirror.com/inherits@2.0.4 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - once: registry.npmmirror.com/once@1.4.0 - path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 - dev: true - - registry.npmmirror.com/glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, tarball: https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz} - name: glob - version: 7.2.0 - dependencies: - fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 - inflight: registry.npmmirror.com/inflight@1.0.6 - inherits: registry.npmmirror.com/inherits@2.0.4 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - once: registry.npmmirror.com/once@1.4.0 - path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 - dev: true - - registry.npmmirror.com/glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, tarball: https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz} - name: glob - version: 7.2.3 - dependencies: - fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 - inflight: registry.npmmirror.com/inflight@1.0.6 - inherits: registry.npmmirror.com/inherits@2.0.4 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - once: registry.npmmirror.com/once@1.4.0 - path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 - dev: true - - registry.npmmirror.com/glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, tarball: https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz} - name: glob - version: 8.1.0 - engines: {node: '>=12'} - dependencies: - fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 - inflight: registry.npmmirror.com/inflight@1.0.6 - inherits: registry.npmmirror.com/inherits@2.0.4 - minimatch: registry.npmmirror.com/minimatch@5.1.6 - once: registry.npmmirror.com/once@1.4.0 - dev: true - - registry.npmmirror.com/globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, tarball: https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz} - name: globals - version: 11.12.0 - engines: {node: '>=4'} - dev: true - - registry.npmmirror.com/globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, tarball: https://registry.npmmirror.com/globals/-/globals-13.23.0.tgz} - name: globals - version: 13.23.0 - engines: {node: '>=8'} - dependencies: - type-fest: registry.npmmirror.com/type-fest@0.20.2 - dev: true - - registry.npmmirror.com/globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, tarball: https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz} - name: globby - version: 11.1.0 - engines: {node: '>=10'} - dependencies: - array-union: registry.npmmirror.com/array-union@2.1.0 - dir-glob: registry.npmmirror.com/dir-glob@3.0.1 - fast-glob: registry.npmmirror.com/fast-glob@3.3.2 - ignore: registry.npmmirror.com/ignore@5.2.4 - merge2: registry.npmmirror.com/merge2@1.4.1 - slash: registry.npmmirror.com/slash@3.0.0 - dev: true - - registry.npmmirror.com/globule@1.3.4: - resolution: {integrity: sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==, tarball: https://registry.npmmirror.com/globule/-/globule-1.3.4.tgz} - name: globule - version: 1.3.4 - engines: {node: '>= 0.10'} - dependencies: - glob: registry.npmmirror.com/glob@7.1.7 - lodash: registry.npmmirror.com/lodash@4.17.21 - minimatch: registry.npmmirror.com/minimatch@3.0.8 - dev: true - - registry.npmmirror.com/gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, tarball: https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz} - name: gopd - version: 1.0.1 - dependencies: - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - dev: true - - registry.npmmirror.com/got@12.6.1: - resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==, tarball: https://registry.npmmirror.com/got/-/got-12.6.1.tgz} - name: got - version: 12.6.1 - engines: {node: '>=14.16'} - dependencies: - '@sindresorhus/is': registry.npmmirror.com/@sindresorhus/is@5.3.0 - '@szmarczak/http-timer': registry.npmmirror.com/@szmarczak/http-timer@5.0.1 - cacheable-lookup: registry.npmmirror.com/cacheable-lookup@7.0.0 - cacheable-request: registry.npmmirror.com/cacheable-request@10.2.14 - decompress-response: registry.npmmirror.com/decompress-response@6.0.0 - form-data-encoder: registry.npmmirror.com/form-data-encoder@2.1.4 - get-stream: registry.npmmirror.com/get-stream@6.0.1 - http2-wrapper: registry.npmmirror.com/http2-wrapper@2.2.1 - lowercase-keys: registry.npmmirror.com/lowercase-keys@3.0.0 - p-cancelable: registry.npmmirror.com/p-cancelable@3.0.0 - responselike: registry.npmmirror.com/responselike@3.0.0 - dev: true - - registry.npmmirror.com/graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz} - name: graceful-fs - version: 4.2.11 - dev: true - - registry.npmmirror.com/grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, tarball: https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz} - name: grapheme-splitter - version: 1.0.4 - dev: true - - registry.npmmirror.com/graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, tarball: https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz} - name: graphemer - version: 1.4.0 - dev: true - - registry.npmmirror.com/has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, tarball: https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz} - name: has-bigints - version: 1.0.2 - dev: true - - registry.npmmirror.com/has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz} - name: has-flag - version: 3.0.0 - engines: {node: '>=4'} - dev: true - - registry.npmmirror.com/has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz} - name: has-flag - version: 4.0.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==, tarball: https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz} - name: has-property-descriptors - version: 1.0.1 - dependencies: - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - dev: true - - registry.npmmirror.com/has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, tarball: https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz} - name: has-proto - version: 1.0.1 - engines: {node: '>= 0.4'} - dev: true - - registry.npmmirror.com/has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, tarball: https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz} - name: has-symbols - version: 1.0.3 - engines: {node: '>= 0.4'} - dev: true - - registry.npmmirror.com/has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, tarball: https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz} - name: has-tostringtag - version: 1.0.0 - engines: {node: '>= 0.4'} - dependencies: - has-symbols: registry.npmmirror.com/has-symbols@1.0.3 - dev: true - - registry.npmmirror.com/has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==, tarball: https://registry.npmmirror.com/has/-/has-1.0.4.tgz} - name: has - version: 1.0.4 - engines: {node: '>= 0.4.0'} - dev: true - - registry.npmmirror.com/hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, tarball: https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz} - name: hasown - version: 2.0.0 - engines: {node: '>= 0.4'} - dependencies: - function-bind: registry.npmmirror.com/function-bind@1.1.2 - dev: true - - registry.npmmirror.com/he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, tarball: https://registry.npmmirror.com/he/-/he-1.2.0.tgz} - name: he - version: 1.2.0 - hasBin: true - dev: true - - registry.npmmirror.com/hosted-git-info@7.0.1: - resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==, tarball: https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz} - name: hosted-git-info - version: 7.0.1 - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - lru-cache: registry.npmmirror.com/lru-cache@10.0.2 - dev: true - - registry.npmmirror.com/html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==, tarball: https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz} - name: html-encoding-sniffer - version: 3.0.0 - engines: {node: '>=12'} - dependencies: - whatwg-encoding: registry.npmmirror.com/whatwg-encoding@2.0.0 - dev: true - - registry.npmmirror.com/html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, tarball: https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz} - name: html-escaper - version: 2.0.2 - dev: true - - registry.npmmirror.com/http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, tarball: https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz} - name: http-cache-semantics - version: 4.1.1 - dev: true - - registry.npmmirror.com/http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, tarball: https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz} - name: http-proxy-agent - version: 5.0.0 - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': registry.npmmirror.com/@tootallnate/once@2.0.0 - agent-base: registry.npmmirror.com/agent-base@6.0.2 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==, tarball: https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz} - name: http-proxy-agent - version: 7.0.0 - engines: {node: '>= 14'} - dependencies: - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==, tarball: https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz} - name: http2-wrapper - version: 2.2.1 - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: registry.npmmirror.com/quick-lru@5.1.1 - resolve-alpn: registry.npmmirror.com/resolve-alpn@1.2.1 - dev: true - - registry.npmmirror.com/https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, tarball: https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz} - name: https-proxy-agent - version: 5.0.1 - engines: {node: '>= 6'} - dependencies: - agent-base: registry.npmmirror.com/agent-base@6.0.2 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, tarball: https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz} - name: https-proxy-agent - version: 7.0.2 - engines: {node: '>= 14'} - dependencies: - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, tarball: https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz} - name: human-signals - version: 2.1.0 - engines: {node: '>=10.17.0'} - dev: true - - registry.npmmirror.com/human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, tarball: https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz} - name: human-signals - version: 5.0.0 - engines: {node: '>=16.17.0'} - dev: true - - registry.npmmirror.com/iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz} - name: iconv-lite - version: 0.4.24 - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 - dev: true - - registry.npmmirror.com/iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz} - name: iconv-lite - version: 0.6.3 - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 - dev: true - - registry.npmmirror.com/ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, tarball: https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz} - name: ieee754 - version: 1.2.1 - dev: true - - registry.npmmirror.com/ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, tarball: https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz} - name: ignore - version: 5.2.4 - engines: {node: '>= 4'} - dev: true - - registry.npmmirror.com/import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, tarball: https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz} - name: import-fresh - version: 3.3.0 - engines: {node: '>=6'} - dependencies: - parent-module: registry.npmmirror.com/parent-module@1.0.1 - resolve-from: registry.npmmirror.com/resolve-from@4.0.0 - dev: true - - registry.npmmirror.com/import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, tarball: https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz} - name: import-local - version: 3.1.0 - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: registry.npmmirror.com/pkg-dir@4.2.0 - resolve-cwd: registry.npmmirror.com/resolve-cwd@3.0.0 - dev: true - - registry.npmmirror.com/import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==, tarball: https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz} - name: import-meta-resolve - version: 4.0.0 - dev: true - - registry.npmmirror.com/imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, tarball: https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz} - name: imurmurhash - version: 0.1.4 - engines: {node: '>=0.8.19'} - dev: true - - registry.npmmirror.com/inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, tarball: https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz} - name: inflight - version: 1.0.6 - dependencies: - once: registry.npmmirror.com/once@1.4.0 - wrappy: registry.npmmirror.com/wrappy@1.0.2 - dev: true - - registry.npmmirror.com/inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz} - name: inherits - version: 2.0.4 - dev: true - - registry.npmmirror.com/inquirer@9.2.12: - resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==, tarball: https://registry.npmmirror.com/inquirer/-/inquirer-9.2.12.tgz} - name: inquirer - version: 9.2.12 - engines: {node: '>=14.18.0'} - dependencies: - '@ljharb/through': registry.npmmirror.com/@ljharb/through@2.3.11 - ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 - chalk: registry.npmmirror.com/chalk@5.3.0 - cli-cursor: registry.npmmirror.com/cli-cursor@3.1.0 - cli-width: registry.npmmirror.com/cli-width@4.1.0 - external-editor: registry.npmmirror.com/external-editor@3.1.0 - figures: registry.npmmirror.com/figures@5.0.0 - lodash: registry.npmmirror.com/lodash@4.17.21 - mute-stream: registry.npmmirror.com/mute-stream@1.0.0 - ora: registry.npmmirror.com/ora@5.4.1 - run-async: registry.npmmirror.com/run-async@3.0.0 - rxjs: registry.npmmirror.com/rxjs@7.8.1 - string-width: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - wrap-ansi: registry.npmmirror.com/wrap-ansi@6.2.0 - dev: true - - registry.npmmirror.com/internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==, tarball: https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz} - name: internal-slot - version: 1.0.5 - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - has: registry.npmmirror.com/has@1.0.4 - side-channel: registry.npmmirror.com/side-channel@1.0.4 - dev: true - - registry.npmmirror.com/ip@1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==, tarball: https://registry.npmmirror.com/ip/-/ip-1.1.8.tgz} - name: ip - version: 1.1.8 - dev: true - - registry.npmmirror.com/ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==, tarball: https://registry.npmmirror.com/ip/-/ip-2.0.0.tgz} - name: ip - version: 2.0.0 - dev: true - - registry.npmmirror.com/is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, tarball: https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz} - name: is-arguments - version: 1.1.1 - engines: {node: '>= 0.4'} - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==, tarball: https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz} - name: is-array-buffer - version: 3.0.2 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - is-typed-array: registry.npmmirror.com/is-typed-array@1.1.10 - dev: true - - registry.npmmirror.com/is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, tarball: https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz} - name: is-arrayish - version: 0.2.1 - dev: true - - registry.npmmirror.com/is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, tarball: https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz} - name: is-bigint - version: 1.0.4 - dependencies: - has-bigints: registry.npmmirror.com/has-bigints@1.0.2 - dev: true - - registry.npmmirror.com/is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, tarball: https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz} - name: is-binary-path - version: 2.1.0 - engines: {node: '>=8'} - dependencies: - binary-extensions: registry.npmmirror.com/binary-extensions@2.2.0 - dev: true - - registry.npmmirror.com/is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, tarball: https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz} - name: is-boolean-object - version: 1.1.2 - engines: {node: '>= 0.4'} - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, tarball: https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz} - name: is-callable - version: 1.2.7 - engines: {node: '>= 0.4'} - dev: true - - registry.npmmirror.com/is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, tarball: https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz} - name: is-core-module - version: 2.13.1 - dependencies: - hasown: registry.npmmirror.com/hasown@2.0.0 - dev: true - - registry.npmmirror.com/is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, tarball: https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz} - name: is-date-object - version: 1.0.5 - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, tarball: https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz} - name: is-extglob - version: 2.1.1 - engines: {node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, tarball: https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz} - name: is-fullwidth-code-point - version: 3.0.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, tarball: https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz} - name: is-generator-fn - version: 2.1.0 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, tarball: https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz} - name: is-glob - version: 4.0.3 - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: registry.npmmirror.com/is-extglob@2.1.1 - dev: true - - registry.npmmirror.com/is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, tarball: https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz} - name: is-interactive - version: 1.0.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==, tarball: https://registry.npmmirror.com/is-map/-/is-map-2.0.2.tgz} - name: is-map - version: 2.0.2 - dev: true - - registry.npmmirror.com/is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, tarball: https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz} - name: is-number-object - version: 1.0.7 - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, tarball: https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz} - name: is-number - version: 7.0.0 - engines: {node: '>=0.12.0'} - dev: true - - registry.npmmirror.com/is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, tarball: https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz} - name: is-path-inside - version: 3.0.3 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz} - name: is-plain-obj - version: 2.1.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz} - name: is-plain-obj - version: 4.1.0 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, tarball: https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz} - name: is-potential-custom-element-name - version: 1.0.1 - dev: true - - registry.npmmirror.com/is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, tarball: https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz} - name: is-regex - version: 1.1.4 - engines: {node: '>= 0.4'} - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==, tarball: https://registry.npmmirror.com/is-set/-/is-set-2.0.2.tgz} - name: is-set - version: 2.0.2 - dev: true - - registry.npmmirror.com/is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, tarball: https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz} - name: is-shared-array-buffer - version: 1.0.2 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - dev: true - - registry.npmmirror.com/is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz} - name: is-stream - version: 2.0.1 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz} - name: is-stream - version: 3.0.0 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - registry.npmmirror.com/is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, tarball: https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz} - name: is-string - version: 1.0.7 - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, tarball: https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz} - name: is-symbol - version: 1.0.4 - engines: {node: '>= 0.4'} - dependencies: - has-symbols: registry.npmmirror.com/has-symbols@1.0.3 - dev: true - - registry.npmmirror.com/is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==, tarball: https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz} - name: is-typed-array - version: 1.1.10 - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 - call-bind: registry.npmmirror.com/call-bind@1.0.5 - for-each: registry.npmmirror.com/for-each@0.3.3 - gopd: registry.npmmirror.com/gopd@1.0.1 - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz} - name: is-unicode-supported - version: 0.1.0 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==, tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz} - name: is-unicode-supported - version: 1.3.0 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==, tarball: https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.1.tgz} - name: is-weakmap - version: 2.0.1 - dev: true - - registry.npmmirror.com/is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==, tarball: https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.2.tgz} - name: is-weakset - version: 2.0.2 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - dev: true - - registry.npmmirror.com/isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, tarball: https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz} - name: isarray - version: 1.0.0 - dev: true - - registry.npmmirror.com/isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, tarball: https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz} - name: isarray - version: 2.0.5 - dev: true - - registry.npmmirror.com/isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, tarball: https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz} - name: isexe - version: 2.0.0 - dev: true - - registry.npmmirror.com/isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, tarball: https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz} - name: isexe - version: 3.1.1 - engines: {node: '>=16'} - dev: true - - registry.npmmirror.com/istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, tarball: https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz} - name: istanbul-lib-coverage - version: 3.2.2 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, tarball: https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz} - name: istanbul-lib-instrument - version: 5.2.1 - engines: {node: '>=8'} - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 - '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 - istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 - semver: registry.npmmirror.com/semver@6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==, tarball: https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz} - name: istanbul-lib-instrument - version: 6.0.1 - engines: {node: '>=10'} - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 - '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 - istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 - semver: registry.npmmirror.com/semver@7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, tarball: https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz} - name: istanbul-lib-report - version: 3.0.1 - engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 - make-dir: registry.npmmirror.com/make-dir@4.0.0 - supports-color: registry.npmmirror.com/supports-color@7.2.0 - dev: true - - registry.npmmirror.com/istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, tarball: https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz} - name: istanbul-lib-source-maps - version: 4.0.1 - engines: {node: '>=10'} - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 - source-map: registry.npmmirror.com/source-map@0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==, tarball: https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz} - name: istanbul-reports - version: 3.1.5 - engines: {node: '>=8'} - dependencies: - html-escaper: registry.npmmirror.com/html-escaper@2.0.2 - istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.1 - dev: true - - registry.npmmirror.com/jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, tarball: https://registry.npmmirror.com/jackspeak/-/jackspeak-2.3.6.tgz} - name: jackspeak - version: 2.3.6 - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': registry.npmmirror.com/@isaacs/cliui@8.0.2 - optionalDependencies: - '@pkgjs/parseargs': registry.npmmirror.com/@pkgjs/parseargs@0.11.0 - dev: true - - registry.npmmirror.com/jake@10.8.5: - resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==, tarball: https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz} - name: jake - version: 10.8.5 - engines: {node: '>=10'} - hasBin: true - dependencies: - async: registry.npmmirror.com/async@3.2.5 - chalk: registry.npmmirror.com/chalk@4.1.2 - filelist: registry.npmmirror.com/filelist@1.0.4 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - dev: true - - registry.npmmirror.com/jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==, tarball: https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz} - name: jest-changed-files - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: registry.npmmirror.com/execa@5.1.1 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - p-limit: registry.npmmirror.com/p-limit@3.1.0 - dev: true - - registry.npmmirror.com/jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==, tarball: https://registry.npmmirror.com/jest-circus/-/jest-circus-29.7.0.tgz} - name: jest-circus - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 - '@jest/expect': registry.npmmirror.com/@jest/expect@29.7.0 - '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - co: registry.npmmirror.com/co@4.6.0 - dedent: registry.npmmirror.com/dedent@1.5.1 - is-generator-fn: registry.npmmirror.com/is-generator-fn@2.1.0 - jest-each: registry.npmmirror.com/jest-each@29.7.0 - jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 - jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - p-limit: registry.npmmirror.com/p-limit@3.1.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - pure-rand: registry.npmmirror.com/pure-rand@6.0.4 - slash: registry.npmmirror.com/slash@3.0.0 - stack-utils: registry.npmmirror.com/stack-utils@2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - registry.npmmirror.com/jest-cli@29.7.0(@types/node@20.11.0): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==, tarball: https://registry.npmmirror.com/jest-cli/-/jest-cli-29.7.0.tgz} - id: registry.npmmirror.com/jest-cli/29.7.0 - name: jest-cli - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: + + registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11: + resolution: + { + integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==, + tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz, + } + name: "@esbuild/linux-ppc64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@jest/core': registry.npmmirror.com/@jest/core@29.7.0 - '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - chalk: registry.npmmirror.com/chalk@4.1.2 - create-jest: registry.npmmirror.com/create-jest@29.7.0(@types/node@20.11.0) - exit: registry.npmmirror.com/exit@0.1.2 - import-local: registry.npmmirror.com/import-local@3.1.0 - jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-validate: registry.npmmirror.com/jest-validate@29.7.0 - yargs: registry.npmmirror.com/yargs@17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==, tarball: https://registry.npmmirror.com/jest-config/-/jest-config-29.7.0.tgz} - id: registry.npmmirror.com/jest-config/29.7.0 - name: jest-config - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': + + registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11: + resolution: + { + integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==, + tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz, + } + name: "@esbuild/linux-riscv64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true optional: true - ts-node: + + registry.npmmirror.com/@esbuild/linux-s390x@0.19.11: + resolution: + { + integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==, + tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz, + } + name: "@esbuild/linux-s390x" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@jest/test-sequencer': registry.npmmirror.com/@jest/test-sequencer@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - babel-jest: registry.npmmirror.com/babel-jest@29.7.0(@babel/core@7.23.3) - chalk: registry.npmmirror.com/chalk@4.1.2 - ci-info: registry.npmmirror.com/ci-info@3.9.0 - deepmerge: registry.npmmirror.com/deepmerge@4.3.1 - glob: registry.npmmirror.com/glob@7.2.3 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-circus: registry.npmmirror.com/jest-circus@29.7.0 - jest-environment-node: registry.npmmirror.com/jest-environment-node@29.7.0 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 - jest-runner: registry.npmmirror.com/jest-runner@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-validate: registry.npmmirror.com/jest-validate@29.7.0 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - parse-json: registry.npmmirror.com/parse-json@5.2.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - registry.npmmirror.com/jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==, tarball: https://registry.npmmirror.com/jest-diff/-/jest-diff-29.7.0.tgz} - name: jest-diff - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: registry.npmmirror.com/chalk@4.1.2 - diff-sequences: registry.npmmirror.com/diff-sequences@29.6.3 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==, tarball: https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.7.0.tgz} - name: jest-docblock - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: registry.npmmirror.com/detect-newline@3.1.0 - dev: true - - registry.npmmirror.com/jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==, tarball: https://registry.npmmirror.com/jest-each/-/jest-each-29.7.0.tgz} - name: jest-each - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - chalk: registry.npmmirror.com/chalk@4.1.2 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/jest-environment-jsdom@29.7.0: - resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==, tarball: https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz} - name: jest-environment-jsdom - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: + + registry.npmmirror.com/@esbuild/linux-x64@0.19.11: + resolution: + { + integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==, + tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz, + } + name: "@esbuild/linux-x64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 - '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/jsdom': registry.npmmirror.com/@types/jsdom@20.0.1 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jsdom: registry.npmmirror.com/jsdom@20.0.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - registry.npmmirror.com/jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==, tarball: https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz} - name: jest-environment-node - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 - '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - dev: true - - registry.npmmirror.com/jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, tarball: https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.6.3.tgz} - name: jest-get-type - version: 29.6.3 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - registry.npmmirror.com/jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==, tarball: https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz} - name: jest-haste-map - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/graceful-fs': registry.npmmirror.com/@types/graceful-fs@4.1.9 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - anymatch: registry.npmmirror.com/anymatch@3.1.3 - fb-watchman: registry.npmmirror.com/fb-watchman@2.0.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-worker: registry.npmmirror.com/jest-worker@29.7.0 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - walker: registry.npmmirror.com/walker@1.0.8 - optionalDependencies: - fsevents: registry.npmmirror.com/fsevents@2.3.3 - dev: true - - registry.npmmirror.com/jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==, tarball: https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz} - name: jest-leak-detector - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==, tarball: https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz} - name: jest-matcher-utils - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: registry.npmmirror.com/chalk@4.1.2 - jest-diff: registry.npmmirror.com/jest-diff@29.7.0 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==, tarball: https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.7.0.tgz} - name: jest-message-util - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/stack-utils': registry.npmmirror.com/@types/stack-utils@2.0.3 - chalk: registry.npmmirror.com/chalk@4.1.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - stack-utils: registry.npmmirror.com/stack-utils@2.0.6 - dev: true - - registry.npmmirror.com/jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==, tarball: https://registry.npmmirror.com/jest-mock/-/jest-mock-29.7.0.tgz} - name: jest-mock - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - dev: true - - registry.npmmirror.com/jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, tarball: https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz} - id: registry.npmmirror.com/jest-pnp-resolver/1.2.3 - name: jest-pnp-resolver - version: 1.2.3 - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: + + registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11: + resolution: + { + integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==, + tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz, + } + name: "@esbuild/netbsd-x64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true optional: true - dependencies: - jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 - dev: true - - registry.npmmirror.com/jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==, tarball: https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz} - name: jest-regex-util - version: 29.6.3 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - registry.npmmirror.com/jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==, tarball: https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz} - name: jest-resolve-dependencies - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==, tarball: https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.7.0.tgz} - name: jest-resolve - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: registry.npmmirror.com/chalk@4.1.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - jest-pnp-resolver: registry.npmmirror.com/jest-pnp-resolver@1.2.3(jest-resolve@29.7.0) - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-validate: registry.npmmirror.com/jest-validate@29.7.0 - resolve: registry.npmmirror.com/resolve@1.22.8 - resolve.exports: registry.npmmirror.com/resolve.exports@2.0.2 - slash: registry.npmmirror.com/slash@3.0.0 - dev: true - - registry.npmmirror.com/jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==, tarball: https://registry.npmmirror.com/jest-runner/-/jest-runner-29.7.0.tgz} - name: jest-runner - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 - '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 - '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 - '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - emittery: registry.npmmirror.com/emittery@0.13.1 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-docblock: registry.npmmirror.com/jest-docblock@29.7.0 - jest-environment-node: registry.npmmirror.com/jest-environment-node@29.7.0 - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - jest-leak-detector: registry.npmmirror.com/jest-leak-detector@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 - jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-watcher: registry.npmmirror.com/jest-watcher@29.7.0 - jest-worker: registry.npmmirror.com/jest-worker@29.7.0 - p-limit: registry.npmmirror.com/p-limit@3.1.0 - source-map-support: registry.npmmirror.com/source-map-support@0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==, tarball: https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.7.0.tgz} - name: jest-runtime - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 - '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 - '@jest/globals': registry.npmmirror.com/@jest/globals@29.7.0 - '@jest/source-map': registry.npmmirror.com/@jest/source-map@29.6.3 - '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 - '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - cjs-module-lexer: registry.npmmirror.com/cjs-module-lexer@1.2.2 - collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 - glob: registry.npmmirror.com/glob@7.2.3 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 - jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - strip-bom: registry.npmmirror.com/strip-bom@4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==, tarball: https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz} - name: jest-snapshot - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 - '@babel/generator': registry.npmmirror.com/@babel/generator@7.23.3 - '@babel/plugin-syntax-jsx': registry.npmmirror.com/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3) - '@babel/plugin-syntax-typescript': registry.npmmirror.com/@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3) - '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 - '@jest/expect-utils': registry.npmmirror.com/@jest/expect-utils@29.7.0 - '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3) - chalk: registry.npmmirror.com/chalk@4.1.2 - expect: registry.npmmirror.com/expect@29.7.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-diff: registry.npmmirror.com/jest-diff@29.7.0 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - natural-compare: registry.npmmirror.com/natural-compare@1.4.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - semver: registry.npmmirror.com/semver@7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, tarball: https://registry.npmmirror.com/jest-util/-/jest-util-29.7.0.tgz} - name: jest-util - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - ci-info: registry.npmmirror.com/ci-info@3.9.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - picomatch: registry.npmmirror.com/picomatch@2.3.1 - dev: true - - registry.npmmirror.com/jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==, tarball: https://registry.npmmirror.com/jest-validate/-/jest-validate-29.7.0.tgz} - name: jest-validate - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - camelcase: registry.npmmirror.com/camelcase@6.3.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - leven: registry.npmmirror.com/leven@3.1.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==, tarball: https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.7.0.tgz} - name: jest-watcher - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 - chalk: registry.npmmirror.com/chalk@4.1.2 - emittery: registry.npmmirror.com/emittery@0.13.1 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - string-length: registry.npmmirror.com/string-length@4.0.2 - dev: true - - registry.npmmirror.com/jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==, tarball: https://registry.npmmirror.com/jest-worker/-/jest-worker-29.7.0.tgz} - name: jest-worker - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - merge-stream: registry.npmmirror.com/merge-stream@2.0.0 - supports-color: registry.npmmirror.com/supports-color@8.1.1 - dev: true - - registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==, tarball: https://registry.npmmirror.com/jest/-/jest-29.7.0.tgz} - id: registry.npmmirror.com/jest/29.7.0 - name: jest - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: + + registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11: + resolution: + { + integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==, + tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz, + } + name: "@esbuild/openbsd-x64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true optional: true - dependencies: - '@jest/core': registry.npmmirror.com/@jest/core@29.7.0 - '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 - import-local: registry.npmmirror.com/import-local@3.1.0 - jest-cli: registry.npmmirror.com/jest-cli@29.7.0(@types/node@20.11.0) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - registry.npmmirror.com/js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, tarball: https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz} - name: js-tokens - version: 4.0.0 - dev: true - - registry.npmmirror.com/js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz} - name: js-yaml - version: 3.14.1 - hasBin: true - dependencies: - argparse: registry.npmmirror.com/argparse@1.0.10 - esprima: registry.npmmirror.com/esprima@4.0.1 - dev: true - - registry.npmmirror.com/js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz} - name: js-yaml - version: 4.1.0 - hasBin: true - dependencies: - argparse: registry.npmmirror.com/argparse@2.0.1 - dev: true - - registry.npmmirror.com/jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==, tarball: https://registry.npmmirror.com/jsdom/-/jsdom-20.0.3.tgz} - name: jsdom - version: 20.0.3 - engines: {node: '>=14'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: + + registry.npmmirror.com/@esbuild/sunos-x64@0.19.11: + resolution: + { + integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==, + tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz, + } + name: "@esbuild/sunos-x64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true optional: true - dependencies: - abab: registry.npmmirror.com/abab@2.0.6 - acorn: registry.npmmirror.com/acorn@8.11.2 - acorn-globals: registry.npmmirror.com/acorn-globals@7.0.1 - cssom: registry.npmmirror.com/cssom@0.5.0 - cssstyle: registry.npmmirror.com/cssstyle@2.3.0 - data-urls: registry.npmmirror.com/data-urls@3.0.2 - decimal.js: registry.npmmirror.com/decimal.js@10.4.3 - domexception: registry.npmmirror.com/domexception@4.0.0 - escodegen: registry.npmmirror.com/escodegen@2.1.0 - form-data: registry.npmmirror.com/form-data@4.0.0 - html-encoding-sniffer: registry.npmmirror.com/html-encoding-sniffer@3.0.0 - http-proxy-agent: registry.npmmirror.com/http-proxy-agent@5.0.0 - https-proxy-agent: registry.npmmirror.com/https-proxy-agent@5.0.1 - is-potential-custom-element-name: registry.npmmirror.com/is-potential-custom-element-name@1.0.1 - nwsapi: registry.npmmirror.com/nwsapi@2.2.4 - parse5: registry.npmmirror.com/parse5@7.1.2 - saxes: registry.npmmirror.com/saxes@6.0.0 - symbol-tree: registry.npmmirror.com/symbol-tree@3.2.4 - tough-cookie: registry.npmmirror.com/tough-cookie@4.1.2 - w3c-xmlserializer: registry.npmmirror.com/w3c-xmlserializer@4.0.0 - webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 - whatwg-encoding: registry.npmmirror.com/whatwg-encoding@2.0.0 - whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype@3.0.0 - whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0 - ws: registry.npmmirror.com/ws@8.14.2 - xml-name-validator: registry.npmmirror.com/xml-name-validator@4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - registry.npmmirror.com/jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, tarball: https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz} - name: jsesc - version: 2.5.2 - engines: {node: '>=4'} - hasBin: true - dev: true - - registry.npmmirror.com/json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, tarball: https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz} - name: json-buffer - version: 3.0.1 - dev: true - - registry.npmmirror.com/json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz} - name: json-parse-even-better-errors - version: 2.3.1 - dev: true - - registry.npmmirror.com/json-parse-even-better-errors@3.0.0: - resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==, tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz} - name: json-parse-even-better-errors - version: 3.0.0 - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - registry.npmmirror.com/json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, tarball: https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz} - name: json-schema-traverse - version: 0.4.1 - dev: true - - registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, tarball: https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz} - name: json-stable-stringify-without-jsonify - version: 1.0.1 - dev: true - - registry.npmmirror.com/json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, tarball: https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz} - name: json5 - version: 2.2.3 - engines: {node: '>=6'} - hasBin: true - dev: true - - registry.npmmirror.com/jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, tarball: https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz} - name: jsonfile - version: 4.0.0 - optionalDependencies: - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - dev: true - - registry.npmmirror.com/keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, tarball: https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz} - name: keyv - version: 4.5.4 - dependencies: - json-buffer: registry.npmmirror.com/json-buffer@3.0.1 - dev: true - - registry.npmmirror.com/kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, tarball: https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz} - name: kleur - version: 3.0.3 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/ky@0.33.3: - resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==, tarball: https://registry.npmmirror.com/ky/-/ky-0.33.3.tgz} - name: ky - version: 0.33.3 - engines: {node: '>=14.16'} - dev: true - - registry.npmmirror.com/lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==, tarball: https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz} - name: lazystream - version: 1.0.1 - engines: {node: '>= 0.6.3'} - dependencies: - readable-stream: registry.npmmirror.com/readable-stream@2.3.8 - dev: true - - registry.npmmirror.com/leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, tarball: https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz} - name: leven - version: 3.1.0 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, tarball: https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz} - name: levn - version: 0.4.1 - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 - type-check: registry.npmmirror.com/type-check@0.4.0 - dev: true - - registry.npmmirror.com/lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, tarball: https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz} - name: lines-and-columns - version: 1.2.4 - dev: true - - registry.npmmirror.com/lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==, tarball: https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz} - name: lines-and-columns - version: 2.0.4 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - registry.npmmirror.com/listenercount@1.0.1: - resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==, tarball: https://registry.npmmirror.com/listenercount/-/listenercount-1.0.1.tgz} - name: listenercount - version: 1.0.1 - dev: true - - registry.npmmirror.com/locate-app@2.1.0: - resolution: {integrity: sha512-rcVo/iLUxrd9d0lrmregK/Z5Y5NCpSwf9KlMbPpOHmKmdxdQY1Fj8NDQ5QymJTryCsBLqwmniFv2f3JKbk9Bvg==, tarball: https://registry.npmmirror.com/locate-app/-/locate-app-2.1.0.tgz} - name: locate-app - version: 2.1.0 - dependencies: - n12: registry.npmmirror.com/n12@0.4.0 - type-fest: registry.npmmirror.com/type-fest@2.13.0 - userhome: registry.npmmirror.com/userhome@1.0.0 - dev: true - - registry.npmmirror.com/locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz} - name: locate-path - version: 5.0.0 - engines: {node: '>=8'} - dependencies: - p-locate: registry.npmmirror.com/p-locate@4.1.0 - dev: true - - registry.npmmirror.com/locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz} - name: locate-path - version: 6.0.0 - engines: {node: '>=10'} - dependencies: - p-locate: registry.npmmirror.com/p-locate@5.0.0 - dev: true - - registry.npmmirror.com/locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-7.2.0.tgz} - name: locate-path - version: 7.2.0 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-locate: registry.npmmirror.com/p-locate@6.0.0 - dev: true - - registry.npmmirror.com/lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==, tarball: https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz} - name: lodash.clonedeep - version: 4.5.0 - dev: true - - registry.npmmirror.com/lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==, tarball: https://registry.npmmirror.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz} - name: lodash.flattendeep - version: 4.4.0 - dev: true - - registry.npmmirror.com/lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, tarball: https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz} - name: lodash.isequal - version: 4.5.0 - dev: true - - registry.npmmirror.com/lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, tarball: https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz} - name: lodash.merge - version: 4.6.2 - dev: true - - registry.npmmirror.com/lodash.pickby@4.6.0: - resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==, tarball: https://registry.npmmirror.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz} - name: lodash.pickby - version: 4.6.0 - dev: true - - registry.npmmirror.com/lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==, tarball: https://registry.npmmirror.com/lodash.union/-/lodash.union-4.6.0.tgz} - name: lodash.union - version: 4.6.0 - dev: true - - registry.npmmirror.com/lodash.zip@4.2.0: - resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==, tarball: https://registry.npmmirror.com/lodash.zip/-/lodash.zip-4.2.0.tgz} - name: lodash.zip - version: 4.2.0 - dev: true - - registry.npmmirror.com/lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz} - name: lodash - version: 4.17.21 - dev: true - - registry.npmmirror.com/log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, tarball: https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz} - name: log-symbols - version: 4.1.0 - engines: {node: '>=10'} - dependencies: - chalk: registry.npmmirror.com/chalk@4.1.2 - is-unicode-supported: registry.npmmirror.com/is-unicode-supported@0.1.0 - dev: true - - registry.npmmirror.com/loglevel-plugin-prefix@0.8.4: - resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==, tarball: https://registry.npmmirror.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz} - name: loglevel-plugin-prefix - version: 0.8.4 - dev: true - - registry.npmmirror.com/loglevel@1.8.1: - resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==, tarball: https://registry.npmmirror.com/loglevel/-/loglevel-1.8.1.tgz} - name: loglevel - version: 1.8.1 - engines: {node: '>= 0.6.0'} - dev: true - - registry.npmmirror.com/loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, tarball: https://registry.npmmirror.com/loupe/-/loupe-2.3.7.tgz} - name: loupe - version: 2.3.7 - dependencies: - get-func-name: registry.npmmirror.com/get-func-name@2.0.2 - dev: true - - registry.npmmirror.com/lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==, tarball: https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz} - name: lowercase-keys - version: 3.0.0 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - registry.npmmirror.com/lru-cache@10.0.2: - resolution: {integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-10.0.2.tgz} - name: lru-cache - version: 10.0.2 - engines: {node: 14 || >=16.14} - dependencies: - semver: registry.npmmirror.com/semver@7.5.4 - dev: true - - registry.npmmirror.com/lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz} - name: lru-cache - version: 5.1.1 - dependencies: - yallist: registry.npmmirror.com/yallist@3.1.1 - dev: true - - registry.npmmirror.com/lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz} - name: lru-cache - version: 6.0.0 - engines: {node: '>=10'} - dependencies: - yallist: registry.npmmirror.com/yallist@4.0.0 - dev: true - - registry.npmmirror.com/lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz} - name: lru-cache - version: 7.18.3 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-4.0.0.tgz} - name: make-dir - version: 4.0.0 - engines: {node: '>=10'} - dependencies: - semver: registry.npmmirror.com/semver@7.5.4 - dev: true - - registry.npmmirror.com/makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, tarball: https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz} - name: makeerror - version: 1.0.12 - dependencies: - tmpl: registry.npmmirror.com/tmpl@1.0.5 - dev: true - - registry.npmmirror.com/merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, tarball: https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz} - name: merge-stream - version: 2.0.0 - dev: true - - registry.npmmirror.com/merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, tarball: https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz} - name: merge2 - version: 1.4.1 - engines: {node: '>= 8'} - dev: true - - registry.npmmirror.com/micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, tarball: https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz} - name: micromatch - version: 4.0.5 - engines: {node: '>=8.6'} - dependencies: - braces: registry.npmmirror.com/braces@3.0.2 - picomatch: registry.npmmirror.com/picomatch@2.3.1 - dev: true - - registry.npmmirror.com/mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, tarball: https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz} - name: mime-db - version: 1.52.0 - engines: {node: '>= 0.6'} - dev: true - - registry.npmmirror.com/mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, tarball: https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz} - name: mime-types - version: 2.1.35 - engines: {node: '>= 0.6'} - dependencies: - mime-db: registry.npmmirror.com/mime-db@1.52.0 - dev: true - - registry.npmmirror.com/mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, tarball: https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz} - name: mimic-fn - version: 2.1.0 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, tarball: https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz} - name: mimic-fn - version: 4.0.0 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz} - name: mimic-response - version: 3.1.0 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==, tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-4.0.0.tgz} - name: mimic-response - version: 4.0.0 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - registry.npmmirror.com/minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.0.8.tgz} - name: minimatch - version: 3.0.8 - dependencies: - brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 - dev: true - - registry.npmmirror.com/minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz} - name: minimatch - version: 3.1.2 - dependencies: - brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 - dev: true - - registry.npmmirror.com/minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.0.1.tgz} - name: minimatch - version: 5.0.1 - engines: {node: '>=10'} - dependencies: - brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 - dev: true - - registry.npmmirror.com/minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz} - name: minimatch - version: 5.1.6 - engines: {node: '>=10'} - dependencies: - brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 - dev: true - - registry.npmmirror.com/minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz} - name: minimatch - version: 9.0.3 - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 - dev: true - - registry.npmmirror.com/minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, tarball: https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz} - name: minimist - version: 1.2.8 - dev: true - - registry.npmmirror.com/minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, tarball: https://registry.npmmirror.com/minipass/-/minipass-7.0.4.tgz} - name: minipass - version: 7.0.4 - engines: {node: '>=16 || 14 >=14.17'} - dev: true - - registry.npmmirror.com/mitt@3.0.0: - resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==, tarball: https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz} - name: mitt - version: 3.0.0 - dev: true - - registry.npmmirror.com/mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, tarball: https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz} - name: mkdirp-classic - version: 0.5.3 - dev: true - - registry.npmmirror.com/mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, tarball: https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz} - name: mkdirp - version: 0.5.6 - hasBin: true - dependencies: - minimist: registry.npmmirror.com/minimist@1.2.8 - dev: true - - registry.npmmirror.com/mocha@10.2.0: - resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==, tarball: https://registry.npmmirror.com/mocha/-/mocha-10.2.0.tgz} - name: mocha - version: 10.2.0 - engines: {node: '>= 14.0.0'} - hasBin: true - dependencies: - ansi-colors: registry.npmmirror.com/ansi-colors@4.1.1 - browser-stdout: registry.npmmirror.com/browser-stdout@1.3.1 - chokidar: registry.npmmirror.com/chokidar@3.5.3 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - diff: registry.npmmirror.com/diff@5.0.0 - escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 - find-up: registry.npmmirror.com/find-up@5.0.0 - glob: registry.npmmirror.com/glob@7.2.0 - he: registry.npmmirror.com/he@1.2.0 - js-yaml: registry.npmmirror.com/js-yaml@4.1.0 - log-symbols: registry.npmmirror.com/log-symbols@4.1.0 - minimatch: registry.npmmirror.com/minimatch@5.0.1 - ms: registry.npmmirror.com/ms@2.1.3 - nanoid: registry.npmmirror.com/nanoid@3.3.3 - serialize-javascript: registry.npmmirror.com/serialize-javascript@6.0.0 - strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 - supports-color: registry.npmmirror.com/supports-color@8.1.1 - workerpool: registry.npmmirror.com/workerpool@6.2.1 - yargs: registry.npmmirror.com/yargs@16.2.0 - yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 - yargs-unparser: registry.npmmirror.com/yargs-unparser@2.0.0 - dev: true - - registry.npmmirror.com/moment@2.29.4: - resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==, tarball: https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz} - name: moment - version: 2.29.4 - dev: true - - registry.npmmirror.com/moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==, tarball: https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz} - name: moment - version: 2.30.1 - dev: true - - registry.npmmirror.com/ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz} - name: ms - version: 2.1.2 - dev: true - - registry.npmmirror.com/ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz} - name: ms - version: 2.1.3 - dev: true - - registry.npmmirror.com/mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, tarball: https://registry.npmmirror.com/mute-stream/-/mute-stream-1.0.0.tgz} - name: mute-stream - version: 1.0.0 - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true - - registry.npmmirror.com/n12@0.4.0: - resolution: {integrity: sha512-p/hj4zQ8d3pbbFLQuN1K9honUxiDDhueOWyFLw/XgBv+wZCE44bcLH4CIcsolOceJQduh4Jf7m/LfaTxyGmGtQ==, tarball: https://registry.npmmirror.com/n12/-/n12-0.4.0.tgz} - name: n12 - version: 0.4.0 - dev: true - - registry.npmmirror.com/nanoid@3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==, tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.3.tgz} - name: nanoid - version: 3.3.3 - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - registry.npmmirror.com/natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, tarball: https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz} - name: natural-compare - version: 1.4.0 - dev: true - - registry.npmmirror.com/netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==, tarball: https://registry.npmmirror.com/netmask/-/netmask-2.0.2.tgz} - name: netmask - version: 2.0.2 - engines: {node: '>= 0.4.0'} - dev: true - - registry.npmmirror.com/node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, tarball: https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz} - name: node-domexception - version: 1.0.0 - engines: {node: '>=10.5.0'} - dev: true - - registry.npmmirror.com/node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz} - name: node-fetch - version: 2.7.0 - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: + + registry.npmmirror.com/@esbuild/win32-arm64@0.19.11: + resolution: + { + integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==, + tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz, + } + name: "@esbuild/win32-arm64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true optional: true - dependencies: - whatwg-url: registry.npmmirror.com/whatwg-url@5.0.0 - dev: true - - registry.npmmirror.com/node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-3.3.2.tgz} - name: node-fetch - version: 3.3.2 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: registry.npmmirror.com/data-uri-to-buffer@4.0.1 - fetch-blob: registry.npmmirror.com/fetch-blob@3.2.0 - formdata-polyfill: registry.npmmirror.com/formdata-polyfill@4.0.10 - dev: true - - registry.npmmirror.com/node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, tarball: https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz} - name: node-int64 - version: 0.4.0 - dev: true - - registry.npmmirror.com/node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz} - name: node-releases - version: 2.0.14 - dev: true - - registry.npmmirror.com/normalize-package-data@6.0.0: - resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==, tarball: https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz} - name: normalize-package-data - version: 6.0.0 - engines: {node: ^16.14.0 || >=18.0.0} - dependencies: - hosted-git-info: registry.npmmirror.com/hosted-git-info@7.0.1 - is-core-module: registry.npmmirror.com/is-core-module@2.13.1 - semver: registry.npmmirror.com/semver@7.5.4 - validate-npm-package-license: registry.npmmirror.com/validate-npm-package-license@3.0.4 - dev: true - - registry.npmmirror.com/normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, tarball: https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz} - name: normalize-path - version: 3.0.0 - engines: {node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/normalize-url@8.0.0: - resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==, tarball: https://registry.npmmirror.com/normalize-url/-/normalize-url-8.0.0.tgz} - name: normalize-url - version: 8.0.0 - engines: {node: '>=14.16'} - dev: true - - registry.npmmirror.com/npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz} - name: npm-run-path - version: 4.0.1 - engines: {node: '>=8'} - dependencies: - path-key: registry.npmmirror.com/path-key@3.1.1 - dev: true - - registry.npmmirror.com/npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==, tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz} - name: npm-run-path - version: 5.1.0 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: registry.npmmirror.com/path-key@4.0.0 - dev: true - - registry.npmmirror.com/nwsapi@2.2.4: - resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==, tarball: https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.4.tgz} - name: nwsapi - version: 2.2.4 - dev: true - - registry.npmmirror.com/object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz} - name: object-inspect - version: 1.13.1 - dev: true - - registry.npmmirror.com/object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, tarball: https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz} - name: object-is - version: 1.1.5 - engines: {node: '>= 0.4'} - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - define-properties: registry.npmmirror.com/define-properties@1.2.1 - dev: true - - registry.npmmirror.com/object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, tarball: https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz} - name: object-keys - version: 1.1.1 - engines: {node: '>= 0.4'} - dev: true - - registry.npmmirror.com/object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, tarball: https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz} - name: object.assign - version: 4.1.5 - engines: {node: '>= 0.4'} - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - define-properties: registry.npmmirror.com/define-properties@1.2.1 - has-symbols: registry.npmmirror.com/has-symbols@1.0.3 - object-keys: registry.npmmirror.com/object-keys@1.1.1 - dev: true - - registry.npmmirror.com/obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0): - resolution: {integrity: sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==, tarball: https://registry.npmmirror.com/obsidian/-/obsidian-1.4.11.tgz} - id: registry.npmmirror.com/obsidian/1.4.11 - name: obsidian - version: 1.4.11 - peerDependencies: - '@codemirror/state': ^6.0.0 - '@codemirror/view': ^6.0.0 - dependencies: - '@codemirror/state': registry.npmmirror.com/@codemirror/state@6.3.1 - '@codemirror/view': registry.npmmirror.com/@codemirror/view@6.22.0 - '@types/codemirror': registry.npmmirror.com/@types/codemirror@5.60.8 - moment: registry.npmmirror.com/moment@2.29.4 - dev: true - - registry.npmmirror.com/once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, tarball: https://registry.npmmirror.com/once/-/once-1.4.0.tgz} - name: once - version: 1.4.0 - dependencies: - wrappy: registry.npmmirror.com/wrappy@1.0.2 - dev: true - - registry.npmmirror.com/onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, tarball: https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz} - name: onetime - version: 5.1.2 - engines: {node: '>=6'} - dependencies: - mimic-fn: registry.npmmirror.com/mimic-fn@2.1.0 - dev: true - - registry.npmmirror.com/onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, tarball: https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz} - name: onetime - version: 6.0.0 - engines: {node: '>=12'} - dependencies: - mimic-fn: registry.npmmirror.com/mimic-fn@4.0.0 - dev: true - - registry.npmmirror.com/optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, tarball: https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz} - name: optionator - version: 0.9.3 - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': registry.npmmirror.com/@aashutoshrathi/word-wrap@1.2.6 - deep-is: registry.npmmirror.com/deep-is@0.1.4 - fast-levenshtein: registry.npmmirror.com/fast-levenshtein@2.0.6 - levn: registry.npmmirror.com/levn@0.4.1 - prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 - type-check: registry.npmmirror.com/type-check@0.4.0 - dev: true - - registry.npmmirror.com/ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, tarball: https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz} - name: ora - version: 5.4.1 - engines: {node: '>=10'} - dependencies: - bl: registry.npmmirror.com/bl@4.1.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - cli-cursor: registry.npmmirror.com/cli-cursor@3.1.0 - cli-spinners: registry.npmmirror.com/cli-spinners@2.9.1 - is-interactive: registry.npmmirror.com/is-interactive@1.0.0 - is-unicode-supported: registry.npmmirror.com/is-unicode-supported@0.1.0 - log-symbols: registry.npmmirror.com/log-symbols@4.1.0 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - wcwidth: registry.npmmirror.com/wcwidth@1.0.1 - dev: true - - registry.npmmirror.com/os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, tarball: https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz} - name: os-tmpdir - version: 1.0.2 - engines: {node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==, tarball: https://registry.npmmirror.com/p-cancelable/-/p-cancelable-3.0.0.tgz} - name: p-cancelable - version: 3.0.0 - engines: {node: '>=12.20'} - dev: true - - registry.npmmirror.com/p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz} - name: p-limit - version: 2.3.0 - engines: {node: '>=6'} - dependencies: - p-try: registry.npmmirror.com/p-try@2.2.0 - dev: true - - registry.npmmirror.com/p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz} - name: p-limit - version: 3.1.0 - engines: {node: '>=10'} - dependencies: - yocto-queue: registry.npmmirror.com/yocto-queue@0.1.0 - dev: true - - registry.npmmirror.com/p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-4.0.0.tgz} - name: p-limit - version: 4.0.0 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: registry.npmmirror.com/yocto-queue@1.0.0 - dev: true - - registry.npmmirror.com/p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz} - name: p-locate - version: 4.1.0 - engines: {node: '>=8'} - dependencies: - p-limit: registry.npmmirror.com/p-limit@2.3.0 - dev: true - - registry.npmmirror.com/p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz} - name: p-locate - version: 5.0.0 - engines: {node: '>=10'} - dependencies: - p-limit: registry.npmmirror.com/p-limit@3.1.0 - dev: true - - registry.npmmirror.com/p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-6.0.0.tgz} - name: p-locate - version: 6.0.0 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-limit: registry.npmmirror.com/p-limit@4.0.0 - dev: true - - registry.npmmirror.com/p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, tarball: https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz} - name: p-try - version: 2.2.0 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/pac-proxy-agent@7.0.1: - resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==, tarball: https://registry.npmmirror.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz} - name: pac-proxy-agent - version: 7.0.1 - engines: {node: '>= 14'} - dependencies: - '@tootallnate/quickjs-emscripten': registry.npmmirror.com/@tootallnate/quickjs-emscripten@0.23.0 - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - get-uri: registry.npmmirror.com/get-uri@6.0.2 - http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 - https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 - pac-resolver: registry.npmmirror.com/pac-resolver@7.0.0 - socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/pac-resolver@7.0.0: - resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==, tarball: https://registry.npmmirror.com/pac-resolver/-/pac-resolver-7.0.0.tgz} - name: pac-resolver - version: 7.0.0 - engines: {node: '>= 14'} - dependencies: - degenerator: registry.npmmirror.com/degenerator@5.0.1 - ip: registry.npmmirror.com/ip@1.1.8 - netmask: registry.npmmirror.com/netmask@2.0.2 - dev: true - - registry.npmmirror.com/parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, tarball: https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz} - name: parent-module - version: 1.0.1 - engines: {node: '>=6'} - dependencies: - callsites: registry.npmmirror.com/callsites@3.1.0 - dev: true - - registry.npmmirror.com/parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, tarball: https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz} - name: parse-json - version: 5.2.0 - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 - error-ex: registry.npmmirror.com/error-ex@1.3.2 - json-parse-even-better-errors: registry.npmmirror.com/json-parse-even-better-errors@2.3.1 - lines-and-columns: registry.npmmirror.com/lines-and-columns@1.2.4 - dev: true - - registry.npmmirror.com/parse-json@7.1.1: - resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==, tarball: https://registry.npmmirror.com/parse-json/-/parse-json-7.1.1.tgz} - name: parse-json - version: 7.1.1 - engines: {node: '>=16'} - dependencies: - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 - error-ex: registry.npmmirror.com/error-ex@1.3.2 - json-parse-even-better-errors: registry.npmmirror.com/json-parse-even-better-errors@3.0.0 - lines-and-columns: registry.npmmirror.com/lines-and-columns@2.0.4 - type-fest: registry.npmmirror.com/type-fest@3.13.1 - dev: true - - registry.npmmirror.com/parse-ms@2.1.0: - resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==, tarball: https://registry.npmmirror.com/parse-ms/-/parse-ms-2.1.0.tgz} - name: parse-ms - version: 2.1.0 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, tarball: https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz} - name: parse5 - version: 7.1.2 - dependencies: - entities: registry.npmmirror.com/entities@4.5.0 - dev: true - - registry.npmmirror.com/path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz} - name: path-exists - version: 4.0.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-5.0.0.tgz} - name: path-exists - version: 5.0.0 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - registry.npmmirror.com/path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, tarball: https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz} - name: path-is-absolute - version: 1.0.1 - engines: {node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, tarball: https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz} - name: path-key - version: 3.1.1 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, tarball: https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz} - name: path-key - version: 4.0.0 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, tarball: https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz} - name: path-parse - version: 1.0.7 - dev: true - - registry.npmmirror.com/path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, tarball: https://registry.npmmirror.com/path-scurry/-/path-scurry-1.10.1.tgz} - name: path-scurry - version: 1.10.1 - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: registry.npmmirror.com/lru-cache@10.0.2 - minipass: registry.npmmirror.com/minipass@7.0.4 - dev: true - - registry.npmmirror.com/path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, tarball: https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz} - name: path-type - version: 4.0.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, tarball: https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz} - name: pathval - version: 1.1.1 - dev: true - - registry.npmmirror.com/pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==, tarball: https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz} - name: pend - version: 1.2.0 - dev: true - - registry.npmmirror.com/picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, tarball: https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz} - name: picocolors - version: 1.0.0 - dev: true - - registry.npmmirror.com/picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, tarball: https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz} - name: picomatch - version: 2.3.1 - engines: {node: '>=8.6'} - dev: true - - registry.npmmirror.com/pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==, tarball: https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz} - name: pirates - version: 4.0.5 - engines: {node: '>= 6'} - dev: true - - registry.npmmirror.com/pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, tarball: https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz} - name: pkg-dir - version: 4.2.0 - engines: {node: '>=8'} - dependencies: - find-up: registry.npmmirror.com/find-up@4.1.0 - dev: true - - registry.npmmirror.com/prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, tarball: https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz} - name: prelude-ls - version: 1.2.1 - engines: {node: '>= 0.8.0'} - dev: true - - registry.npmmirror.com/prettier@3.2.2: - resolution: {integrity: sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==, tarball: https://registry.npmmirror.com/prettier/-/prettier-3.2.2.tgz} - name: prettier - version: 3.2.2 - engines: {node: '>=14'} - hasBin: true - dev: true - - registry.npmmirror.com/pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, tarball: https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz} - name: pretty-format - version: 29.7.0 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': registry.npmmirror.com/@jest/schemas@29.6.3 - ansi-styles: registry.npmmirror.com/ansi-styles@5.2.0 - react-is: registry.npmmirror.com/react-is@18.2.0 - dev: true - - registry.npmmirror.com/pretty-ms@7.0.1: - resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==, tarball: https://registry.npmmirror.com/pretty-ms/-/pretty-ms-7.0.1.tgz} - name: pretty-ms - version: 7.0.1 - engines: {node: '>=10'} - dependencies: - parse-ms: registry.npmmirror.com/parse-ms@2.1.0 - dev: true - - registry.npmmirror.com/process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, tarball: https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz} - name: process-nextick-args - version: 2.0.1 - dev: true - - registry.npmmirror.com/progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==, tarball: https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz} - name: progress - version: 2.0.3 - engines: {node: '>=0.4.0'} - dev: true - - registry.npmmirror.com/prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, tarball: https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz} - name: prompts - version: 2.4.2 - engines: {node: '>= 6'} - dependencies: - kleur: registry.npmmirror.com/kleur@3.0.3 - sisteransi: registry.npmmirror.com/sisteransi@1.0.5 - dev: true - - registry.npmmirror.com/proxy-agent@6.3.0: - resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==, tarball: https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.3.0.tgz} - name: proxy-agent - version: 6.3.0 - engines: {node: '>= 14'} - dependencies: - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 - https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 - lru-cache: registry.npmmirror.com/lru-cache@7.18.3 - pac-proxy-agent: registry.npmmirror.com/pac-proxy-agent@7.0.1 - proxy-from-env: registry.npmmirror.com/proxy-from-env@1.1.0 - socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/proxy-agent@6.3.1: - resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==, tarball: https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.3.1.tgz} - name: proxy-agent - version: 6.3.1 - engines: {node: '>= 14'} - dependencies: - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 - https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 - lru-cache: registry.npmmirror.com/lru-cache@7.18.3 - pac-proxy-agent: registry.npmmirror.com/pac-proxy-agent@7.0.1 - proxy-from-env: registry.npmmirror.com/proxy-from-env@1.1.0 - socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, tarball: https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz} - name: proxy-from-env - version: 1.1.0 - dev: true - - registry.npmmirror.com/psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, tarball: https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz} - name: psl - version: 1.9.0 - dev: true - - registry.npmmirror.com/pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, tarball: https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz} - name: pump - version: 3.0.0 - dependencies: - end-of-stream: registry.npmmirror.com/end-of-stream@1.4.4 - once: registry.npmmirror.com/once@1.4.0 - dev: true - - registry.npmmirror.com/punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, tarball: https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz} - name: punycode - version: 2.3.1 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/puppeteer-core@20.9.0(typescript@5.1.6): - resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==, tarball: https://registry.npmmirror.com/puppeteer-core/-/puppeteer-core-20.9.0.tgz} - id: registry.npmmirror.com/puppeteer-core/20.9.0 - name: puppeteer-core - version: 20.9.0 - engines: {node: '>=16.3.0'} - peerDependencies: - typescript: '>= 4.7.4' - peerDependenciesMeta: - typescript: + + registry.npmmirror.com/@esbuild/win32-ia32@0.19.11: + resolution: + { + integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==, + tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz, + } + name: "@esbuild/win32-ia32" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true optional: true - dependencies: - '@puppeteer/browsers': registry.npmmirror.com/@puppeteer/browsers@1.4.6(typescript@5.1.6) - chromium-bidi: registry.npmmirror.com/chromium-bidi@0.4.16(devtools-protocol@0.0.1147663) - cross-fetch: registry.npmmirror.com/cross-fetch@4.0.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1147663 - typescript: 5.1.6 - ws: registry.npmmirror.com/ws@8.13.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - registry.npmmirror.com/pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==, tarball: https://registry.npmmirror.com/pure-rand/-/pure-rand-6.0.4.tgz} - name: pure-rand - version: 6.0.4 - dev: true - - registry.npmmirror.com/query-selector-shadow-dom@1.0.1: - resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==, tarball: https://registry.npmmirror.com/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz} - name: query-selector-shadow-dom - version: 1.0.1 - dev: true - - registry.npmmirror.com/querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, tarball: https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz} - name: querystringify - version: 2.2.0 - dev: true - - registry.npmmirror.com/queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, tarball: https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz} - name: queue-microtask - version: 1.2.3 - dev: true - - registry.npmmirror.com/queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==, tarball: https://registry.npmmirror.com/queue-tick/-/queue-tick-1.0.1.tgz} - name: queue-tick - version: 1.0.1 - dev: true - - registry.npmmirror.com/quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, tarball: https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz} - name: quick-lru - version: 5.1.1 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, tarball: https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz} - name: randombytes - version: 2.1.0 - dependencies: - safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 - dev: true - - registry.npmmirror.com/react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, tarball: https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz} - name: react-is - version: 18.2.0 - dev: true - - registry.npmmirror.com/read-pkg-up@10.1.0: - resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==, tarball: https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-10.1.0.tgz} - name: read-pkg-up - version: 10.1.0 - engines: {node: '>=16'} - dependencies: - find-up: registry.npmmirror.com/find-up@6.3.0 - read-pkg: registry.npmmirror.com/read-pkg@8.1.0 - type-fest: registry.npmmirror.com/type-fest@4.7.1 - dev: true - - registry.npmmirror.com/read-pkg@8.1.0: - resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==, tarball: https://registry.npmmirror.com/read-pkg/-/read-pkg-8.1.0.tgz} - name: read-pkg - version: 8.1.0 - engines: {node: '>=16'} - dependencies: - '@types/normalize-package-data': registry.npmmirror.com/@types/normalize-package-data@2.4.4 - normalize-package-data: registry.npmmirror.com/normalize-package-data@6.0.0 - parse-json: registry.npmmirror.com/parse-json@7.1.1 - type-fest: registry.npmmirror.com/type-fest@4.7.1 - dev: true - - registry.npmmirror.com/readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz} - name: readable-stream - version: 2.3.8 - dependencies: - core-util-is: registry.npmmirror.com/core-util-is@1.0.3 - inherits: registry.npmmirror.com/inherits@2.0.4 - isarray: registry.npmmirror.com/isarray@1.0.0 - process-nextick-args: registry.npmmirror.com/process-nextick-args@2.0.1 - safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 - string_decoder: registry.npmmirror.com/string_decoder@1.1.1 - util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 - dev: true - - registry.npmmirror.com/readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz} - name: readable-stream - version: 3.6.2 - engines: {node: '>= 6'} - dependencies: - inherits: registry.npmmirror.com/inherits@2.0.4 - string_decoder: registry.npmmirror.com/string_decoder@1.3.0 - util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 - dev: true - - registry.npmmirror.com/readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==, tarball: https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz} - name: readdir-glob - version: 1.1.3 - dependencies: - minimatch: registry.npmmirror.com/minimatch@5.1.6 - dev: true - - registry.npmmirror.com/readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, tarball: https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz} - name: readdirp - version: 3.6.0 - engines: {node: '>=8.10.0'} - dependencies: - picomatch: registry.npmmirror.com/picomatch@2.3.1 - dev: true - - registry.npmmirror.com/recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==, tarball: https://registry.npmmirror.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz} - name: recursive-readdir - version: 2.2.3 - engines: {node: '>=6.0.0'} - dependencies: - minimatch: registry.npmmirror.com/minimatch@3.1.2 - dev: true - - registry.npmmirror.com/regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==, tarball: https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz} - name: regexp.prototype.flags - version: 1.5.0 - engines: {node: '>= 0.4'} - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - define-properties: registry.npmmirror.com/define-properties@1.2.1 - functions-have-names: registry.npmmirror.com/functions-have-names@1.2.3 - dev: true - - registry.npmmirror.com/require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, tarball: https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz} - name: require-directory - version: 2.1.1 - engines: {node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, tarball: https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz} - name: requires-port - version: 1.0.0 - dev: true - - registry.npmmirror.com/resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, tarball: https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz} - name: resolve-alpn - version: 1.2.1 - dev: true - - registry.npmmirror.com/resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, tarball: https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz} - name: resolve-cwd - version: 3.0.0 - engines: {node: '>=8'} - dependencies: - resolve-from: registry.npmmirror.com/resolve-from@5.0.0 - dev: true - - registry.npmmirror.com/resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz} - name: resolve-from - version: 4.0.0 - engines: {node: '>=4'} - dev: true - - registry.npmmirror.com/resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz} - name: resolve-from - version: 5.0.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==, tarball: https://registry.npmmirror.com/resolve.exports/-/resolve.exports-2.0.2.tgz} - name: resolve.exports - version: 2.0.2 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, tarball: https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz} - name: resolve - version: 1.22.8 - hasBin: true - dependencies: - is-core-module: registry.npmmirror.com/is-core-module@2.13.1 - path-parse: registry.npmmirror.com/path-parse@1.0.7 - supports-preserve-symlinks-flag: registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0 - dev: true - - registry.npmmirror.com/responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==, tarball: https://registry.npmmirror.com/responselike/-/responselike-3.0.0.tgz} - name: responselike - version: 3.0.0 - engines: {node: '>=14.16'} - dependencies: - lowercase-keys: registry.npmmirror.com/lowercase-keys@3.0.0 - dev: true - - registry.npmmirror.com/resq@1.11.0: - resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==, tarball: https://registry.npmmirror.com/resq/-/resq-1.11.0.tgz} - name: resq - version: 1.11.0 - dependencies: - fast-deep-equal: registry.npmmirror.com/fast-deep-equal@2.0.1 - dev: true - - registry.npmmirror.com/restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, tarball: https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz} - name: restore-cursor - version: 3.1.0 - engines: {node: '>=8'} - dependencies: - onetime: registry.npmmirror.com/onetime@5.1.2 - signal-exit: registry.npmmirror.com/signal-exit@3.0.7 - dev: true - - registry.npmmirror.com/reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, tarball: https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz} - name: reusify - version: 1.0.4 - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/rgb2hex@0.2.5: - resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==, tarball: https://registry.npmmirror.com/rgb2hex/-/rgb2hex-0.2.5.tgz} - name: rgb2hex - version: 0.2.5 - dev: true - - registry.npmmirror.com/rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, tarball: https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz} - name: rimraf - version: 2.7.1 - hasBin: true - dependencies: - glob: registry.npmmirror.com/glob@7.2.3 - dev: true - - registry.npmmirror.com/rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, tarball: https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz} - name: rimraf - version: 3.0.2 - hasBin: true - dependencies: - glob: registry.npmmirror.com/glob@7.2.3 - dev: true - - registry.npmmirror.com/run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==, tarball: https://registry.npmmirror.com/run-async/-/run-async-3.0.0.tgz} - name: run-async - version: 3.0.0 - engines: {node: '>=0.12.0'} - dev: true - - registry.npmmirror.com/run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, tarball: https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz} - name: run-parallel - version: 1.2.0 - dependencies: - queue-microtask: registry.npmmirror.com/queue-microtask@1.2.3 - dev: true - - registry.npmmirror.com/rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, tarball: https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz} - name: rxjs - version: 7.8.1 - dependencies: - tslib: registry.npmmirror.com/tslib@2.6.1 - dev: true - - registry.npmmirror.com/safaridriver@0.1.0: - resolution: {integrity: sha512-azzzIP3gR1TB9bVPv7QO4Zjw0rR1BWEU/s2aFdUMN48gxDjxEB13grAEuXDmkKPgE74cObymDxmAmZnL3clj4w==, tarball: https://registry.npmmirror.com/safaridriver/-/safaridriver-0.1.0.tgz} - name: safaridriver - version: 0.1.0 - dev: true - - registry.npmmirror.com/safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz} - name: safe-buffer - version: 5.1.2 - dev: true - - registry.npmmirror.com/safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz} - name: safe-buffer - version: 5.2.1 - dev: true - - registry.npmmirror.com/safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, tarball: https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz} - name: safer-buffer - version: 2.1.2 - dev: true - - registry.npmmirror.com/saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, tarball: https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz} - name: saxes - version: 6.0.0 - engines: {node: '>=v12.22.7'} - dependencies: - xmlchars: registry.npmmirror.com/xmlchars@2.2.0 - dev: true - - registry.npmmirror.com/semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, tarball: https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz} - name: semver - version: 6.3.1 - hasBin: true - dev: true - - registry.npmmirror.com/semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, tarball: https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz} - name: semver - version: 7.5.4 - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: registry.npmmirror.com/lru-cache@6.0.0 - dev: true - - registry.npmmirror.com/serialize-error@11.0.3: - resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==, tarball: https://registry.npmmirror.com/serialize-error/-/serialize-error-11.0.3.tgz} - name: serialize-error - version: 11.0.3 - engines: {node: '>=14.16'} - dependencies: - type-fest: registry.npmmirror.com/type-fest@2.19.0 - dev: true - - registry.npmmirror.com/serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==, tarball: https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz} - name: serialize-javascript - version: 6.0.0 - dependencies: - randombytes: registry.npmmirror.com/randombytes@2.1.0 - dev: true - - registry.npmmirror.com/set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==, tarball: https://registry.npmmirror.com/set-function-length/-/set-function-length-1.1.1.tgz} - name: set-function-length - version: 1.1.1 - engines: {node: '>= 0.4'} - dependencies: - define-data-property: registry.npmmirror.com/define-data-property@1.1.1 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - gopd: registry.npmmirror.com/gopd@1.0.1 - has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 - dev: true - - registry.npmmirror.com/setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, tarball: https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz} - name: setimmediate - version: 1.0.5 - dev: true - - registry.npmmirror.com/shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, tarball: https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz} - name: shebang-command - version: 2.0.0 - engines: {node: '>=8'} - dependencies: - shebang-regex: registry.npmmirror.com/shebang-regex@3.0.0 - dev: true - - registry.npmmirror.com/shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, tarball: https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz} - name: shebang-regex - version: 3.0.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, tarball: https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz} - name: side-channel - version: 1.0.4 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - object-inspect: registry.npmmirror.com/object-inspect@1.13.1 - dev: true - - registry.npmmirror.com/signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz} - name: signal-exit - version: 3.0.7 - dev: true - - registry.npmmirror.com/signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz} - name: signal-exit - version: 4.1.0 - engines: {node: '>=14'} - dev: true - - registry.npmmirror.com/sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, tarball: https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz} - name: sisteransi - version: 1.0.5 - dev: true - - registry.npmmirror.com/slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, tarball: https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz} - name: slash - version: 3.0.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, tarball: https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz} - name: smart-buffer - version: 4.2.0 - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: true - - registry.npmmirror.com/socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==, tarball: https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz} - name: socks-proxy-agent - version: 8.0.2 - engines: {node: '>= 14'} - dependencies: - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - socks: registry.npmmirror.com/socks@2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==, tarball: https://registry.npmmirror.com/socks/-/socks-2.7.1.tgz} - name: socks - version: 2.7.1 - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} - dependencies: - ip: registry.npmmirror.com/ip@2.0.0 - smart-buffer: registry.npmmirror.com/smart-buffer@4.2.0 - dev: true - - registry.npmmirror.com/source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, tarball: https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz} - name: source-map-support - version: 0.5.13 - dependencies: - buffer-from: registry.npmmirror.com/buffer-from@1.1.2 - source-map: registry.npmmirror.com/source-map@0.6.1 - dev: true - - registry.npmmirror.com/source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz} - name: source-map - version: 0.6.1 - engines: {node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, tarball: https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz} - name: spdx-correct - version: 3.2.0 - dependencies: - spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 - spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.16 - dev: true - - registry.npmmirror.com/spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, tarball: https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz} - name: spdx-exceptions - version: 2.3.0 - dev: true - - registry.npmmirror.com/spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, tarball: https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz} - name: spdx-expression-parse - version: 3.0.1 - dependencies: - spdx-exceptions: registry.npmmirror.com/spdx-exceptions@2.3.0 - spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.16 - dev: true - - registry.npmmirror.com/spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==, tarball: https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz} - name: spdx-license-ids - version: 3.0.16 - dev: true - - registry.npmmirror.com/split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, tarball: https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz} - name: split2 - version: 4.2.0 - engines: {node: '>= 10.x'} - dev: true - - registry.npmmirror.com/sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, tarball: https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz} - name: sprintf-js - version: 1.0.3 - dev: true - - registry.npmmirror.com/stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, tarball: https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz} - name: stack-utils - version: 2.0.6 - engines: {node: '>=10'} - dependencies: - escape-string-regexp: registry.npmmirror.com/escape-string-regexp@2.0.0 - dev: true - - registry.npmmirror.com/stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==, tarball: https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz} - name: stop-iteration-iterator - version: 1.0.0 - engines: {node: '>= 0.4'} - dependencies: - internal-slot: registry.npmmirror.com/internal-slot@1.0.5 - dev: true - - registry.npmmirror.com/stream-buffers@3.0.2: - resolution: {integrity: sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==, tarball: https://registry.npmmirror.com/stream-buffers/-/stream-buffers-3.0.2.tgz} - name: stream-buffers - version: 3.0.2 - engines: {node: '>= 0.10.0'} - dev: true - - registry.npmmirror.com/streamx@2.15.4: - resolution: {integrity: sha512-uSXKl88bibiUCQ1eMpItRljCzDENcDx18rsfDmV79r0e/ThfrAwxG4Y2FarQZ2G4/21xcOKmFFd1Hue+ZIDwHw==, tarball: https://registry.npmmirror.com/streamx/-/streamx-2.15.4.tgz} - name: streamx - version: 2.15.4 - dependencies: - fast-fifo: registry.npmmirror.com/fast-fifo@1.3.2 - queue-tick: registry.npmmirror.com/queue-tick@1.0.1 - dev: true - - registry.npmmirror.com/string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, tarball: https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz} - name: string-length - version: 4.0.2 - engines: {node: '>=10'} - dependencies: - char-regex: registry.npmmirror.com/char-regex@1.0.2 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - dev: true - - registry.npmmirror.com/string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, tarball: https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz} - name: string-width - version: 4.2.3 - engines: {node: '>=8'} - dependencies: - emoji-regex: registry.npmmirror.com/emoji-regex@8.0.0 - is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point@3.0.0 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - dev: true - - registry.npmmirror.com/string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, tarball: https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz} - name: string-width - version: 5.1.2 - engines: {node: '>=12'} - dependencies: - eastasianwidth: registry.npmmirror.com/eastasianwidth@0.2.0 - emoji-regex: registry.npmmirror.com/emoji-regex@9.2.2 - strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 - dev: true - - registry.npmmirror.com/string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz} - name: string_decoder - version: 1.1.1 - dependencies: - safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 - dev: true - - registry.npmmirror.com/string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz} - name: string_decoder - version: 1.3.0 - dependencies: - safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 - dev: true - - registry.npmmirror.com/strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz} - name: strip-ansi - version: 6.0.1 - engines: {node: '>=8'} - dependencies: - ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 - dev: true - - registry.npmmirror.com/strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz} - name: strip-ansi - version: 7.1.0 - engines: {node: '>=12'} - dependencies: - ansi-regex: registry.npmmirror.com/ansi-regex@6.0.1 - dev: true - - registry.npmmirror.com/strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, tarball: https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz} - name: strip-bom - version: 4.0.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, tarball: https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz} - name: strip-final-newline - version: 2.0.0 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, tarball: https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz} - name: strip-final-newline - version: 3.0.0 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, tarball: https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz} - name: strip-json-comments - version: 3.1.1 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/style-mod@4.1.0: - resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==, tarball: https://registry.npmmirror.com/style-mod/-/style-mod-4.1.0.tgz} - name: style-mod - version: 4.1.0 - dev: true - - registry.npmmirror.com/supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz} - name: supports-color - version: 5.5.0 - engines: {node: '>=4'} - dependencies: - has-flag: registry.npmmirror.com/has-flag@3.0.0 - dev: true - - registry.npmmirror.com/supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz} - name: supports-color - version: 7.2.0 - engines: {node: '>=8'} - dependencies: - has-flag: registry.npmmirror.com/has-flag@4.0.0 - dev: true - - registry.npmmirror.com/supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz} - name: supports-color - version: 8.1.1 - engines: {node: '>=10'} - dependencies: - has-flag: registry.npmmirror.com/has-flag@4.0.0 - dev: true - - registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, tarball: https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz} - name: supports-preserve-symlinks-flag - version: 1.0.0 - engines: {node: '>= 0.4'} - dev: true - - registry.npmmirror.com/symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, tarball: https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz} - name: symbol-tree - version: 3.2.4 - dev: true - - registry.npmmirror.com/tar-fs@3.0.4: - resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==, tarball: https://registry.npmmirror.com/tar-fs/-/tar-fs-3.0.4.tgz} - name: tar-fs - version: 3.0.4 - dependencies: - mkdirp-classic: registry.npmmirror.com/mkdirp-classic@0.5.3 - pump: registry.npmmirror.com/pump@3.0.0 - tar-stream: registry.npmmirror.com/tar-stream@3.1.6 - dev: true - - registry.npmmirror.com/tar-stream@3.1.6: - resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==, tarball: https://registry.npmmirror.com/tar-stream/-/tar-stream-3.1.6.tgz} - name: tar-stream - version: 3.1.6 - dependencies: - b4a: registry.npmmirror.com/b4a@1.6.4 - fast-fifo: registry.npmmirror.com/fast-fifo@1.3.2 - streamx: registry.npmmirror.com/streamx@2.15.4 - dev: true - - registry.npmmirror.com/test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, tarball: https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz} - name: test-exclude - version: 6.0.0 - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 - glob: registry.npmmirror.com/glob@7.2.3 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - dev: true - - registry.npmmirror.com/text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, tarball: https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz} - name: text-table - version: 0.2.0 - dev: true - - registry.npmmirror.com/through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, tarball: https://registry.npmmirror.com/through/-/through-2.3.8.tgz} - name: through - version: 2.3.8 - dev: true - - registry.npmmirror.com/tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, tarball: https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz} - name: tmp - version: 0.0.33 - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: registry.npmmirror.com/os-tmpdir@1.0.2 - dev: true - - registry.npmmirror.com/tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, tarball: https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz} - name: tmpl - version: 1.0.5 - dev: true - - registry.npmmirror.com/to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, tarball: https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz} - name: to-fast-properties - version: 2.0.0 - engines: {node: '>=4'} - dev: true - - registry.npmmirror.com/to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, tarball: https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz} - name: to-regex-range - version: 5.0.1 - engines: {node: '>=8.0'} - dependencies: - is-number: registry.npmmirror.com/is-number@7.0.0 - dev: true - - registry.npmmirror.com/tough-cookie@4.1.2: - resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==, tarball: https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.2.tgz} - name: tough-cookie - version: 4.1.2 - engines: {node: '>=6'} - dependencies: - psl: registry.npmmirror.com/psl@1.9.0 - punycode: registry.npmmirror.com/punycode@2.3.1 - universalify: registry.npmmirror.com/universalify@0.2.0 - url-parse: registry.npmmirror.com/url-parse@1.5.10 - dev: true - - registry.npmmirror.com/tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, tarball: https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz} - name: tr46 - version: 0.0.3 - dev: true - - registry.npmmirror.com/tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==, tarball: https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz} - name: tr46 - version: 3.0.0 - engines: {node: '>=12'} - dependencies: - punycode: registry.npmmirror.com/punycode@2.3.1 - dev: true - - registry.npmmirror.com/traverse@0.3.9: - resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==, tarball: https://registry.npmmirror.com/traverse/-/traverse-0.3.9.tgz} - name: traverse - version: 0.3.9 - dev: true - - registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, tarball: https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz} - id: registry.npmmirror.com/ts-api-utils/1.0.3 - name: ts-api-utils - version: 1.0.3 - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.1.6 - dev: true - - registry.npmmirror.com/tslib@2.6.1: - resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==, tarball: https://registry.npmmirror.com/tslib/-/tslib-2.6.1.tgz} - name: tslib - version: 2.6.1 - dev: true - - registry.npmmirror.com/type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, tarball: https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz} - name: type-check - version: 0.4.0 - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 - dev: true - - registry.npmmirror.com/type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, tarball: https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz} - name: type-detect - version: 4.0.8 - engines: {node: '>=4'} - dev: true - - registry.npmmirror.com/type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz} - name: type-fest - version: 0.20.2 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz} - name: type-fest - version: 0.21.3 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/type-fest@2.13.0: - resolution: {integrity: sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-2.13.0.tgz} - name: type-fest - version: 2.13.0 - engines: {node: '>=12.20'} - dev: true - - registry.npmmirror.com/type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz} - name: type-fest - version: 2.19.0 - engines: {node: '>=12.20'} - dev: true - - registry.npmmirror.com/type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-3.13.1.tgz} - name: type-fest - version: 3.13.1 - engines: {node: '>=14.16'} - dev: true - - registry.npmmirror.com/type-fest@4.7.1: - resolution: {integrity: sha512-iWr8RUmzAJRfhZugX9O7nZE6pCxDU8CZ3QxsLuTnGcBLJpCaP2ll3s4eMTBoFnU/CeXY/5rfQSuAEsTGJO4y8A==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-4.7.1.tgz} - name: type-fest - version: 4.7.1 - engines: {node: '>=16'} - dev: true - - registry.npmmirror.com/uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, tarball: https://registry.npmmirror.com/uglify-js/-/uglify-js-3.17.4.tgz} - name: uglify-js - version: 3.17.4 - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - - registry.npmmirror.com/unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==, tarball: https://registry.npmmirror.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz} - name: unbzip2-stream - version: 1.4.3 - dependencies: - buffer: registry.npmmirror.com/buffer@5.7.1 - through: registry.npmmirror.com/through@2.3.8 - dev: true - - registry.npmmirror.com/undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, tarball: https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz} - name: undici-types - version: 5.26.5 - dev: true - - registry.npmmirror.com/universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, tarball: https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz} - name: universalify - version: 0.1.2 - engines: {node: '>= 4.0.0'} - dev: true - - registry.npmmirror.com/universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, tarball: https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz} - name: universalify - version: 0.2.0 - engines: {node: '>= 4.0.0'} - dev: true - - registry.npmmirror.com/unzipper@0.10.14: - resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==, tarball: https://registry.npmmirror.com/unzipper/-/unzipper-0.10.14.tgz} - name: unzipper - version: 0.10.14 - dependencies: - big-integer: registry.npmmirror.com/big-integer@1.6.51 - binary: registry.npmmirror.com/binary@0.3.0 - bluebird: registry.npmmirror.com/bluebird@3.4.7 - buffer-indexof-polyfill: registry.npmmirror.com/buffer-indexof-polyfill@1.0.2 - duplexer2: registry.npmmirror.com/duplexer2@0.1.4 - fstream: registry.npmmirror.com/fstream@1.0.12 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - listenercount: registry.npmmirror.com/listenercount@1.0.1 - readable-stream: registry.npmmirror.com/readable-stream@2.3.8 - setimmediate: registry.npmmirror.com/setimmediate@1.0.5 - dev: true - - registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, tarball: https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz} - id: registry.npmmirror.com/update-browserslist-db/1.0.13 - name: update-browserslist-db - version: 1.0.13 - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: registry.npmmirror.com/browserslist@4.22.1 - escalade: registry.npmmirror.com/escalade@3.1.1 - picocolors: registry.npmmirror.com/picocolors@1.0.0 - dev: true - - registry.npmmirror.com/uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, tarball: https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz} - name: uri-js - version: 4.4.1 - dependencies: - punycode: registry.npmmirror.com/punycode@2.3.1 - dev: true - - registry.npmmirror.com/url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, tarball: https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz} - name: url-parse - version: 1.5.10 - dependencies: - querystringify: registry.npmmirror.com/querystringify@2.2.0 - requires-port: registry.npmmirror.com/requires-port@1.0.0 - dev: true - - registry.npmmirror.com/userhome@1.0.0: - resolution: {integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==, tarball: https://registry.npmmirror.com/userhome/-/userhome-1.0.0.tgz} - name: userhome - version: 1.0.0 - engines: {node: '>= 0.8.0'} - dev: true - - registry.npmmirror.com/util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, tarball: https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz} - name: util-deprecate - version: 1.0.2 - dev: true - - registry.npmmirror.com/v8-to-istanbul@9.1.3: - resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==, tarball: https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz} - name: v8-to-istanbul - version: 9.1.3 - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 - convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 - dev: true - - registry.npmmirror.com/validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, tarball: https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz} - name: validate-npm-package-license - version: 3.0.4 - dependencies: - spdx-correct: registry.npmmirror.com/spdx-correct@3.2.0 - spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 - dev: true - - registry.npmmirror.com/w3c-keyname@2.2.6: - resolution: {integrity: sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==, tarball: https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz} - name: w3c-keyname - version: 2.2.6 - dev: true - - registry.npmmirror.com/w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==, tarball: https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz} - name: w3c-xmlserializer - version: 4.0.0 - engines: {node: '>=14'} - dependencies: - xml-name-validator: registry.npmmirror.com/xml-name-validator@4.0.0 - dev: true - - registry.npmmirror.com/wait-port@1.1.0: - resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==, tarball: https://registry.npmmirror.com/wait-port/-/wait-port-1.1.0.tgz} - name: wait-port - version: 1.1.0 - engines: {node: '>=10'} - hasBin: true - dependencies: - chalk: registry.npmmirror.com/chalk@4.1.2 - commander: registry.npmmirror.com/commander@9.5.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, tarball: https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz} - name: walker - version: 1.0.8 - dependencies: - makeerror: registry.npmmirror.com/makeerror@1.0.12 - dev: true - - registry.npmmirror.com/wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, tarball: https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz} - name: wcwidth - version: 1.0.1 - dependencies: - defaults: registry.npmmirror.com/defaults@1.0.4 - dev: true - - registry.npmmirror.com/web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, tarball: https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz} - name: web-streams-polyfill - version: 3.2.1 - engines: {node: '>= 8'} - dev: true - - registry.npmmirror.com/webdriver@8.27.2: - resolution: {integrity: sha512-vY2Lr0ZNr83n0v8PjLCXtJwR9E7QGycJVS+ev2G72gI54/rFwLv58HMSbJNn8CtE27VkhtewMUPlDpSkj5wGPQ==, tarball: https://registry.npmmirror.com/webdriver/-/webdriver-8.27.2.tgz} - name: webdriver - version: 8.27.2 - engines: {node: ^16.13 || >=18} - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - '@types/ws': registry.npmmirror.com/@types/ws@8.5.9 - '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - '@wdio/protocols': registry.npmmirror.com/@wdio/protocols@8.24.12 - '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 - '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 - deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 - got: registry.npmmirror.com/got@12.6.1 - ky: registry.npmmirror.com/ky@0.33.3 - ws: registry.npmmirror.com/ws@8.14.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6): - resolution: {integrity: sha512-X6PhKE8e8XsB33Q/KSS1zYKP2Rqkq2Nef0YKOhQO+5OTlTkeqMCjnEtyRcfmdtfAwT0DEFqMnGnUKEbTajFC4Q==, tarball: https://registry.npmmirror.com/webdriverio/-/webdriverio-8.27.2.tgz} - id: registry.npmmirror.com/webdriverio/8.27.2 - name: webdriverio - version: 8.27.2 - engines: {node: ^16.13 || >=18} - peerDependencies: - devtools: ^8.14.0 - peerDependenciesMeta: - devtools: + + registry.npmmirror.com/@esbuild/win32-x64@0.19.11: + resolution: + { + integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==, + tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz, + } + name: "@esbuild/win32-x64" + version: 0.19.11 + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true optional: true - dependencies: - '@types/node': registry.npmmirror.com/@types/node@20.11.0 - '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 - '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 - '@wdio/protocols': registry.npmmirror.com/@wdio/protocols@8.24.12 - '@wdio/repl': registry.npmmirror.com/@wdio/repl@8.24.12 - '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 - '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 - archiver: registry.npmmirror.com/archiver@6.0.1 - aria-query: registry.npmmirror.com/aria-query@5.1.3 - css-shorthand-properties: registry.npmmirror.com/css-shorthand-properties@1.1.1 - css-value: registry.npmmirror.com/css-value@0.0.1 - devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1239539 - grapheme-splitter: registry.npmmirror.com/grapheme-splitter@1.0.4 - import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 - is-plain-obj: registry.npmmirror.com/is-plain-obj@4.1.0 - lodash.clonedeep: registry.npmmirror.com/lodash.clonedeep@4.5.0 - lodash.zip: registry.npmmirror.com/lodash.zip@4.2.0 - minimatch: registry.npmmirror.com/minimatch@9.0.3 - puppeteer-core: registry.npmmirror.com/puppeteer-core@20.9.0(typescript@5.1.6) - query-selector-shadow-dom: registry.npmmirror.com/query-selector-shadow-dom@1.0.1 - resq: registry.npmmirror.com/resq@1.11.0 - rgb2hex: registry.npmmirror.com/rgb2hex@0.2.5 - serialize-error: registry.npmmirror.com/serialize-error@11.0.3 - webdriver: registry.npmmirror.com/webdriver@8.27.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz} - name: webidl-conversions - version: 3.0.1 - dev: true - - registry.npmmirror.com/webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz} - name: webidl-conversions - version: 7.0.0 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==, tarball: https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz} - name: whatwg-encoding - version: 2.0.0 - engines: {node: '>=12'} - dependencies: - iconv-lite: registry.npmmirror.com/iconv-lite@0.6.3 - dev: true - - registry.npmmirror.com/whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, tarball: https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz} - name: whatwg-mimetype - version: 3.0.0 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz} - name: whatwg-url - version: 11.0.0 - engines: {node: '>=12'} - dependencies: - tr46: registry.npmmirror.com/tr46@3.0.0 - webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 - dev: true - - registry.npmmirror.com/whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz} - name: whatwg-url - version: 5.0.0 - dependencies: - tr46: registry.npmmirror.com/tr46@0.0.3 - webidl-conversions: registry.npmmirror.com/webidl-conversions@3.0.1 - dev: true - - registry.npmmirror.com/which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, tarball: https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz} - name: which-boxed-primitive - version: 1.0.2 - dependencies: - is-bigint: registry.npmmirror.com/is-bigint@1.0.4 - is-boolean-object: registry.npmmirror.com/is-boolean-object@1.1.2 - is-number-object: registry.npmmirror.com/is-number-object@1.0.7 - is-string: registry.npmmirror.com/is-string@1.0.7 - is-symbol: registry.npmmirror.com/is-symbol@1.0.4 - dev: true - - registry.npmmirror.com/which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==, tarball: https://registry.npmmirror.com/which-collection/-/which-collection-1.0.1.tgz} - name: which-collection - version: 1.0.1 - dependencies: - is-map: registry.npmmirror.com/is-map@2.0.2 - is-set: registry.npmmirror.com/is-set@2.0.2 - is-weakmap: registry.npmmirror.com/is-weakmap@2.0.1 - is-weakset: registry.npmmirror.com/is-weakset@2.0.2 - dev: true - - registry.npmmirror.com/which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==, tarball: https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.13.tgz} - name: which-typed-array - version: 1.1.13 - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 - call-bind: registry.npmmirror.com/call-bind@1.0.5 - for-each: registry.npmmirror.com/for-each@0.3.3 - gopd: registry.npmmirror.com/gopd@1.0.1 - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, tarball: https://registry.npmmirror.com/which/-/which-2.0.2.tgz} - name: which - version: 2.0.2 - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: registry.npmmirror.com/isexe@2.0.0 - dev: true - - registry.npmmirror.com/which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, tarball: https://registry.npmmirror.com/which/-/which-4.0.0.tgz} - name: which - version: 4.0.0 - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true - dependencies: - isexe: registry.npmmirror.com/isexe@3.1.1 - dev: true - - registry.npmmirror.com/workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==, tarball: https://registry.npmmirror.com/workerpool/-/workerpool-6.2.1.tgz} - name: workerpool - version: 6.2.1 - dev: true - - registry.npmmirror.com/wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz} - name: wrap-ansi - version: 6.2.0 - engines: {node: '>=8'} - dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 - string-width: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - dev: true - - registry.npmmirror.com/wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz} - name: wrap-ansi - version: 7.0.0 - engines: {node: '>=10'} - dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 - string-width: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - dev: true - - registry.npmmirror.com/wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz} - name: wrap-ansi - version: 8.1.0 - engines: {node: '>=12'} - dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles@6.2.1 - string-width: registry.npmmirror.com/string-width@5.1.2 - strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 - dev: true - - registry.npmmirror.com/wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, tarball: https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz} - name: wrappy - version: 1.0.2 - dev: true - - registry.npmmirror.com/write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, tarball: https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz} - name: write-file-atomic - version: 4.0.2 - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 - signal-exit: registry.npmmirror.com/signal-exit@3.0.7 - dev: true - - registry.npmmirror.com/ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==, tarball: https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz} - name: ws - version: 8.13.0 - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: + + registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + tarball: https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz, + } + id: registry.npmmirror.com/@eslint-community/eslint-utils/4.4.0 + name: "@eslint-community/eslint-utils" + version: 4.4.0 + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: registry.npmmirror.com/eslint@8.56.0 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 + dev: true + + registry.npmmirror.com/@eslint-community/regexpp@4.10.0: + resolution: + { + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, + tarball: https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz, + } + name: "@eslint-community/regexpp" + version: 4.10.0 + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + dev: true + + registry.npmmirror.com/@eslint/eslintrc@2.1.4: + resolution: + { + integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, + tarball: https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz, + } + name: "@eslint/eslintrc" + version: 2.1.4 + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: registry.npmmirror.com/ajv@6.12.6 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + espree: registry.npmmirror.com/espree@9.6.1 + globals: registry.npmmirror.com/globals@13.23.0 + ignore: registry.npmmirror.com/ignore@5.2.4 + import-fresh: registry.npmmirror.com/import-fresh@3.3.0 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@eslint/js@8.56.0: + resolution: + { + integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, + tarball: https://registry.npmmirror.com/@eslint/js/-/js-8.56.0.tgz, + } + name: "@eslint/js" + version: 8.56.0 + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + registry.npmmirror.com/@humanwhocodes/config-array@0.11.13: + resolution: + { + integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, + tarball: https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz, + } + name: "@humanwhocodes/config-array" + version: 0.11.13 + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": registry.npmmirror.com/@humanwhocodes/object-schema@2.0.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + minimatch: registry.npmmirror.com/minimatch@3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + tarball: https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz, + } + name: "@humanwhocodes/module-importer" + version: 1.0.1 + engines: { node: ">=12.22" } + dev: true + + registry.npmmirror.com/@humanwhocodes/object-schema@2.0.1: + resolution: + { + integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, + tarball: https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz, + } + name: "@humanwhocodes/object-schema" + version: 2.0.1 + dev: true + + registry.npmmirror.com/@isaacs/cliui@8.0.2: + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + tarball: https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz, + } + name: "@isaacs/cliui" + version: 8.0.2 + engines: { node: ">=12" } + dependencies: + string-width: registry.npmmirror.com/string-width@5.1.2 + string-width-cjs: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 + strip-ansi-cjs: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@8.1.0 + wrap-ansi-cjs: registry.npmmirror.com/wrap-ansi@7.0.0 + dev: true + + registry.npmmirror.com/@istanbuljs/load-nyc-config@1.1.0: + resolution: + { + integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, + tarball: https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz, + } + name: "@istanbuljs/load-nyc-config" + version: 1.1.0 + engines: { node: ">=8" } + dependencies: + camelcase: registry.npmmirror.com/camelcase@5.3.1 + find-up: registry.npmmirror.com/find-up@4.1.0 + get-package-type: registry.npmmirror.com/get-package-type@0.1.0 + js-yaml: registry.npmmirror.com/js-yaml@3.14.1 + resolve-from: registry.npmmirror.com/resolve-from@5.0.0 + dev: true + + registry.npmmirror.com/@istanbuljs/schema@0.1.3: + resolution: + { + integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, + tarball: https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz, + } + name: "@istanbuljs/schema" + version: 0.1.3 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/@jest/console@29.7.0: + resolution: + { + integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==, + tarball: https://registry.npmmirror.com/@jest/console/-/console-29.7.0.tgz, + } + name: "@jest/console" + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + dev: true + + registry.npmmirror.com/@jest/core@29.7.0: + resolution: + { + integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==, + tarball: https://registry.npmmirror.com/@jest/core/-/core-29.7.0.tgz, + } + name: "@jest/core" + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + "@jest/console": registry.npmmirror.com/@jest/console@29.7.0 + "@jest/reporters": registry.npmmirror.com/@jest/reporters@29.7.0 + "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 + "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 + chalk: registry.npmmirror.com/chalk@4.1.2 + ci-info: registry.npmmirror.com/ci-info@3.9.0 + exit: registry.npmmirror.com/exit@0.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-changed-files: registry.npmmirror.com/jest-changed-files@29.7.0 + jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-resolve-dependencies: registry.npmmirror.com/jest-resolve-dependencies@29.7.0 + jest-runner: registry.npmmirror.com/jest-runner@29.7.0 + jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + jest-watcher: registry.npmmirror.com/jest-watcher@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + registry.npmmirror.com/@jest/environment@29.7.0: + resolution: + { + integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==, + tarball: https://registry.npmmirror.com/@jest/environment/-/environment-29.7.0.tgz, + } + name: "@jest/environment" + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/fake-timers": registry.npmmirror.com/@jest/fake-timers@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + dev: true + + registry.npmmirror.com/@jest/expect-utils@29.7.0: + resolution: + { + integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==, + tarball: https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz, + } + name: "@jest/expect-utils" + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + dev: true + + registry.npmmirror.com/@jest/expect@29.7.0: + resolution: + { + integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==, + tarball: https://registry.npmmirror.com/@jest/expect/-/expect-29.7.0.tgz, + } + name: "@jest/expect" + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + expect: registry.npmmirror.com/expect@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@jest/fake-timers@29.7.0: + resolution: + { + integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==, + tarball: https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz, + } + name: "@jest/fake-timers" + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@sinonjs/fake-timers": registry.npmmirror.com/@sinonjs/fake-timers@10.0.2 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + dev: true + + registry.npmmirror.com/@jest/globals@29.7.0: + resolution: + { + integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==, + tarball: https://registry.npmmirror.com/@jest/globals/-/globals-29.7.0.tgz, + } + name: "@jest/globals" + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 + "@jest/expect": registry.npmmirror.com/@jest/expect@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@jest/reporters@29.7.0: + resolution: + { + integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==, + tarball: https://registry.npmmirror.com/@jest/reporters/-/reporters-29.7.0.tgz, + } + name: "@jest/reporters" + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + "@bcoe/v8-coverage": registry.npmmirror.com/@bcoe/v8-coverage@0.2.3 + "@jest/console": registry.npmmirror.com/@jest/console@29.7.0 + "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 + "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 + exit: registry.npmmirror.com/exit@0.1.2 + glob: registry.npmmirror.com/glob@7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument@6.0.1 + istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.1 + istanbul-lib-source-maps: registry.npmmirror.com/istanbul-lib-source-maps@4.0.1 + istanbul-reports: registry.npmmirror.com/istanbul-reports@3.1.5 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-worker: registry.npmmirror.com/jest-worker@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + string-length: registry.npmmirror.com/string-length@4.0.2 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + v8-to-istanbul: registry.npmmirror.com/v8-to-istanbul@9.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@jest/schemas@29.6.3: + resolution: + { + integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, + tarball: https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz, + } + name: "@jest/schemas" + version: 29.6.3 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@sinclair/typebox": registry.npmmirror.com/@sinclair/typebox@0.27.8 + dev: true + + registry.npmmirror.com/@jest/source-map@29.6.3: + resolution: + { + integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==, + tarball: https://registry.npmmirror.com/@jest/source-map/-/source-map-29.6.3.tgz, + } + name: "@jest/source-map" + version: 29.6.3 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + callsites: registry.npmmirror.com/callsites@3.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + dev: true + + registry.npmmirror.com/@jest/test-result@29.7.0: + resolution: + { + integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==, + tarball: https://registry.npmmirror.com/@jest/test-result/-/test-result-29.7.0.tgz, + } + name: "@jest/test-result" + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/console": registry.npmmirror.com/@jest/console@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/istanbul-lib-coverage": registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 + dev: true + + registry.npmmirror.com/@jest/test-sequencer@29.7.0: + resolution: + { + integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==, + tarball: https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz, + } + name: "@jest/test-sequencer" + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + dev: true + + registry.npmmirror.com/@jest/transform@29.7.0: + resolution: + { + integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==, + tarball: https://registry.npmmirror.com/@jest/transform/-/transform-29.7.0.tgz, + } + name: "@jest/transform" + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul@6.1.1 + chalk: registry.npmmirror.com/chalk@4.1.2 + convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify@2.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + pirates: registry.npmmirror.com/pirates@4.0.5 + slash: registry.npmmirror.com/slash@3.0.0 + write-file-atomic: registry.npmmirror.com/write-file-atomic@4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@jest/types@29.6.3: + resolution: + { + integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, + tarball: https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz, + } + name: "@jest/types" + version: 29.6.3 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/schemas": registry.npmmirror.com/@jest/schemas@29.6.3 + "@types/istanbul-lib-coverage": registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + "@types/istanbul-reports": registry.npmmirror.com/@types/istanbul-reports@3.0.4 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + "@types/yargs": registry.npmmirror.com/@types/yargs@17.0.31 + chalk: registry.npmmirror.com/chalk@4.1.2 + dev: true + + registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3: + resolution: + { + integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, + tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz, + } + name: "@jridgewell/gen-mapping" + version: 0.3.3 + engines: { node: ">=6.0.0" } + dependencies: + "@jridgewell/set-array": registry.npmmirror.com/@jridgewell/set-array@1.1.2 + "@jridgewell/sourcemap-codec": registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15 + "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + dev: true + + registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0: + resolution: + { + integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, + tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz, + } + name: "@jridgewell/resolve-uri" + version: 3.1.0 + engines: { node: ">=6.0.0" } + dev: true + + registry.npmmirror.com/@jridgewell/set-array@1.1.2: + resolution: + { + integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, + tarball: https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz, + } + name: "@jridgewell/set-array" + version: 1.1.2 + engines: { node: ">=6.0.0" } + dev: true + + registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15: + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz, + } + name: "@jridgewell/sourcemap-codec" + version: 1.4.15 + dev: true + + registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20: + resolution: + { + integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==, + tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz, + } + name: "@jridgewell/trace-mapping" + version: 0.3.20 + dependencies: + "@jridgewell/resolve-uri": registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0 + "@jridgewell/sourcemap-codec": registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15 + dev: true + + registry.npmmirror.com/@kurkle/color@0.3.2: + resolution: + { + integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==, + tarball: https://registry.npmmirror.com/@kurkle/color/-/color-0.3.2.tgz, + } + name: "@kurkle/color" + version: 0.3.2 + dev: false + + registry.npmmirror.com/@ljharb/through@2.3.11: + resolution: + { + integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==, + tarball: https://registry.npmmirror.com/@ljharb/through/-/through-2.3.11.tgz, + } + name: "@ljharb/through" + version: 2.3.11 + engines: { node: ">= 0.4" } + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + dev: true + + registry.npmmirror.com/@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + tarball: https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz, + } + name: "@nodelib/fs.scandir" + version: 2.1.5 + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": registry.npmmirror.com/@nodelib/fs.stat@2.0.5 + run-parallel: registry.npmmirror.com/run-parallel@1.2.0 + dev: true + + registry.npmmirror.com/@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + tarball: https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz, + } + name: "@nodelib/fs.stat" + version: 2.0.5 + engines: { node: ">= 8" } + dev: true + + registry.npmmirror.com/@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + tarball: https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz, + } + name: "@nodelib/fs.walk" + version: 1.2.8 + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": registry.npmmirror.com/@nodelib/fs.scandir@2.1.5 + fastq: registry.npmmirror.com/fastq@1.15.0 + dev: true + + registry.npmmirror.com/@pkgjs/parseargs@0.11.0: + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + tarball: https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz, + } + name: "@pkgjs/parseargs" + version: 0.11.0 + engines: { node: ">=14" } + requiresBuild: true + dev: true optional: true - utf-8-validate: + + registry.npmmirror.com/@puppeteer/browsers@1.4.6(typescript@5.1.6): + resolution: + { + integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==, + tarball: https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-1.4.6.tgz, + } + id: registry.npmmirror.com/@puppeteer/browsers/1.4.6 + name: "@puppeteer/browsers" + version: 1.4.6 + engines: { node: ">=16.3.0" } + hasBin: true + peerDependencies: + typescript: ">= 4.7.4" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + extract-zip: registry.npmmirror.com/extract-zip@2.0.1 + progress: registry.npmmirror.com/progress@2.0.3 + proxy-agent: registry.npmmirror.com/proxy-agent@6.3.0 + tar-fs: registry.npmmirror.com/tar-fs@3.0.4 + typescript: 5.1.6 + unbzip2-stream: registry.npmmirror.com/unbzip2-stream@1.4.3 + yargs: registry.npmmirror.com/yargs@17.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@puppeteer/browsers@1.8.0: + resolution: + { + integrity: sha512-TkRHIV6k2D8OlUe8RtG+5jgOF/H98Myx0M6AOafC8DdNVOFiBSFa5cpRDtpm8LXOa9sVwe0+e6Q3FC56X/DZfg==, + tarball: https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-1.8.0.tgz, + } + name: "@puppeteer/browsers" + version: 1.8.0 + engines: { node: ">=16.3.0" } + hasBin: true + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + extract-zip: registry.npmmirror.com/extract-zip@2.0.1 + progress: registry.npmmirror.com/progress@2.0.3 + proxy-agent: registry.npmmirror.com/proxy-agent@6.3.1 + tar-fs: registry.npmmirror.com/tar-fs@3.0.4 + unbzip2-stream: registry.npmmirror.com/unbzip2-stream@1.4.3 + yargs: registry.npmmirror.com/yargs@17.7.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@sinclair/typebox@0.27.8: + resolution: + { + integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, + tarball: https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz, + } + name: "@sinclair/typebox" + version: 0.27.8 + dev: true + + registry.npmmirror.com/@sindresorhus/is@5.3.0: + resolution: + { + integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==, + tarball: https://registry.npmmirror.com/@sindresorhus/is/-/is-5.3.0.tgz, + } + name: "@sindresorhus/is" + version: 5.3.0 + engines: { node: ">=14.16" } + dev: true + + registry.npmmirror.com/@sinonjs/commons@2.0.0: + resolution: + { + integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==, + tarball: https://registry.npmmirror.com/@sinonjs/commons/-/commons-2.0.0.tgz, + } + name: "@sinonjs/commons" + version: 2.0.0 + dependencies: + type-detect: registry.npmmirror.com/type-detect@4.0.8 + dev: true + + registry.npmmirror.com/@sinonjs/fake-timers@10.0.2: + resolution: + { + integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==, + tarball: https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz, + } + name: "@sinonjs/fake-timers" + version: 10.0.2 + dependencies: + "@sinonjs/commons": registry.npmmirror.com/@sinonjs/commons@2.0.0 + dev: true + + registry.npmmirror.com/@szmarczak/http-timer@5.0.1: + resolution: + { + integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==, + tarball: https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz, + } + name: "@szmarczak/http-timer" + version: 5.0.1 + engines: { node: ">=14.16" } + dependencies: + defer-to-connect: registry.npmmirror.com/defer-to-connect@2.0.1 + dev: true + + registry.npmmirror.com/@tootallnate/once@2.0.0: + resolution: + { + integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, + tarball: https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz, + } + name: "@tootallnate/once" + version: 2.0.0 + engines: { node: ">= 10" } + dev: true + + registry.npmmirror.com/@tootallnate/quickjs-emscripten@0.23.0: + resolution: + { + integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==, + tarball: https://registry.npmmirror.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz, + } + name: "@tootallnate/quickjs-emscripten" + version: 0.23.0 + dev: true + + registry.npmmirror.com/@types/babel__core@7.20.4: + resolution: + { + integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==, + tarball: https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.4.tgz, + } + name: "@types/babel__core" + version: 7.20.4 + dependencies: + "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + "@types/babel__generator": registry.npmmirror.com/@types/babel__generator@7.6.7 + "@types/babel__template": registry.npmmirror.com/@types/babel__template@7.4.4 + "@types/babel__traverse": registry.npmmirror.com/@types/babel__traverse@7.20.4 + dev: true + + registry.npmmirror.com/@types/babel__generator@7.6.7: + resolution: + { + integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==, + tarball: https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.7.tgz, + } + name: "@types/babel__generator" + version: 7.6.7 + dependencies: + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@types/babel__template@7.4.4: + resolution: + { + integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, + tarball: https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz, + } + name: "@types/babel__template" + version: 7.4.4 + dependencies: + "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@types/babel__traverse@7.20.4: + resolution: + { + integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==, + tarball: https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz, + } + name: "@types/babel__traverse" + version: 7.20.4 + dependencies: + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@types/codemirror@5.60.8: + resolution: + { + integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==, + tarball: https://registry.npmmirror.com/@types/codemirror/-/codemirror-5.60.8.tgz, + } + name: "@types/codemirror" + version: 5.60.8 + dependencies: + "@types/tern": registry.npmmirror.com/@types/tern@0.23.7 + dev: true + + registry.npmmirror.com/@types/estree@1.0.5: + resolution: + { + integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, + tarball: https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz, + } + name: "@types/estree" + version: 1.0.5 + dev: true + + registry.npmmirror.com/@types/graceful-fs@4.1.9: + resolution: + { + integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, + tarball: https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz, + } + name: "@types/graceful-fs" + version: 4.1.9 + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + dev: true + + registry.npmmirror.com/@types/http-cache-semantics@4.0.4: + resolution: + { + integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==, + tarball: https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz, + } + name: "@types/http-cache-semantics" + version: 4.0.4 + dev: true + + registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6: + resolution: + { + integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, + tarball: https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz, + } + name: "@types/istanbul-lib-coverage" + version: 2.0.6 + dev: true + + registry.npmmirror.com/@types/istanbul-lib-report@3.0.3: + resolution: + { + integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, + tarball: https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz, + } + name: "@types/istanbul-lib-report" + version: 3.0.3 + dependencies: + "@types/istanbul-lib-coverage": registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + dev: true + + registry.npmmirror.com/@types/istanbul-reports@3.0.4: + resolution: + { + integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, + tarball: https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz, + } + name: "@types/istanbul-reports" + version: 3.0.4 + dependencies: + "@types/istanbul-lib-report": registry.npmmirror.com/@types/istanbul-lib-report@3.0.3 + dev: true + + registry.npmmirror.com/@types/jest@29.5.11: + resolution: + { + integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==, + tarball: https://registry.npmmirror.com/@types/jest/-/jest-29.5.11.tgz, + } + name: "@types/jest" + version: 29.5.11 + dependencies: + expect: registry.npmmirror.com/expect@29.7.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/@types/jsdom@20.0.1: + resolution: + { + integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==, + tarball: https://registry.npmmirror.com/@types/jsdom/-/jsdom-20.0.1.tgz, + } + name: "@types/jsdom" + version: 20.0.1 + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + "@types/tough-cookie": registry.npmmirror.com/@types/tough-cookie@4.0.5 + parse5: registry.npmmirror.com/parse5@7.1.2 + dev: true + + registry.npmmirror.com/@types/json-schema@7.0.15: + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + tarball: https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz, + } + name: "@types/json-schema" + version: 7.0.15 + dev: true + + registry.npmmirror.com/@types/mocha@10.0.4: + resolution: + { + integrity: sha512-xKU7bUjiFTIttpWaIZ9qvgg+22O1nmbA+HRxdlR+u6TWsGfmFdXrheJoK4fFxrHNVIOBDvDNKZG+LYBpMHpX3w==, + tarball: https://registry.npmmirror.com/@types/mocha/-/mocha-10.0.4.tgz, + } + name: "@types/mocha" + version: 10.0.4 + dev: true + + registry.npmmirror.com/@types/node@20.11.0: + resolution: + { + integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==, + tarball: https://registry.npmmirror.com/@types/node/-/node-20.11.0.tgz, + } + name: "@types/node" + version: 20.11.0 + dependencies: + undici-types: registry.npmmirror.com/undici-types@5.26.5 + dev: true + + registry.npmmirror.com/@types/normalize-package-data@2.4.4: + resolution: + { + integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, + tarball: https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz, + } + name: "@types/normalize-package-data" + version: 2.4.4 + dev: true + + registry.npmmirror.com/@types/semver@7.5.5: + resolution: + { + integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==, + tarball: https://registry.npmmirror.com/@types/semver/-/semver-7.5.5.tgz, + } + name: "@types/semver" + version: 7.5.5 + dev: true + + registry.npmmirror.com/@types/stack-utils@2.0.3: + resolution: + { + integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, + tarball: https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.3.tgz, + } + name: "@types/stack-utils" + version: 2.0.3 + dev: true + + registry.npmmirror.com/@types/tern@0.23.7: + resolution: + { + integrity: sha512-0YS9XCZ0LAhlP11HV9SqncUYyz9Ggsgc7Om/AmchKvoeFyj0qPaJmX6rJ93mJVExizWDzUMb49gAtVpI1uHd8Q==, + tarball: https://registry.npmmirror.com/@types/tern/-/tern-0.23.7.tgz, + } + name: "@types/tern" + version: 0.23.7 + dependencies: + "@types/estree": registry.npmmirror.com/@types/estree@1.0.5 + dev: true + + registry.npmmirror.com/@types/tough-cookie@4.0.5: + resolution: + { + integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==, + tarball: https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz, + } + name: "@types/tough-cookie" + version: 4.0.5 + dev: true + + registry.npmmirror.com/@types/vhtml@2.2.9: + resolution: + { + integrity: sha512-maEIRJb+PdK2FWDORl0a0aNUSGlniMl8pN+7WbanLzx1Gry4gLfsT0C9O/6JucPPBHCNrqDSImr2QcsUENLKUg==, + tarball: https://registry.npmmirror.com/@types/vhtml/-/vhtml-2.2.9.tgz, + } + name: "@types/vhtml" + version: 2.2.9 + dev: true + + registry.npmmirror.com/@types/which@2.0.2: + resolution: + { + integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==, + tarball: https://registry.npmmirror.com/@types/which/-/which-2.0.2.tgz, + } + name: "@types/which" + version: 2.0.2 + dev: true + + registry.npmmirror.com/@types/ws@8.5.9: + resolution: + { + integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==, + tarball: https://registry.npmmirror.com/@types/ws/-/ws-8.5.9.tgz, + } + name: "@types/ws" + version: 8.5.9 + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + dev: true + + registry.npmmirror.com/@types/yargs-parser@21.0.3: + resolution: + { + integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, + tarball: https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz, + } + name: "@types/yargs-parser" + version: 21.0.3 + dev: true + + registry.npmmirror.com/@types/yargs@17.0.31: + resolution: + { + integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==, + tarball: https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.31.tgz, + } + name: "@types/yargs" + version: 17.0.31 + dependencies: + "@types/yargs-parser": registry.npmmirror.com/@types/yargs-parser@21.0.3 + dev: true + + registry.npmmirror.com/@types/yauzl@2.10.3: + resolution: + { + integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, + tarball: https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz, + } + name: "@types/yauzl" + version: 2.10.3 + requiresBuild: true + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + dev: true optional: true - dev: true - - registry.npmmirror.com/ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, tarball: https://registry.npmmirror.com/ws/-/ws-8.14.2.tgz} - name: ws - version: 8.14.2 - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: + + registry.npmmirror.com/@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.1.6): + resolution: + { + integrity: sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==, + tarball: https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz, + } + id: registry.npmmirror.com/@typescript-eslint/eslint-plugin/6.18.1 + name: "@typescript-eslint/eslint-plugin" + version: 6.18.1 + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@eslint-community/regexpp": registry.npmmirror.com/@eslint-community/regexpp@4.10.0 + "@typescript-eslint/parser": registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6) + "@typescript-eslint/scope-manager": registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 + "@typescript-eslint/type-utils": registry.npmmirror.com/@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) + "@typescript-eslint/utils": registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) + "@typescript-eslint/visitor-keys": registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmmirror.com/eslint@8.56.0 + graphemer: registry.npmmirror.com/graphemer@1.4.0 + ignore: registry.npmmirror.com/ignore@5.2.4 + natural-compare: registry.npmmirror.com/natural-compare@1.4.0 + semver: registry.npmmirror.com/semver@7.5.4 + ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6): + resolution: + { + integrity: sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==, + tarball: https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.18.1.tgz, + } + id: registry.npmmirror.com/@typescript-eslint/parser/6.18.1 + name: "@typescript-eslint/parser" + version: 6.18.1 + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/scope-manager": registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 + "@typescript-eslint/types": registry.npmmirror.com/@typescript-eslint/types@6.18.1 + "@typescript-eslint/typescript-estree": registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) + "@typescript-eslint/visitor-keys": registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmmirror.com/eslint@8.56.0 + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1: + resolution: + { + integrity: sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==, + tarball: https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz, + } + name: "@typescript-eslint/scope-manager" + version: 6.18.1 + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": registry.npmmirror.com/@typescript-eslint/types@6.18.1 + "@typescript-eslint/visitor-keys": registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 + dev: true + + registry.npmmirror.com/@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.1.6): + resolution: + { + integrity: sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==, + tarball: https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz, + } + id: registry.npmmirror.com/@typescript-eslint/type-utils/6.18.1 + name: "@typescript-eslint/type-utils" + version: 6.18.1 + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/typescript-estree": registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) + "@typescript-eslint/utils": registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmmirror.com/eslint@8.56.0 + ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/types@6.18.1: + resolution: + { + integrity: sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==, + tarball: https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.18.1.tgz, + } + name: "@typescript-eslint/types" + version: 6.18.1 + engines: { node: ^16.0.0 || >=18.0.0 } + dev: true + + registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6): + resolution: + { + integrity: sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==, + tarball: https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz, + } + id: registry.npmmirror.com/@typescript-eslint/typescript-estree/6.18.1 + name: "@typescript-eslint/typescript-estree" + version: 6.18.1 + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/types": registry.npmmirror.com/@typescript-eslint/types@6.18.1 + "@typescript-eslint/visitor-keys": registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + globby: registry.npmmirror.com/globby@11.1.0 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + minimatch: registry.npmmirror.com/minimatch@9.0.3 + semver: registry.npmmirror.com/semver@7.5.4 + ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6): + resolution: + { + integrity: sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==, + tarball: https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.18.1.tgz, + } + id: registry.npmmirror.com/@typescript-eslint/utils/6.18.1 + name: "@typescript-eslint/utils" + version: 6.18.1 + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + "@eslint-community/eslint-utils": registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0) + "@types/json-schema": registry.npmmirror.com/@types/json-schema@7.0.15 + "@types/semver": registry.npmmirror.com/@types/semver@7.5.5 + "@typescript-eslint/scope-manager": registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 + "@typescript-eslint/types": registry.npmmirror.com/@typescript-eslint/types@6.18.1 + "@typescript-eslint/typescript-estree": registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) + eslint: registry.npmmirror.com/eslint@8.56.0 + semver: registry.npmmirror.com/semver@7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1: + resolution: + { + integrity: sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==, + tarball: https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz, + } + name: "@typescript-eslint/visitor-keys" + version: 6.18.1 + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": registry.npmmirror.com/@typescript-eslint/types@6.18.1 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 + dev: true + + registry.npmmirror.com/@ungap/structured-clone@1.2.0: + resolution: + { + integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, + tarball: https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz, + } + name: "@ungap/structured-clone" + version: 1.2.0 + dev: true + + registry.npmmirror.com/@wdio/cli@8.27.2(typescript@5.1.6): + resolution: + { + integrity: sha512-gRbwqjjczReWqLFZQX9iwTsCwGPFavJwL7iKSoIeAS645sM9PMmPW7mHzawmkFxqDDAyBWO3qFn4KV2H/2YfdA==, + tarball: https://registry.npmmirror.com/@wdio/cli/-/cli-8.27.2.tgz, + } + id: registry.npmmirror.com/@wdio/cli/8.27.2 + name: "@wdio/cli" + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + hasBin: true + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + "@wdio/config": registry.npmmirror.com/@wdio/config@8.27.2 + "@wdio/globals": registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + "@wdio/protocols": registry.npmmirror.com/@wdio/protocols@8.24.12 + "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 + "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 + async-exit-hook: registry.npmmirror.com/async-exit-hook@2.0.1 + chalk: registry.npmmirror.com/chalk@5.3.0 + chokidar: registry.npmmirror.com/chokidar@3.5.3 + cli-spinners: registry.npmmirror.com/cli-spinners@2.9.1 + dotenv: registry.npmmirror.com/dotenv@16.3.1 + ejs: registry.npmmirror.com/ejs@3.1.9 + execa: registry.npmmirror.com/execa@8.0.1 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 + inquirer: registry.npmmirror.com/inquirer@9.2.12 + lodash.flattendeep: registry.npmmirror.com/lodash.flattendeep@4.4.0 + lodash.pickby: registry.npmmirror.com/lodash.pickby@4.6.0 + lodash.union: registry.npmmirror.com/lodash.union@4.6.0 + read-pkg-up: registry.npmmirror.com/read-pkg-up@10.1.0 + recursive-readdir: registry.npmmirror.com/recursive-readdir@2.2.3 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + yargs: registry.npmmirror.com/yargs@17.7.2 + transitivePeerDependencies: + - bufferutil + - devtools + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/@wdio/config@8.27.2: + resolution: + { + integrity: sha512-qR1r7K7/jsQhi9g5NiW40lgbvbzCcwwk8nz07hzTj6m8fQ8TXkQPob2fnrlDaNrXjzbZC4od0uv0a5fimK9YOQ==, + tarball: https://registry.npmmirror.com/@wdio/config/-/config-8.27.2.tgz, + } + name: "@wdio/config" + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + dependencies: + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 + "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + glob: registry.npmmirror.com/glob@10.3.10 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6): + resolution: + { + integrity: sha512-kU9fsOD1HVSROgN0TkjH8+O2SWbd5hHzL952+YOifMHFtt05Ua/n5mqxTTVAWmxUMMCz6VOuySmBt2Dhd4NnKA==, + tarball: https://registry.npmmirror.com/@wdio/globals/-/globals-8.27.2.tgz, + } + id: registry.npmmirror.com/@wdio/globals/8.27.2 + name: "@wdio/globals" + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + optionalDependencies: + expect-webdriverio: registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6) + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + transitivePeerDependencies: + - bufferutil + - devtools + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/@wdio/local-runner@8.27.2(typescript@5.1.6): + resolution: + { + integrity: sha512-7m0vEulOyriMPB1+559ioEdjXlLu7yseM3KfQapCdLqaqTWvURJlMSxiHZZwuHaVGKa6YBPNB7NhRcHoUsqsAg==, + tarball: https://registry.npmmirror.com/@wdio/local-runner/-/local-runner-8.27.2.tgz, + } + id: registry.npmmirror.com/@wdio/local-runner/8.27.2 + name: "@wdio/local-runner" + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + "@wdio/repl": registry.npmmirror.com/@wdio/repl@8.24.12 + "@wdio/runner": registry.npmmirror.com/@wdio/runner@8.27.2(typescript@5.1.6) + "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 + async-exit-hook: registry.npmmirror.com/async-exit-hook@2.0.1 + split2: registry.npmmirror.com/split2@4.2.0 + stream-buffers: registry.npmmirror.com/stream-buffers@3.0.2 + transitivePeerDependencies: + - bufferutil + - devtools + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/@wdio/logger@8.24.12: + resolution: + { + integrity: sha512-QisOiVIWKTUCf1H7S+DOtC+gruhlpimQrUXfWMTeeh672PvAJYnTpOJDWA+BtXfsikkUYFAzAaq8SeMJk8rqKg==, + tarball: https://registry.npmmirror.com/@wdio/logger/-/logger-8.24.12.tgz, + } + name: "@wdio/logger" + version: 8.24.12 + engines: { node: ^16.13 || >=18 } + dependencies: + chalk: registry.npmmirror.com/chalk@5.3.0 + loglevel: registry.npmmirror.com/loglevel@1.8.1 + loglevel-plugin-prefix: registry.npmmirror.com/loglevel-plugin-prefix@0.8.4 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 + dev: true + + registry.npmmirror.com/@wdio/mocha-framework@8.27.2: + resolution: + { + integrity: sha512-R0PRW5X8VDJzpHPhtOGkcPFrcetDOYz9q//4uqvdtdKtngrp4goz2cVNEmnbXJDMUm5VHSYy2GW6YtsjWUxbkA==, + tarball: https://registry.npmmirror.com/@wdio/mocha-framework/-/mocha-framework-8.27.2.tgz, + } + name: "@wdio/mocha-framework" + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + dependencies: + "@types/mocha": registry.npmmirror.com/@types/mocha@10.0.4 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 + "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 + mocha: registry.npmmirror.com/mocha@10.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@wdio/protocols@8.24.12: + resolution: + { + integrity: sha512-QnVj3FkapmVD3h2zoZk+ZQ8gevSj9D9MiIQIy8eOnY4FAneYZ9R9GvoW+mgNcCZO8S8++S/jZHetR8n+8Q808g==, + tarball: https://registry.npmmirror.com/@wdio/protocols/-/protocols-8.24.12.tgz, + } + name: "@wdio/protocols" + version: 8.24.12 + dev: true + + registry.npmmirror.com/@wdio/repl@8.24.12: + resolution: + { + integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==, + tarball: https://registry.npmmirror.com/@wdio/repl/-/repl-8.24.12.tgz, + } + name: "@wdio/repl" + version: 8.24.12 + engines: { node: ^16.13 || >=18 } + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + dev: true + + registry.npmmirror.com/@wdio/reporter@8.27.2: + resolution: + { + integrity: sha512-vMhoTVsowDmk6EXYgJ4nFBd6vvMFLIO3zUL4w/DCCkPDyjS9/6ggs/wpVSlrKxw9qisAph1Z4W9ngtNuhQQuwg==, + tarball: https://registry.npmmirror.com/@wdio/reporter/-/reporter-8.27.2.tgz, + } + name: "@wdio/reporter" + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 + diff: registry.npmmirror.com/diff@5.1.0 + object-inspect: registry.npmmirror.com/object-inspect@1.13.1 + dev: true + + registry.npmmirror.com/@wdio/runner@8.27.2(typescript@5.1.6): + resolution: + { + integrity: sha512-a72dJ+7ap0DOrkrjx1ofYHzgDYzK0I7RjSGOEvi2cc+SwnwESHnwtPug5F3NfDFEMXV3Y3pN+E/yz81S27WpvQ==, + tarball: https://registry.npmmirror.com/@wdio/runner/-/runner-8.27.2.tgz, + } + id: registry.npmmirror.com/@wdio/runner/8.27.2 + name: "@wdio/runner" + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + "@wdio/config": registry.npmmirror.com/@wdio/config@8.27.2 + "@wdio/globals": registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 + "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + expect-webdriverio: registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6) + gaze: registry.npmmirror.com/gaze@1.1.3 + webdriver: registry.npmmirror.com/webdriver@8.27.2 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + transitivePeerDependencies: + - bufferutil + - devtools + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/@wdio/spec-reporter@8.27.2: + resolution: + { + integrity: sha512-2U1MALAHjUqDo3C+PYinN1wAnDBiy+kLG3GrTpMeIWZ2qZ6m1fRWt9GlADX7r07vhiRqShxy131nUenqeoF/qg==, + tarball: https://registry.npmmirror.com/@wdio/spec-reporter/-/spec-reporter-8.27.2.tgz, + } + name: "@wdio/spec-reporter" + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + dependencies: + "@wdio/reporter": registry.npmmirror.com/@wdio/reporter@8.27.2 + "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 + chalk: registry.npmmirror.com/chalk@5.3.0 + easy-table: registry.npmmirror.com/easy-table@1.2.0 + pretty-ms: registry.npmmirror.com/pretty-ms@7.0.1 + dev: true + + registry.npmmirror.com/@wdio/types@8.27.2: + resolution: + { + integrity: sha512-z/TtSQysEtAUNh+DooOs22G7xotTsJC2RcIZKaVtHY4Gl6lF+tn8kLRXD79jem2ta1byB1TpW62K366k1vzcLw==, + tarball: https://registry.npmmirror.com/@wdio/types/-/types-8.27.2.tgz, + } + name: "@wdio/types" + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + dev: true + + registry.npmmirror.com/@wdio/utils@8.27.2: + resolution: + { + integrity: sha512-jWxUhGjlZ4L3uOsP96oLKWjkITpoH/KPTtKzU7xdoVGhd1LXK4d/Fr8cTFTNkDBXM7yuM7C+EMmQ8HJHR55KTA==, + tarball: https://registry.npmmirror.com/@wdio/utils/-/utils-8.27.2.tgz, + } + name: "@wdio/utils" + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + dependencies: + "@puppeteer/browsers": registry.npmmirror.com/@puppeteer/browsers@1.8.0 + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + edgedriver: registry.npmmirror.com/edgedriver@5.3.8 + geckodriver: registry.npmmirror.com/geckodriver@4.2.1 + get-port: registry.npmmirror.com/get-port@7.0.0 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 + locate-app: registry.npmmirror.com/locate-app@2.1.0 + safaridriver: registry.npmmirror.com/safaridriver@0.1.0 + split2: registry.npmmirror.com/split2@4.2.0 + wait-port: registry.npmmirror.com/wait-port@1.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/abab@2.0.6: + resolution: + { + integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, + tarball: https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz, + } + name: abab + version: 2.0.6 + deprecated: Use your platform's native atob() and btoa() methods instead + dev: true + + registry.npmmirror.com/acorn-globals@7.0.1: + resolution: + { + integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==, + tarball: https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz, + } + name: acorn-globals + version: 7.0.1 + dependencies: + acorn: registry.npmmirror.com/acorn@8.11.2 + acorn-walk: registry.npmmirror.com/acorn-walk@8.3.0 + dev: true + + registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.11.2): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + tarball: https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz, + } + id: registry.npmmirror.com/acorn-jsx/5.3.2 + name: acorn-jsx + version: 5.3.2 + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: registry.npmmirror.com/acorn@8.11.2 + dev: true + + registry.npmmirror.com/acorn-walk@8.3.0: + resolution: + { + integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==, + tarball: https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.0.tgz, + } + name: acorn-walk + version: 8.3.0 + engines: { node: ">=0.4.0" } + dev: true + + registry.npmmirror.com/acorn@8.11.2: + resolution: + { + integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, + tarball: https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz, + } + name: acorn + version: 8.11.2 + engines: { node: ">=0.4.0" } + hasBin: true + dev: true + + registry.npmmirror.com/agent-base@6.0.2: + resolution: + { + integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + tarball: https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz, + } + name: agent-base + version: 6.0.2 + engines: { node: ">= 6.0.0" } + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/agent-base@7.1.0: + resolution: + { + integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==, + tarball: https://registry.npmmirror.com/agent-base/-/agent-base-7.1.0.tgz, + } + name: agent-base + version: 7.1.0 + engines: { node: ">= 14" } + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + tarball: https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz, + } + name: ajv + version: 6.12.6 + dependencies: + fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify@2.1.0 + json-schema-traverse: registry.npmmirror.com/json-schema-traverse@0.4.1 + uri-js: registry.npmmirror.com/uri-js@4.4.1 + dev: true + + registry.npmmirror.com/ansi-colors@4.1.1: + resolution: + { + integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==, + tarball: https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz, + } + name: ansi-colors + version: 4.1.1 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/ansi-escapes@4.3.2: + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + tarball: https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz, + } + name: ansi-escapes + version: 4.3.2 + engines: { node: ">=8" } + dependencies: + type-fest: registry.npmmirror.com/type-fest@0.21.3 + dev: true + + registry.npmmirror.com/ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz, + } + name: ansi-regex + version: 5.0.1 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/ansi-regex@6.0.1: + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz, + } + name: ansi-regex + version: 6.0.1 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/ansi-styles@3.2.1: + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz, + } + name: ansi-styles + version: 3.2.1 + engines: { node: ">=4" } + dependencies: + color-convert: registry.npmmirror.com/color-convert@1.9.3 + dev: true + + registry.npmmirror.com/ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz, + } + name: ansi-styles + version: 4.3.0 + engines: { node: ">=8" } + dependencies: + color-convert: registry.npmmirror.com/color-convert@2.0.1 + dev: true + + registry.npmmirror.com/ansi-styles@5.2.0: + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz, + } + name: ansi-styles + version: 5.2.0 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz, + } + name: ansi-styles + version: 6.2.1 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + tarball: https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz, + } + name: anymatch + version: 3.1.3 + engines: { node: ">= 8" } + dependencies: + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + picomatch: registry.npmmirror.com/picomatch@2.3.1 + dev: true + + registry.npmmirror.com/archiver-utils@4.0.1: + resolution: + { + integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==, + tarball: https://registry.npmmirror.com/archiver-utils/-/archiver-utils-4.0.1.tgz, + } + name: archiver-utils + version: 4.0.1 + engines: { node: ">= 12.0.0" } + dependencies: + glob: registry.npmmirror.com/glob@8.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + lazystream: registry.npmmirror.com/lazystream@1.0.1 + lodash: registry.npmmirror.com/lodash@4.17.21 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + dev: true + + registry.npmmirror.com/archiver@6.0.1: + resolution: + { + integrity: sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==, + tarball: https://registry.npmmirror.com/archiver/-/archiver-6.0.1.tgz, + } + name: archiver + version: 6.0.1 + engines: { node: ">= 12.0.0" } + dependencies: + archiver-utils: registry.npmmirror.com/archiver-utils@4.0.1 + async: registry.npmmirror.com/async@3.2.5 + buffer-crc32: registry.npmmirror.com/buffer-crc32@0.2.13 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + readdir-glob: registry.npmmirror.com/readdir-glob@1.1.3 + tar-stream: registry.npmmirror.com/tar-stream@3.1.6 + zip-stream: registry.npmmirror.com/zip-stream@5.0.1 + dev: true + + registry.npmmirror.com/argparse@1.0.10: + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + tarball: https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz, + } + name: argparse + version: 1.0.10 + dependencies: + sprintf-js: registry.npmmirror.com/sprintf-js@1.0.3 + dev: true + + registry.npmmirror.com/argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + tarball: https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz, + } + name: argparse + version: 2.0.1 + dev: true + + registry.npmmirror.com/aria-query@5.1.3: + resolution: + { + integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==, + tarball: https://registry.npmmirror.com/aria-query/-/aria-query-5.1.3.tgz, + } + name: aria-query + version: 5.1.3 + dependencies: + deep-equal: registry.npmmirror.com/deep-equal@2.2.1 + dev: true + + registry.npmmirror.com/array-buffer-byte-length@1.0.0: + resolution: + { + integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==, + tarball: https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz, + } + name: array-buffer-byte-length + version: 1.0.0 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + is-array-buffer: registry.npmmirror.com/is-array-buffer@3.0.2 + dev: true + + registry.npmmirror.com/array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + tarball: https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz, + } + name: array-union + version: 2.1.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/assertion-error@1.1.0: + resolution: + { + integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, + tarball: https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz, + } + name: assertion-error + version: 1.1.0 + dev: true + + registry.npmmirror.com/ast-types@0.13.4: + resolution: + { + integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==, + tarball: https://registry.npmmirror.com/ast-types/-/ast-types-0.13.4.tgz, + } + name: ast-types + version: 0.13.4 + engines: { node: ">=4" } + dependencies: + tslib: registry.npmmirror.com/tslib@2.6.1 + dev: true + + registry.npmmirror.com/async-exit-hook@2.0.1: + resolution: + { + integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==, + tarball: https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz, + } + name: async-exit-hook + version: 2.0.1 + engines: { node: ">=0.12.0" } + dev: true + + registry.npmmirror.com/async@3.2.5: + resolution: + { + integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==, + tarball: https://registry.npmmirror.com/async/-/async-3.2.5.tgz, + } + name: async + version: 3.2.5 + dev: true + + registry.npmmirror.com/asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + tarball: https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz, + } + name: asynckit + version: 0.4.0 + dev: true + + registry.npmmirror.com/available-typed-arrays@1.0.5: + resolution: + { + integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, + tarball: https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz, + } + name: available-typed-arrays + version: 1.0.5 + engines: { node: ">= 0.4" } + dev: true + + registry.npmmirror.com/b4a@1.6.4: + resolution: + { + integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==, + tarball: https://registry.npmmirror.com/b4a/-/b4a-1.6.4.tgz, + } + name: b4a + version: 1.6.4 + dev: true + + registry.npmmirror.com/babel-jest@29.7.0(@babel/core@7.23.3): + resolution: + { + integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==, + tarball: https://registry.npmmirror.com/babel-jest/-/babel-jest-29.7.0.tgz, + } + id: registry.npmmirror.com/babel-jest/29.7.0 + name: babel-jest + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + "@babel/core": ^7.8.0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 + "@types/babel__core": registry.npmmirror.com/@types/babel__core@7.20.4 + babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul@6.1.1 + babel-preset-jest: registry.npmmirror.com/babel-preset-jest@29.6.3(@babel/core@7.23.3) + chalk: registry.npmmirror.com/chalk@4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + slash: registry.npmmirror.com/slash@3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-istanbul@6.1.1: + resolution: + { + integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, + tarball: https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz, + } + name: babel-plugin-istanbul + version: 6.1.1 + engines: { node: ">=8" } + dependencies: + "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + "@istanbuljs/load-nyc-config": registry.npmmirror.com/@istanbuljs/load-nyc-config@1.1.0 + "@istanbuljs/schema": registry.npmmirror.com/@istanbuljs/schema@0.1.3 + istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument@5.2.1 + test-exclude: registry.npmmirror.com/test-exclude@6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-jest-hoist@29.6.3: + resolution: + { + integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==, + tarball: https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz, + } + name: babel-plugin-jest-hoist + version: 29.6.3 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@babel/template": registry.npmmirror.com/@babel/template@7.22.15 + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + "@types/babel__core": registry.npmmirror.com/@types/babel__core@7.20.4 + "@types/babel__traverse": registry.npmmirror.com/@types/babel__traverse@7.20.4 + dev: true + + registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3): + resolution: + { + integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, + tarball: https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz, + } + id: registry.npmmirror.com/babel-preset-current-node-syntax/1.0.1 + name: babel-preset-current-node-syntax + version: 1.0.1 + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/plugin-syntax-async-generators": registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3) + "@babel/plugin-syntax-bigint": registry.npmmirror.com/@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3) + "@babel/plugin-syntax-class-properties": registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3) + "@babel/plugin-syntax-import-meta": registry.npmmirror.com/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3) + "@babel/plugin-syntax-json-strings": registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3) + "@babel/plugin-syntax-logical-assignment-operators": registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3) + "@babel/plugin-syntax-nullish-coalescing-operator": registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3) + "@babel/plugin-syntax-numeric-separator": registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3) + "@babel/plugin-syntax-object-rest-spread": registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3) + "@babel/plugin-syntax-optional-catch-binding": registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3) + "@babel/plugin-syntax-optional-chaining": registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3) + "@babel/plugin-syntax-top-level-await": registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3) + dev: true + + registry.npmmirror.com/babel-preset-jest@29.6.3(@babel/core@7.23.3): + resolution: + { + integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==, + tarball: https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz, + } + id: registry.npmmirror.com/babel-preset-jest/29.6.3 + name: babel-preset-jest + version: 29.6.3 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + babel-plugin-jest-hoist: registry.npmmirror.com/babel-plugin-jest-hoist@29.6.3 + babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3) + dev: true + + registry.npmmirror.com/balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + tarball: https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz, + } + name: balanced-match + version: 1.0.2 + dev: true + + registry.npmmirror.com/base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + tarball: https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz, + } + name: base64-js + version: 1.5.1 + dev: true + + registry.npmmirror.com/basic-ftp@5.0.3: + resolution: + { + integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==, + tarball: https://registry.npmmirror.com/basic-ftp/-/basic-ftp-5.0.3.tgz, + } + name: basic-ftp + version: 5.0.3 + engines: { node: ">=10.0.0" } + dev: true + + registry.npmmirror.com/big-integer@1.6.51: + resolution: + { + integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==, + tarball: https://registry.npmmirror.com/big-integer/-/big-integer-1.6.51.tgz, + } + name: big-integer + version: 1.6.51 + engines: { node: ">=0.6" } + dev: true + + registry.npmmirror.com/binary-extensions@2.2.0: + resolution: + { + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, + tarball: https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz, + } + name: binary-extensions + version: 2.2.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/binary@0.3.0: + resolution: + { + integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==, + tarball: https://registry.npmmirror.com/binary/-/binary-0.3.0.tgz, + } + name: binary + version: 0.3.0 + dependencies: + buffers: registry.npmmirror.com/buffers@0.1.1 + chainsaw: registry.npmmirror.com/chainsaw@0.1.0 + dev: true + + registry.npmmirror.com/bl@4.1.0: + resolution: + { + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, + tarball: https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz, + } + name: bl + version: 4.1.0 + dependencies: + buffer: registry.npmmirror.com/buffer@5.7.1 + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + dev: true + + registry.npmmirror.com/bluebird@3.4.7: + resolution: + { + integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==, + tarball: https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz, + } + name: bluebird + version: 3.4.7 + dev: true + + registry.npmmirror.com/brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz, + } + name: brace-expansion + version: 1.1.11 + dependencies: + balanced-match: registry.npmmirror.com/balanced-match@1.0.2 + concat-map: registry.npmmirror.com/concat-map@0.0.1 + dev: true + + registry.npmmirror.com/brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz, + } + name: brace-expansion + version: 2.0.1 + dependencies: + balanced-match: registry.npmmirror.com/balanced-match@1.0.2 + dev: true + + registry.npmmirror.com/braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + tarball: https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz, + } + name: braces + version: 3.0.2 + engines: { node: ">=8" } + dependencies: + fill-range: registry.npmmirror.com/fill-range@7.0.1 + dev: true + + registry.npmmirror.com/browser-stdout@1.3.1: + resolution: + { + integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==, + tarball: https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz, + } + name: browser-stdout + version: 1.3.1 + dev: true + + registry.npmmirror.com/browserslist@4.22.1: + resolution: + { + integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==, + tarball: https://registry.npmmirror.com/browserslist/-/browserslist-4.22.1.tgz, + } + name: browserslist + version: 4.22.1 + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + dependencies: + caniuse-lite: registry.npmmirror.com/caniuse-lite@1.0.30001561 + electron-to-chromium: registry.npmmirror.com/electron-to-chromium@1.4.581 + node-releases: registry.npmmirror.com/node-releases@2.0.14 + update-browserslist-db: registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1) + dev: true + + registry.npmmirror.com/bser@2.1.1: + resolution: + { + integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, + tarball: https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz, + } + name: bser + version: 2.1.1 + dependencies: + node-int64: registry.npmmirror.com/node-int64@0.4.0 + dev: true + + registry.npmmirror.com/buffer-crc32@0.2.13: + resolution: + { + integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==, + tarball: https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz, + } + name: buffer-crc32 + version: 0.2.13 + dev: true + + registry.npmmirror.com/buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + tarball: https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz, + } + name: buffer-from + version: 1.1.2 + dev: true + + registry.npmmirror.com/buffer-indexof-polyfill@1.0.2: + resolution: + { + integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==, + tarball: https://registry.npmmirror.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz, + } + name: buffer-indexof-polyfill + version: 1.0.2 + engines: { node: ">=0.10" } + dev: true + + registry.npmmirror.com/buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + tarball: https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz, + } + name: buffer + version: 5.7.1 + dependencies: + base64-js: registry.npmmirror.com/base64-js@1.5.1 + ieee754: registry.npmmirror.com/ieee754@1.2.1 + dev: true + + registry.npmmirror.com/buffers@0.1.1: + resolution: + { + integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==, + tarball: https://registry.npmmirror.com/buffers/-/buffers-0.1.1.tgz, + } + name: buffers + version: 0.1.1 + engines: { node: ">=0.2.0" } + dev: true + + registry.npmmirror.com/cacheable-lookup@7.0.0: + resolution: + { + integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==, + tarball: https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz, + } + name: cacheable-lookup + version: 7.0.0 + engines: { node: ">=14.16" } + dev: true + + registry.npmmirror.com/cacheable-request@10.2.14: + resolution: + { + integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==, + tarball: https://registry.npmmirror.com/cacheable-request/-/cacheable-request-10.2.14.tgz, + } + name: cacheable-request + version: 10.2.14 + engines: { node: ">=14.16" } + dependencies: + "@types/http-cache-semantics": registry.npmmirror.com/@types/http-cache-semantics@4.0.4 + get-stream: registry.npmmirror.com/get-stream@6.0.1 + http-cache-semantics: registry.npmmirror.com/http-cache-semantics@4.1.1 + keyv: registry.npmmirror.com/keyv@4.5.4 + mimic-response: registry.npmmirror.com/mimic-response@4.0.0 + normalize-url: registry.npmmirror.com/normalize-url@8.0.0 + responselike: registry.npmmirror.com/responselike@3.0.0 + dev: true + + registry.npmmirror.com/call-bind@1.0.5: + resolution: + { + integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==, + tarball: https://registry.npmmirror.com/call-bind/-/call-bind-1.0.5.tgz, + } + name: call-bind + version: 1.0.5 + dependencies: + function-bind: registry.npmmirror.com/function-bind@1.1.2 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + set-function-length: registry.npmmirror.com/set-function-length@1.1.1 + dev: true + + registry.npmmirror.com/callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + tarball: https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz, + } + name: callsites + version: 3.1.0 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/camelcase@5.3.1: + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + tarball: https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz, + } + name: camelcase + version: 5.3.1 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/camelcase@6.3.0: + resolution: + { + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, + tarball: https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz, + } + name: camelcase + version: 6.3.0 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/caniuse-lite@1.0.30001561: + resolution: + { + integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==, + tarball: https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz, + } + name: caniuse-lite + version: 1.0.30001561 + dev: true + + registry.npmmirror.com/chai@4.3.10: + resolution: + { + integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==, + tarball: https://registry.npmmirror.com/chai/-/chai-4.3.10.tgz, + } + name: chai + version: 4.3.10 + engines: { node: ">=4" } + dependencies: + assertion-error: registry.npmmirror.com/assertion-error@1.1.0 + check-error: registry.npmmirror.com/check-error@1.0.3 + deep-eql: registry.npmmirror.com/deep-eql@4.1.3 + get-func-name: registry.npmmirror.com/get-func-name@2.0.2 + loupe: registry.npmmirror.com/loupe@2.3.7 + pathval: registry.npmmirror.com/pathval@1.1.1 + type-detect: registry.npmmirror.com/type-detect@4.0.8 + dev: true + + registry.npmmirror.com/chainsaw@0.1.0: + resolution: + { + integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==, + tarball: https://registry.npmmirror.com/chainsaw/-/chainsaw-0.1.0.tgz, + } + name: chainsaw + version: 0.1.0 + dependencies: + traverse: registry.npmmirror.com/traverse@0.3.9 + dev: true + + registry.npmmirror.com/chalk@2.4.2: + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + tarball: https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz, + } + name: chalk + version: 2.4.2 + engines: { node: ">=4" } + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@3.2.1 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@1.0.5 + supports-color: registry.npmmirror.com/supports-color@5.5.0 + dev: true + + registry.npmmirror.com/chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + tarball: https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz, + } + name: chalk + version: 4.1.2 + engines: { node: ">=10" } + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 + supports-color: registry.npmmirror.com/supports-color@7.2.0 + dev: true + + registry.npmmirror.com/chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + tarball: https://registry.npmmirror.com/chalk/-/chalk-5.3.0.tgz, + } + name: chalk + version: 5.3.0 + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: true + + registry.npmmirror.com/char-regex@1.0.2: + resolution: + { + integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, + tarball: https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz, + } + name: char-regex + version: 1.0.2 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/chardet@0.7.0: + resolution: + { + integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, + tarball: https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz, + } + name: chardet + version: 0.7.0 + dev: true + + registry.npmmirror.com/chart.js@4.4.1: + resolution: + { + integrity: sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==, + tarball: https://registry.npmmirror.com/chart.js/-/chart.js-4.4.1.tgz, + } + name: chart.js + version: 4.4.1 + engines: { pnpm: ">=7" } + dependencies: + "@kurkle/color": registry.npmmirror.com/@kurkle/color@0.3.2 + dev: false + + registry.npmmirror.com/check-error@1.0.3: + resolution: + { + integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, + tarball: https://registry.npmmirror.com/check-error/-/check-error-1.0.3.tgz, + } + name: check-error + version: 1.0.3 + dependencies: + get-func-name: registry.npmmirror.com/get-func-name@2.0.2 + dev: true + + registry.npmmirror.com/chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz, + } + name: chokidar + version: 3.5.3 + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: registry.npmmirror.com/anymatch@3.1.3 + braces: registry.npmmirror.com/braces@3.0.2 + glob-parent: registry.npmmirror.com/glob-parent@5.1.2 + is-binary-path: registry.npmmirror.com/is-binary-path@2.1.0 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + readdirp: registry.npmmirror.com/readdirp@3.6.0 + optionalDependencies: + fsevents: registry.npmmirror.com/fsevents@2.3.3 + dev: true + + registry.npmmirror.com/chromium-bidi@0.4.16(devtools-protocol@0.0.1147663): + resolution: + { + integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==, + tarball: https://registry.npmmirror.com/chromium-bidi/-/chromium-bidi-0.4.16.tgz, + } + id: registry.npmmirror.com/chromium-bidi/0.4.16 + name: chromium-bidi + version: 0.4.16 + peerDependencies: + devtools-protocol: "*" + dependencies: + devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1147663 + mitt: registry.npmmirror.com/mitt@3.0.0 + dev: true + + registry.npmmirror.com/ci-info@3.9.0: + resolution: + { + integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, + tarball: https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz, + } + name: ci-info + version: 3.9.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/cjs-module-lexer@1.2.2: + resolution: + { + integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==, + tarball: https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz, + } + name: cjs-module-lexer + version: 1.2.2 + dev: true + + registry.npmmirror.com/cli-cursor@3.1.0: + resolution: + { + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, + tarball: https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz, + } + name: cli-cursor + version: 3.1.0 + engines: { node: ">=8" } + dependencies: + restore-cursor: registry.npmmirror.com/restore-cursor@3.1.0 + dev: true + + registry.npmmirror.com/cli-spinners@2.9.1: + resolution: + { + integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==, + tarball: https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.1.tgz, + } + name: cli-spinners + version: 2.9.1 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/cli-width@4.1.0: + resolution: + { + integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==, + tarball: https://registry.npmmirror.com/cli-width/-/cli-width-4.1.0.tgz, + } + name: cli-width + version: 4.1.0 + engines: { node: ">= 12" } + dev: true + + registry.npmmirror.com/cliui@7.0.4: + resolution: + { + integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, + tarball: https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz, + } + name: cliui + version: 7.0.4 + dependencies: + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 + dev: true + + registry.npmmirror.com/cliui@8.0.1: + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + tarball: https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz, + } + name: cliui + version: 8.0.1 + engines: { node: ">=12" } + dependencies: + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 + dev: true + + registry.npmmirror.com/clone@1.0.4: + resolution: + { + integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, + tarball: https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz, + } + name: clone + version: 1.0.4 + engines: { node: ">=0.8" } + requiresBuild: true + dev: true + + registry.npmmirror.com/co@4.6.0: + resolution: + { + integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, + tarball: https://registry.npmmirror.com/co/-/co-4.6.0.tgz, + } + name: co + version: 4.6.0 + engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } + dev: true + + registry.npmmirror.com/collect-v8-coverage@1.0.1: + resolution: + { + integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==, + tarball: https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz, + } + name: collect-v8-coverage + version: 1.0.1 + dev: true + + registry.npmmirror.com/color-convert@1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + tarball: https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz, + } + name: color-convert + version: 1.9.3 + dependencies: + color-name: registry.npmmirror.com/color-name@1.1.3 + dev: true + + registry.npmmirror.com/color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + tarball: https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz, + } + name: color-convert + version: 2.0.1 + engines: { node: ">=7.0.0" } + dependencies: + color-name: registry.npmmirror.com/color-name@1.1.4 + dev: true + + registry.npmmirror.com/color-name@1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz, + } + name: color-name + version: 1.1.3 + dev: true + + registry.npmmirror.com/color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz, + } + name: color-name + version: 1.1.4 + dev: true + + registry.npmmirror.com/combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + tarball: https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz, + } + name: combined-stream + version: 1.0.8 + engines: { node: ">= 0.8" } + dependencies: + delayed-stream: registry.npmmirror.com/delayed-stream@1.0.0 + dev: true + + registry.npmmirror.com/commander@9.5.0: + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + tarball: https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz, + } + name: commander + version: 9.5.0 + engines: { node: ^12.20.0 || >=14 } + dev: true + + registry.npmmirror.com/compress-commons@5.0.1: + resolution: + { + integrity: sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==, + tarball: https://registry.npmmirror.com/compress-commons/-/compress-commons-5.0.1.tgz, + } + name: compress-commons + version: 5.0.1 + engines: { node: ">= 12.0.0" } + dependencies: + crc-32: registry.npmmirror.com/crc-32@1.2.2 + crc32-stream: registry.npmmirror.com/crc32-stream@5.0.0 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + dev: true + + registry.npmmirror.com/concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + tarball: https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz, + } + name: concat-map + version: 0.0.1 + dev: true + + registry.npmmirror.com/convert-source-map@2.0.0: + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz, + } + name: convert-source-map + version: 2.0.0 + dev: true + + registry.npmmirror.com/core-util-is@1.0.3: + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + tarball: https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz, + } + name: core-util-is + version: 1.0.3 + dev: true + + registry.npmmirror.com/crc-32@1.2.2: + resolution: + { + integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, + tarball: https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz, + } + name: crc-32 + version: 1.2.2 + engines: { node: ">=0.8" } + hasBin: true + dev: true + + registry.npmmirror.com/crc32-stream@5.0.0: + resolution: + { + integrity: sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==, + tarball: https://registry.npmmirror.com/crc32-stream/-/crc32-stream-5.0.0.tgz, + } + name: crc32-stream + version: 5.0.0 + engines: { node: ">= 12.0.0" } + dependencies: + crc-32: registry.npmmirror.com/crc-32@1.2.2 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + dev: true + + registry.npmmirror.com/create-jest@29.7.0(@types/node@20.11.0): + resolution: + { + integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==, + tarball: https://registry.npmmirror.com/create-jest/-/create-jest-29.7.0.tgz, + } + id: registry.npmmirror.com/create-jest/29.7.0 + name: create-jest + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + dependencies: + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + exit: registry.npmmirror.com/exit@0.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) + jest-util: registry.npmmirror.com/jest-util@29.7.0 + prompts: registry.npmmirror.com/prompts@2.4.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + registry.npmmirror.com/cross-fetch@4.0.0: + resolution: + { + integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==, + tarball: https://registry.npmmirror.com/cross-fetch/-/cross-fetch-4.0.0.tgz, + } + name: cross-fetch + version: 4.0.0 + dependencies: + node-fetch: registry.npmmirror.com/node-fetch@2.7.0 + transitivePeerDependencies: + - encoding + dev: true + + registry.npmmirror.com/cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + tarball: https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz, + } + name: cross-spawn + version: 7.0.3 + engines: { node: ">= 8" } + dependencies: + path-key: registry.npmmirror.com/path-key@3.1.1 + shebang-command: registry.npmmirror.com/shebang-command@2.0.0 + which: registry.npmmirror.com/which@2.0.2 + dev: true + + registry.npmmirror.com/css-shorthand-properties@1.1.1: + resolution: + { + integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==, + tarball: https://registry.npmmirror.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz, + } + name: css-shorthand-properties + version: 1.1.1 + dev: true + + registry.npmmirror.com/css-value@0.0.1: + resolution: + { + integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==, + tarball: https://registry.npmmirror.com/css-value/-/css-value-0.0.1.tgz, + } + name: css-value + version: 0.0.1 + dev: true + + registry.npmmirror.com/cssom@0.3.8: + resolution: + { + integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==, + tarball: https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz, + } + name: cssom + version: 0.3.8 + dev: true + + registry.npmmirror.com/cssom@0.5.0: + resolution: + { + integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==, + tarball: https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz, + } + name: cssom + version: 0.5.0 + dev: true + + registry.npmmirror.com/cssstyle@2.3.0: + resolution: + { + integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==, + tarball: https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz, + } + name: cssstyle + version: 2.3.0 + engines: { node: ">=8" } + dependencies: + cssom: registry.npmmirror.com/cssom@0.3.8 + dev: true + + registry.npmmirror.com/data-uri-to-buffer@4.0.1: + resolution: + { + integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, + tarball: https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz, + } + name: data-uri-to-buffer + version: 4.0.1 + engines: { node: ">= 12" } + dev: true + + registry.npmmirror.com/data-uri-to-buffer@6.0.1: + resolution: + { + integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==, + tarball: https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz, + } + name: data-uri-to-buffer + version: 6.0.1 + engines: { node: ">= 14" } + dev: true + + registry.npmmirror.com/data-urls@3.0.2: + resolution: + { + integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==, + tarball: https://registry.npmmirror.com/data-urls/-/data-urls-3.0.2.tgz, + } + name: data-urls + version: 3.0.2 + engines: { node: ">=12" } + dependencies: + abab: registry.npmmirror.com/abab@2.0.6 + whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype@3.0.0 + whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0 + dev: true + + registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1): + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + tarball: https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz, + } + id: registry.npmmirror.com/debug/4.3.4 + name: debug + version: 4.3.4 + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: registry.npmmirror.com/ms@2.1.2 + supports-color: registry.npmmirror.com/supports-color@8.1.1 + dev: true + + registry.npmmirror.com/decamelize@4.0.0: + resolution: + { + integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==, + tarball: https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz, + } + name: decamelize + version: 4.0.0 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/decamelize@6.0.0: + resolution: + { + integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==, + tarball: https://registry.npmmirror.com/decamelize/-/decamelize-6.0.0.tgz, + } + name: decamelize + version: 6.0.0 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + registry.npmmirror.com/decimal.js@10.4.3: + resolution: + { + integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, + tarball: https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz, + } + name: decimal.js + version: 10.4.3 + dev: true + + registry.npmmirror.com/decompress-response@6.0.0: + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + tarball: https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz, + } + name: decompress-response + version: 6.0.0 + engines: { node: ">=10" } + dependencies: + mimic-response: registry.npmmirror.com/mimic-response@3.1.0 + dev: true + + registry.npmmirror.com/dedent@1.5.1: + resolution: + { + integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==, + tarball: https://registry.npmmirror.com/dedent/-/dedent-1.5.1.tgz, + } + name: dedent + version: 1.5.1 + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: true + + registry.npmmirror.com/deep-eql@4.1.3: + resolution: + { + integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==, + tarball: https://registry.npmmirror.com/deep-eql/-/deep-eql-4.1.3.tgz, + } + name: deep-eql + version: 4.1.3 + engines: { node: ">=6" } + dependencies: + type-detect: registry.npmmirror.com/type-detect@4.0.8 + dev: true + + registry.npmmirror.com/deep-equal@2.2.1: + resolution: + { + integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==, + tarball: https://registry.npmmirror.com/deep-equal/-/deep-equal-2.2.1.tgz, + } + name: deep-equal + version: 2.2.1 + dependencies: + array-buffer-byte-length: registry.npmmirror.com/array-buffer-byte-length@1.0.0 + call-bind: registry.npmmirror.com/call-bind@1.0.5 + es-get-iterator: registry.npmmirror.com/es-get-iterator@1.1.3 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + is-arguments: registry.npmmirror.com/is-arguments@1.1.1 + is-array-buffer: registry.npmmirror.com/is-array-buffer@3.0.2 + is-date-object: registry.npmmirror.com/is-date-object@1.0.5 + is-regex: registry.npmmirror.com/is-regex@1.1.4 + is-shared-array-buffer: registry.npmmirror.com/is-shared-array-buffer@1.0.2 + isarray: registry.npmmirror.com/isarray@2.0.5 + object-is: registry.npmmirror.com/object-is@1.1.5 + object-keys: registry.npmmirror.com/object-keys@1.1.1 + object.assign: registry.npmmirror.com/object.assign@4.1.5 + regexp.prototype.flags: registry.npmmirror.com/regexp.prototype.flags@1.5.0 + side-channel: registry.npmmirror.com/side-channel@1.0.4 + which-boxed-primitive: registry.npmmirror.com/which-boxed-primitive@1.0.2 + which-collection: registry.npmmirror.com/which-collection@1.0.1 + which-typed-array: registry.npmmirror.com/which-typed-array@1.1.13 + dev: true + + registry.npmmirror.com/deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + tarball: https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz, + } + name: deep-is + version: 0.1.4 + dev: true + + registry.npmmirror.com/deepcopy@2.1.0: + resolution: + { + integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==, + tarball: https://registry.npmmirror.com/deepcopy/-/deepcopy-2.1.0.tgz, + } + name: deepcopy + version: 2.1.0 + dependencies: + type-detect: registry.npmmirror.com/type-detect@4.0.8 + dev: true + + registry.npmmirror.com/deepmerge-ts@5.1.0: + resolution: + { + integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==, + tarball: https://registry.npmmirror.com/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz, + } + name: deepmerge-ts + version: 5.1.0 + engines: { node: ">=16.0.0" } + dev: true + + registry.npmmirror.com/deepmerge@4.3.1: + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + tarball: https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz, + } + name: deepmerge + version: 4.3.1 + engines: { node: ">=0.10.0" } + dev: true + + registry.npmmirror.com/defaults@1.0.4: + resolution: + { + integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, + tarball: https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz, + } + name: defaults + version: 1.0.4 + requiresBuild: true + dependencies: + clone: registry.npmmirror.com/clone@1.0.4 + dev: true + + registry.npmmirror.com/defer-to-connect@2.0.1: + resolution: + { + integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, + tarball: https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz, + } + name: defer-to-connect + version: 2.0.1 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/define-data-property@1.1.1: + resolution: + { + integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==, + tarball: https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.1.tgz, + } + name: define-data-property + version: 1.1.1 + engines: { node: ">= 0.4" } + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 + dev: true + + registry.npmmirror.com/define-properties@1.2.1: + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + tarball: https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz, + } + name: define-properties + version: 1.2.1 + engines: { node: ">= 0.4" } + dependencies: + define-data-property: registry.npmmirror.com/define-data-property@1.1.1 + has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 + object-keys: registry.npmmirror.com/object-keys@1.1.1 + dev: true + + registry.npmmirror.com/degenerator@5.0.1: + resolution: + { + integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==, + tarball: https://registry.npmmirror.com/degenerator/-/degenerator-5.0.1.tgz, + } + name: degenerator + version: 5.0.1 + engines: { node: ">= 14" } + dependencies: + ast-types: registry.npmmirror.com/ast-types@0.13.4 + escodegen: registry.npmmirror.com/escodegen@2.1.0 + esprima: registry.npmmirror.com/esprima@4.0.1 + dev: true + + registry.npmmirror.com/delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + tarball: https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz, + } + name: delayed-stream + version: 1.0.0 + engines: { node: ">=0.4.0" } + dev: true + + registry.npmmirror.com/detect-newline@3.1.0: + resolution: + { + integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, + tarball: https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz, + } + name: detect-newline + version: 3.1.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/devtools-protocol@0.0.1147663: + resolution: + { + integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==, + tarball: https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz, + } + name: devtools-protocol + version: 0.0.1147663 + dev: true + + registry.npmmirror.com/devtools-protocol@0.0.1239539: + resolution: + { + integrity: sha512-uS7hZVqZxGyZwR8lX/8wWyNLGEYs1wWWxN7qeRC+wBZ4VM5JXYwCJg8hofEna5yX0W2cavpjHOE4ukHXLHlEaA==, + tarball: https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1239539.tgz, + } + name: devtools-protocol + version: 0.0.1239539 + dev: true + + registry.npmmirror.com/diff-sequences@29.6.3: + resolution: + { + integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, + tarball: https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz, + } + name: diff-sequences + version: 29.6.3 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + registry.npmmirror.com/diff@5.0.0: + resolution: + { + integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==, + tarball: https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz, + } + name: diff + version: 5.0.0 + engines: { node: ">=0.3.1" } + dev: true + + registry.npmmirror.com/diff@5.1.0: + resolution: + { + integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==, + tarball: https://registry.npmmirror.com/diff/-/diff-5.1.0.tgz, + } + name: diff + version: 5.1.0 + engines: { node: ">=0.3.1" } + dev: true + + registry.npmmirror.com/dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + tarball: https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz, + } + name: dir-glob + version: 3.0.1 + engines: { node: ">=8" } + dependencies: + path-type: registry.npmmirror.com/path-type@4.0.0 + dev: true + + registry.npmmirror.com/doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + tarball: https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz, + } + name: doctrine + version: 3.0.0 + engines: { node: ">=6.0.0" } + dependencies: + esutils: registry.npmmirror.com/esutils@2.0.3 + dev: true + + registry.npmmirror.com/domexception@4.0.0: + resolution: + { + integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==, + tarball: https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz, + } + name: domexception + version: 4.0.0 + engines: { node: ">=12" } + deprecated: Use your platform's native DOMException instead + dependencies: + webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 + dev: true + + registry.npmmirror.com/dotenv@16.3.1: + resolution: + { + integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, + tarball: https://registry.npmmirror.com/dotenv/-/dotenv-16.3.1.tgz, + } + name: dotenv + version: 16.3.1 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/duplexer2@0.1.4: + resolution: + { + integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, + tarball: https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz, + } + name: duplexer2 + version: 0.1.4 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@2.3.8 + dev: true + + registry.npmmirror.com/eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + tarball: https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz, + } + name: eastasianwidth + version: 0.2.0 + dev: true + + registry.npmmirror.com/easy-table@1.2.0: + resolution: + { + integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==, + tarball: https://registry.npmmirror.com/easy-table/-/easy-table-1.2.0.tgz, + } + name: easy-table + version: 1.2.0 + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 + optionalDependencies: + wcwidth: registry.npmmirror.com/wcwidth@1.0.1 + dev: true + + registry.npmmirror.com/edge-paths@3.0.5: + resolution: + { + integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==, + tarball: https://registry.npmmirror.com/edge-paths/-/edge-paths-3.0.5.tgz, + } + name: edge-paths + version: 3.0.5 + engines: { node: ">=14.0.0" } + dependencies: + "@types/which": registry.npmmirror.com/@types/which@2.0.2 + which: registry.npmmirror.com/which@2.0.2 + dev: true + + registry.npmmirror.com/edgedriver@5.3.8: + resolution: + { + integrity: sha512-FWLPDuwJDeGGgtmlqTXb4lQi/HV9yylLo1F9O1g9TLqSemA5T6xH28seUIfyleVirLFtDQyKNUxKsMhMT4IfnA==, + tarball: https://registry.npmmirror.com/edgedriver/-/edgedriver-5.3.8.tgz, + } + name: edgedriver + version: 5.3.8 + hasBin: true + requiresBuild: true + dependencies: + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + edge-paths: registry.npmmirror.com/edge-paths@3.0.5 + node-fetch: registry.npmmirror.com/node-fetch@3.3.2 + unzipper: registry.npmmirror.com/unzipper@0.10.14 + which: registry.npmmirror.com/which@4.0.0 + dev: true + + registry.npmmirror.com/ejs@3.1.9: + resolution: + { + integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==, + tarball: https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz, + } + name: ejs + version: 3.1.9 + engines: { node: ">=0.10.0" } + hasBin: true + dependencies: + jake: registry.npmmirror.com/jake@10.8.5 + dev: true + + registry.npmmirror.com/electron-to-chromium@1.4.581: + resolution: + { + integrity: sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==, + tarball: https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz, + } + name: electron-to-chromium + version: 1.4.581 + dev: true + + registry.npmmirror.com/emittery@0.13.1: + resolution: + { + integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, + tarball: https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz, + } + name: emittery + version: 0.13.1 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz, + } + name: emoji-regex + version: 8.0.0 + dev: true + + registry.npmmirror.com/emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz, + } + name: emoji-regex + version: 9.2.2 + dev: true + + registry.npmmirror.com/end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + tarball: https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz, + } + name: end-of-stream + version: 1.4.4 + dependencies: + once: registry.npmmirror.com/once@1.4.0 + dev: true + + registry.npmmirror.com/entities@4.5.0: + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + tarball: https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz, + } + name: entities + version: 4.5.0 + engines: { node: ">=0.12" } + dev: true + + registry.npmmirror.com/error-ex@1.3.2: + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + tarball: https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz, + } + name: error-ex + version: 1.3.2 + dependencies: + is-arrayish: registry.npmmirror.com/is-arrayish@0.2.1 + dev: true + + registry.npmmirror.com/es-get-iterator@1.1.3: + resolution: + { + integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==, + tarball: https://registry.npmmirror.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz, + } + name: es-get-iterator + version: 1.1.3 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + is-arguments: registry.npmmirror.com/is-arguments@1.1.1 + is-map: registry.npmmirror.com/is-map@2.0.2 + is-set: registry.npmmirror.com/is-set@2.0.2 + is-string: registry.npmmirror.com/is-string@1.0.7 + isarray: registry.npmmirror.com/isarray@2.0.5 + stop-iteration-iterator: registry.npmmirror.com/stop-iteration-iterator@1.0.0 + dev: true + + registry.npmmirror.com/esbuild@0.19.11: + resolution: + { + integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==, + tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.19.11.tgz, + } + name: esbuild + version: 0.19.11 + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@esbuild/aix-ppc64": registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11 + "@esbuild/android-arm": registry.npmmirror.com/@esbuild/android-arm@0.19.11 + "@esbuild/android-arm64": registry.npmmirror.com/@esbuild/android-arm64@0.19.11 + "@esbuild/android-x64": registry.npmmirror.com/@esbuild/android-x64@0.19.11 + "@esbuild/darwin-arm64": registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11 + "@esbuild/darwin-x64": registry.npmmirror.com/@esbuild/darwin-x64@0.19.11 + "@esbuild/freebsd-arm64": registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11 + "@esbuild/freebsd-x64": registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11 + "@esbuild/linux-arm": registry.npmmirror.com/@esbuild/linux-arm@0.19.11 + "@esbuild/linux-arm64": registry.npmmirror.com/@esbuild/linux-arm64@0.19.11 + "@esbuild/linux-ia32": registry.npmmirror.com/@esbuild/linux-ia32@0.19.11 + "@esbuild/linux-loong64": registry.npmmirror.com/@esbuild/linux-loong64@0.19.11 + "@esbuild/linux-mips64el": registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11 + "@esbuild/linux-ppc64": registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11 + "@esbuild/linux-riscv64": registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11 + "@esbuild/linux-s390x": registry.npmmirror.com/@esbuild/linux-s390x@0.19.11 + "@esbuild/linux-x64": registry.npmmirror.com/@esbuild/linux-x64@0.19.11 + "@esbuild/netbsd-x64": registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11 + "@esbuild/openbsd-x64": registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11 + "@esbuild/sunos-x64": registry.npmmirror.com/@esbuild/sunos-x64@0.19.11 + "@esbuild/win32-arm64": registry.npmmirror.com/@esbuild/win32-arm64@0.19.11 + "@esbuild/win32-ia32": registry.npmmirror.com/@esbuild/win32-ia32@0.19.11 + "@esbuild/win32-x64": registry.npmmirror.com/@esbuild/win32-x64@0.19.11 + dev: true + + registry.npmmirror.com/escalade@3.1.1: + resolution: + { + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, + tarball: https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz, + } + name: escalade + version: 3.1.1 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/escape-string-regexp@1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz, + } + name: escape-string-regexp + version: 1.0.5 + engines: { node: ">=0.8.0" } + dev: true + + registry.npmmirror.com/escape-string-regexp@2.0.0: + resolution: + { + integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, + tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz, + } + name: escape-string-regexp + version: 2.0.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz, + } + name: escape-string-regexp + version: 4.0.0 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/escape-string-regexp@5.0.0: + resolution: + { + integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, + tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz, + } + name: escape-string-regexp + version: 5.0.0 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/escodegen@2.1.0: + resolution: + { + integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, + tarball: https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz, + } + name: escodegen + version: 2.1.0 + engines: { node: ">=6.0" } + hasBin: true + dependencies: + esprima: registry.npmmirror.com/esprima@4.0.1 + estraverse: registry.npmmirror.com/estraverse@5.3.0 + esutils: registry.npmmirror.com/esutils@2.0.3 + optionalDependencies: + source-map: registry.npmmirror.com/source-map@0.6.1 + dev: true + + registry.npmmirror.com/eslint-scope@7.2.2: + resolution: + { + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, + tarball: https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz, + } + name: eslint-scope + version: 7.2.2 + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: registry.npmmirror.com/esrecurse@4.3.0 + estraverse: registry.npmmirror.com/estraverse@5.3.0 + dev: true + + registry.npmmirror.com/eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + tarball: https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz, + } + name: eslint-visitor-keys + version: 3.4.3 + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + registry.npmmirror.com/eslint@8.56.0: + resolution: + { + integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, + tarball: https://registry.npmmirror.com/eslint/-/eslint-8.56.0.tgz, + } + name: eslint + version: 8.56.0 + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint-community/eslint-utils": registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0) + "@eslint-community/regexpp": registry.npmmirror.com/@eslint-community/regexpp@4.10.0 + "@eslint/eslintrc": registry.npmmirror.com/@eslint/eslintrc@2.1.4 + "@eslint/js": registry.npmmirror.com/@eslint/js@8.56.0 + "@humanwhocodes/config-array": registry.npmmirror.com/@humanwhocodes/config-array@0.11.13 + "@humanwhocodes/module-importer": registry.npmmirror.com/@humanwhocodes/module-importer@1.0.1 + "@nodelib/fs.walk": registry.npmmirror.com/@nodelib/fs.walk@1.2.8 + "@ungap/structured-clone": registry.npmmirror.com/@ungap/structured-clone@1.2.0 + ajv: registry.npmmirror.com/ajv@6.12.6 + chalk: registry.npmmirror.com/chalk@4.1.2 + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + doctrine: registry.npmmirror.com/doctrine@3.0.0 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 + eslint-scope: registry.npmmirror.com/eslint-scope@7.2.2 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 + espree: registry.npmmirror.com/espree@9.6.1 + esquery: registry.npmmirror.com/esquery@1.5.0 + esutils: registry.npmmirror.com/esutils@2.0.3 + fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 + file-entry-cache: registry.npmmirror.com/file-entry-cache@6.0.1 + find-up: registry.npmmirror.com/find-up@5.0.0 + glob-parent: registry.npmmirror.com/glob-parent@6.0.2 + globals: registry.npmmirror.com/globals@13.23.0 + graphemer: registry.npmmirror.com/graphemer@1.4.0 + ignore: registry.npmmirror.com/ignore@5.2.4 + imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + is-path-inside: registry.npmmirror.com/is-path-inside@3.0.3 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + json-stable-stringify-without-jsonify: registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1 + levn: registry.npmmirror.com/levn@0.4.1 + lodash.merge: registry.npmmirror.com/lodash.merge@4.6.2 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + natural-compare: registry.npmmirror.com/natural-compare@1.4.0 + optionator: registry.npmmirror.com/optionator@0.9.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + text-table: registry.npmmirror.com/text-table@0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + tarball: https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz, + } + name: espree + version: 9.6.1 + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: registry.npmmirror.com/acorn@8.11.2 + acorn-jsx: registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.11.2) + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 + dev: true + + registry.npmmirror.com/esprima@4.0.1: + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + tarball: https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz, + } + name: esprima + version: 4.0.1 + engines: { node: ">=4" } + hasBin: true + dev: true + + registry.npmmirror.com/esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + tarball: https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz, + } + name: esquery + version: 1.5.0 + engines: { node: ">=0.10" } + dependencies: + estraverse: registry.npmmirror.com/estraverse@5.3.0 + dev: true + + registry.npmmirror.com/esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + tarball: https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz, + } + name: esrecurse + version: 4.3.0 + engines: { node: ">=4.0" } + dependencies: + estraverse: registry.npmmirror.com/estraverse@5.3.0 + dev: true + + registry.npmmirror.com/estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + tarball: https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz, + } + name: estraverse + version: 5.3.0 + engines: { node: ">=4.0" } + dev: true + + registry.npmmirror.com/esutils@2.0.3: + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + tarball: https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz, + } + name: esutils + version: 2.0.3 + engines: { node: ">=0.10.0" } + dev: true + + registry.npmmirror.com/execa@5.1.1: + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + tarball: https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz, + } + name: execa + version: 5.1.1 + engines: { node: ">=10" } + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + get-stream: registry.npmmirror.com/get-stream@6.0.1 + human-signals: registry.npmmirror.com/human-signals@2.1.0 + is-stream: registry.npmmirror.com/is-stream@2.0.1 + merge-stream: registry.npmmirror.com/merge-stream@2.0.0 + npm-run-path: registry.npmmirror.com/npm-run-path@4.0.1 + onetime: registry.npmmirror.com/onetime@5.1.2 + signal-exit: registry.npmmirror.com/signal-exit@3.0.7 + strip-final-newline: registry.npmmirror.com/strip-final-newline@2.0.0 + dev: true + + registry.npmmirror.com/execa@8.0.1: + resolution: + { + integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, + tarball: https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz, + } + name: execa + version: 8.0.1 + engines: { node: ">=16.17" } + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + get-stream: registry.npmmirror.com/get-stream@8.0.1 + human-signals: registry.npmmirror.com/human-signals@5.0.0 + is-stream: registry.npmmirror.com/is-stream@3.0.0 + merge-stream: registry.npmmirror.com/merge-stream@2.0.0 + npm-run-path: registry.npmmirror.com/npm-run-path@5.1.0 + onetime: registry.npmmirror.com/onetime@6.0.0 + signal-exit: registry.npmmirror.com/signal-exit@4.1.0 + strip-final-newline: registry.npmmirror.com/strip-final-newline@3.0.0 + dev: true + + registry.npmmirror.com/exit@0.1.2: + resolution: + { + integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, + tarball: https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz, + } + name: exit + version: 0.1.2 + engines: { node: ">= 0.8.0" } + dev: true + + registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6): + resolution: + { + integrity: sha512-JD5aboj/tCiMXdEPCpt3BA0xL3DBhNu1MoiOdBGT9LT+9COIXoDG6Ks6h5S4c4PNwLs6xSeU8s7XxFAmBPu45Q==, + tarball: https://registry.npmmirror.com/expect-webdriverio/-/expect-webdriverio-4.8.1.tgz, + } + id: registry.npmmirror.com/expect-webdriverio/4.8.1 + name: expect-webdriverio + version: 4.8.1 + engines: { node: ">=16 || >=18 || >=20" } + dependencies: + expect: registry.npmmirror.com/expect@29.7.0 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + lodash.isequal: registry.npmmirror.com/lodash.isequal@4.5.0 + optionalDependencies: + "@wdio/globals": registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + transitivePeerDependencies: + - bufferutil + - devtools + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/expect@29.7.0: + resolution: + { + integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==, + tarball: https://registry.npmmirror.com/expect/-/expect-29.7.0.tgz, + } + name: expect + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/expect-utils": registry.npmmirror.com/@jest/expect-utils@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + dev: true + + registry.npmmirror.com/external-editor@3.1.0: + resolution: + { + integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, + tarball: https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz, + } + name: external-editor + version: 3.1.0 + engines: { node: ">=4" } + dependencies: + chardet: registry.npmmirror.com/chardet@0.7.0 + iconv-lite: registry.npmmirror.com/iconv-lite@0.4.24 + tmp: registry.npmmirror.com/tmp@0.0.33 + dev: true + + registry.npmmirror.com/extract-zip@2.0.1: + resolution: + { + integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==, + tarball: https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz, + } + name: extract-zip + version: 2.0.1 + engines: { node: ">= 10.17.0" } + hasBin: true + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + get-stream: registry.npmmirror.com/get-stream@5.2.0 + yauzl: registry.npmmirror.com/yauzl@2.10.0 + optionalDependencies: + "@types/yauzl": registry.npmmirror.com/@types/yauzl@2.10.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/fast-deep-equal@2.0.1: + resolution: + { + integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==, + tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz, + } + name: fast-deep-equal + version: 2.0.1 + dev: true + + registry.npmmirror.com/fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz, + } + name: fast-deep-equal + version: 3.1.3 + dev: true + + registry.npmmirror.com/fast-fifo@1.3.2: + resolution: + { + integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, + tarball: https://registry.npmmirror.com/fast-fifo/-/fast-fifo-1.3.2.tgz, + } + name: fast-fifo + version: 1.3.2 + dev: true + + registry.npmmirror.com/fast-glob@3.3.2: + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + tarball: https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz, + } + name: fast-glob + version: 3.3.2 + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": registry.npmmirror.com/@nodelib/fs.stat@2.0.5 + "@nodelib/fs.walk": registry.npmmirror.com/@nodelib/fs.walk@1.2.8 + glob-parent: registry.npmmirror.com/glob-parent@5.1.2 + merge2: registry.npmmirror.com/merge2@1.4.1 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + dev: true + + registry.npmmirror.com/fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + tarball: https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz, + } + name: fast-json-stable-stringify + version: 2.1.0 + dev: true + + registry.npmmirror.com/fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + tarball: https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz, + } + name: fast-levenshtein + version: 2.0.6 + dev: true + + registry.npmmirror.com/fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + tarball: https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz, + } + name: fastq + version: 1.15.0 + dependencies: + reusify: registry.npmmirror.com/reusify@1.0.4 + dev: true + + registry.npmmirror.com/fb-watchman@2.0.2: + resolution: + { + integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, + tarball: https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz, + } + name: fb-watchman + version: 2.0.2 + dependencies: + bser: registry.npmmirror.com/bser@2.1.1 + dev: true + + registry.npmmirror.com/fd-slicer@1.1.0: + resolution: + { + integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==, + tarball: https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz, + } + name: fd-slicer + version: 1.1.0 + dependencies: + pend: registry.npmmirror.com/pend@1.2.0 + dev: true + + registry.npmmirror.com/fetch-blob@3.2.0: + resolution: + { + integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, + tarball: https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz, + } + name: fetch-blob + version: 3.2.0 + engines: { node: ^12.20 || >= 14.13 } + dependencies: + node-domexception: registry.npmmirror.com/node-domexception@1.0.0 + web-streams-polyfill: registry.npmmirror.com/web-streams-polyfill@3.2.1 + dev: true + + registry.npmmirror.com/figures@5.0.0: + resolution: + { + integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==, + tarball: https://registry.npmmirror.com/figures/-/figures-5.0.0.tgz, + } + name: figures + version: 5.0.0 + engines: { node: ">=14" } + dependencies: + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@5.0.0 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported@1.3.0 + dev: true + + registry.npmmirror.com/file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + tarball: https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz, + } + name: file-entry-cache + version: 6.0.1 + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: registry.npmmirror.com/flat-cache@3.1.1 + dev: true + + registry.npmmirror.com/filelist@1.0.4: + resolution: + { + integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, + tarball: https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz, + } + name: filelist + version: 1.0.4 + dependencies: + minimatch: registry.npmmirror.com/minimatch@5.1.6 + dev: true + + registry.npmmirror.com/fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + tarball: https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz, + } + name: fill-range + version: 7.0.1 + engines: { node: ">=8" } + dependencies: + to-regex-range: registry.npmmirror.com/to-regex-range@5.0.1 + dev: true + + registry.npmmirror.com/find-up@4.1.0: + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + tarball: https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz, + } + name: find-up + version: 4.1.0 + engines: { node: ">=8" } + dependencies: + locate-path: registry.npmmirror.com/locate-path@5.0.0 + path-exists: registry.npmmirror.com/path-exists@4.0.0 + dev: true + + registry.npmmirror.com/find-up@5.0.0: + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + tarball: https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz, + } + name: find-up + version: 5.0.0 + engines: { node: ">=10" } + dependencies: + locate-path: registry.npmmirror.com/locate-path@6.0.0 + path-exists: registry.npmmirror.com/path-exists@4.0.0 + dev: true + + registry.npmmirror.com/find-up@6.3.0: + resolution: + { + integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==, + tarball: https://registry.npmmirror.com/find-up/-/find-up-6.3.0.tgz, + } + name: find-up + version: 6.3.0 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + locate-path: registry.npmmirror.com/locate-path@7.2.0 + path-exists: registry.npmmirror.com/path-exists@5.0.0 + dev: true + + registry.npmmirror.com/flat-cache@3.1.1: + resolution: + { + integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==, + tarball: https://registry.npmmirror.com/flat-cache/-/flat-cache-3.1.1.tgz, + } + name: flat-cache + version: 3.1.1 + engines: { node: ">=12.0.0" } + dependencies: + flatted: registry.npmmirror.com/flatted@3.2.9 + keyv: registry.npmmirror.com/keyv@4.5.4 + rimraf: registry.npmmirror.com/rimraf@3.0.2 + dev: true + + registry.npmmirror.com/flat@5.0.2: + resolution: + { + integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, + tarball: https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz, + } + name: flat + version: 5.0.2 + hasBin: true + dev: true + + registry.npmmirror.com/flatted@3.2.9: + resolution: + { + integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, + tarball: https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz, + } + name: flatted + version: 3.2.9 + dev: true + + registry.npmmirror.com/for-each@0.3.3: + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + tarball: https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz, + } + name: for-each + version: 0.3.3 + dependencies: + is-callable: registry.npmmirror.com/is-callable@1.2.7 + dev: true + + registry.npmmirror.com/foreground-child@3.1.1: + resolution: + { + integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, + tarball: https://registry.npmmirror.com/foreground-child/-/foreground-child-3.1.1.tgz, + } + name: foreground-child + version: 3.1.1 + engines: { node: ">=14" } + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + signal-exit: registry.npmmirror.com/signal-exit@4.1.0 + dev: true + + registry.npmmirror.com/form-data-encoder@2.1.4: + resolution: + { + integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==, + tarball: https://registry.npmmirror.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz, + } + name: form-data-encoder + version: 2.1.4 + engines: { node: ">= 14.17" } + dev: true + + registry.npmmirror.com/form-data@4.0.0: + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + tarball: https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz, + } + name: form-data + version: 4.0.0 + engines: { node: ">= 6" } + dependencies: + asynckit: registry.npmmirror.com/asynckit@0.4.0 + combined-stream: registry.npmmirror.com/combined-stream@1.0.8 + mime-types: registry.npmmirror.com/mime-types@2.1.35 + dev: true + + registry.npmmirror.com/formdata-polyfill@4.0.10: + resolution: + { + integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, + tarball: https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz, + } + name: formdata-polyfill + version: 4.0.10 + engines: { node: ">=12.20.0" } + dependencies: + fetch-blob: registry.npmmirror.com/fetch-blob@3.2.0 + dev: true + + registry.npmmirror.com/fs-extra@8.1.0: + resolution: + { + integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, + tarball: https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz, + } + name: fs-extra + version: 8.1.0 + engines: { node: ">=6 <7 || >=8" } + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jsonfile: registry.npmmirror.com/jsonfile@4.0.0 + universalify: registry.npmmirror.com/universalify@0.1.2 + dev: true + + registry.npmmirror.com/fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + tarball: https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz, + } + name: fs.realpath + version: 1.0.0 + dev: true + + registry.npmmirror.com/fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz, + } + name: fsevents + version: 2.3.3 + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + dev: true optional: true - utf-8-validate: + + registry.npmmirror.com/fsrs.js@1.1.0: + resolution: + { + integrity: sha512-DEihBx081nENpNjrSvCopPVi9Ilh+u+ELYOKQmshfSz+DgC/B0hxFFMQnqy2ibWAm9zjyR/bWvaz86xEA4MIcA==, + tarball: https://registry.npmmirror.com/fsrs.js/-/fsrs.js-1.1.0.tgz, + } + name: fsrs.js + version: 1.1.0 + engines: { node: ">=10" } + dependencies: + deepcopy: registry.npmmirror.com/deepcopy@2.1.0 + dev: true + + registry.npmmirror.com/fstream@1.0.12: + resolution: + { + integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==, + tarball: https://registry.npmmirror.com/fstream/-/fstream-1.0.12.tgz, + } + name: fstream + version: 1.0.12 + engines: { node: ">=0.6" } + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + inherits: registry.npmmirror.com/inherits@2.0.4 + mkdirp: registry.npmmirror.com/mkdirp@0.5.6 + rimraf: registry.npmmirror.com/rimraf@2.7.1 + dev: true + + registry.npmmirror.com/function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz, + } + name: function-bind + version: 1.1.2 + dev: true + + registry.npmmirror.com/functions-have-names@1.2.3: + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + tarball: https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz, + } + name: functions-have-names + version: 1.2.3 + dev: true + + registry.npmmirror.com/gaze@1.1.3: + resolution: + { + integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==, + tarball: https://registry.npmmirror.com/gaze/-/gaze-1.1.3.tgz, + } + name: gaze + version: 1.1.3 + engines: { node: ">= 4.0.0" } + dependencies: + globule: registry.npmmirror.com/globule@1.3.4 + dev: true + + registry.npmmirror.com/geckodriver@4.2.1: + resolution: + { + integrity: sha512-4m/CRk0OI8MaANRuFIahvOxYTSjlNAO2p9JmE14zxueknq6cdtB5M9UGRQ8R9aMV0bLGNVHHDnDXmoXdOwJfWg==, + tarball: https://registry.npmmirror.com/geckodriver/-/geckodriver-4.2.1.tgz, + } + name: geckodriver + version: 4.2.1 + engines: { node: ^16.13 || >=18 || >=20 } + hasBin: true + requiresBuild: true + dependencies: + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + node-fetch: registry.npmmirror.com/node-fetch@3.3.2 + tar-fs: registry.npmmirror.com/tar-fs@3.0.4 + unzipper: registry.npmmirror.com/unzipper@0.10.14 + which: registry.npmmirror.com/which@4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/gensync@1.0.0-beta.2: + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + tarball: https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz, + } + name: gensync + version: 1.0.0-beta.2 + engines: { node: ">=6.9.0" } + dev: true + + registry.npmmirror.com/get-caller-file@2.0.5: + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + tarball: https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz, + } + name: get-caller-file + version: 2.0.5 + engines: { node: 6.* || 8.* || >= 10.* } + dev: true + + registry.npmmirror.com/get-func-name@2.0.2: + resolution: + { + integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, + tarball: https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.2.tgz, + } + name: get-func-name + version: 2.0.2 + dev: true + + registry.npmmirror.com/get-intrinsic@1.2.2: + resolution: + { + integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==, + tarball: https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz, + } + name: get-intrinsic + version: 1.2.2 + dependencies: + function-bind: registry.npmmirror.com/function-bind@1.1.2 + has-proto: registry.npmmirror.com/has-proto@1.0.1 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + hasown: registry.npmmirror.com/hasown@2.0.0 + dev: true + + registry.npmmirror.com/get-package-type@0.1.0: + resolution: + { + integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, + tarball: https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz, + } + name: get-package-type + version: 0.1.0 + engines: { node: ">=8.0.0" } + dev: true + + registry.npmmirror.com/get-port@7.0.0: + resolution: + { + integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==, + tarball: https://registry.npmmirror.com/get-port/-/get-port-7.0.0.tgz, + } + name: get-port + version: 7.0.0 + engines: { node: ">=16" } + dev: true + + registry.npmmirror.com/get-stream@5.2.0: + resolution: + { + integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, + tarball: https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz, + } + name: get-stream + version: 5.2.0 + engines: { node: ">=8" } + dependencies: + pump: registry.npmmirror.com/pump@3.0.0 + dev: true + + registry.npmmirror.com/get-stream@6.0.1: + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + tarball: https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz, + } + name: get-stream + version: 6.0.1 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/get-stream@8.0.1: + resolution: + { + integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, + tarball: https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz, + } + name: get-stream + version: 8.0.1 + engines: { node: ">=16" } + dev: true + + registry.npmmirror.com/get-uri@6.0.2: + resolution: + { + integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==, + tarball: https://registry.npmmirror.com/get-uri/-/get-uri-6.0.2.tgz, + } + name: get-uri + version: 6.0.2 + engines: { node: ">= 14" } + dependencies: + basic-ftp: registry.npmmirror.com/basic-ftp@5.0.3 + data-uri-to-buffer: registry.npmmirror.com/data-uri-to-buffer@6.0.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + fs-extra: registry.npmmirror.com/fs-extra@8.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz, + } + name: glob-parent + version: 5.1.2 + engines: { node: ">= 6" } + dependencies: + is-glob: registry.npmmirror.com/is-glob@4.0.3 + dev: true + + registry.npmmirror.com/glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz, + } + name: glob-parent + version: 6.0.2 + engines: { node: ">=10.13.0" } + dependencies: + is-glob: registry.npmmirror.com/is-glob@4.0.3 + dev: true + + registry.npmmirror.com/glob@10.3.10: + resolution: + { + integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==, + tarball: https://registry.npmmirror.com/glob/-/glob-10.3.10.tgz, + } + name: glob + version: 10.3.10 + engines: { node: ">=16 || 14 >=14.17" } + hasBin: true + dependencies: + foreground-child: registry.npmmirror.com/foreground-child@3.1.1 + jackspeak: registry.npmmirror.com/jackspeak@2.3.6 + minimatch: registry.npmmirror.com/minimatch@9.0.3 + minipass: registry.npmmirror.com/minipass@7.0.4 + path-scurry: registry.npmmirror.com/path-scurry@1.10.1 + dev: true + + registry.npmmirror.com/glob@7.1.7: + resolution: + { + integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==, + tarball: https://registry.npmmirror.com/glob/-/glob-7.1.7.tgz, + } + name: glob + version: 7.1.7 + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + once: registry.npmmirror.com/once@1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 + dev: true + + registry.npmmirror.com/glob@7.2.0: + resolution: + { + integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, + tarball: https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz, + } + name: glob + version: 7.2.0 + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + once: registry.npmmirror.com/once@1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 + dev: true + + registry.npmmirror.com/glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + tarball: https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz, + } + name: glob + version: 7.2.3 + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + once: registry.npmmirror.com/once@1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 + dev: true + + registry.npmmirror.com/glob@8.1.0: + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + tarball: https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz, + } + name: glob + version: 8.1.0 + engines: { node: ">=12" } + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@5.1.6 + once: registry.npmmirror.com/once@1.4.0 + dev: true + + registry.npmmirror.com/globals@11.12.0: + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + tarball: https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz, + } + name: globals + version: 11.12.0 + engines: { node: ">=4" } + dev: true + + registry.npmmirror.com/globals@13.23.0: + resolution: + { + integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, + tarball: https://registry.npmmirror.com/globals/-/globals-13.23.0.tgz, + } + name: globals + version: 13.23.0 + engines: { node: ">=8" } + dependencies: + type-fest: registry.npmmirror.com/type-fest@0.20.2 + dev: true + + registry.npmmirror.com/globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + tarball: https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz, + } + name: globby + version: 11.1.0 + engines: { node: ">=10" } + dependencies: + array-union: registry.npmmirror.com/array-union@2.1.0 + dir-glob: registry.npmmirror.com/dir-glob@3.0.1 + fast-glob: registry.npmmirror.com/fast-glob@3.3.2 + ignore: registry.npmmirror.com/ignore@5.2.4 + merge2: registry.npmmirror.com/merge2@1.4.1 + slash: registry.npmmirror.com/slash@3.0.0 + dev: true + + registry.npmmirror.com/globule@1.3.4: + resolution: + { + integrity: sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==, + tarball: https://registry.npmmirror.com/globule/-/globule-1.3.4.tgz, + } + name: globule + version: 1.3.4 + engines: { node: ">= 0.10" } + dependencies: + glob: registry.npmmirror.com/glob@7.1.7 + lodash: registry.npmmirror.com/lodash@4.17.21 + minimatch: registry.npmmirror.com/minimatch@3.0.8 + dev: true + + registry.npmmirror.com/gopd@1.0.1: + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + tarball: https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz, + } + name: gopd + version: 1.0.1 + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + dev: true + + registry.npmmirror.com/got@12.6.1: + resolution: + { + integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==, + tarball: https://registry.npmmirror.com/got/-/got-12.6.1.tgz, + } + name: got + version: 12.6.1 + engines: { node: ">=14.16" } + dependencies: + "@sindresorhus/is": registry.npmmirror.com/@sindresorhus/is@5.3.0 + "@szmarczak/http-timer": registry.npmmirror.com/@szmarczak/http-timer@5.0.1 + cacheable-lookup: registry.npmmirror.com/cacheable-lookup@7.0.0 + cacheable-request: registry.npmmirror.com/cacheable-request@10.2.14 + decompress-response: registry.npmmirror.com/decompress-response@6.0.0 + form-data-encoder: registry.npmmirror.com/form-data-encoder@2.1.4 + get-stream: registry.npmmirror.com/get-stream@6.0.1 + http2-wrapper: registry.npmmirror.com/http2-wrapper@2.2.1 + lowercase-keys: registry.npmmirror.com/lowercase-keys@3.0.0 + p-cancelable: registry.npmmirror.com/p-cancelable@3.0.0 + responselike: registry.npmmirror.com/responselike@3.0.0 + dev: true + + registry.npmmirror.com/graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz, + } + name: graceful-fs + version: 4.2.11 + dev: true + + registry.npmmirror.com/grapheme-splitter@1.0.4: + resolution: + { + integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, + tarball: https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz, + } + name: grapheme-splitter + version: 1.0.4 + dev: true + + registry.npmmirror.com/graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + tarball: https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz, + } + name: graphemer + version: 1.4.0 + dev: true + + registry.npmmirror.com/has-bigints@1.0.2: + resolution: + { + integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, + tarball: https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz, + } + name: has-bigints + version: 1.0.2 + dev: true + + registry.npmmirror.com/has-flag@3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + tarball: https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz, + } + name: has-flag + version: 3.0.0 + engines: { node: ">=4" } + dev: true + + registry.npmmirror.com/has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + tarball: https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz, + } + name: has-flag + version: 4.0.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/has-property-descriptors@1.0.1: + resolution: + { + integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==, + tarball: https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz, + } + name: has-property-descriptors + version: 1.0.1 + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + dev: true + + registry.npmmirror.com/has-proto@1.0.1: + resolution: + { + integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, + tarball: https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz, + } + name: has-proto + version: 1.0.1 + engines: { node: ">= 0.4" } + dev: true + + registry.npmmirror.com/has-symbols@1.0.3: + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + tarball: https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz, + } + name: has-symbols + version: 1.0.3 + engines: { node: ">= 0.4" } + dev: true + + registry.npmmirror.com/has-tostringtag@1.0.0: + resolution: + { + integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, + tarball: https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz, + } + name: has-tostringtag + version: 1.0.0 + engines: { node: ">= 0.4" } + dependencies: + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + dev: true + + registry.npmmirror.com/has@1.0.4: + resolution: + { + integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==, + tarball: https://registry.npmmirror.com/has/-/has-1.0.4.tgz, + } + name: has + version: 1.0.4 + engines: { node: ">= 0.4.0" } + dev: true + + registry.npmmirror.com/hasown@2.0.0: + resolution: + { + integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, + tarball: https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz, + } + name: hasown + version: 2.0.0 + engines: { node: ">= 0.4" } + dependencies: + function-bind: registry.npmmirror.com/function-bind@1.1.2 + dev: true + + registry.npmmirror.com/he@1.2.0: + resolution: + { + integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, + tarball: https://registry.npmmirror.com/he/-/he-1.2.0.tgz, + } + name: he + version: 1.2.0 + hasBin: true + dev: true + + registry.npmmirror.com/hosted-git-info@7.0.1: + resolution: + { + integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==, + tarball: https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz, + } + name: hosted-git-info + version: 7.0.1 + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + lru-cache: registry.npmmirror.com/lru-cache@10.0.2 + dev: true + + registry.npmmirror.com/html-encoding-sniffer@3.0.0: + resolution: + { + integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==, + tarball: https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz, + } + name: html-encoding-sniffer + version: 3.0.0 + engines: { node: ">=12" } + dependencies: + whatwg-encoding: registry.npmmirror.com/whatwg-encoding@2.0.0 + dev: true + + registry.npmmirror.com/html-escaper@2.0.2: + resolution: + { + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, + tarball: https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz, + } + name: html-escaper + version: 2.0.2 + dev: true + + registry.npmmirror.com/http-cache-semantics@4.1.1: + resolution: + { + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, + tarball: https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz, + } + name: http-cache-semantics + version: 4.1.1 + dev: true + + registry.npmmirror.com/http-proxy-agent@5.0.0: + resolution: + { + integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, + tarball: https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz, + } + name: http-proxy-agent + version: 5.0.0 + engines: { node: ">= 6" } + dependencies: + "@tootallnate/once": registry.npmmirror.com/@tootallnate/once@2.0.0 + agent-base: registry.npmmirror.com/agent-base@6.0.2 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/http-proxy-agent@7.0.0: + resolution: + { + integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==, + tarball: https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz, + } + name: http-proxy-agent + version: 7.0.0 + engines: { node: ">= 14" } + dependencies: + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/http2-wrapper@2.2.1: + resolution: + { + integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==, + tarball: https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz, + } + name: http2-wrapper + version: 2.2.1 + engines: { node: ">=10.19.0" } + dependencies: + quick-lru: registry.npmmirror.com/quick-lru@5.1.1 + resolve-alpn: registry.npmmirror.com/resolve-alpn@1.2.1 + dev: true + + registry.npmmirror.com/https-proxy-agent@5.0.1: + resolution: + { + integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, + tarball: https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz, + } + name: https-proxy-agent + version: 5.0.1 + engines: { node: ">= 6" } + dependencies: + agent-base: registry.npmmirror.com/agent-base@6.0.2 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/https-proxy-agent@7.0.2: + resolution: + { + integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, + tarball: https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz, + } + name: https-proxy-agent + version: 7.0.2 + engines: { node: ">= 14" } + dependencies: + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/human-signals@2.1.0: + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + tarball: https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz, + } + name: human-signals + version: 2.1.0 + engines: { node: ">=10.17.0" } + dev: true + + registry.npmmirror.com/human-signals@5.0.0: + resolution: + { + integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, + tarball: https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz, + } + name: human-signals + version: 5.0.0 + engines: { node: ">=16.17.0" } + dev: true + + registry.npmmirror.com/iconv-lite@0.4.24: + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz, + } + name: iconv-lite + version: 0.4.24 + engines: { node: ">=0.10.0" } + dependencies: + safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 + dev: true + + registry.npmmirror.com/iconv-lite@0.6.3: + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz, + } + name: iconv-lite + version: 0.6.3 + engines: { node: ">=0.10.0" } + dependencies: + safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 + dev: true + + registry.npmmirror.com/ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + tarball: https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz, + } + name: ieee754 + version: 1.2.1 + dev: true + + registry.npmmirror.com/ignore@5.2.4: + resolution: + { + integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, + tarball: https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz, + } + name: ignore + version: 5.2.4 + engines: { node: ">= 4" } + dev: true + + registry.npmmirror.com/import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + tarball: https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz, + } + name: import-fresh + version: 3.3.0 + engines: { node: ">=6" } + dependencies: + parent-module: registry.npmmirror.com/parent-module@1.0.1 + resolve-from: registry.npmmirror.com/resolve-from@4.0.0 + dev: true + + registry.npmmirror.com/import-local@3.1.0: + resolution: + { + integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, + tarball: https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz, + } + name: import-local + version: 3.1.0 + engines: { node: ">=8" } + hasBin: true + dependencies: + pkg-dir: registry.npmmirror.com/pkg-dir@4.2.0 + resolve-cwd: registry.npmmirror.com/resolve-cwd@3.0.0 + dev: true + + registry.npmmirror.com/import-meta-resolve@4.0.0: + resolution: + { + integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==, + tarball: https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz, + } + name: import-meta-resolve + version: 4.0.0 + dev: true + + registry.npmmirror.com/imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + tarball: https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz, + } + name: imurmurhash + version: 0.1.4 + engines: { node: ">=0.8.19" } + dev: true + + registry.npmmirror.com/inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + tarball: https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz, + } + name: inflight + version: 1.0.6 + dependencies: + once: registry.npmmirror.com/once@1.4.0 + wrappy: registry.npmmirror.com/wrappy@1.0.2 + dev: true + + registry.npmmirror.com/inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz, + } + name: inherits + version: 2.0.4 + dev: true + + registry.npmmirror.com/inquirer@9.2.12: + resolution: + { + integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==, + tarball: https://registry.npmmirror.com/inquirer/-/inquirer-9.2.12.tgz, + } + name: inquirer + version: 9.2.12 + engines: { node: ">=14.18.0" } + dependencies: + "@ljharb/through": registry.npmmirror.com/@ljharb/through@2.3.11 + ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 + chalk: registry.npmmirror.com/chalk@5.3.0 + cli-cursor: registry.npmmirror.com/cli-cursor@3.1.0 + cli-width: registry.npmmirror.com/cli-width@4.1.0 + external-editor: registry.npmmirror.com/external-editor@3.1.0 + figures: registry.npmmirror.com/figures@5.0.0 + lodash: registry.npmmirror.com/lodash@4.17.21 + mute-stream: registry.npmmirror.com/mute-stream@1.0.0 + ora: registry.npmmirror.com/ora@5.4.1 + run-async: registry.npmmirror.com/run-async@3.0.0 + rxjs: registry.npmmirror.com/rxjs@7.8.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@6.2.0 + dev: true + + registry.npmmirror.com/internal-slot@1.0.5: + resolution: + { + integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==, + tarball: https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz, + } + name: internal-slot + version: 1.0.5 + engines: { node: ">= 0.4" } + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + has: registry.npmmirror.com/has@1.0.4 + side-channel: registry.npmmirror.com/side-channel@1.0.4 + dev: true + + registry.npmmirror.com/ip@1.1.8: + resolution: + { + integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==, + tarball: https://registry.npmmirror.com/ip/-/ip-1.1.8.tgz, + } + name: ip + version: 1.1.8 + dev: true + + registry.npmmirror.com/ip@2.0.0: + resolution: + { + integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==, + tarball: https://registry.npmmirror.com/ip/-/ip-2.0.0.tgz, + } + name: ip + version: 2.0.0 + dev: true + + registry.npmmirror.com/is-arguments@1.1.1: + resolution: + { + integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, + tarball: https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz, + } + name: is-arguments + version: 1.1.1 + engines: { node: ">= 0.4" } + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-array-buffer@3.0.2: + resolution: + { + integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==, + tarball: https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz, + } + name: is-array-buffer + version: 3.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + is-typed-array: registry.npmmirror.com/is-typed-array@1.1.10 + dev: true + + registry.npmmirror.com/is-arrayish@0.2.1: + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + tarball: https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz, + } + name: is-arrayish + version: 0.2.1 + dev: true + + registry.npmmirror.com/is-bigint@1.0.4: + resolution: + { + integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, + tarball: https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz, + } + name: is-bigint + version: 1.0.4 + dependencies: + has-bigints: registry.npmmirror.com/has-bigints@1.0.2 + dev: true + + registry.npmmirror.com/is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + tarball: https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz, + } + name: is-binary-path + version: 2.1.0 + engines: { node: ">=8" } + dependencies: + binary-extensions: registry.npmmirror.com/binary-extensions@2.2.0 + dev: true + + registry.npmmirror.com/is-boolean-object@1.1.2: + resolution: + { + integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, + tarball: https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz, + } + name: is-boolean-object + version: 1.1.2 + engines: { node: ">= 0.4" } + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-callable@1.2.7: + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + tarball: https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz, + } + name: is-callable + version: 1.2.7 + engines: { node: ">= 0.4" } + dev: true + + registry.npmmirror.com/is-core-module@2.13.1: + resolution: + { + integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, + tarball: https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz, + } + name: is-core-module + version: 2.13.1 + dependencies: + hasown: registry.npmmirror.com/hasown@2.0.0 + dev: true + + registry.npmmirror.com/is-date-object@1.0.5: + resolution: + { + integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, + tarball: https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz, + } + name: is-date-object + version: 1.0.5 + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + tarball: https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz, + } + name: is-extglob + version: 2.1.1 + engines: { node: ">=0.10.0" } + dev: true + + registry.npmmirror.com/is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + tarball: https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz, + } + name: is-fullwidth-code-point + version: 3.0.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/is-generator-fn@2.1.0: + resolution: + { + integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, + tarball: https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz, + } + name: is-generator-fn + version: 2.1.0 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + tarball: https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz, + } + name: is-glob + version: 4.0.3 + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: registry.npmmirror.com/is-extglob@2.1.1 + dev: true + + registry.npmmirror.com/is-interactive@1.0.0: + resolution: + { + integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, + tarball: https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz, + } + name: is-interactive + version: 1.0.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/is-map@2.0.2: + resolution: + { + integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==, + tarball: https://registry.npmmirror.com/is-map/-/is-map-2.0.2.tgz, + } + name: is-map + version: 2.0.2 + dev: true + + registry.npmmirror.com/is-number-object@1.0.7: + resolution: + { + integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, + tarball: https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz, + } + name: is-number-object + version: 1.0.7 + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + tarball: https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz, + } + name: is-number + version: 7.0.0 + engines: { node: ">=0.12.0" } + dev: true + + registry.npmmirror.com/is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + tarball: https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz, + } + name: is-path-inside + version: 3.0.3 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/is-plain-obj@2.1.0: + resolution: + { + integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, + tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz, + } + name: is-plain-obj + version: 2.1.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/is-plain-obj@4.1.0: + resolution: + { + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, + tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz, + } + name: is-plain-obj + version: 4.1.0 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/is-potential-custom-element-name@1.0.1: + resolution: + { + integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, + tarball: https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz, + } + name: is-potential-custom-element-name + version: 1.0.1 + dev: true + + registry.npmmirror.com/is-regex@1.1.4: + resolution: + { + integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, + tarball: https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz, + } + name: is-regex + version: 1.1.4 + engines: { node: ">= 0.4" } + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-set@2.0.2: + resolution: + { + integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==, + tarball: https://registry.npmmirror.com/is-set/-/is-set-2.0.2.tgz, + } + name: is-set + version: 2.0.2 + dev: true + + registry.npmmirror.com/is-shared-array-buffer@1.0.2: + resolution: + { + integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, + tarball: https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz, + } + name: is-shared-array-buffer + version: 1.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + dev: true + + registry.npmmirror.com/is-stream@2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + tarball: https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz, + } + name: is-stream + version: 2.0.1 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/is-stream@3.0.0: + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + tarball: https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz, + } + name: is-stream + version: 3.0.0 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + registry.npmmirror.com/is-string@1.0.7: + resolution: + { + integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, + tarball: https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz, + } + name: is-string + version: 1.0.7 + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-symbol@1.0.4: + resolution: + { + integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, + tarball: https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz, + } + name: is-symbol + version: 1.0.4 + engines: { node: ">= 0.4" } + dependencies: + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + dev: true + + registry.npmmirror.com/is-typed-array@1.1.10: + resolution: + { + integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==, + tarball: https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz, + } + name: is-typed-array + version: 1.1.10 + engines: { node: ">= 0.4" } + dependencies: + available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 + call-bind: registry.npmmirror.com/call-bind@1.0.5 + for-each: registry.npmmirror.com/for-each@0.3.3 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-unicode-supported@0.1.0: + resolution: + { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz, + } + name: is-unicode-supported + version: 0.1.0 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/is-unicode-supported@1.3.0: + resolution: + { + integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==, + tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz, + } + name: is-unicode-supported + version: 1.3.0 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/is-weakmap@2.0.1: + resolution: + { + integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==, + tarball: https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.1.tgz, + } + name: is-weakmap + version: 2.0.1 + dev: true + + registry.npmmirror.com/is-weakset@2.0.2: + resolution: + { + integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==, + tarball: https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.2.tgz, + } + name: is-weakset + version: 2.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + dev: true + + registry.npmmirror.com/isarray@1.0.0: + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + tarball: https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz, + } + name: isarray + version: 1.0.0 + dev: true + + registry.npmmirror.com/isarray@2.0.5: + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + tarball: https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz, + } + name: isarray + version: 2.0.5 + dev: true + + registry.npmmirror.com/isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + tarball: https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz, + } + name: isexe + version: 2.0.0 + dev: true + + registry.npmmirror.com/isexe@3.1.1: + resolution: + { + integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, + tarball: https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz, + } + name: isexe + version: 3.1.1 + engines: { node: ">=16" } + dev: true + + registry.npmmirror.com/istanbul-lib-coverage@3.2.2: + resolution: + { + integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, + tarball: https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz, + } + name: istanbul-lib-coverage + version: 3.2.2 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/istanbul-lib-instrument@5.2.1: + resolution: + { + integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, + tarball: https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz, + } + name: istanbul-lib-instrument + version: 5.2.1 + engines: { node: ">=8" } + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 + "@istanbuljs/schema": registry.npmmirror.com/@istanbuljs/schema@0.1.3 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + semver: registry.npmmirror.com/semver@6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/istanbul-lib-instrument@6.0.1: + resolution: + { + integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==, + tarball: https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz, + } + name: istanbul-lib-instrument + version: 6.0.1 + engines: { node: ">=10" } + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 + "@istanbuljs/schema": registry.npmmirror.com/@istanbuljs/schema@0.1.3 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + semver: registry.npmmirror.com/semver@7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/istanbul-lib-report@3.0.1: + resolution: + { + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, + tarball: https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz, + } + name: istanbul-lib-report + version: 3.0.1 + engines: { node: ">=10" } + dependencies: + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + make-dir: registry.npmmirror.com/make-dir@4.0.0 + supports-color: registry.npmmirror.com/supports-color@7.2.0 + dev: true + + registry.npmmirror.com/istanbul-lib-source-maps@4.0.1: + resolution: + { + integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, + tarball: https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz, + } + name: istanbul-lib-source-maps + version: 4.0.1 + engines: { node: ">=10" } + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + source-map: registry.npmmirror.com/source-map@0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/istanbul-reports@3.1.5: + resolution: + { + integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==, + tarball: https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz, + } + name: istanbul-reports + version: 3.1.5 + engines: { node: ">=8" } + dependencies: + html-escaper: registry.npmmirror.com/html-escaper@2.0.2 + istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.1 + dev: true + + registry.npmmirror.com/jackspeak@2.3.6: + resolution: + { + integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, + tarball: https://registry.npmmirror.com/jackspeak/-/jackspeak-2.3.6.tgz, + } + name: jackspeak + version: 2.3.6 + engines: { node: ">=14" } + dependencies: + "@isaacs/cliui": registry.npmmirror.com/@isaacs/cliui@8.0.2 + optionalDependencies: + "@pkgjs/parseargs": registry.npmmirror.com/@pkgjs/parseargs@0.11.0 + dev: true + + registry.npmmirror.com/jake@10.8.5: + resolution: + { + integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==, + tarball: https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz, + } + name: jake + version: 10.8.5 + engines: { node: ">=10" } + hasBin: true + dependencies: + async: registry.npmmirror.com/async@3.2.5 + chalk: registry.npmmirror.com/chalk@4.1.2 + filelist: registry.npmmirror.com/filelist@1.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + dev: true + + registry.npmmirror.com/jest-changed-files@29.7.0: + resolution: + { + integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==, + tarball: https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz, + } + name: jest-changed-files + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + execa: registry.npmmirror.com/execa@5.1.1 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + p-limit: registry.npmmirror.com/p-limit@3.1.0 + dev: true + + registry.npmmirror.com/jest-circus@29.7.0: + resolution: + { + integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==, + tarball: https://registry.npmmirror.com/jest-circus/-/jest-circus-29.7.0.tgz, + } + name: jest-circus + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 + "@jest/expect": registry.npmmirror.com/@jest/expect@29.7.0 + "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + co: registry.npmmirror.com/co@4.6.0 + dedent: registry.npmmirror.com/dedent@1.5.1 + is-generator-fn: registry.npmmirror.com/is-generator-fn@2.1.0 + jest-each: registry.npmmirror.com/jest-each@29.7.0 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + p-limit: registry.npmmirror.com/p-limit@3.1.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + pure-rand: registry.npmmirror.com/pure-rand@6.0.4 + slash: registry.npmmirror.com/slash@3.0.0 + stack-utils: registry.npmmirror.com/stack-utils@2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + registry.npmmirror.com/jest-cli@29.7.0(@types/node@20.11.0): + resolution: + { + integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==, + tarball: https://registry.npmmirror.com/jest-cli/-/jest-cli-29.7.0.tgz, + } + id: registry.npmmirror.com/jest-cli/29.7.0 + name: jest-cli + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + "@jest/core": registry.npmmirror.com/@jest/core@29.7.0 + "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + create-jest: registry.npmmirror.com/create-jest@29.7.0(@types/node@20.11.0) + exit: registry.npmmirror.com/exit@0.1.2 + import-local: registry.npmmirror.com/import-local@3.1.0 + jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + yargs: registry.npmmirror.com/yargs@17.7.2 + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0): + resolution: + { + integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==, + tarball: https://registry.npmmirror.com/jest-config/-/jest-config-29.7.0.tgz, + } + id: registry.npmmirror.com/jest-config/29.7.0 + name: jest-config + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@jest/test-sequencer": registry.npmmirror.com/@jest/test-sequencer@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + babel-jest: registry.npmmirror.com/babel-jest@29.7.0(@babel/core@7.23.3) + chalk: registry.npmmirror.com/chalk@4.1.2 + ci-info: registry.npmmirror.com/ci-info@3.9.0 + deepmerge: registry.npmmirror.com/deepmerge@4.3.1 + glob: registry.npmmirror.com/glob@7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-circus: registry.npmmirror.com/jest-circus@29.7.0 + jest-environment-node: registry.npmmirror.com/jest-environment-node@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-runner: registry.npmmirror.com/jest-runner@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + parse-json: registry.npmmirror.com/parse-json@5.2.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + registry.npmmirror.com/jest-diff@29.7.0: + resolution: + { + integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==, + tarball: https://registry.npmmirror.com/jest-diff/-/jest-diff-29.7.0.tgz, + } + name: jest-diff + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: registry.npmmirror.com/chalk@4.1.2 + diff-sequences: registry.npmmirror.com/diff-sequences@29.6.3 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/jest-docblock@29.7.0: + resolution: + { + integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==, + tarball: https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.7.0.tgz, + } + name: jest-docblock + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + detect-newline: registry.npmmirror.com/detect-newline@3.1.0 + dev: true + + registry.npmmirror.com/jest-each@29.7.0: + resolution: + { + integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==, + tarball: https://registry.npmmirror.com/jest-each/-/jest-each-29.7.0.tgz, + } + name: jest-each + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/jest-environment-jsdom@29.7.0: + resolution: + { + integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==, + tarball: https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz, + } + name: jest-environment-jsdom + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 + "@jest/fake-timers": registry.npmmirror.com/@jest/fake-timers@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/jsdom": registry.npmmirror.com/@types/jsdom@20.0.1 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jsdom: registry.npmmirror.com/jsdom@20.0.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/jest-environment-node@29.7.0: + resolution: + { + integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==, + tarball: https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz, + } + name: jest-environment-node + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 + "@jest/fake-timers": registry.npmmirror.com/@jest/fake-timers@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + dev: true + + registry.npmmirror.com/jest-get-type@29.6.3: + resolution: + { + integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, + tarball: https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.6.3.tgz, + } + name: jest-get-type + version: 29.6.3 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + registry.npmmirror.com/jest-haste-map@29.7.0: + resolution: + { + integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==, + tarball: https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz, + } + name: jest-haste-map + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/graceful-fs": registry.npmmirror.com/@types/graceful-fs@4.1.9 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + anymatch: registry.npmmirror.com/anymatch@3.1.3 + fb-watchman: registry.npmmirror.com/fb-watchman@2.0.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-worker: registry.npmmirror.com/jest-worker@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + walker: registry.npmmirror.com/walker@1.0.8 + optionalDependencies: + fsevents: registry.npmmirror.com/fsevents@2.3.3 + dev: true + + registry.npmmirror.com/jest-leak-detector@29.7.0: + resolution: + { + integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==, + tarball: https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz, + } + name: jest-leak-detector + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/jest-matcher-utils@29.7.0: + resolution: + { + integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==, + tarball: https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz, + } + name: jest-matcher-utils + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-diff: registry.npmmirror.com/jest-diff@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/jest-message-util@29.7.0: + resolution: + { + integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==, + tarball: https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.7.0.tgz, + } + name: jest-message-util + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/stack-utils": registry.npmmirror.com/@types/stack-utils@2.0.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + stack-utils: registry.npmmirror.com/stack-utils@2.0.6 + dev: true + + registry.npmmirror.com/jest-mock@29.7.0: + resolution: + { + integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==, + tarball: https://registry.npmmirror.com/jest-mock/-/jest-mock-29.7.0.tgz, + } + name: jest-mock + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + dev: true + + registry.npmmirror.com/jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: + { + integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, + tarball: https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz, + } + id: registry.npmmirror.com/jest-pnp-resolver/1.2.3 + name: jest-pnp-resolver + version: 1.2.3 + engines: { node: ">=6" } + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + dev: true + + registry.npmmirror.com/jest-regex-util@29.6.3: + resolution: + { + integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==, + tarball: https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz, + } + name: jest-regex-util + version: 29.6.3 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dev: true + + registry.npmmirror.com/jest-resolve-dependencies@29.7.0: + resolution: + { + integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==, + tarball: https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz, + } + name: jest-resolve-dependencies + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-resolve@29.7.0: + resolution: + { + integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==, + tarball: https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.7.0.tgz, + } + name: jest-resolve + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + chalk: registry.npmmirror.com/chalk@4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-pnp-resolver: registry.npmmirror.com/jest-pnp-resolver@1.2.3(jest-resolve@29.7.0) + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + resolve: registry.npmmirror.com/resolve@1.22.8 + resolve.exports: registry.npmmirror.com/resolve.exports@2.0.2 + slash: registry.npmmirror.com/slash@3.0.0 + dev: true + + registry.npmmirror.com/jest-runner@29.7.0: + resolution: + { + integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==, + tarball: https://registry.npmmirror.com/jest-runner/-/jest-runner-29.7.0.tgz, + } + name: jest-runner + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/console": registry.npmmirror.com/@jest/console@29.7.0 + "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 + "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 + "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + emittery: registry.npmmirror.com/emittery@0.13.1 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-docblock: registry.npmmirror.com/jest-docblock@29.7.0 + jest-environment-node: registry.npmmirror.com/jest-environment-node@29.7.0 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-leak-detector: registry.npmmirror.com/jest-leak-detector@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-watcher: registry.npmmirror.com/jest-watcher@29.7.0 + jest-worker: registry.npmmirror.com/jest-worker@29.7.0 + p-limit: registry.npmmirror.com/p-limit@3.1.0 + source-map-support: registry.npmmirror.com/source-map-support@0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-runtime@29.7.0: + resolution: + { + integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==, + tarball: https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.7.0.tgz, + } + name: jest-runtime + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 + "@jest/fake-timers": registry.npmmirror.com/@jest/fake-timers@29.7.0 + "@jest/globals": registry.npmmirror.com/@jest/globals@29.7.0 + "@jest/source-map": registry.npmmirror.com/@jest/source-map@29.6.3 + "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 + "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + cjs-module-lexer: registry.npmmirror.com/cjs-module-lexer@1.2.2 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 + glob: registry.npmmirror.com/glob@7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + strip-bom: registry.npmmirror.com/strip-bom@4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-snapshot@29.7.0: + resolution: + { + integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==, + tarball: https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz, + } + name: jest-snapshot + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 + "@babel/generator": registry.npmmirror.com/@babel/generator@7.23.3 + "@babel/plugin-syntax-jsx": registry.npmmirror.com/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3) + "@babel/plugin-syntax-typescript": registry.npmmirror.com/@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3) + "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 + "@jest/expect-utils": registry.npmmirror.com/@jest/expect-utils@29.7.0 + "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3) + chalk: registry.npmmirror.com/chalk@4.1.2 + expect: registry.npmmirror.com/expect@29.7.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-diff: registry.npmmirror.com/jest-diff@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + natural-compare: registry.npmmirror.com/natural-compare@1.4.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + semver: registry.npmmirror.com/semver@7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-util@29.7.0: + resolution: + { + integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, + tarball: https://registry.npmmirror.com/jest-util/-/jest-util-29.7.0.tgz, + } + name: jest-util + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + ci-info: registry.npmmirror.com/ci-info@3.9.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + picomatch: registry.npmmirror.com/picomatch@2.3.1 + dev: true + + registry.npmmirror.com/jest-validate@29.7.0: + resolution: + { + integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==, + tarball: https://registry.npmmirror.com/jest-validate/-/jest-validate-29.7.0.tgz, + } + name: jest-validate + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + camelcase: registry.npmmirror.com/camelcase@6.3.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + leven: registry.npmmirror.com/leven@3.1.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/jest-watcher@29.7.0: + resolution: + { + integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==, + tarball: https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.7.0.tgz, + } + name: jest-watcher + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 + chalk: registry.npmmirror.com/chalk@4.1.2 + emittery: registry.npmmirror.com/emittery@0.13.1 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + string-length: registry.npmmirror.com/string-length@4.0.2 + dev: true + + registry.npmmirror.com/jest-worker@29.7.0: + resolution: + { + integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==, + tarball: https://registry.npmmirror.com/jest-worker/-/jest-worker-29.7.0.tgz, + } + name: jest-worker + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + merge-stream: registry.npmmirror.com/merge-stream@2.0.0 + supports-color: registry.npmmirror.com/supports-color@8.1.1 + dev: true + + registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0): + resolution: + { + integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==, + tarball: https://registry.npmmirror.com/jest/-/jest-29.7.0.tgz, + } + id: registry.npmmirror.com/jest/29.7.0 + name: jest + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + "@jest/core": registry.npmmirror.com/@jest/core@29.7.0 + "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 + import-local: registry.npmmirror.com/import-local@3.1.0 + jest-cli: registry.npmmirror.com/jest-cli@29.7.0(@types/node@20.11.0) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + registry.npmmirror.com/js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + tarball: https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz, + } + name: js-tokens + version: 4.0.0 + dev: true + + registry.npmmirror.com/js-yaml@3.14.1: + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz, + } + name: js-yaml + version: 3.14.1 + hasBin: true + dependencies: + argparse: registry.npmmirror.com/argparse@1.0.10 + esprima: registry.npmmirror.com/esprima@4.0.1 + dev: true + + registry.npmmirror.com/js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz, + } + name: js-yaml + version: 4.1.0 + hasBin: true + dependencies: + argparse: registry.npmmirror.com/argparse@2.0.1 + dev: true + + registry.npmmirror.com/jsdom@20.0.3: + resolution: + { + integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==, + tarball: https://registry.npmmirror.com/jsdom/-/jsdom-20.0.3.tgz, + } + name: jsdom + version: 20.0.3 + engines: { node: ">=14" } + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: registry.npmmirror.com/abab@2.0.6 + acorn: registry.npmmirror.com/acorn@8.11.2 + acorn-globals: registry.npmmirror.com/acorn-globals@7.0.1 + cssom: registry.npmmirror.com/cssom@0.5.0 + cssstyle: registry.npmmirror.com/cssstyle@2.3.0 + data-urls: registry.npmmirror.com/data-urls@3.0.2 + decimal.js: registry.npmmirror.com/decimal.js@10.4.3 + domexception: registry.npmmirror.com/domexception@4.0.0 + escodegen: registry.npmmirror.com/escodegen@2.1.0 + form-data: registry.npmmirror.com/form-data@4.0.0 + html-encoding-sniffer: registry.npmmirror.com/html-encoding-sniffer@3.0.0 + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@5.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@5.0.1 + is-potential-custom-element-name: registry.npmmirror.com/is-potential-custom-element-name@1.0.1 + nwsapi: registry.npmmirror.com/nwsapi@2.2.4 + parse5: registry.npmmirror.com/parse5@7.1.2 + saxes: registry.npmmirror.com/saxes@6.0.0 + symbol-tree: registry.npmmirror.com/symbol-tree@3.2.4 + tough-cookie: registry.npmmirror.com/tough-cookie@4.1.2 + w3c-xmlserializer: registry.npmmirror.com/w3c-xmlserializer@4.0.0 + webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 + whatwg-encoding: registry.npmmirror.com/whatwg-encoding@2.0.0 + whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype@3.0.0 + whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0 + ws: registry.npmmirror.com/ws@8.14.2 + xml-name-validator: registry.npmmirror.com/xml-name-validator@4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/jsesc@2.5.2: + resolution: + { + integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, + tarball: https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz, + } + name: jsesc + version: 2.5.2 + engines: { node: ">=4" } + hasBin: true + dev: true + + registry.npmmirror.com/json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + tarball: https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz, + } + name: json-buffer + version: 3.0.1 + dev: true + + registry.npmmirror.com/json-parse-even-better-errors@2.3.1: + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz, + } + name: json-parse-even-better-errors + version: 2.3.1 + dev: true + + registry.npmmirror.com/json-parse-even-better-errors@3.0.0: + resolution: + { + integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==, + tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz, + } + name: json-parse-even-better-errors + version: 3.0.0 + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + registry.npmmirror.com/json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + tarball: https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz, + } + name: json-schema-traverse + version: 0.4.1 + dev: true + + registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + tarball: https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz, + } + name: json-stable-stringify-without-jsonify + version: 1.0.1 + dev: true + + registry.npmmirror.com/json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + tarball: https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz, + } + name: json5 + version: 2.2.3 + engines: { node: ">=6" } + hasBin: true + dev: true + + registry.npmmirror.com/jsonfile@4.0.0: + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + tarball: https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz, + } + name: jsonfile + version: 4.0.0 + optionalDependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + dev: true + + registry.npmmirror.com/keyv@4.5.4: + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + tarball: https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz, + } + name: keyv + version: 4.5.4 + dependencies: + json-buffer: registry.npmmirror.com/json-buffer@3.0.1 + dev: true + + registry.npmmirror.com/kleur@3.0.3: + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + tarball: https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz, + } + name: kleur + version: 3.0.3 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/ky@0.33.3: + resolution: + { + integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==, + tarball: https://registry.npmmirror.com/ky/-/ky-0.33.3.tgz, + } + name: ky + version: 0.33.3 + engines: { node: ">=14.16" } + dev: true + + registry.npmmirror.com/lazystream@1.0.1: + resolution: + { + integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==, + tarball: https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz, + } + name: lazystream + version: 1.0.1 + engines: { node: ">= 0.6.3" } + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@2.3.8 + dev: true + + registry.npmmirror.com/leven@3.1.0: + resolution: + { + integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, + tarball: https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz, + } + name: leven + version: 3.1.0 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + tarball: https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz, + } + name: levn + version: 0.4.1 + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 + type-check: registry.npmmirror.com/type-check@0.4.0 + dev: true + + registry.npmmirror.com/lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + tarball: https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz, + } + name: lines-and-columns + version: 1.2.4 + dev: true + + registry.npmmirror.com/lines-and-columns@2.0.4: + resolution: + { + integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==, + tarball: https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz, + } + name: lines-and-columns + version: 2.0.4 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + registry.npmmirror.com/listenercount@1.0.1: + resolution: + { + integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==, + tarball: https://registry.npmmirror.com/listenercount/-/listenercount-1.0.1.tgz, + } + name: listenercount + version: 1.0.1 + dev: true + + registry.npmmirror.com/locate-app@2.1.0: + resolution: + { + integrity: sha512-rcVo/iLUxrd9d0lrmregK/Z5Y5NCpSwf9KlMbPpOHmKmdxdQY1Fj8NDQ5QymJTryCsBLqwmniFv2f3JKbk9Bvg==, + tarball: https://registry.npmmirror.com/locate-app/-/locate-app-2.1.0.tgz, + } + name: locate-app + version: 2.1.0 + dependencies: + n12: registry.npmmirror.com/n12@0.4.0 + type-fest: registry.npmmirror.com/type-fest@2.13.0 + userhome: registry.npmmirror.com/userhome@1.0.0 + dev: true + + registry.npmmirror.com/locate-path@5.0.0: + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + tarball: https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz, + } + name: locate-path + version: 5.0.0 + engines: { node: ">=8" } + dependencies: + p-locate: registry.npmmirror.com/p-locate@4.1.0 + dev: true + + registry.npmmirror.com/locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + tarball: https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz, + } + name: locate-path + version: 6.0.0 + engines: { node: ">=10" } + dependencies: + p-locate: registry.npmmirror.com/p-locate@5.0.0 + dev: true + + registry.npmmirror.com/locate-path@7.2.0: + resolution: + { + integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, + tarball: https://registry.npmmirror.com/locate-path/-/locate-path-7.2.0.tgz, + } + name: locate-path + version: 7.2.0 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + p-locate: registry.npmmirror.com/p-locate@6.0.0 + dev: true + + registry.npmmirror.com/lodash.clonedeep@4.5.0: + resolution: + { + integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==, + tarball: https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz, + } + name: lodash.clonedeep + version: 4.5.0 + dev: true + + registry.npmmirror.com/lodash.flattendeep@4.4.0: + resolution: + { + integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==, + tarball: https://registry.npmmirror.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz, + } + name: lodash.flattendeep + version: 4.4.0 + dev: true + + registry.npmmirror.com/lodash.isequal@4.5.0: + resolution: + { + integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, + tarball: https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz, + } + name: lodash.isequal + version: 4.5.0 + dev: true + + registry.npmmirror.com/lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + tarball: https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz, + } + name: lodash.merge + version: 4.6.2 + dev: true + + registry.npmmirror.com/lodash.pickby@4.6.0: + resolution: + { + integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==, + tarball: https://registry.npmmirror.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz, + } + name: lodash.pickby + version: 4.6.0 + dev: true + + registry.npmmirror.com/lodash.union@4.6.0: + resolution: + { + integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==, + tarball: https://registry.npmmirror.com/lodash.union/-/lodash.union-4.6.0.tgz, + } + name: lodash.union + version: 4.6.0 + dev: true + + registry.npmmirror.com/lodash.zip@4.2.0: + resolution: + { + integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==, + tarball: https://registry.npmmirror.com/lodash.zip/-/lodash.zip-4.2.0.tgz, + } + name: lodash.zip + version: 4.2.0 + dev: true + + registry.npmmirror.com/lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz, + } + name: lodash + version: 4.17.21 + dev: true + + registry.npmmirror.com/log-symbols@4.1.0: + resolution: + { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + tarball: https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz, + } + name: log-symbols + version: 4.1.0 + engines: { node: ">=10" } + dependencies: + chalk: registry.npmmirror.com/chalk@4.1.2 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported@0.1.0 + dev: true + + registry.npmmirror.com/loglevel-plugin-prefix@0.8.4: + resolution: + { + integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==, + tarball: https://registry.npmmirror.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz, + } + name: loglevel-plugin-prefix + version: 0.8.4 + dev: true + + registry.npmmirror.com/loglevel@1.8.1: + resolution: + { + integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==, + tarball: https://registry.npmmirror.com/loglevel/-/loglevel-1.8.1.tgz, + } + name: loglevel + version: 1.8.1 + engines: { node: ">= 0.6.0" } + dev: true + + registry.npmmirror.com/loupe@2.3.7: + resolution: + { + integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, + tarball: https://registry.npmmirror.com/loupe/-/loupe-2.3.7.tgz, + } + name: loupe + version: 2.3.7 + dependencies: + get-func-name: registry.npmmirror.com/get-func-name@2.0.2 + dev: true + + registry.npmmirror.com/lowercase-keys@3.0.0: + resolution: + { + integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==, + tarball: https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz, + } + name: lowercase-keys + version: 3.0.0 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + registry.npmmirror.com/lru-cache@10.0.2: + resolution: + { + integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==, + tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-10.0.2.tgz, + } + name: lru-cache + version: 10.0.2 + engines: { node: 14 || >=16.14 } + dependencies: + semver: registry.npmmirror.com/semver@7.5.4 + dev: true + + registry.npmmirror.com/lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz, + } + name: lru-cache + version: 5.1.1 + dependencies: + yallist: registry.npmmirror.com/yallist@3.1.1 + dev: true + + registry.npmmirror.com/lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz, + } + name: lru-cache + version: 6.0.0 + engines: { node: ">=10" } + dependencies: + yallist: registry.npmmirror.com/yallist@4.0.0 + dev: true + + registry.npmmirror.com/lru-cache@7.18.3: + resolution: + { + integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, + tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz, + } + name: lru-cache + version: 7.18.3 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/make-dir@4.0.0: + resolution: + { + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, + tarball: https://registry.npmmirror.com/make-dir/-/make-dir-4.0.0.tgz, + } + name: make-dir + version: 4.0.0 + engines: { node: ">=10" } + dependencies: + semver: registry.npmmirror.com/semver@7.5.4 + dev: true + + registry.npmmirror.com/makeerror@1.0.12: + resolution: + { + integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, + tarball: https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz, + } + name: makeerror + version: 1.0.12 + dependencies: + tmpl: registry.npmmirror.com/tmpl@1.0.5 + dev: true + + registry.npmmirror.com/merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + tarball: https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz, + } + name: merge-stream + version: 2.0.0 + dev: true + + registry.npmmirror.com/merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + tarball: https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz, + } + name: merge2 + version: 1.4.1 + engines: { node: ">= 8" } + dev: true + + registry.npmmirror.com/micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + tarball: https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz, + } + name: micromatch + version: 4.0.5 + engines: { node: ">=8.6" } + dependencies: + braces: registry.npmmirror.com/braces@3.0.2 + picomatch: registry.npmmirror.com/picomatch@2.3.1 + dev: true + + registry.npmmirror.com/mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + tarball: https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz, + } + name: mime-db + version: 1.52.0 + engines: { node: ">= 0.6" } + dev: true + + registry.npmmirror.com/mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + tarball: https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz, + } + name: mime-types + version: 2.1.35 + engines: { node: ">= 0.6" } + dependencies: + mime-db: registry.npmmirror.com/mime-db@1.52.0 + dev: true + + registry.npmmirror.com/mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + tarball: https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz, + } + name: mimic-fn + version: 2.1.0 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/mimic-fn@4.0.0: + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + tarball: https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz, + } + name: mimic-fn + version: 4.0.0 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz, + } + name: mimic-response + version: 3.1.0 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/mimic-response@4.0.0: + resolution: + { + integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==, + tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-4.0.0.tgz, + } + name: mimic-response + version: 4.0.0 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + registry.npmmirror.com/minimatch@3.0.8: + resolution: + { + integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==, + tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.0.8.tgz, + } + name: minimatch + version: 3.0.8 + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 + dev: true + + registry.npmmirror.com/minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz, + } + name: minimatch + version: 3.1.2 + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 + dev: true + + registry.npmmirror.com/minimatch@5.0.1: + resolution: + { + integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==, + tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.0.1.tgz, + } + name: minimatch + version: 5.0.1 + engines: { node: ">=10" } + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 + dev: true + + registry.npmmirror.com/minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz, + } + name: minimatch + version: 5.1.6 + engines: { node: ">=10" } + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 + dev: true + + registry.npmmirror.com/minimatch@9.0.3: + resolution: + { + integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, + tarball: https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz, + } + name: minimatch + version: 9.0.3 + engines: { node: ">=16 || 14 >=14.17" } + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 + dev: true + + registry.npmmirror.com/minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + tarball: https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz, + } + name: minimist + version: 1.2.8 + dev: true + + registry.npmmirror.com/minipass@7.0.4: + resolution: + { + integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, + tarball: https://registry.npmmirror.com/minipass/-/minipass-7.0.4.tgz, + } + name: minipass + version: 7.0.4 + engines: { node: ">=16 || 14 >=14.17" } + dev: true + + registry.npmmirror.com/mitt@3.0.0: + resolution: + { + integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==, + tarball: https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz, + } + name: mitt + version: 3.0.0 + dev: true + + registry.npmmirror.com/mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + tarball: https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz, + } + name: mkdirp-classic + version: 0.5.3 + dev: true + + registry.npmmirror.com/mkdirp@0.5.6: + resolution: + { + integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, + tarball: https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz, + } + name: mkdirp + version: 0.5.6 + hasBin: true + dependencies: + minimist: registry.npmmirror.com/minimist@1.2.8 + dev: true + + registry.npmmirror.com/mocha@10.2.0: + resolution: + { + integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==, + tarball: https://registry.npmmirror.com/mocha/-/mocha-10.2.0.tgz, + } + name: mocha + version: 10.2.0 + engines: { node: ">= 14.0.0" } + hasBin: true + dependencies: + ansi-colors: registry.npmmirror.com/ansi-colors@4.1.1 + browser-stdout: registry.npmmirror.com/browser-stdout@1.3.1 + chokidar: registry.npmmirror.com/chokidar@3.5.3 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + diff: registry.npmmirror.com/diff@5.0.0 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 + find-up: registry.npmmirror.com/find-up@5.0.0 + glob: registry.npmmirror.com/glob@7.2.0 + he: registry.npmmirror.com/he@1.2.0 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + log-symbols: registry.npmmirror.com/log-symbols@4.1.0 + minimatch: registry.npmmirror.com/minimatch@5.0.1 + ms: registry.npmmirror.com/ms@2.1.3 + nanoid: registry.npmmirror.com/nanoid@3.3.3 + serialize-javascript: registry.npmmirror.com/serialize-javascript@6.0.0 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 + supports-color: registry.npmmirror.com/supports-color@8.1.1 + workerpool: registry.npmmirror.com/workerpool@6.2.1 + yargs: registry.npmmirror.com/yargs@16.2.0 + yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 + yargs-unparser: registry.npmmirror.com/yargs-unparser@2.0.0 + dev: true + + registry.npmmirror.com/moment@2.29.4: + resolution: + { + integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==, + tarball: https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz, + } + name: moment + version: 2.29.4 + dev: true + + registry.npmmirror.com/moment@2.30.1: + resolution: + { + integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==, + tarball: https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz, + } + name: moment + version: 2.30.1 + dev: true + + registry.npmmirror.com/ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + tarball: https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz, + } + name: ms + version: 2.1.2 + dev: true + + registry.npmmirror.com/ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + tarball: https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz, + } + name: ms + version: 2.1.3 + dev: true + + registry.npmmirror.com/mute-stream@1.0.0: + resolution: + { + integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, + tarball: https://registry.npmmirror.com/mute-stream/-/mute-stream-1.0.0.tgz, + } + name: mute-stream + version: 1.0.0 + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + + registry.npmmirror.com/n12@0.4.0: + resolution: + { + integrity: sha512-p/hj4zQ8d3pbbFLQuN1K9honUxiDDhueOWyFLw/XgBv+wZCE44bcLH4CIcsolOceJQduh4Jf7m/LfaTxyGmGtQ==, + tarball: https://registry.npmmirror.com/n12/-/n12-0.4.0.tgz, + } + name: n12 + version: 0.4.0 + dev: true + + registry.npmmirror.com/nanoid@3.3.3: + resolution: + { + integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==, + tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.3.tgz, + } + name: nanoid + version: 3.3.3 + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + dev: true + + registry.npmmirror.com/natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + tarball: https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz, + } + name: natural-compare + version: 1.4.0 + dev: true + + registry.npmmirror.com/netmask@2.0.2: + resolution: + { + integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==, + tarball: https://registry.npmmirror.com/netmask/-/netmask-2.0.2.tgz, + } + name: netmask + version: 2.0.2 + engines: { node: ">= 0.4.0" } + dev: true + + registry.npmmirror.com/node-domexception@1.0.0: + resolution: + { + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + tarball: https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz, + } + name: node-domexception + version: 1.0.0 + engines: { node: ">=10.5.0" } + dev: true + + registry.npmmirror.com/node-fetch@2.7.0: + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz, + } + name: node-fetch + version: 2.7.0 + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: registry.npmmirror.com/whatwg-url@5.0.0 + dev: true + + registry.npmmirror.com/node-fetch@3.3.2: + resolution: + { + integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, + tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-3.3.2.tgz, + } + name: node-fetch + version: 3.3.2 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + data-uri-to-buffer: registry.npmmirror.com/data-uri-to-buffer@4.0.1 + fetch-blob: registry.npmmirror.com/fetch-blob@3.2.0 + formdata-polyfill: registry.npmmirror.com/formdata-polyfill@4.0.10 + dev: true + + registry.npmmirror.com/node-int64@0.4.0: + resolution: + { + integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, + tarball: https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz, + } + name: node-int64 + version: 0.4.0 + dev: true + + registry.npmmirror.com/node-releases@2.0.14: + resolution: + { + integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, + tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz, + } + name: node-releases + version: 2.0.14 + dev: true + + registry.npmmirror.com/normalize-package-data@6.0.0: + resolution: + { + integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==, + tarball: https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz, + } + name: normalize-package-data + version: 6.0.0 + engines: { node: ^16.14.0 || >=18.0.0 } + dependencies: + hosted-git-info: registry.npmmirror.com/hosted-git-info@7.0.1 + is-core-module: registry.npmmirror.com/is-core-module@2.13.1 + semver: registry.npmmirror.com/semver@7.5.4 + validate-npm-package-license: registry.npmmirror.com/validate-npm-package-license@3.0.4 + dev: true + + registry.npmmirror.com/normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + tarball: https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz, + } + name: normalize-path + version: 3.0.0 + engines: { node: ">=0.10.0" } + dev: true + + registry.npmmirror.com/normalize-url@8.0.0: + resolution: + { + integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==, + tarball: https://registry.npmmirror.com/normalize-url/-/normalize-url-8.0.0.tgz, + } + name: normalize-url + version: 8.0.0 + engines: { node: ">=14.16" } + dev: true + + registry.npmmirror.com/npm-run-path@4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz, + } + name: npm-run-path + version: 4.0.1 + engines: { node: ">=8" } + dependencies: + path-key: registry.npmmirror.com/path-key@3.1.1 + dev: true + + registry.npmmirror.com/npm-run-path@5.1.0: + resolution: + { + integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==, + tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz, + } + name: npm-run-path + version: 5.1.0 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + path-key: registry.npmmirror.com/path-key@4.0.0 + dev: true + + registry.npmmirror.com/nwsapi@2.2.4: + resolution: + { + integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==, + tarball: https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.4.tgz, + } + name: nwsapi + version: 2.2.4 + dev: true + + registry.npmmirror.com/object-inspect@1.13.1: + resolution: + { + integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, + tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz, + } + name: object-inspect + version: 1.13.1 + dev: true + + registry.npmmirror.com/object-is@1.1.5: + resolution: + { + integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, + tarball: https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz, + } + name: object-is + version: 1.1.5 + engines: { node: ">= 0.4" } + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + define-properties: registry.npmmirror.com/define-properties@1.2.1 + dev: true + + registry.npmmirror.com/object-keys@1.1.1: + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + tarball: https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz, + } + name: object-keys + version: 1.1.1 + engines: { node: ">= 0.4" } + dev: true + + registry.npmmirror.com/object.assign@4.1.5: + resolution: + { + integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, + tarball: https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz, + } + name: object.assign + version: 4.1.5 + engines: { node: ">= 0.4" } + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + define-properties: registry.npmmirror.com/define-properties@1.2.1 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + object-keys: registry.npmmirror.com/object-keys@1.1.1 + dev: true + + registry.npmmirror.com/obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0): + resolution: + { + integrity: sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==, + tarball: https://registry.npmmirror.com/obsidian/-/obsidian-1.4.11.tgz, + } + id: registry.npmmirror.com/obsidian/1.4.11 + name: obsidian + version: 1.4.11 + peerDependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + dependencies: + "@codemirror/state": registry.npmmirror.com/@codemirror/state@6.3.1 + "@codemirror/view": registry.npmmirror.com/@codemirror/view@6.22.0 + "@types/codemirror": registry.npmmirror.com/@types/codemirror@5.60.8 + moment: registry.npmmirror.com/moment@2.29.4 + dev: true + + registry.npmmirror.com/once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + tarball: https://registry.npmmirror.com/once/-/once-1.4.0.tgz, + } + name: once + version: 1.4.0 + dependencies: + wrappy: registry.npmmirror.com/wrappy@1.0.2 + dev: true + + registry.npmmirror.com/onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + tarball: https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz, + } + name: onetime + version: 5.1.2 + engines: { node: ">=6" } + dependencies: + mimic-fn: registry.npmmirror.com/mimic-fn@2.1.0 + dev: true + + registry.npmmirror.com/onetime@6.0.0: + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + tarball: https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz, + } + name: onetime + version: 6.0.0 + engines: { node: ">=12" } + dependencies: + mimic-fn: registry.npmmirror.com/mimic-fn@4.0.0 + dev: true + + registry.npmmirror.com/optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + tarball: https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz, + } + name: optionator + version: 0.9.3 + engines: { node: ">= 0.8.0" } + dependencies: + "@aashutoshrathi/word-wrap": registry.npmmirror.com/@aashutoshrathi/word-wrap@1.2.6 + deep-is: registry.npmmirror.com/deep-is@0.1.4 + fast-levenshtein: registry.npmmirror.com/fast-levenshtein@2.0.6 + levn: registry.npmmirror.com/levn@0.4.1 + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 + type-check: registry.npmmirror.com/type-check@0.4.0 + dev: true + + registry.npmmirror.com/ora@5.4.1: + resolution: + { + integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, + tarball: https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz, + } + name: ora + version: 5.4.1 + engines: { node: ">=10" } + dependencies: + bl: registry.npmmirror.com/bl@4.1.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + cli-cursor: registry.npmmirror.com/cli-cursor@3.1.0 + cli-spinners: registry.npmmirror.com/cli-spinners@2.9.1 + is-interactive: registry.npmmirror.com/is-interactive@1.0.0 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported@0.1.0 + log-symbols: registry.npmmirror.com/log-symbols@4.1.0 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wcwidth: registry.npmmirror.com/wcwidth@1.0.1 + dev: true + + registry.npmmirror.com/os-tmpdir@1.0.2: + resolution: + { + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + tarball: https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz, + } + name: os-tmpdir + version: 1.0.2 + engines: { node: ">=0.10.0" } + dev: true + + registry.npmmirror.com/p-cancelable@3.0.0: + resolution: + { + integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==, + tarball: https://registry.npmmirror.com/p-cancelable/-/p-cancelable-3.0.0.tgz, + } + name: p-cancelable + version: 3.0.0 + engines: { node: ">=12.20" } + dev: true + + registry.npmmirror.com/p-limit@2.3.0: + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + tarball: https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz, + } + name: p-limit + version: 2.3.0 + engines: { node: ">=6" } + dependencies: + p-try: registry.npmmirror.com/p-try@2.2.0 + dev: true + + registry.npmmirror.com/p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + tarball: https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz, + } + name: p-limit + version: 3.1.0 + engines: { node: ">=10" } + dependencies: + yocto-queue: registry.npmmirror.com/yocto-queue@0.1.0 + dev: true + + registry.npmmirror.com/p-limit@4.0.0: + resolution: + { + integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, + tarball: https://registry.npmmirror.com/p-limit/-/p-limit-4.0.0.tgz, + } + name: p-limit + version: 4.0.0 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + yocto-queue: registry.npmmirror.com/yocto-queue@1.0.0 + dev: true + + registry.npmmirror.com/p-locate@4.1.0: + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + tarball: https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz, + } + name: p-locate + version: 4.1.0 + engines: { node: ">=8" } + dependencies: + p-limit: registry.npmmirror.com/p-limit@2.3.0 + dev: true + + registry.npmmirror.com/p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + tarball: https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz, + } + name: p-locate + version: 5.0.0 + engines: { node: ">=10" } + dependencies: + p-limit: registry.npmmirror.com/p-limit@3.1.0 + dev: true + + registry.npmmirror.com/p-locate@6.0.0: + resolution: + { + integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, + tarball: https://registry.npmmirror.com/p-locate/-/p-locate-6.0.0.tgz, + } + name: p-locate + version: 6.0.0 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + p-limit: registry.npmmirror.com/p-limit@4.0.0 + dev: true + + registry.npmmirror.com/p-try@2.2.0: + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + tarball: https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz, + } + name: p-try + version: 2.2.0 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/pac-proxy-agent@7.0.1: + resolution: + { + integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==, + tarball: https://registry.npmmirror.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz, + } + name: pac-proxy-agent + version: 7.0.1 + engines: { node: ">= 14" } + dependencies: + "@tootallnate/quickjs-emscripten": registry.npmmirror.com/@tootallnate/quickjs-emscripten@0.23.0 + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + get-uri: registry.npmmirror.com/get-uri@6.0.2 + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + pac-resolver: registry.npmmirror.com/pac-resolver@7.0.0 + socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/pac-resolver@7.0.0: + resolution: + { + integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==, + tarball: https://registry.npmmirror.com/pac-resolver/-/pac-resolver-7.0.0.tgz, + } + name: pac-resolver + version: 7.0.0 + engines: { node: ">= 14" } + dependencies: + degenerator: registry.npmmirror.com/degenerator@5.0.1 + ip: registry.npmmirror.com/ip@1.1.8 + netmask: registry.npmmirror.com/netmask@2.0.2 + dev: true + + registry.npmmirror.com/parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + tarball: https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz, + } + name: parent-module + version: 1.0.1 + engines: { node: ">=6" } + dependencies: + callsites: registry.npmmirror.com/callsites@3.1.0 + dev: true + + registry.npmmirror.com/parse-json@5.2.0: + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + tarball: https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz, + } + name: parse-json + version: 5.2.0 + engines: { node: ">=8" } + dependencies: + "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 + error-ex: registry.npmmirror.com/error-ex@1.3.2 + json-parse-even-better-errors: registry.npmmirror.com/json-parse-even-better-errors@2.3.1 + lines-and-columns: registry.npmmirror.com/lines-and-columns@1.2.4 + dev: true + + registry.npmmirror.com/parse-json@7.1.1: + resolution: + { + integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==, + tarball: https://registry.npmmirror.com/parse-json/-/parse-json-7.1.1.tgz, + } + name: parse-json + version: 7.1.1 + engines: { node: ">=16" } + dependencies: + "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 + error-ex: registry.npmmirror.com/error-ex@1.3.2 + json-parse-even-better-errors: registry.npmmirror.com/json-parse-even-better-errors@3.0.0 + lines-and-columns: registry.npmmirror.com/lines-and-columns@2.0.4 + type-fest: registry.npmmirror.com/type-fest@3.13.1 + dev: true + + registry.npmmirror.com/parse-ms@2.1.0: + resolution: + { + integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==, + tarball: https://registry.npmmirror.com/parse-ms/-/parse-ms-2.1.0.tgz, + } + name: parse-ms + version: 2.1.0 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/parse5@7.1.2: + resolution: + { + integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, + tarball: https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz, + } + name: parse5 + version: 7.1.2 + dependencies: + entities: registry.npmmirror.com/entities@4.5.0 + dev: true + + registry.npmmirror.com/path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + tarball: https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz, + } + name: path-exists + version: 4.0.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/path-exists@5.0.0: + resolution: + { + integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, + tarball: https://registry.npmmirror.com/path-exists/-/path-exists-5.0.0.tgz, + } + name: path-exists + version: 5.0.0 + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + registry.npmmirror.com/path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + tarball: https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz, + } + name: path-is-absolute + version: 1.0.1 + engines: { node: ">=0.10.0" } + dev: true + + registry.npmmirror.com/path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + tarball: https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz, + } + name: path-key + version: 3.1.1 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/path-key@4.0.0: + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + tarball: https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz, + } + name: path-key + version: 4.0.0 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + tarball: https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz, + } + name: path-parse + version: 1.0.7 + dev: true + + registry.npmmirror.com/path-scurry@1.10.1: + resolution: + { + integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, + tarball: https://registry.npmmirror.com/path-scurry/-/path-scurry-1.10.1.tgz, + } + name: path-scurry + version: 1.10.1 + engines: { node: ">=16 || 14 >=14.17" } + dependencies: + lru-cache: registry.npmmirror.com/lru-cache@10.0.2 + minipass: registry.npmmirror.com/minipass@7.0.4 + dev: true + + registry.npmmirror.com/path-type@4.0.0: + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + tarball: https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz, + } + name: path-type + version: 4.0.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/pathval@1.1.1: + resolution: + { + integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, + tarball: https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz, + } + name: pathval + version: 1.1.1 + dev: true + + registry.npmmirror.com/pend@1.2.0: + resolution: + { + integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==, + tarball: https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz, + } + name: pend + version: 1.2.0 + dev: true + + registry.npmmirror.com/picocolors@1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + tarball: https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz, + } + name: picocolors + version: 1.0.0 + dev: true + + registry.npmmirror.com/picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + tarball: https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz, + } + name: picomatch + version: 2.3.1 + engines: { node: ">=8.6" } + dev: true + + registry.npmmirror.com/pirates@4.0.5: + resolution: + { + integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==, + tarball: https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz, + } + name: pirates + version: 4.0.5 + engines: { node: ">= 6" } + dev: true + + registry.npmmirror.com/pkg-dir@4.2.0: + resolution: + { + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, + tarball: https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz, + } + name: pkg-dir + version: 4.2.0 + engines: { node: ">=8" } + dependencies: + find-up: registry.npmmirror.com/find-up@4.1.0 + dev: true + + registry.npmmirror.com/prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + tarball: https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz, + } + name: prelude-ls + version: 1.2.1 + engines: { node: ">= 0.8.0" } + dev: true + + registry.npmmirror.com/prettier@3.2.2: + resolution: + { + integrity: sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==, + tarball: https://registry.npmmirror.com/prettier/-/prettier-3.2.2.tgz, + } + name: prettier + version: 3.2.2 + engines: { node: ">=14" } + hasBin: true + dev: true + + registry.npmmirror.com/pretty-format@29.7.0: + resolution: + { + integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, + tarball: https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz, + } + name: pretty-format + version: 29.7.0 + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + dependencies: + "@jest/schemas": registry.npmmirror.com/@jest/schemas@29.6.3 + ansi-styles: registry.npmmirror.com/ansi-styles@5.2.0 + react-is: registry.npmmirror.com/react-is@18.2.0 + dev: true + + registry.npmmirror.com/pretty-ms@7.0.1: + resolution: + { + integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==, + tarball: https://registry.npmmirror.com/pretty-ms/-/pretty-ms-7.0.1.tgz, + } + name: pretty-ms + version: 7.0.1 + engines: { node: ">=10" } + dependencies: + parse-ms: registry.npmmirror.com/parse-ms@2.1.0 + dev: true + + registry.npmmirror.com/process-nextick-args@2.0.1: + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + tarball: https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz, + } + name: process-nextick-args + version: 2.0.1 + dev: true + + registry.npmmirror.com/progress@2.0.3: + resolution: + { + integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==, + tarball: https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz, + } + name: progress + version: 2.0.3 + engines: { node: ">=0.4.0" } + dev: true + + registry.npmmirror.com/prompts@2.4.2: + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + tarball: https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz, + } + name: prompts + version: 2.4.2 + engines: { node: ">= 6" } + dependencies: + kleur: registry.npmmirror.com/kleur@3.0.3 + sisteransi: registry.npmmirror.com/sisteransi@1.0.5 + dev: true + + registry.npmmirror.com/proxy-agent@6.3.0: + resolution: + { + integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==, + tarball: https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.3.0.tgz, + } + name: proxy-agent + version: 6.3.0 + engines: { node: ">= 14" } + dependencies: + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + lru-cache: registry.npmmirror.com/lru-cache@7.18.3 + pac-proxy-agent: registry.npmmirror.com/pac-proxy-agent@7.0.1 + proxy-from-env: registry.npmmirror.com/proxy-from-env@1.1.0 + socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/proxy-agent@6.3.1: + resolution: + { + integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==, + tarball: https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.3.1.tgz, + } + name: proxy-agent + version: 6.3.1 + engines: { node: ">= 14" } + dependencies: + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + lru-cache: registry.npmmirror.com/lru-cache@7.18.3 + pac-proxy-agent: registry.npmmirror.com/pac-proxy-agent@7.0.1 + proxy-from-env: registry.npmmirror.com/proxy-from-env@1.1.0 + socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/proxy-from-env@1.1.0: + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + tarball: https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz, + } + name: proxy-from-env + version: 1.1.0 + dev: true + + registry.npmmirror.com/psl@1.9.0: + resolution: + { + integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, + tarball: https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz, + } + name: psl + version: 1.9.0 + dev: true + + registry.npmmirror.com/pump@3.0.0: + resolution: + { + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, + tarball: https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz, + } + name: pump + version: 3.0.0 + dependencies: + end-of-stream: registry.npmmirror.com/end-of-stream@1.4.4 + once: registry.npmmirror.com/once@1.4.0 + dev: true + + registry.npmmirror.com/punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + tarball: https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz, + } + name: punycode + version: 2.3.1 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/puppeteer-core@20.9.0(typescript@5.1.6): + resolution: + { + integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==, + tarball: https://registry.npmmirror.com/puppeteer-core/-/puppeteer-core-20.9.0.tgz, + } + id: registry.npmmirror.com/puppeteer-core/20.9.0 + name: puppeteer-core + version: 20.9.0 + engines: { node: ">=16.3.0" } + peerDependencies: + typescript: ">= 4.7.4" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@puppeteer/browsers": registry.npmmirror.com/@puppeteer/browsers@1.4.6(typescript@5.1.6) + chromium-bidi: registry.npmmirror.com/chromium-bidi@0.4.16(devtools-protocol@0.0.1147663) + cross-fetch: registry.npmmirror.com/cross-fetch@4.0.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1147663 + typescript: 5.1.6 + ws: registry.npmmirror.com/ws@8.13.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/pure-rand@6.0.4: + resolution: + { + integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==, + tarball: https://registry.npmmirror.com/pure-rand/-/pure-rand-6.0.4.tgz, + } + name: pure-rand + version: 6.0.4 + dev: true + + registry.npmmirror.com/query-selector-shadow-dom@1.0.1: + resolution: + { + integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==, + tarball: https://registry.npmmirror.com/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz, + } + name: query-selector-shadow-dom + version: 1.0.1 + dev: true + + registry.npmmirror.com/querystringify@2.2.0: + resolution: + { + integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, + tarball: https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz, + } + name: querystringify + version: 2.2.0 + dev: true + + registry.npmmirror.com/queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + tarball: https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz, + } + name: queue-microtask + version: 1.2.3 + dev: true + + registry.npmmirror.com/queue-tick@1.0.1: + resolution: + { + integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==, + tarball: https://registry.npmmirror.com/queue-tick/-/queue-tick-1.0.1.tgz, + } + name: queue-tick + version: 1.0.1 + dev: true + + registry.npmmirror.com/quick-lru@5.1.1: + resolution: + { + integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, + tarball: https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz, + } + name: quick-lru + version: 5.1.1 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/randombytes@2.1.0: + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + tarball: https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz, + } + name: randombytes + version: 2.1.0 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/react-is@18.2.0: + resolution: + { + integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, + tarball: https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz, + } + name: react-is + version: 18.2.0 + dev: true + + registry.npmmirror.com/read-pkg-up@10.1.0: + resolution: + { + integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==, + tarball: https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-10.1.0.tgz, + } + name: read-pkg-up + version: 10.1.0 + engines: { node: ">=16" } + dependencies: + find-up: registry.npmmirror.com/find-up@6.3.0 + read-pkg: registry.npmmirror.com/read-pkg@8.1.0 + type-fest: registry.npmmirror.com/type-fest@4.7.1 + dev: true + + registry.npmmirror.com/read-pkg@8.1.0: + resolution: + { + integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==, + tarball: https://registry.npmmirror.com/read-pkg/-/read-pkg-8.1.0.tgz, + } + name: read-pkg + version: 8.1.0 + engines: { node: ">=16" } + dependencies: + "@types/normalize-package-data": registry.npmmirror.com/@types/normalize-package-data@2.4.4 + normalize-package-data: registry.npmmirror.com/normalize-package-data@6.0.0 + parse-json: registry.npmmirror.com/parse-json@7.1.1 + type-fest: registry.npmmirror.com/type-fest@4.7.1 + dev: true + + registry.npmmirror.com/readable-stream@2.3.8: + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz, + } + name: readable-stream + version: 2.3.8 + dependencies: + core-util-is: registry.npmmirror.com/core-util-is@1.0.3 + inherits: registry.npmmirror.com/inherits@2.0.4 + isarray: registry.npmmirror.com/isarray@1.0.0 + process-nextick-args: registry.npmmirror.com/process-nextick-args@2.0.1 + safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 + string_decoder: registry.npmmirror.com/string_decoder@1.1.1 + util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 + dev: true + + registry.npmmirror.com/readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz, + } + name: readable-stream + version: 3.6.2 + engines: { node: ">= 6" } + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + string_decoder: registry.npmmirror.com/string_decoder@1.3.0 + util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 + dev: true + + registry.npmmirror.com/readdir-glob@1.1.3: + resolution: + { + integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==, + tarball: https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz, + } + name: readdir-glob + version: 1.1.3 + dependencies: + minimatch: registry.npmmirror.com/minimatch@5.1.6 + dev: true + + registry.npmmirror.com/readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + tarball: https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz, + } + name: readdirp + version: 3.6.0 + engines: { node: ">=8.10.0" } + dependencies: + picomatch: registry.npmmirror.com/picomatch@2.3.1 + dev: true + + registry.npmmirror.com/recursive-readdir@2.2.3: + resolution: + { + integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==, + tarball: https://registry.npmmirror.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz, + } + name: recursive-readdir + version: 2.2.3 + engines: { node: ">=6.0.0" } + dependencies: + minimatch: registry.npmmirror.com/minimatch@3.1.2 + dev: true + + registry.npmmirror.com/regexp.prototype.flags@1.5.0: + resolution: + { + integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==, + tarball: https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz, + } + name: regexp.prototype.flags + version: 1.5.0 + engines: { node: ">= 0.4" } + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + define-properties: registry.npmmirror.com/define-properties@1.2.1 + functions-have-names: registry.npmmirror.com/functions-have-names@1.2.3 + dev: true + + registry.npmmirror.com/require-directory@2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + tarball: https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz, + } + name: require-directory + version: 2.1.1 + engines: { node: ">=0.10.0" } + dev: true + + registry.npmmirror.com/requires-port@1.0.0: + resolution: + { + integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, + tarball: https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz, + } + name: requires-port + version: 1.0.0 + dev: true + + registry.npmmirror.com/resolve-alpn@1.2.1: + resolution: + { + integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, + tarball: https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz, + } + name: resolve-alpn + version: 1.2.1 + dev: true + + registry.npmmirror.com/resolve-cwd@3.0.0: + resolution: + { + integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, + tarball: https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz, + } + name: resolve-cwd + version: 3.0.0 + engines: { node: ">=8" } + dependencies: + resolve-from: registry.npmmirror.com/resolve-from@5.0.0 + dev: true + + registry.npmmirror.com/resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz, + } + name: resolve-from + version: 4.0.0 + engines: { node: ">=4" } + dev: true + + registry.npmmirror.com/resolve-from@5.0.0: + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz, + } + name: resolve-from + version: 5.0.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/resolve.exports@2.0.2: + resolution: + { + integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==, + tarball: https://registry.npmmirror.com/resolve.exports/-/resolve.exports-2.0.2.tgz, + } + name: resolve.exports + version: 2.0.2 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/resolve@1.22.8: + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + tarball: https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz, + } + name: resolve + version: 1.22.8 + hasBin: true + dependencies: + is-core-module: registry.npmmirror.com/is-core-module@2.13.1 + path-parse: registry.npmmirror.com/path-parse@1.0.7 + supports-preserve-symlinks-flag: registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0 + dev: true + + registry.npmmirror.com/responselike@3.0.0: + resolution: + { + integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==, + tarball: https://registry.npmmirror.com/responselike/-/responselike-3.0.0.tgz, + } + name: responselike + version: 3.0.0 + engines: { node: ">=14.16" } + dependencies: + lowercase-keys: registry.npmmirror.com/lowercase-keys@3.0.0 + dev: true + + registry.npmmirror.com/resq@1.11.0: + resolution: + { + integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==, + tarball: https://registry.npmmirror.com/resq/-/resq-1.11.0.tgz, + } + name: resq + version: 1.11.0 + dependencies: + fast-deep-equal: registry.npmmirror.com/fast-deep-equal@2.0.1 + dev: true + + registry.npmmirror.com/restore-cursor@3.1.0: + resolution: + { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + tarball: https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz, + } + name: restore-cursor + version: 3.1.0 + engines: { node: ">=8" } + dependencies: + onetime: registry.npmmirror.com/onetime@5.1.2 + signal-exit: registry.npmmirror.com/signal-exit@3.0.7 + dev: true + + registry.npmmirror.com/reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + tarball: https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz, + } + name: reusify + version: 1.0.4 + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + dev: true + + registry.npmmirror.com/rgb2hex@0.2.5: + resolution: + { + integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==, + tarball: https://registry.npmmirror.com/rgb2hex/-/rgb2hex-0.2.5.tgz, + } + name: rgb2hex + version: 0.2.5 + dev: true + + registry.npmmirror.com/rimraf@2.7.1: + resolution: + { + integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, + tarball: https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz, + } + name: rimraf + version: 2.7.1 + hasBin: true + dependencies: + glob: registry.npmmirror.com/glob@7.2.3 + dev: true + + registry.npmmirror.com/rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + tarball: https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz, + } + name: rimraf + version: 3.0.2 + hasBin: true + dependencies: + glob: registry.npmmirror.com/glob@7.2.3 + dev: true + + registry.npmmirror.com/run-async@3.0.0: + resolution: + { + integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==, + tarball: https://registry.npmmirror.com/run-async/-/run-async-3.0.0.tgz, + } + name: run-async + version: 3.0.0 + engines: { node: ">=0.12.0" } + dev: true + + registry.npmmirror.com/run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + tarball: https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz, + } + name: run-parallel + version: 1.2.0 + dependencies: + queue-microtask: registry.npmmirror.com/queue-microtask@1.2.3 + dev: true + + registry.npmmirror.com/rxjs@7.8.1: + resolution: + { + integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, + tarball: https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz, + } + name: rxjs + version: 7.8.1 + dependencies: + tslib: registry.npmmirror.com/tslib@2.6.1 + dev: true + + registry.npmmirror.com/safaridriver@0.1.0: + resolution: + { + integrity: sha512-azzzIP3gR1TB9bVPv7QO4Zjw0rR1BWEU/s2aFdUMN48gxDjxEB13grAEuXDmkKPgE74cObymDxmAmZnL3clj4w==, + tarball: https://registry.npmmirror.com/safaridriver/-/safaridriver-0.1.0.tgz, + } + name: safaridriver + version: 0.1.0 + dev: true + + registry.npmmirror.com/safe-buffer@5.1.2: + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz, + } + name: safe-buffer + version: 5.1.2 + dev: true + + registry.npmmirror.com/safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz, + } + name: safe-buffer + version: 5.2.1 + dev: true + + registry.npmmirror.com/safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + tarball: https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz, + } + name: safer-buffer + version: 2.1.2 + dev: true + + registry.npmmirror.com/saxes@6.0.0: + resolution: + { + integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, + tarball: https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz, + } + name: saxes + version: 6.0.0 + engines: { node: ">=v12.22.7" } + dependencies: + xmlchars: registry.npmmirror.com/xmlchars@2.2.0 + dev: true + + registry.npmmirror.com/semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + tarball: https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz, + } + name: semver + version: 6.3.1 + hasBin: true + dev: true + + registry.npmmirror.com/semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + tarball: https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz, + } + name: semver + version: 7.5.4 + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: registry.npmmirror.com/lru-cache@6.0.0 + dev: true + + registry.npmmirror.com/serialize-error@11.0.3: + resolution: + { + integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==, + tarball: https://registry.npmmirror.com/serialize-error/-/serialize-error-11.0.3.tgz, + } + name: serialize-error + version: 11.0.3 + engines: { node: ">=14.16" } + dependencies: + type-fest: registry.npmmirror.com/type-fest@2.19.0 + dev: true + + registry.npmmirror.com/serialize-javascript@6.0.0: + resolution: + { + integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==, + tarball: https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz, + } + name: serialize-javascript + version: 6.0.0 + dependencies: + randombytes: registry.npmmirror.com/randombytes@2.1.0 + dev: true + + registry.npmmirror.com/set-function-length@1.1.1: + resolution: + { + integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==, + tarball: https://registry.npmmirror.com/set-function-length/-/set-function-length-1.1.1.tgz, + } + name: set-function-length + version: 1.1.1 + engines: { node: ">= 0.4" } + dependencies: + define-data-property: registry.npmmirror.com/define-data-property@1.1.1 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 + dev: true + + registry.npmmirror.com/setimmediate@1.0.5: + resolution: + { + integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, + tarball: https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz, + } + name: setimmediate + version: 1.0.5 + dev: true + + registry.npmmirror.com/shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + tarball: https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz, + } + name: shebang-command + version: 2.0.0 + engines: { node: ">=8" } + dependencies: + shebang-regex: registry.npmmirror.com/shebang-regex@3.0.0 + dev: true + + registry.npmmirror.com/shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + tarball: https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz, + } + name: shebang-regex + version: 3.0.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/side-channel@1.0.4: + resolution: + { + integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, + tarball: https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz, + } + name: side-channel + version: 1.0.4 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + object-inspect: registry.npmmirror.com/object-inspect@1.13.1 + dev: true + + registry.npmmirror.com/signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz, + } + name: signal-exit + version: 3.0.7 + dev: true + + registry.npmmirror.com/signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz, + } + name: signal-exit + version: 4.1.0 + engines: { node: ">=14" } + dev: true + + registry.npmmirror.com/sisteransi@1.0.5: + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + tarball: https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz, + } + name: sisteransi + version: 1.0.5 + dev: true + + registry.npmmirror.com/slash@3.0.0: + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + tarball: https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz, + } + name: slash + version: 3.0.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/smart-buffer@4.2.0: + resolution: + { + integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, + tarball: https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz, + } + name: smart-buffer + version: 4.2.0 + engines: { node: ">= 6.0.0", npm: ">= 3.0.0" } + dev: true + + registry.npmmirror.com/socks-proxy-agent@8.0.2: + resolution: + { + integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==, + tarball: https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz, + } + name: socks-proxy-agent + version: 8.0.2 + engines: { node: ">= 14" } + dependencies: + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + socks: registry.npmmirror.com/socks@2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/socks@2.7.1: + resolution: + { + integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==, + tarball: https://registry.npmmirror.com/socks/-/socks-2.7.1.tgz, + } + name: socks + version: 2.7.1 + engines: { node: ">= 10.13.0", npm: ">= 3.0.0" } + dependencies: + ip: registry.npmmirror.com/ip@2.0.0 + smart-buffer: registry.npmmirror.com/smart-buffer@4.2.0 + dev: true + + registry.npmmirror.com/source-map-support@0.5.13: + resolution: + { + integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, + tarball: https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz, + } + name: source-map-support + version: 0.5.13 + dependencies: + buffer-from: registry.npmmirror.com/buffer-from@1.1.2 + source-map: registry.npmmirror.com/source-map@0.6.1 + dev: true + + registry.npmmirror.com/source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + tarball: https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz, + } + name: source-map + version: 0.6.1 + engines: { node: ">=0.10.0" } + dev: true + + registry.npmmirror.com/spdx-correct@3.2.0: + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + tarball: https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz, + } + name: spdx-correct + version: 3.2.0 + dependencies: + spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 + spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.16 + dev: true + + registry.npmmirror.com/spdx-exceptions@2.3.0: + resolution: + { + integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, + tarball: https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz, + } + name: spdx-exceptions + version: 2.3.0 + dev: true + + registry.npmmirror.com/spdx-expression-parse@3.0.1: + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + tarball: https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz, + } + name: spdx-expression-parse + version: 3.0.1 + dependencies: + spdx-exceptions: registry.npmmirror.com/spdx-exceptions@2.3.0 + spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.16 + dev: true + + registry.npmmirror.com/spdx-license-ids@3.0.16: + resolution: + { + integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==, + tarball: https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz, + } + name: spdx-license-ids + version: 3.0.16 + dev: true + + registry.npmmirror.com/split2@4.2.0: + resolution: + { + integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, + tarball: https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz, + } + name: split2 + version: 4.2.0 + engines: { node: ">= 10.x" } + dev: true + + registry.npmmirror.com/sprintf-js@1.0.3: + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + tarball: https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz, + } + name: sprintf-js + version: 1.0.3 + dev: true + + registry.npmmirror.com/stack-utils@2.0.6: + resolution: + { + integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, + tarball: https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz, + } + name: stack-utils + version: 2.0.6 + engines: { node: ">=10" } + dependencies: + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@2.0.0 + dev: true + + registry.npmmirror.com/stop-iteration-iterator@1.0.0: + resolution: + { + integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==, + tarball: https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz, + } + name: stop-iteration-iterator + version: 1.0.0 + engines: { node: ">= 0.4" } + dependencies: + internal-slot: registry.npmmirror.com/internal-slot@1.0.5 + dev: true + + registry.npmmirror.com/stream-buffers@3.0.2: + resolution: + { + integrity: sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==, + tarball: https://registry.npmmirror.com/stream-buffers/-/stream-buffers-3.0.2.tgz, + } + name: stream-buffers + version: 3.0.2 + engines: { node: ">= 0.10.0" } + dev: true + + registry.npmmirror.com/streamx@2.15.4: + resolution: + { + integrity: sha512-uSXKl88bibiUCQ1eMpItRljCzDENcDx18rsfDmV79r0e/ThfrAwxG4Y2FarQZ2G4/21xcOKmFFd1Hue+ZIDwHw==, + tarball: https://registry.npmmirror.com/streamx/-/streamx-2.15.4.tgz, + } + name: streamx + version: 2.15.4 + dependencies: + fast-fifo: registry.npmmirror.com/fast-fifo@1.3.2 + queue-tick: registry.npmmirror.com/queue-tick@1.0.1 + dev: true + + registry.npmmirror.com/string-length@4.0.2: + resolution: + { + integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, + tarball: https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz, + } + name: string-length + version: 4.0.2 + engines: { node: ">=10" } + dependencies: + char-regex: registry.npmmirror.com/char-regex@1.0.2 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + dev: true + + registry.npmmirror.com/string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + tarball: https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz, + } + name: string-width + version: 4.2.3 + engines: { node: ">=8" } + dependencies: + emoji-regex: registry.npmmirror.com/emoji-regex@8.0.0 + is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point@3.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + dev: true + + registry.npmmirror.com/string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + tarball: https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz, + } + name: string-width + version: 5.1.2 + engines: { node: ">=12" } + dependencies: + eastasianwidth: registry.npmmirror.com/eastasianwidth@0.2.0 + emoji-regex: registry.npmmirror.com/emoji-regex@9.2.2 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 + dev: true + + registry.npmmirror.com/string_decoder@1.1.1: + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz, + } + name: string_decoder + version: 1.1.1 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 + dev: true + + registry.npmmirror.com/string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz, + } + name: string_decoder + version: 1.3.0 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz, + } + name: strip-ansi + version: 6.0.1 + engines: { node: ">=8" } + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 + dev: true + + registry.npmmirror.com/strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz, + } + name: strip-ansi + version: 7.1.0 + engines: { node: ">=12" } + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex@6.0.1 + dev: true + + registry.npmmirror.com/strip-bom@4.0.0: + resolution: + { + integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, + tarball: https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz, + } + name: strip-bom + version: 4.0.0 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/strip-final-newline@2.0.0: + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + tarball: https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz, + } + name: strip-final-newline + version: 2.0.0 + engines: { node: ">=6" } + dev: true + + registry.npmmirror.com/strip-final-newline@3.0.0: + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + tarball: https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz, + } + name: strip-final-newline + version: 3.0.0 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + tarball: https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz, + } + name: strip-json-comments + version: 3.1.1 + engines: { node: ">=8" } + dev: true + + registry.npmmirror.com/style-mod@4.1.0: + resolution: + { + integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==, + tarball: https://registry.npmmirror.com/style-mod/-/style-mod-4.1.0.tgz, + } + name: style-mod + version: 4.1.0 + dev: true + + registry.npmmirror.com/supports-color@5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + tarball: https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz, + } + name: supports-color + version: 5.5.0 + engines: { node: ">=4" } + dependencies: + has-flag: registry.npmmirror.com/has-flag@3.0.0 + dev: true + + registry.npmmirror.com/supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + tarball: https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz, + } + name: supports-color + version: 7.2.0 + engines: { node: ">=8" } + dependencies: + has-flag: registry.npmmirror.com/has-flag@4.0.0 + dev: true + + registry.npmmirror.com/supports-color@8.1.1: + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + tarball: https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz, + } + name: supports-color + version: 8.1.1 + engines: { node: ">=10" } + dependencies: + has-flag: registry.npmmirror.com/has-flag@4.0.0 + dev: true + + registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + tarball: https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz, + } + name: supports-preserve-symlinks-flag + version: 1.0.0 + engines: { node: ">= 0.4" } + dev: true + + registry.npmmirror.com/symbol-tree@3.2.4: + resolution: + { + integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, + tarball: https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz, + } + name: symbol-tree + version: 3.2.4 + dev: true + + registry.npmmirror.com/tar-fs@3.0.4: + resolution: + { + integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==, + tarball: https://registry.npmmirror.com/tar-fs/-/tar-fs-3.0.4.tgz, + } + name: tar-fs + version: 3.0.4 + dependencies: + mkdirp-classic: registry.npmmirror.com/mkdirp-classic@0.5.3 + pump: registry.npmmirror.com/pump@3.0.0 + tar-stream: registry.npmmirror.com/tar-stream@3.1.6 + dev: true + + registry.npmmirror.com/tar-stream@3.1.6: + resolution: + { + integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==, + tarball: https://registry.npmmirror.com/tar-stream/-/tar-stream-3.1.6.tgz, + } + name: tar-stream + version: 3.1.6 + dependencies: + b4a: registry.npmmirror.com/b4a@1.6.4 + fast-fifo: registry.npmmirror.com/fast-fifo@1.3.2 + streamx: registry.npmmirror.com/streamx@2.15.4 + dev: true + + registry.npmmirror.com/test-exclude@6.0.0: + resolution: + { + integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, + tarball: https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz, + } + name: test-exclude + version: 6.0.0 + engines: { node: ">=8" } + dependencies: + "@istanbuljs/schema": registry.npmmirror.com/@istanbuljs/schema@0.1.3 + glob: registry.npmmirror.com/glob@7.2.3 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + dev: true + + registry.npmmirror.com/text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + tarball: https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz, + } + name: text-table + version: 0.2.0 + dev: true + + registry.npmmirror.com/through@2.3.8: + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + tarball: https://registry.npmmirror.com/through/-/through-2.3.8.tgz, + } + name: through + version: 2.3.8 + dev: true + + registry.npmmirror.com/tmp@0.0.33: + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + tarball: https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz, + } + name: tmp + version: 0.0.33 + engines: { node: ">=0.6.0" } + dependencies: + os-tmpdir: registry.npmmirror.com/os-tmpdir@1.0.2 + dev: true + + registry.npmmirror.com/tmpl@1.0.5: + resolution: + { + integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, + tarball: https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz, + } + name: tmpl + version: 1.0.5 + dev: true + + registry.npmmirror.com/to-fast-properties@2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + tarball: https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz, + } + name: to-fast-properties + version: 2.0.0 + engines: { node: ">=4" } + dev: true + + registry.npmmirror.com/to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + tarball: https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz, + } + name: to-regex-range + version: 5.0.1 + engines: { node: ">=8.0" } + dependencies: + is-number: registry.npmmirror.com/is-number@7.0.0 + dev: true + + registry.npmmirror.com/tough-cookie@4.1.2: + resolution: + { + integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==, + tarball: https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.2.tgz, + } + name: tough-cookie + version: 4.1.2 + engines: { node: ">=6" } + dependencies: + psl: registry.npmmirror.com/psl@1.9.0 + punycode: registry.npmmirror.com/punycode@2.3.1 + universalify: registry.npmmirror.com/universalify@0.2.0 + url-parse: registry.npmmirror.com/url-parse@1.5.10 + dev: true + + registry.npmmirror.com/tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + tarball: https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz, + } + name: tr46 + version: 0.0.3 + dev: true + + registry.npmmirror.com/tr46@3.0.0: + resolution: + { + integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==, + tarball: https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz, + } + name: tr46 + version: 3.0.0 + engines: { node: ">=12" } + dependencies: + punycode: registry.npmmirror.com/punycode@2.3.1 + dev: true + + registry.npmmirror.com/traverse@0.3.9: + resolution: + { + integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==, + tarball: https://registry.npmmirror.com/traverse/-/traverse-0.3.9.tgz, + } + name: traverse + version: 0.3.9 + dev: true + + registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6): + resolution: + { + integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, + tarball: https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz, + } + id: registry.npmmirror.com/ts-api-utils/1.0.3 + name: ts-api-utils + version: 1.0.3 + engines: { node: ">=16.13.0" } + peerDependencies: + typescript: ">=4.2.0" + dependencies: + typescript: 5.1.6 + dev: true + + registry.npmmirror.com/tslib@2.6.1: + resolution: + { + integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==, + tarball: https://registry.npmmirror.com/tslib/-/tslib-2.6.1.tgz, + } + name: tslib + version: 2.6.1 + dev: true + + registry.npmmirror.com/type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + tarball: https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz, + } + name: type-check + version: 0.4.0 + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 + dev: true + + registry.npmmirror.com/type-detect@4.0.8: + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + tarball: https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz, + } + name: type-detect + version: 4.0.8 + engines: { node: ">=4" } + dev: true + + registry.npmmirror.com/type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz, + } + name: type-fest + version: 0.20.2 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/type-fest@0.21.3: + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz, + } + name: type-fest + version: 0.21.3 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/type-fest@2.13.0: + resolution: + { + integrity: sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==, + tarball: https://registry.npmmirror.com/type-fest/-/type-fest-2.13.0.tgz, + } + name: type-fest + version: 2.13.0 + engines: { node: ">=12.20" } + dev: true + + registry.npmmirror.com/type-fest@2.19.0: + resolution: + { + integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, + tarball: https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz, + } + name: type-fest + version: 2.19.0 + engines: { node: ">=12.20" } + dev: true + + registry.npmmirror.com/type-fest@3.13.1: + resolution: + { + integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==, + tarball: https://registry.npmmirror.com/type-fest/-/type-fest-3.13.1.tgz, + } + name: type-fest + version: 3.13.1 + engines: { node: ">=14.16" } + dev: true + + registry.npmmirror.com/type-fest@4.7.1: + resolution: + { + integrity: sha512-iWr8RUmzAJRfhZugX9O7nZE6pCxDU8CZ3QxsLuTnGcBLJpCaP2ll3s4eMTBoFnU/CeXY/5rfQSuAEsTGJO4y8A==, + tarball: https://registry.npmmirror.com/type-fest/-/type-fest-4.7.1.tgz, + } + name: type-fest + version: 4.7.1 + engines: { node: ">=16" } + dev: true + + registry.npmmirror.com/uglify-js@3.17.4: + resolution: + { + integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, + tarball: https://registry.npmmirror.com/uglify-js/-/uglify-js-3.17.4.tgz, + } + name: uglify-js + version: 3.17.4 + engines: { node: ">=0.8.0" } + hasBin: true + requiresBuild: true + dev: true optional: true - dev: true - - registry.npmmirror.com/xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==, tarball: https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz} - name: xml-name-validator - version: 4.0.0 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, tarball: https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz} - name: xmlchars - version: 2.2.0 - dev: true - - registry.npmmirror.com/y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, tarball: https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz} - name: y18n - version: 5.0.8 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, tarball: https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz} - name: yallist - version: 3.1.1 - dev: true - - registry.npmmirror.com/yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, tarball: https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz} - name: yallist - version: 4.0.0 - dev: true - - registry.npmmirror.com/yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz} - name: yargs-parser - version: 20.2.4 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz} - name: yargs-parser - version: 21.1.1 - engines: {node: '>=12'} - dev: true - - registry.npmmirror.com/yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==, tarball: https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz} - name: yargs-unparser - version: 2.0.0 - engines: {node: '>=10'} - dependencies: - camelcase: registry.npmmirror.com/camelcase@6.3.0 - decamelize: registry.npmmirror.com/decamelize@4.0.0 - flat: registry.npmmirror.com/flat@5.0.2 - is-plain-obj: registry.npmmirror.com/is-plain-obj@2.1.0 - dev: true - - registry.npmmirror.com/yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, tarball: https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz} - name: yargs - version: 16.2.0 - engines: {node: '>=10'} - dependencies: - cliui: registry.npmmirror.com/cliui@7.0.4 - escalade: registry.npmmirror.com/escalade@3.1.1 - get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 - require-directory: registry.npmmirror.com/require-directory@2.1.1 - string-width: registry.npmmirror.com/string-width@4.2.3 - y18n: registry.npmmirror.com/y18n@5.0.8 - yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 - dev: true - - registry.npmmirror.com/yargs@17.7.1: - resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==, tarball: https://registry.npmmirror.com/yargs/-/yargs-17.7.1.tgz} - name: yargs - version: 17.7.1 - engines: {node: '>=12'} - dependencies: - cliui: registry.npmmirror.com/cliui@8.0.1 - escalade: registry.npmmirror.com/escalade@3.1.1 - get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 - require-directory: registry.npmmirror.com/require-directory@2.1.1 - string-width: registry.npmmirror.com/string-width@4.2.3 - y18n: registry.npmmirror.com/y18n@5.0.8 - yargs-parser: registry.npmmirror.com/yargs-parser@21.1.1 - dev: true - - registry.npmmirror.com/yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, tarball: https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz} - name: yargs - version: 17.7.2 - engines: {node: '>=12'} - dependencies: - cliui: registry.npmmirror.com/cliui@8.0.1 - escalade: registry.npmmirror.com/escalade@3.1.1 - get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 - require-directory: registry.npmmirror.com/require-directory@2.1.1 - string-width: registry.npmmirror.com/string-width@4.2.3 - y18n: registry.npmmirror.com/y18n@5.0.8 - yargs-parser: registry.npmmirror.com/yargs-parser@21.1.1 - dev: true - - registry.npmmirror.com/yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==, tarball: https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz} - name: yauzl - version: 2.10.0 - dependencies: - buffer-crc32: registry.npmmirror.com/buffer-crc32@0.2.13 - fd-slicer: registry.npmmirror.com/fd-slicer@1.1.0 - dev: true - - registry.npmmirror.com/yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz} - name: yocto-queue - version: 0.1.0 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.0.0.tgz} - name: yocto-queue - version: 1.0.0 - engines: {node: '>=12.20'} - dev: true - - registry.npmmirror.com/zip-stream@5.0.1: - resolution: {integrity: sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==, tarball: https://registry.npmmirror.com/zip-stream/-/zip-stream-5.0.1.tgz} - name: zip-stream - version: 5.0.1 - engines: {node: '>= 12.0.0'} - dependencies: - archiver-utils: registry.npmmirror.com/archiver-utils@4.0.1 - compress-commons: registry.npmmirror.com/compress-commons@5.0.1 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - dev: true + + registry.npmmirror.com/unbzip2-stream@1.4.3: + resolution: + { + integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==, + tarball: https://registry.npmmirror.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz, + } + name: unbzip2-stream + version: 1.4.3 + dependencies: + buffer: registry.npmmirror.com/buffer@5.7.1 + through: registry.npmmirror.com/through@2.3.8 + dev: true + + registry.npmmirror.com/undici-types@5.26.5: + resolution: + { + integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + tarball: https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz, + } + name: undici-types + version: 5.26.5 + dev: true + + registry.npmmirror.com/universalify@0.1.2: + resolution: + { + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, + tarball: https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz, + } + name: universalify + version: 0.1.2 + engines: { node: ">= 4.0.0" } + dev: true + + registry.npmmirror.com/universalify@0.2.0: + resolution: + { + integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, + tarball: https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz, + } + name: universalify + version: 0.2.0 + engines: { node: ">= 4.0.0" } + dev: true + + registry.npmmirror.com/unzipper@0.10.14: + resolution: + { + integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==, + tarball: https://registry.npmmirror.com/unzipper/-/unzipper-0.10.14.tgz, + } + name: unzipper + version: 0.10.14 + dependencies: + big-integer: registry.npmmirror.com/big-integer@1.6.51 + binary: registry.npmmirror.com/binary@0.3.0 + bluebird: registry.npmmirror.com/bluebird@3.4.7 + buffer-indexof-polyfill: registry.npmmirror.com/buffer-indexof-polyfill@1.0.2 + duplexer2: registry.npmmirror.com/duplexer2@0.1.4 + fstream: registry.npmmirror.com/fstream@1.0.12 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + listenercount: registry.npmmirror.com/listenercount@1.0.1 + readable-stream: registry.npmmirror.com/readable-stream@2.3.8 + setimmediate: registry.npmmirror.com/setimmediate@1.0.5 + dev: true + + registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: + { + integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, + tarball: https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz, + } + id: registry.npmmirror.com/update-browserslist-db/1.0.13 + name: update-browserslist-db + version: 1.0.13 + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + dependencies: + browserslist: registry.npmmirror.com/browserslist@4.22.1 + escalade: registry.npmmirror.com/escalade@3.1.1 + picocolors: registry.npmmirror.com/picocolors@1.0.0 + dev: true + + registry.npmmirror.com/uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + tarball: https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz, + } + name: uri-js + version: 4.4.1 + dependencies: + punycode: registry.npmmirror.com/punycode@2.3.1 + dev: true + + registry.npmmirror.com/url-parse@1.5.10: + resolution: + { + integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, + tarball: https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz, + } + name: url-parse + version: 1.5.10 + dependencies: + querystringify: registry.npmmirror.com/querystringify@2.2.0 + requires-port: registry.npmmirror.com/requires-port@1.0.0 + dev: true + + registry.npmmirror.com/userhome@1.0.0: + resolution: + { + integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==, + tarball: https://registry.npmmirror.com/userhome/-/userhome-1.0.0.tgz, + } + name: userhome + version: 1.0.0 + engines: { node: ">= 0.8.0" } + dev: true + + registry.npmmirror.com/util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + tarball: https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz, + } + name: util-deprecate + version: 1.0.2 + dev: true + + registry.npmmirror.com/v8-to-istanbul@9.1.3: + resolution: + { + integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==, + tarball: https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz, + } + name: v8-to-istanbul + version: 9.1.3 + engines: { node: ">=10.12.0" } + dependencies: + "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + "@types/istanbul-lib-coverage": registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 + dev: true + + registry.npmmirror.com/validate-npm-package-license@3.0.4: + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + tarball: https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz, + } + name: validate-npm-package-license + version: 3.0.4 + dependencies: + spdx-correct: registry.npmmirror.com/spdx-correct@3.2.0 + spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 + dev: true + + registry.npmmirror.com/w3c-keyname@2.2.6: + resolution: + { + integrity: sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==, + tarball: https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz, + } + name: w3c-keyname + version: 2.2.6 + dev: true + + registry.npmmirror.com/w3c-xmlserializer@4.0.0: + resolution: + { + integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==, + tarball: https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz, + } + name: w3c-xmlserializer + version: 4.0.0 + engines: { node: ">=14" } + dependencies: + xml-name-validator: registry.npmmirror.com/xml-name-validator@4.0.0 + dev: true + + registry.npmmirror.com/wait-port@1.1.0: + resolution: + { + integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==, + tarball: https://registry.npmmirror.com/wait-port/-/wait-port-1.1.0.tgz, + } + name: wait-port + version: 1.1.0 + engines: { node: ">=10" } + hasBin: true + dependencies: + chalk: registry.npmmirror.com/chalk@4.1.2 + commander: registry.npmmirror.com/commander@9.5.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/walker@1.0.8: + resolution: + { + integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, + tarball: https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz, + } + name: walker + version: 1.0.8 + dependencies: + makeerror: registry.npmmirror.com/makeerror@1.0.12 + dev: true + + registry.npmmirror.com/wcwidth@1.0.1: + resolution: + { + integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, + tarball: https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz, + } + name: wcwidth + version: 1.0.1 + dependencies: + defaults: registry.npmmirror.com/defaults@1.0.4 + dev: true + + registry.npmmirror.com/web-streams-polyfill@3.2.1: + resolution: + { + integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, + tarball: https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz, + } + name: web-streams-polyfill + version: 3.2.1 + engines: { node: ">= 8" } + dev: true + + registry.npmmirror.com/webdriver@8.27.2: + resolution: + { + integrity: sha512-vY2Lr0ZNr83n0v8PjLCXtJwR9E7QGycJVS+ev2G72gI54/rFwLv58HMSbJNn8CtE27VkhtewMUPlDpSkj5wGPQ==, + tarball: https://registry.npmmirror.com/webdriver/-/webdriver-8.27.2.tgz, + } + name: webdriver + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + "@types/ws": registry.npmmirror.com/@types/ws@8.5.9 + "@wdio/config": registry.npmmirror.com/@wdio/config@8.27.2 + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + "@wdio/protocols": registry.npmmirror.com/@wdio/protocols@8.24.12 + "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 + "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + got: registry.npmmirror.com/got@12.6.1 + ky: registry.npmmirror.com/ky@0.33.3 + ws: registry.npmmirror.com/ws@8.14.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6): + resolution: + { + integrity: sha512-X6PhKE8e8XsB33Q/KSS1zYKP2Rqkq2Nef0YKOhQO+5OTlTkeqMCjnEtyRcfmdtfAwT0DEFqMnGnUKEbTajFC4Q==, + tarball: https://registry.npmmirror.com/webdriverio/-/webdriverio-8.27.2.tgz, + } + id: registry.npmmirror.com/webdriverio/8.27.2 + name: webdriverio + version: 8.27.2 + engines: { node: ^16.13 || >=18 } + peerDependencies: + devtools: ^8.14.0 + peerDependenciesMeta: + devtools: + optional: true + dependencies: + "@types/node": registry.npmmirror.com/@types/node@20.11.0 + "@wdio/config": registry.npmmirror.com/@wdio/config@8.27.2 + "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 + "@wdio/protocols": registry.npmmirror.com/@wdio/protocols@8.24.12 + "@wdio/repl": registry.npmmirror.com/@wdio/repl@8.24.12 + "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 + "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 + archiver: registry.npmmirror.com/archiver@6.0.1 + aria-query: registry.npmmirror.com/aria-query@5.1.3 + css-shorthand-properties: registry.npmmirror.com/css-shorthand-properties@1.1.1 + css-value: registry.npmmirror.com/css-value@0.0.1 + devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1239539 + grapheme-splitter: registry.npmmirror.com/grapheme-splitter@1.0.4 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 + is-plain-obj: registry.npmmirror.com/is-plain-obj@4.1.0 + lodash.clonedeep: registry.npmmirror.com/lodash.clonedeep@4.5.0 + lodash.zip: registry.npmmirror.com/lodash.zip@4.2.0 + minimatch: registry.npmmirror.com/minimatch@9.0.3 + puppeteer-core: registry.npmmirror.com/puppeteer-core@20.9.0(typescript@5.1.6) + query-selector-shadow-dom: registry.npmmirror.com/query-selector-shadow-dom@1.0.1 + resq: registry.npmmirror.com/resq@1.11.0 + rgb2hex: registry.npmmirror.com/rgb2hex@0.2.5 + serialize-error: registry.npmmirror.com/serialize-error@11.0.3 + webdriver: registry.npmmirror.com/webdriver@8.27.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/webidl-conversions@3.0.1: + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz, + } + name: webidl-conversions + version: 3.0.1 + dev: true + + registry.npmmirror.com/webidl-conversions@7.0.0: + resolution: + { + integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, + tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz, + } + name: webidl-conversions + version: 7.0.0 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/whatwg-encoding@2.0.0: + resolution: + { + integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==, + tarball: https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz, + } + name: whatwg-encoding + version: 2.0.0 + engines: { node: ">=12" } + dependencies: + iconv-lite: registry.npmmirror.com/iconv-lite@0.6.3 + dev: true + + registry.npmmirror.com/whatwg-mimetype@3.0.0: + resolution: + { + integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, + tarball: https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz, + } + name: whatwg-mimetype + version: 3.0.0 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/whatwg-url@11.0.0: + resolution: + { + integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==, + tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz, + } + name: whatwg-url + version: 11.0.0 + engines: { node: ">=12" } + dependencies: + tr46: registry.npmmirror.com/tr46@3.0.0 + webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 + dev: true + + registry.npmmirror.com/whatwg-url@5.0.0: + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz, + } + name: whatwg-url + version: 5.0.0 + dependencies: + tr46: registry.npmmirror.com/tr46@0.0.3 + webidl-conversions: registry.npmmirror.com/webidl-conversions@3.0.1 + dev: true + + registry.npmmirror.com/which-boxed-primitive@1.0.2: + resolution: + { + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, + tarball: https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz, + } + name: which-boxed-primitive + version: 1.0.2 + dependencies: + is-bigint: registry.npmmirror.com/is-bigint@1.0.4 + is-boolean-object: registry.npmmirror.com/is-boolean-object@1.1.2 + is-number-object: registry.npmmirror.com/is-number-object@1.0.7 + is-string: registry.npmmirror.com/is-string@1.0.7 + is-symbol: registry.npmmirror.com/is-symbol@1.0.4 + dev: true + + registry.npmmirror.com/which-collection@1.0.1: + resolution: + { + integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==, + tarball: https://registry.npmmirror.com/which-collection/-/which-collection-1.0.1.tgz, + } + name: which-collection + version: 1.0.1 + dependencies: + is-map: registry.npmmirror.com/is-map@2.0.2 + is-set: registry.npmmirror.com/is-set@2.0.2 + is-weakmap: registry.npmmirror.com/is-weakmap@2.0.1 + is-weakset: registry.npmmirror.com/is-weakset@2.0.2 + dev: true + + registry.npmmirror.com/which-typed-array@1.1.13: + resolution: + { + integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==, + tarball: https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.13.tgz, + } + name: which-typed-array + version: 1.1.13 + engines: { node: ">= 0.4" } + dependencies: + available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 + call-bind: registry.npmmirror.com/call-bind@1.0.5 + for-each: registry.npmmirror.com/for-each@0.3.3 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + tarball: https://registry.npmmirror.com/which/-/which-2.0.2.tgz, + } + name: which + version: 2.0.2 + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: registry.npmmirror.com/isexe@2.0.0 + dev: true + + registry.npmmirror.com/which@4.0.0: + resolution: + { + integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, + tarball: https://registry.npmmirror.com/which/-/which-4.0.0.tgz, + } + name: which + version: 4.0.0 + engines: { node: ^16.13.0 || >=18.0.0 } + hasBin: true + dependencies: + isexe: registry.npmmirror.com/isexe@3.1.1 + dev: true + + registry.npmmirror.com/workerpool@6.2.1: + resolution: + { + integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==, + tarball: https://registry.npmmirror.com/workerpool/-/workerpool-6.2.1.tgz, + } + name: workerpool + version: 6.2.1 + dev: true + + registry.npmmirror.com/wrap-ansi@6.2.0: + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz, + } + name: wrap-ansi + version: 6.2.0 + engines: { node: ">=8" } + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + dev: true + + registry.npmmirror.com/wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz, + } + name: wrap-ansi + version: 7.0.0 + engines: { node: ">=10" } + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + dev: true + + registry.npmmirror.com/wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz, + } + name: wrap-ansi + version: 8.1.0 + engines: { node: ">=12" } + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@6.2.1 + string-width: registry.npmmirror.com/string-width@5.1.2 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 + dev: true + + registry.npmmirror.com/wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + tarball: https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz, + } + name: wrappy + version: 1.0.2 + dev: true + + registry.npmmirror.com/write-file-atomic@4.0.2: + resolution: + { + integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, + tarball: https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz, + } + name: write-file-atomic + version: 4.0.2 + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + dependencies: + imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 + signal-exit: registry.npmmirror.com/signal-exit@3.0.7 + dev: true + + registry.npmmirror.com/ws@8.13.0: + resolution: + { + integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==, + tarball: https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz, + } + name: ws + version: 8.13.0 + engines: { node: ">=10.0.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + registry.npmmirror.com/ws@8.14.2: + resolution: + { + integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, + tarball: https://registry.npmmirror.com/ws/-/ws-8.14.2.tgz, + } + name: ws + version: 8.14.2 + engines: { node: ">=10.0.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + registry.npmmirror.com/xml-name-validator@4.0.0: + resolution: + { + integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==, + tarball: https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz, + } + name: xml-name-validator + version: 4.0.0 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/xmlchars@2.2.0: + resolution: + { + integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, + tarball: https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz, + } + name: xmlchars + version: 2.2.0 + dev: true + + registry.npmmirror.com/y18n@5.0.8: + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + tarball: https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz, + } + name: y18n + version: 5.0.8 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/yallist@3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + tarball: https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz, + } + name: yallist + version: 3.1.1 + dev: true + + registry.npmmirror.com/yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + tarball: https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz, + } + name: yallist + version: 4.0.0 + dev: true + + registry.npmmirror.com/yargs-parser@20.2.4: + resolution: + { + integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, + tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz, + } + name: yargs-parser + version: 20.2.4 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz, + } + name: yargs-parser + version: 21.1.1 + engines: { node: ">=12" } + dev: true + + registry.npmmirror.com/yargs-unparser@2.0.0: + resolution: + { + integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==, + tarball: https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz, + } + name: yargs-unparser + version: 2.0.0 + engines: { node: ">=10" } + dependencies: + camelcase: registry.npmmirror.com/camelcase@6.3.0 + decamelize: registry.npmmirror.com/decamelize@4.0.0 + flat: registry.npmmirror.com/flat@5.0.2 + is-plain-obj: registry.npmmirror.com/is-plain-obj@2.1.0 + dev: true + + registry.npmmirror.com/yargs@16.2.0: + resolution: + { + integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, + tarball: https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz, + } + name: yargs + version: 16.2.0 + engines: { node: ">=10" } + dependencies: + cliui: registry.npmmirror.com/cliui@7.0.4 + escalade: registry.npmmirror.com/escalade@3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 + require-directory: registry.npmmirror.com/require-directory@2.1.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + y18n: registry.npmmirror.com/y18n@5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 + dev: true + + registry.npmmirror.com/yargs@17.7.1: + resolution: + { + integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==, + tarball: https://registry.npmmirror.com/yargs/-/yargs-17.7.1.tgz, + } + name: yargs + version: 17.7.1 + engines: { node: ">=12" } + dependencies: + cliui: registry.npmmirror.com/cliui@8.0.1 + escalade: registry.npmmirror.com/escalade@3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 + require-directory: registry.npmmirror.com/require-directory@2.1.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + y18n: registry.npmmirror.com/y18n@5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser@21.1.1 + dev: true + + registry.npmmirror.com/yargs@17.7.2: + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + tarball: https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz, + } + name: yargs + version: 17.7.2 + engines: { node: ">=12" } + dependencies: + cliui: registry.npmmirror.com/cliui@8.0.1 + escalade: registry.npmmirror.com/escalade@3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 + require-directory: registry.npmmirror.com/require-directory@2.1.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + y18n: registry.npmmirror.com/y18n@5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser@21.1.1 + dev: true + + registry.npmmirror.com/yauzl@2.10.0: + resolution: + { + integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==, + tarball: https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz, + } + name: yauzl + version: 2.10.0 + dependencies: + buffer-crc32: registry.npmmirror.com/buffer-crc32@0.2.13 + fd-slicer: registry.npmmirror.com/fd-slicer@1.1.0 + dev: true + + registry.npmmirror.com/yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz, + } + name: yocto-queue + version: 0.1.0 + engines: { node: ">=10" } + dev: true + + registry.npmmirror.com/yocto-queue@1.0.0: + resolution: + { + integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, + tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.0.0.tgz, + } + name: yocto-queue + version: 1.0.0 + engines: { node: ">=12.20" } + dev: true + + registry.npmmirror.com/zip-stream@5.0.1: + resolution: + { + integrity: sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==, + tarball: https://registry.npmmirror.com/zip-stream/-/zip-stream-5.0.1.tgz, + } + name: zip-stream + version: 5.0.1 + engines: { node: ">= 12.0.0" } + dependencies: + archiver-utils: registry.npmmirror.com/archiver-utils@4.0.1 + compress-commons: registry.npmmirror.com/compress-commons@5.0.1 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + dev: true diff --git a/src/algorithms/anki.ts b/src/algorithms/anki.ts index f044d74b..588530d0 100644 --- a/src/algorithms/anki.ts +++ b/src/algorithms/anki.ts @@ -160,8 +160,8 @@ export class AnkiAlgorithm extends SrsAlgorithm { lastitval > newdata.lastInterval ? lastitval : iter > 1 - ? this.settings.graduatingInterval - : newdata.lastInterval; + ? this.settings.graduatingInterval + : newdata.lastInterval; newdata.iteration = iter; item.data = deepcopy(newdata); } diff --git a/src/gui/reviewresponse-modal.tsx b/src/gui/reviewresponse-modal.tsx index f597f06a..c2548403 100644 --- a/src/gui/reviewresponse-modal.tsx +++ b/src/gui/reviewresponse-modal.tsx @@ -273,8 +273,8 @@ export class reviewResponseModal { this.responseInterval == null ? `${text}` : Platform.isMobile - ? textInterval(this.responseInterval[index], true) - : `${text} - ${textInterval(this.responseInterval[index], false)}`; + ? textInterval(this.responseInterval[index], true) + : `${text} - ${textInterval(this.responseInterval[index], false)}`; } return text; } From d73d9510f984239100166a6648d6a15e94dff073 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 14 Jan 2024 15:53:06 +0800 Subject: [PATCH 096/155] chore: bump version --- docs/changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.md b/docs/changelog.md index dad24e7b..de4b854a 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). -## [unrelease] +## [1.11.0.1] - fix #34, untrack error; - close #36, merge master branch; From 1b83954ed539d0ee4f5b15a879c5702df5a5b4a8 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 14 Jan 2024 17:09:41 +0800 Subject: [PATCH 097/155] update action update fsrs version --- .github/workflows/pr.yml | 5 +- package.json | 2 +- pnpm-lock.yaml | 19991 +++++++++++++++---------------------- 3 files changed, 8303 insertions(+), 11695 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 6a781c8c..975f7425 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -49,10 +49,11 @@ jobs: - name: Prettify code uses: creyD/prettier_action@v4.3 with: - prettier_version: 2.8.8 + prettier_version: ^3.1.1 # This part is also where you can pass other options, for example: # prettier_options: --write *.ts *.json src test --ignore-path package-lock.json - prettier_options: --write . --ignore-path package-lock.json + # --config .prettierrc.json --ignore-path package-lock.json pnpm-lock.yaml + prettier_options: --write . lint_and_test: needs: pretty diff --git a/package.json b/package.json index 1c93d9f6..bc97871f 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "devDependencies": { "@popperjs/core": "^2.11.8", "deepcopy": "^2.1.0", - "fsrs.js": "1.1.0", + "fsrs.js": "^1.2.1", "@types/jest": "^29.5.11", "@types/node": "^20.10.6", "@types/vhtml": "^2.2.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 058e4d1a..449d0d01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,11727 +1,8334 @@ -lockfileVersion: "6.0" +lockfileVersion: '6.0' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - chart.js: - specifier: ^4.4.1 - version: registry.npmmirror.com/chart.js@4.4.1 - pagerank.js: - specifier: ^1.0.2 - version: 1.0.2 + chart.js: + specifier: ^4.4.1 + version: registry.npmmirror.com/chart.js@4.4.1 + pagerank.js: + specifier: ^1.0.2 + version: 1.0.2 devDependencies: - "@popperjs/core": - specifier: ^2.11.8 - version: 2.11.8 - "@types/jest": - specifier: ^29.5.11 - version: registry.npmmirror.com/@types/jest@29.5.11 - "@types/node": - specifier: ^20.10.6 - version: registry.npmmirror.com/@types/node@20.11.0 - "@types/vhtml": - specifier: ^2.2.9 - version: registry.npmmirror.com/@types/vhtml@2.2.9 - "@typescript-eslint/eslint-plugin": - specifier: ^6.16.0 - version: registry.npmmirror.com/@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.1.6) - "@typescript-eslint/parser": - specifier: ^6.16.0 - version: registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6) - "@wdio/cli": - specifier: ^8.27.1 - version: registry.npmmirror.com/@wdio/cli@8.27.2(typescript@5.1.6) - "@wdio/local-runner": - specifier: ^8.27.0 - version: registry.npmmirror.com/@wdio/local-runner@8.27.2(typescript@5.1.6) - "@wdio/mocha-framework": - specifier: ^8.27.0 - version: registry.npmmirror.com/@wdio/mocha-framework@8.27.2 - "@wdio/spec-reporter": - specifier: ^8.27.0 - version: registry.npmmirror.com/@wdio/spec-reporter@8.27.2 - auto-changelog: - specifier: ^2.4.0 - version: 2.4.0 - builtin-modules: - specifier: ^3.3.0 - version: 3.3.0 - chai: - specifier: ^4.3.10 - version: registry.npmmirror.com/chai@4.3.10 - deepcopy: - specifier: ^2.1.0 - version: 2.1.0 - esbuild: - specifier: ~0.19.11 - version: registry.npmmirror.com/esbuild@0.19.11 - eslint: - specifier: ^8.56.0 - version: registry.npmmirror.com/eslint@8.56.0 - fsrs.js: - specifier: 1.1.0 - version: registry.npmmirror.com/fsrs.js@1.1.0 - jest: - specifier: ^29.7.0 - version: registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0) - jest-environment-jsdom: - specifier: ^29.7.0 - version: registry.npmmirror.com/jest-environment-jsdom@29.7.0 - jest-expect-message: - specifier: ^1.1.3 - version: 1.1.3 - moment: - specifier: ^2.30.1 - version: registry.npmmirror.com/moment@2.30.1 - obsidian: - specifier: ^1.4.11 - version: registry.npmmirror.com/obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0) - prettier: - specifier: ^3.1.1 - version: registry.npmmirror.com/prettier@3.2.2 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.23.3)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6) - tslib: - specifier: 2.6.1 - version: 2.6.1 - typescript: - specifier: 5.1.6 - version: 5.1.6 - vhtml: - specifier: ^2.2.0 - version: 2.2.0 - wdio-chromedriver-service: - specifier: ^8.1.1 - version: 8.1.1(webdriverio@8.27.2) + '@popperjs/core': + specifier: ^2.11.8 + version: 2.11.8 + '@types/jest': + specifier: ^29.5.11 + version: registry.npmmirror.com/@types/jest@29.5.11 + '@types/node': + specifier: ^20.10.6 + version: registry.npmmirror.com/@types/node@20.11.0 + '@types/vhtml': + specifier: ^2.2.9 + version: registry.npmmirror.com/@types/vhtml@2.2.9 + '@typescript-eslint/eslint-plugin': + specifier: ^6.16.0 + version: registry.npmmirror.com/@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.1.6) + '@typescript-eslint/parser': + specifier: ^6.16.0 + version: registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6) + '@wdio/cli': + specifier: ^8.27.1 + version: registry.npmmirror.com/@wdio/cli@8.27.2(typescript@5.1.6) + '@wdio/local-runner': + specifier: ^8.27.0 + version: registry.npmmirror.com/@wdio/local-runner@8.27.2(typescript@5.1.6) + '@wdio/mocha-framework': + specifier: ^8.27.0 + version: registry.npmmirror.com/@wdio/mocha-framework@8.27.2 + '@wdio/spec-reporter': + specifier: ^8.27.0 + version: registry.npmmirror.com/@wdio/spec-reporter@8.27.2 + auto-changelog: + specifier: ^2.4.0 + version: 2.4.0 + builtin-modules: + specifier: ^3.3.0 + version: 3.3.0 + chai: + specifier: ^4.3.10 + version: registry.npmmirror.com/chai@4.3.10 + deepcopy: + specifier: ^2.1.0 + version: 2.1.0 + esbuild: + specifier: ~0.19.11 + version: registry.npmmirror.com/esbuild@0.19.11 + eslint: + specifier: ^8.56.0 + version: registry.npmmirror.com/eslint@8.56.0 + fsrs.js: + specifier: ^1.2.1 + version: registry.npmmirror.com/fsrs.js@1.2.1 + jest: + specifier: ^29.7.0 + version: registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0) + jest-environment-jsdom: + specifier: ^29.7.0 + version: registry.npmmirror.com/jest-environment-jsdom@29.7.0 + jest-expect-message: + specifier: ^1.1.3 + version: 1.1.3 + moment: + specifier: ^2.30.1 + version: registry.npmmirror.com/moment@2.30.1 + obsidian: + specifier: ^1.4.11 + version: registry.npmmirror.com/obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0) + prettier: + specifier: ^3.1.1 + version: registry.npmmirror.com/prettier@3.2.2 + ts-jest: + specifier: ^29.1.1 + version: 29.1.1(@babel/core@7.23.3)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6) + tslib: + specifier: 2.6.1 + version: 2.6.1 + typescript: + specifier: 5.1.6 + version: 5.1.6 + vhtml: + specifier: ^2.2.0 + version: 2.2.0 + wdio-chromedriver-service: + specifier: ^8.1.1 + version: 8.1.1(webdriverio@8.27.2) packages: - /@jest/schemas@29.6.3: - resolution: - { - integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@sinclair/typebox": 0.27.8 - dev: true - - /@jest/types@29.6.3: - resolution: - { - integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/schemas": 29.6.3 - "@types/istanbul-lib-coverage": 2.0.6 - "@types/istanbul-reports": 3.0.4 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - "@types/yargs": 17.0.31 - chalk: registry.npmmirror.com/chalk@4.1.2 - dev: true - - /@popperjs/core@2.11.8: - resolution: - { - integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==, - } - dev: true - - /@sinclair/typebox@0.27.8: - resolution: - { - integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, - } - dev: true - - /@types/istanbul-lib-coverage@2.0.6: - resolution: - { - integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, - } - dev: true - - /@types/istanbul-lib-report@3.0.3: - resolution: - { - integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, - } - dependencies: - "@types/istanbul-lib-coverage": registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 - dev: true - - /@types/istanbul-reports@3.0.4: - resolution: - { - integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, - } - dependencies: - "@types/istanbul-lib-report": 3.0.3 - dev: true - - /@types/yargs-parser@21.0.3: - resolution: - { - integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, - } - dev: true - - /@types/yargs@17.0.31: - resolution: - { - integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==, - } - dependencies: - "@types/yargs-parser": 21.0.3 - dev: true - - /@wdio/logger@8.16.17: - resolution: - { - integrity: sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==, - } - engines: { node: ^16.13 || >=18 } - dependencies: - chalk: 5.2.0 - loglevel: 1.8.1 - loglevel-plugin-prefix: 0.8.4 - strip-ansi: 7.1.0 - dev: true - - /ansi-regex@6.0.1: - resolution: - { - integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, - } - engines: { node: ">=12" } - dev: true - - /ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } - dependencies: - color-convert: 2.0.1 - dev: true - - /auto-changelog@2.4.0: - resolution: - { - integrity: sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==, - } - engines: { node: ">=8.3" } - hasBin: true - dependencies: - commander: 7.2.0 - handlebars: 4.7.8 - node-fetch: 2.7.0 - parse-github-url: 1.0.2 - semver: 7.5.0 - transitivePeerDependencies: - - encoding - dev: true - - /bs-logger@0.2.6: - resolution: - { - integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, - } - engines: { node: ">= 6" } - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /builtin-modules@3.3.0: - resolution: - { - integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, - } - engines: { node: ">=6" } - dev: true - - /chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@5.2.0: - resolution: - { - integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: true - - /ci-info@3.9.0: - resolution: - { - integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, - } - engines: { node: ">=8" } - dev: true - - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - dev: true - - /commander@7.2.0: - resolution: - { - integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, - } - engines: { node: ">= 10" } - dev: true - - /debug@4.3.1: - resolution: - { - integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } - dev: true - - /deepcopy@2.1.0: - resolution: - { - integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==, - } - dependencies: - type-detect: 4.0.8 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - dev: true - - /fs-extra@11.1.1: - resolution: - { - integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==, - } - engines: { node: ">=14.14" } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - - /graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } - dev: true - - /handlebars@4.7.8: - resolution: - { - integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==, - } - engines: { node: ">=0.4.7" } - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: registry.npmmirror.com/uglify-js@3.17.4 - dev: true - - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } - dev: true - - /ip-regex@4.3.0: - resolution: - { - integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==, - } - engines: { node: ">=8" } - dev: true - - /is-url@1.2.4: - resolution: - { - integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==, - } - dev: true - - /is2@2.0.9: - resolution: - { - integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==, - } - engines: { node: ">=v0.10.0" } - dependencies: - deep-is: 0.1.4 - ip-regex: 4.3.0 - is-url: 1.2.4 - dev: true - - /jest-expect-message@1.1.3: - resolution: - { - integrity: sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==, - } - dev: true - - /jest-util@29.7.0: - resolution: - { - integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/types": 29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: ">=6" } - hasBin: true - dev: true - - /jsonfile@6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - dev: true - - /lodash.memoize@4.1.2: - resolution: - { - integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, - } - dev: true - - /loglevel-plugin-prefix@0.8.4: - resolution: - { - integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==, - } - dev: true - - /loglevel@1.8.1: - resolution: - { - integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==, - } - engines: { node: ">= 0.6.0" } - dev: true - - /lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } - dependencies: - yallist: 4.0.0 - dev: true - - /make-error@1.3.6: - resolution: - { - integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, - } - dev: true - - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - dev: true - - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - dev: true - - /neo-async@2.6.2: - resolution: - { - integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, - } - dev: true - - /node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - } - engines: { node: 4.x || >=6.0.0 } - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /pagerank.js@1.0.2: - resolution: - { - integrity: sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw==, - } - dev: false - - /parse-github-url@1.0.2: - resolution: - { - integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==, - } - engines: { node: ">=0.10.0" } - hasBin: true - dev: true - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - dev: true - - /semver@7.5.0: - resolution: - { - integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==, - } - engines: { node: ">=10" } - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - } - engines: { node: ">=10" } - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } - dev: true - - /split2@4.2.0: - resolution: - { - integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, - } - engines: { node: ">= 10.x" } - dev: true - - /strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: ">=12" } - dependencies: - ansi-regex: 6.0.1 - dev: true - - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } - dependencies: - has-flag: 4.0.0 - dev: true - - /tcp-port-used@1.0.2: - resolution: - { - integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==, - } - dependencies: - debug: 4.3.1 - is2: 2.0.9 - transitivePeerDependencies: - - supports-color - dev: true - - /tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - dev: true - - /ts-jest@29.1.1(@babel/core@7.23.3)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6): - resolution: - { - integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - "@babel/core": ">=7.0.0-beta.0 <8" - "@jest/types": ^29.0.0 - babel-jest: ^29.0.0 - esbuild: "*" - jest: ^29.0.0 - typescript: ">=4.3 <6" - peerDependenciesMeta: - "@babel/core": - optional: true - "@jest/types": - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - bs-logger: 0.2.6 - esbuild: registry.npmmirror.com/esbuild@0.19.11 - fast-json-stable-stringify: 2.1.0 - jest: registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.1.6 - yargs-parser: 21.1.1 - dev: true - - /tslib@2.6.1: - resolution: - { - integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==, - } - dev: true - - /type-detect@4.0.8: - resolution: - { - integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, - } - engines: { node: ">=4" } - dev: true - - /typescript@5.1.6: - resolution: - { - integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==, - } - engines: { node: ">=14.17" } - hasBin: true - dev: true - - /universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: ">= 10.0.0" } - dev: true - - /vhtml@2.2.0: - resolution: - { - integrity: sha512-TPXrXrxBOslRUVnlVkiAqhoXneiertIg86bdvzionrUYhEuiROvyPZNiiP6GIIJ2Q7oPNVyEtIx8gMAZZE9lCQ==, - } - dev: true - - /wdio-chromedriver-service@8.1.1(webdriverio@8.27.2): - resolution: - { - integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==, - } - engines: { node: ^16.13 || >=18 } - peerDependencies: - "@wdio/types": ^7.0.0 || ^8.0.0-alpha.219 - chromedriver: "*" - webdriverio: ^7.0.0 || ^8.0.0-alpha.219 - peerDependenciesMeta: - "@wdio/types": - optional: true - chromedriver: - optional: true - dependencies: - "@wdio/logger": 8.16.17 - fs-extra: 11.1.1 - split2: 4.2.0 - tcp-port-used: 1.0.2 - webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) - transitivePeerDependencies: - - supports-color - dev: true - - /webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } - dev: true - - /whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: true - - /wordwrap@1.0.0: - resolution: - { - integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, - } - dev: true - - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - dev: true - - /yargs-parser@21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, - } - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/@aashutoshrathi/word-wrap@1.2.6: - resolution: - { - integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, - tarball: https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz, - } - name: "@aashutoshrathi/word-wrap" - version: 1.2.6 - engines: { node: ">=0.10.0" } - dev: true - - registry.npmmirror.com/@ampproject/remapping@2.2.1: - resolution: - { - integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, - tarball: https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz, - } - name: "@ampproject/remapping" - version: 2.2.1 - engines: { node: ">=6.0.0" } - dependencies: - "@jridgewell/gen-mapping": registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 - "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - dev: true - - registry.npmmirror.com/@babel/code-frame@7.22.13: - resolution: - { - integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==, - tarball: https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz, - } - name: "@babel/code-frame" - version: 7.22.13 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/highlight": registry.npmmirror.com/@babel/highlight@7.22.20 - chalk: registry.npmmirror.com/chalk@2.4.2 - dev: true - - registry.npmmirror.com/@babel/compat-data@7.23.3: - resolution: - { - integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==, - tarball: https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.3.tgz, - } - name: "@babel/compat-data" - version: 7.23.3 - engines: { node: ">=6.9.0" } - dev: true - - registry.npmmirror.com/@babel/core@7.23.3: - resolution: - { - integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==, - tarball: https://registry.npmmirror.com/@babel/core/-/core-7.23.3.tgz, - } - name: "@babel/core" - version: 7.23.3 - engines: { node: ">=6.9.0" } - dependencies: - "@ampproject/remapping": registry.npmmirror.com/@ampproject/remapping@2.2.1 - "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 - "@babel/generator": registry.npmmirror.com/@babel/generator@7.23.3 - "@babel/helper-compilation-targets": registry.npmmirror.com/@babel/helper-compilation-targets@7.22.15 - "@babel/helper-module-transforms": registry.npmmirror.com/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3) - "@babel/helpers": registry.npmmirror.com/@babel/helpers@7.23.2 - "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 - "@babel/template": registry.npmmirror.com/@babel/template@7.22.15 - "@babel/traverse": registry.npmmirror.com/@babel/traverse@7.23.3 - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - gensync: registry.npmmirror.com/gensync@1.0.0-beta.2 - json5: registry.npmmirror.com/json5@2.2.3 - semver: registry.npmmirror.com/semver@6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/generator@7.23.3: - resolution: - { - integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==, - tarball: https://registry.npmmirror.com/@babel/generator/-/generator-7.23.3.tgz, - } - name: "@babel/generator" - version: 7.23.3 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - "@jridgewell/gen-mapping": registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 - "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - jsesc: registry.npmmirror.com/jsesc@2.5.2 - dev: true - - registry.npmmirror.com/@babel/helper-compilation-targets@7.22.15: - resolution: - { - integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==, - tarball: https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz, - } - name: "@babel/helper-compilation-targets" - version: 7.22.15 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/compat-data": registry.npmmirror.com/@babel/compat-data@7.23.3 - "@babel/helper-validator-option": registry.npmmirror.com/@babel/helper-validator-option@7.22.15 - browserslist: registry.npmmirror.com/browserslist@4.22.1 - lru-cache: registry.npmmirror.com/lru-cache@5.1.1 - semver: registry.npmmirror.com/semver@6.3.1 - dev: true - - registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20: - resolution: - { - integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, - tarball: https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz, - } - name: "@babel/helper-environment-visitor" - version: 7.22.20 - engines: { node: ">=6.9.0" } - dev: true - - registry.npmmirror.com/@babel/helper-function-name@7.23.0: - resolution: - { - integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, - tarball: https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz, - } - name: "@babel/helper-function-name" - version: 7.23.0 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/template": registry.npmmirror.com/@babel/template@7.22.15 - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/helper-hoist-variables@7.22.5: - resolution: - { - integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, - tarball: https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz, - } - name: "@babel/helper-hoist-variables" - version: 7.22.5 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/helper-module-imports@7.22.15: - resolution: - { - integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, - tarball: https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz, - } - name: "@babel/helper-module-imports" - version: 7.22.15 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): - resolution: - { - integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, - tarball: https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz, - } - id: registry.npmmirror.com/@babel/helper-module-transforms/7.23.3 - name: "@babel/helper-module-transforms" - version: 7.23.3 - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-environment-visitor": registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20 - "@babel/helper-module-imports": registry.npmmirror.com/@babel/helper-module-imports@7.22.15 - "@babel/helper-simple-access": registry.npmmirror.com/@babel/helper-simple-access@7.22.5 - "@babel/helper-split-export-declaration": registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6 - "@babel/helper-validator-identifier": registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 - dev: true - - registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5: - resolution: - { - integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, - tarball: https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz, - } - name: "@babel/helper-plugin-utils" - version: 7.22.5 - engines: { node: ">=6.9.0" } - dev: true - - registry.npmmirror.com/@babel/helper-simple-access@7.22.5: - resolution: - { - integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, - tarball: https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz, - } - name: "@babel/helper-simple-access" - version: 7.22.5 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6: - resolution: - { - integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, - tarball: https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz, - } - name: "@babel/helper-split-export-declaration" - version: 7.22.6 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/helper-string-parser@7.22.5: - resolution: - { - integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, - tarball: https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz, - } - name: "@babel/helper-string-parser" - version: 7.22.5 - engines: { node: ">=6.9.0" } - dev: true - - registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20: - resolution: - { - integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, - tarball: https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz, - } - name: "@babel/helper-validator-identifier" - version: 7.22.20 - engines: { node: ">=6.9.0" } - dev: true - - registry.npmmirror.com/@babel/helper-validator-option@7.22.15: - resolution: - { - integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==, - tarball: https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz, - } - name: "@babel/helper-validator-option" - version: 7.22.15 - engines: { node: ">=6.9.0" } - dev: true - - registry.npmmirror.com/@babel/helpers@7.23.2: - resolution: - { - integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==, - tarball: https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.2.tgz, - } - name: "@babel/helpers" - version: 7.23.2 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/template": registry.npmmirror.com/@babel/template@7.22.15 - "@babel/traverse": registry.npmmirror.com/@babel/traverse@7.23.3 - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/highlight@7.22.20: - resolution: - { - integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==, - tarball: https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.20.tgz, - } - name: "@babel/highlight" - version: 7.22.20 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/helper-validator-identifier": registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 - chalk: registry.npmmirror.com/chalk@2.4.2 - js-tokens: registry.npmmirror.com/js-tokens@4.0.0 - dev: true - - registry.npmmirror.com/@babel/parser@7.23.3: - resolution: - { - integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==, - tarball: https://registry.npmmirror.com/@babel/parser/-/parser-7.23.3.tgz, - } - name: "@babel/parser" - version: 7.23.3 - engines: { node: ">=6.0.0" } - hasBin: true - dependencies: - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3): - resolution: - { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-async-generators/7.8.4 - name: "@babel/plugin-syntax-async-generators" - version: 7.8.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3): - resolution: - { - integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-bigint/7.8.3 - name: "@babel/plugin-syntax-bigint" - version: 7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3): - resolution: - { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-class-properties/7.12.13 - name: "@babel/plugin-syntax-class-properties" - version: 7.12.13 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3): - resolution: - { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-import-meta/7.10.4 - name: "@babel/plugin-syntax-import-meta" - version: 7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3): - resolution: - { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-json-strings/7.8.3 - name: "@babel/plugin-syntax-json-strings" - version: 7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3): - resolution: - { - integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-jsx/7.23.3 - name: "@babel/plugin-syntax-jsx" - version: 7.23.3 - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3): - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/7.10.4 - name: "@babel/plugin-syntax-logical-assignment-operators" - version: 7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3): - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3 - name: "@babel/plugin-syntax-nullish-coalescing-operator" - version: 7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3): - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/7.10.4 - name: "@babel/plugin-syntax-numeric-separator" - version: 7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3): - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/7.8.3 - name: "@babel/plugin-syntax-object-rest-spread" - version: 7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3): - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/7.8.3 - name: "@babel/plugin-syntax-optional-catch-binding" - version: 7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3): - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/7.8.3 - name: "@babel/plugin-syntax-optional-chaining" - version: 7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3): - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-top-level-await/7.14.5 - name: "@babel/plugin-syntax-top-level-await" - version: 7.14.5 - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3): - resolution: - { - integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==, - tarball: https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz, - } - id: registry.npmmirror.com/@babel/plugin-syntax-typescript/7.23.3 - name: "@babel/plugin-syntax-typescript" - version: 7.23.3 - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - dev: true - - registry.npmmirror.com/@babel/template@7.22.15: - resolution: - { - integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, - tarball: https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz, - } - name: "@babel/template" - version: 7.22.15 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 - "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@babel/traverse@7.23.3: - resolution: - { - integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==, - tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.3.tgz, - } - name: "@babel/traverse" - version: 7.23.3 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 - "@babel/generator": registry.npmmirror.com/@babel/generator@7.23.3 - "@babel/helper-environment-visitor": registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20 - "@babel/helper-function-name": registry.npmmirror.com/@babel/helper-function-name@7.23.0 - "@babel/helper-hoist-variables": registry.npmmirror.com/@babel/helper-hoist-variables@7.22.5 - "@babel/helper-split-export-declaration": registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6 - "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - globals: registry.npmmirror.com/globals@11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/types@7.23.3: - resolution: - { - integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==, - tarball: https://registry.npmmirror.com/@babel/types/-/types-7.23.3.tgz, - } - name: "@babel/types" - version: 7.23.3 - engines: { node: ">=6.9.0" } - dependencies: - "@babel/helper-string-parser": registry.npmmirror.com/@babel/helper-string-parser@7.22.5 - "@babel/helper-validator-identifier": registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 - to-fast-properties: registry.npmmirror.com/to-fast-properties@2.0.0 - dev: true - - registry.npmmirror.com/@bcoe/v8-coverage@0.2.3: - resolution: - { - integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, - tarball: https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz, - } - name: "@bcoe/v8-coverage" - version: 0.2.3 - dev: true - - registry.npmmirror.com/@codemirror/state@6.3.1: - resolution: - { - integrity: sha512-88e4HhMtKJyw6fKprGaN/yZfiaoGYOi2nM45YCUC6R/kex9sxFWBDGatS1vk4lMgnWmdIIB9tk8Gj1LmL8YfvA==, - tarball: https://registry.npmmirror.com/@codemirror/state/-/state-6.3.1.tgz, - } - name: "@codemirror/state" - version: 6.3.1 - dev: true - - registry.npmmirror.com/@codemirror/view@6.22.0: - resolution: - { - integrity: sha512-6zLj4YIoIpfTGKrDMTbeZRpa8ih4EymMCKmddEDcJWrCdp/N1D46B38YEz4creTb4T177AVS9EyXkLeC/HL2jA==, - tarball: https://registry.npmmirror.com/@codemirror/view/-/view-6.22.0.tgz, - } - name: "@codemirror/view" - version: 6.22.0 - dependencies: - "@codemirror/state": registry.npmmirror.com/@codemirror/state@6.3.1 - style-mod: registry.npmmirror.com/style-mod@4.1.0 - w3c-keyname: registry.npmmirror.com/w3c-keyname@2.2.6 - dev: true - - registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11: - resolution: - { - integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==, - tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz, - } - name: "@esbuild/aix-ppc64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true - registry.npmmirror.com/@esbuild/android-arm64@0.19.11: - resolution: - { - integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==, - tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz, - } - name: "@esbuild/android-arm64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@types/yargs': 17.0.31 + chalk: registry.npmmirror.com/chalk@4.1.2 + dev: true + + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@17.0.31: + resolution: {integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@wdio/logger@8.16.17: + resolution: {integrity: sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==} + engines: {node: ^16.13 || >=18} + dependencies: + chalk: 5.2.0 + loglevel: 1.8.1 + loglevel-plugin-prefix: 0.8.4 + strip-ansi: 7.1.0 + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /auto-changelog@2.4.0: + resolution: {integrity: sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==} + engines: {node: '>=8.3'} + hasBin: true + dependencies: + commander: 7.2.0 + handlebars: 4.7.8 + node-fetch: 2.7.0 + parse-github-url: 1.0.2 + semver: 7.5.0 + transitivePeerDependencies: + - encoding + dev: true + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /debug@4.3.1: + resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: optional: true - - registry.npmmirror.com/@esbuild/android-arm@0.19.11: - resolution: - { - integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==, - tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz, - } - name: "@esbuild/android-arm" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepcopy@2.1.0: + resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: registry.npmmirror.com/uglify-js@3.17.4 + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /ip-regex@4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + dev: true + + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: true + + /is2@2.0.9: + resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} + engines: {node: '>=v0.10.0'} + dependencies: + deep-is: 0.1.4 + ip-regex: 4.3.0 + is-url: 1.2.4 + dev: true + + /jest-expect-message@1.1.3: + resolution: {integrity: sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==} + dev: true + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + dev: true + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + dev: true + + /loglevel@1.8.1: + resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} + engines: {node: '>= 0.6.0'} + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: optional: true - - registry.npmmirror.com/@esbuild/android-x64@0.19.11: - resolution: - { - integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==, - tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz, - } - name: "@esbuild/android-x64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [x64] - os: [android] - requiresBuild: true - dev: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /pagerank.js@1.0.2: + resolution: {integrity: sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw==} + dev: false + + /parse-github-url@1.0.2: + resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /semver@7.5.0: + resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /tcp-port-used@1.0.2: + resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} + dependencies: + debug: 4.3.1 + is2: 2.0.9 + transitivePeerDependencies: + - supports-color + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-jest@29.1.1(@babel/core@7.23.3)(esbuild@0.19.11)(jest@29.7.0)(typescript@5.1.6): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': optional: true - - registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11: - resolution: - { - integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==, - tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz, - } - name: "@esbuild/darwin-arm64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@jest/types': optional: true - - registry.npmmirror.com/@esbuild/darwin-x64@0.19.11: - resolution: - { - integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==, - tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz, - } - name: "@esbuild/darwin-x64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + babel-jest: optional: true - - registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11: - resolution: - { - integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==, - tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz, - } - name: "@esbuild/freebsd-arm64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + esbuild: optional: true - - registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11: - resolution: - { - integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==, - tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz, - } - name: "@esbuild/freebsd-x64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + bs-logger: 0.2.6 + esbuild: registry.npmmirror.com/esbuild@0.19.11 + fast-json-stable-stringify: 2.1.0 + jest: registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 5.1.6 + yargs-parser: 21.1.1 + dev: true + + /tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /vhtml@2.2.0: + resolution: {integrity: sha512-TPXrXrxBOslRUVnlVkiAqhoXneiertIg86bdvzionrUYhEuiROvyPZNiiP6GIIJ2Q7oPNVyEtIx8gMAZZE9lCQ==} + dev: true + + /wdio-chromedriver-service@8.1.1(webdriverio@8.27.2): + resolution: {integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==} + engines: {node: ^16.13 || >=18} + peerDependencies: + '@wdio/types': ^7.0.0 || ^8.0.0-alpha.219 + chromedriver: '*' + webdriverio: ^7.0.0 || ^8.0.0-alpha.219 + peerDependenciesMeta: + '@wdio/types': optional: true - - registry.npmmirror.com/@esbuild/linux-arm64@0.19.11: - resolution: - { - integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==, - tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz, - } - name: "@esbuild/linux-arm64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + chromedriver: optional: true - - registry.npmmirror.com/@esbuild/linux-arm@0.19.11: - resolution: - { - integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==, - tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz, - } - name: "@esbuild/linux-arm" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@wdio/logger': 8.16.17 + fs-extra: 11.1.1 + split2: 4.2.0 + tcp-port-used: 1.0.2 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + transitivePeerDependencies: + - supports-color + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, tarball: https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz} + name: '@aashutoshrathi/word-wrap' + version: 1.2.6 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, tarball: https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz} + name: '@ampproject/remapping' + version: 2.2.1 + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + dev: true + + registry.npmmirror.com/@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==, tarball: https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz} + name: '@babel/code-frame' + version: 7.22.13 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': registry.npmmirror.com/@babel/highlight@7.22.20 + chalk: registry.npmmirror.com/chalk@2.4.2 + dev: true + + registry.npmmirror.com/@babel/compat-data@7.23.3: + resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==, tarball: https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.3.tgz} + name: '@babel/compat-data' + version: 7.23.3 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/core@7.23.3: + resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==, tarball: https://registry.npmmirror.com/@babel/core/-/core-7.23.3.tgz} + name: '@babel/core' + version: 7.23.3 + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': registry.npmmirror.com/@ampproject/remapping@2.2.1 + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + '@babel/generator': registry.npmmirror.com/@babel/generator@7.23.3 + '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets@7.22.15 + '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3) + '@babel/helpers': registry.npmmirror.com/@babel/helpers@7.23.2 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 + '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + gensync: registry.npmmirror.com/gensync@1.0.0-beta.2 + json5: registry.npmmirror.com/json5@2.2.3 + semver: registry.npmmirror.com/semver@6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/generator@7.23.3: + resolution: {integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==, tarball: https://registry.npmmirror.com/@babel/generator/-/generator-7.23.3.tgz} + name: '@babel/generator' + version: 7.23.3 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + jsesc: registry.npmmirror.com/jsesc@2.5.2 + dev: true + + registry.npmmirror.com/@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==, tarball: https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz} + name: '@babel/helper-compilation-targets' + version: 7.22.15 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': registry.npmmirror.com/@babel/compat-data@7.23.3 + '@babel/helper-validator-option': registry.npmmirror.com/@babel/helper-validator-option@7.22.15 + browserslist: registry.npmmirror.com/browserslist@4.22.1 + lru-cache: registry.npmmirror.com/lru-cache@5.1.1 + semver: registry.npmmirror.com/semver@6.3.1 + dev: true + + registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, tarball: https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz} + name: '@babel/helper-environment-visitor' + version: 7.22.20 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, tarball: https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz} + name: '@babel/helper-function-name' + version: 7.23.0 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, tarball: https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz} + name: '@babel/helper-hoist-variables' + version: 7.22.5 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, tarball: https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz} + name: '@babel/helper-module-imports' + version: 7.22.15 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, tarball: https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz} + id: registry.npmmirror.com/@babel/helper-module-transforms/7.23.3 + name: '@babel/helper-module-transforms' + version: 7.23.3 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20 + '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports@7.22.15 + '@babel/helper-simple-access': registry.npmmirror.com/@babel/helper-simple-access@7.22.5 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6 + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 + dev: true + + registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, tarball: https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz} + name: '@babel/helper-plugin-utils' + version: 7.22.5 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, tarball: https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz} + name: '@babel/helper-simple-access' + version: 7.22.5 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, tarball: https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz} + name: '@babel/helper-split-export-declaration' + version: 7.22.6 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, tarball: https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz} + name: '@babel/helper-string-parser' + version: 7.22.5 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, tarball: https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz} + name: '@babel/helper-validator-identifier' + version: 7.22.20 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==, tarball: https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz} + name: '@babel/helper-validator-option' + version: 7.22.15 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/@babel/helpers@7.23.2: + resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==, tarball: https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.2.tgz} + name: '@babel/helpers' + version: 7.23.2 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 + '@babel/traverse': registry.npmmirror.com/@babel/traverse@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==, tarball: https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.20.tgz} + name: '@babel/highlight' + version: 7.22.20 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 + chalk: registry.npmmirror.com/chalk@2.4.2 + js-tokens: registry.npmmirror.com/js-tokens@4.0.0 + dev: true + + registry.npmmirror.com/@babel/parser@7.23.3: + resolution: {integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==, tarball: https://registry.npmmirror.com/@babel/parser/-/parser-7.23.3.tgz} + name: '@babel/parser' + version: 7.23.3 + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-async-generators/7.8.4 + name: '@babel/plugin-syntax-async-generators' + version: 7.8.4 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-bigint/7.8.3 + name: '@babel/plugin-syntax-bigint' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-class-properties/7.12.13 + name: '@babel/plugin-syntax-class-properties' + version: 7.12.13 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-import-meta/7.10.4 + name: '@babel/plugin-syntax-import-meta' + version: 7.10.4 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-json-strings/7.8.3 + name: '@babel/plugin-syntax-json-strings' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-jsx/7.23.3 + name: '@babel/plugin-syntax-jsx' + version: 7.23.3 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/7.10.4 + name: '@babel/plugin-syntax-logical-assignment-operators' + version: 7.10.4 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3 + name: '@babel/plugin-syntax-nullish-coalescing-operator' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/7.10.4 + name: '@babel/plugin-syntax-numeric-separator' + version: 7.10.4 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/7.8.3 + name: '@babel/plugin-syntax-object-rest-spread' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/7.8.3 + name: '@babel/plugin-syntax-optional-catch-binding' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/7.8.3 + name: '@babel/plugin-syntax-optional-chaining' + version: 7.8.3 + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-top-level-await/7.14.5 + name: '@babel/plugin-syntax-top-level-await' + version: 7.14.5 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz} + id: registry.npmmirror.com/@babel/plugin-syntax-typescript/7.23.3 + name: '@babel/plugin-syntax-typescript' + version: 7.23.3 + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + dev: true + + registry.npmmirror.com/@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, tarball: https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz} + name: '@babel/template' + version: 7.22.15 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@babel/traverse@7.23.3: + resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==, tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.3.tgz} + name: '@babel/traverse' + version: 7.23.3 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + '@babel/generator': registry.npmmirror.com/@babel/generator@7.23.3 + '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor@7.22.20 + '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name@7.23.0 + '@babel/helper-hoist-variables': registry.npmmirror.com/@babel/helper-hoist-variables@7.22.5 + '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration@7.22.6 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + globals: registry.npmmirror.com/globals@11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@babel/types@7.23.3: + resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==, tarball: https://registry.npmmirror.com/@babel/types/-/types-7.23.3.tgz} + name: '@babel/types' + version: 7.23.3 + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': registry.npmmirror.com/@babel/helper-string-parser@7.22.5 + '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier@7.22.20 + to-fast-properties: registry.npmmirror.com/to-fast-properties@2.0.0 + dev: true + + registry.npmmirror.com/@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, tarball: https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz} + name: '@bcoe/v8-coverage' + version: 0.2.3 + dev: true + + registry.npmmirror.com/@codemirror/state@6.3.1: + resolution: {integrity: sha512-88e4HhMtKJyw6fKprGaN/yZfiaoGYOi2nM45YCUC6R/kex9sxFWBDGatS1vk4lMgnWmdIIB9tk8Gj1LmL8YfvA==, tarball: https://registry.npmmirror.com/@codemirror/state/-/state-6.3.1.tgz} + name: '@codemirror/state' + version: 6.3.1 + dev: true + + registry.npmmirror.com/@codemirror/view@6.22.0: + resolution: {integrity: sha512-6zLj4YIoIpfTGKrDMTbeZRpa8ih4EymMCKmddEDcJWrCdp/N1D46B38YEz4creTb4T177AVS9EyXkLeC/HL2jA==, tarball: https://registry.npmmirror.com/@codemirror/view/-/view-6.22.0.tgz} + name: '@codemirror/view' + version: 6.22.0 + dependencies: + '@codemirror/state': registry.npmmirror.com/@codemirror/state@6.3.1 + style-mod: registry.npmmirror.com/style-mod@4.1.0 + w3c-keyname: registry.npmmirror.com/w3c-keyname@2.2.6 + dev: true + + registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==, tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz} + name: '@esbuild/aix-ppc64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz} + name: '@esbuild/android-arm64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz} + name: '@esbuild/android-arm' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz} + name: '@esbuild/android-x64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz} + name: '@esbuild/darwin-arm64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz} + name: '@esbuild/darwin-x64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz} + name: '@esbuild/freebsd-arm64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz} + name: '@esbuild/freebsd-x64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz} + name: '@esbuild/linux-arm64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz} + name: '@esbuild/linux-arm' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz} + name: '@esbuild/linux-ia32' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz} + name: '@esbuild/linux-loong64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz} + name: '@esbuild/linux-mips64el' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz} + name: '@esbuild/linux-ppc64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz} + name: '@esbuild/linux-riscv64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz} + name: '@esbuild/linux-s390x' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz} + name: '@esbuild/linux-x64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz} + name: '@esbuild/netbsd-x64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz} + name: '@esbuild/openbsd-x64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz} + name: '@esbuild/sunos-x64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz} + name: '@esbuild/win32-arm64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz} + name: '@esbuild/win32-ia32' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz} + name: '@esbuild/win32-x64' + version: 0.19.11 + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, tarball: https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz} + id: registry.npmmirror.com/@eslint-community/eslint-utils/4.4.0 + name: '@eslint-community/eslint-utils' + version: 4.4.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: registry.npmmirror.com/eslint@8.56.0 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 + dev: true + + registry.npmmirror.com/@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, tarball: https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz} + name: '@eslint-community/regexpp' + version: 4.10.0 + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + registry.npmmirror.com/@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, tarball: https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz} + name: '@eslint/eslintrc' + version: 2.1.4 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: registry.npmmirror.com/ajv@6.12.6 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + espree: registry.npmmirror.com/espree@9.6.1 + globals: registry.npmmirror.com/globals@13.23.0 + ignore: registry.npmmirror.com/ignore@5.2.4 + import-fresh: registry.npmmirror.com/import-fresh@3.3.0 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, tarball: https://registry.npmmirror.com/@eslint/js/-/js-8.56.0.tgz} + name: '@eslint/js' + version: 8.56.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + registry.npmmirror.com/@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, tarball: https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz} + name: '@humanwhocodes/config-array' + version: 0.11.13 + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': registry.npmmirror.com/@humanwhocodes/object-schema@2.0.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + minimatch: registry.npmmirror.com/minimatch@3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, tarball: https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz} + name: '@humanwhocodes/module-importer' + version: 1.0.1 + engines: {node: '>=12.22'} + dev: true + + registry.npmmirror.com/@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, tarball: https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz} + name: '@humanwhocodes/object-schema' + version: 2.0.1 + dev: true + + registry.npmmirror.com/@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, tarball: https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz} + name: '@isaacs/cliui' + version: 8.0.2 + engines: {node: '>=12'} + dependencies: + string-width: registry.npmmirror.com/string-width@5.1.2 + string-width-cjs: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 + strip-ansi-cjs: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@8.1.0 + wrap-ansi-cjs: registry.npmmirror.com/wrap-ansi@7.0.0 + dev: true + + registry.npmmirror.com/@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, tarball: https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz} + name: '@istanbuljs/load-nyc-config' + version: 1.1.0 + engines: {node: '>=8'} + dependencies: + camelcase: registry.npmmirror.com/camelcase@5.3.1 + find-up: registry.npmmirror.com/find-up@4.1.0 + get-package-type: registry.npmmirror.com/get-package-type@0.1.0 + js-yaml: registry.npmmirror.com/js-yaml@3.14.1 + resolve-from: registry.npmmirror.com/resolve-from@5.0.0 + dev: true + + registry.npmmirror.com/@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, tarball: https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz} + name: '@istanbuljs/schema' + version: 0.1.3 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==, tarball: https://registry.npmmirror.com/@jest/console/-/console-29.7.0.tgz} + name: '@jest/console' + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + dev: true + + registry.npmmirror.com/@jest/core@29.7.0: + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==, tarball: https://registry.npmmirror.com/@jest/core/-/core-29.7.0.tgz} + name: '@jest/core' + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - registry.npmmirror.com/@esbuild/linux-ia32@0.19.11: - resolution: - { - integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==, - tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz, - } - name: "@esbuild/linux-ia32" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 + '@jest/reporters': registry.npmmirror.com/@jest/reporters@29.7.0 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 + chalk: registry.npmmirror.com/chalk@4.1.2 + ci-info: registry.npmmirror.com/ci-info@3.9.0 + exit: registry.npmmirror.com/exit@0.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-changed-files: registry.npmmirror.com/jest-changed-files@29.7.0 + jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-resolve-dependencies: registry.npmmirror.com/jest-resolve-dependencies@29.7.0 + jest-runner: registry.npmmirror.com/jest-runner@29.7.0 + jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + jest-watcher: registry.npmmirror.com/jest-watcher@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + registry.npmmirror.com/@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==, tarball: https://registry.npmmirror.com/@jest/environment/-/environment-29.7.0.tgz} + name: '@jest/environment' + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + dev: true + + registry.npmmirror.com/@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==, tarball: https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz} + name: '@jest/expect-utils' + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + dev: true + + registry.npmmirror.com/@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==, tarball: https://registry.npmmirror.com/@jest/expect/-/expect-29.7.0.tgz} + name: '@jest/expect' + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: registry.npmmirror.com/expect@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==, tarball: https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz} + name: '@jest/fake-timers' + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@sinonjs/fake-timers': registry.npmmirror.com/@sinonjs/fake-timers@10.0.2 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + dev: true + + registry.npmmirror.com/@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==, tarball: https://registry.npmmirror.com/@jest/globals/-/globals-29.7.0.tgz} + name: '@jest/globals' + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/expect': registry.npmmirror.com/@jest/expect@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==, tarball: https://registry.npmmirror.com/@jest/reporters/-/reporters-29.7.0.tgz} + name: '@jest/reporters' + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - registry.npmmirror.com/@esbuild/linux-loong64@0.19.11: - resolution: - { - integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==, - tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz, - } - name: "@esbuild/linux-loong64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@bcoe/v8-coverage': registry.npmmirror.com/@bcoe/v8-coverage@0.2.3 + '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 + exit: registry.npmmirror.com/exit@0.1.2 + glob: registry.npmmirror.com/glob@7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument@6.0.1 + istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.1 + istanbul-lib-source-maps: registry.npmmirror.com/istanbul-lib-source-maps@4.0.1 + istanbul-reports: registry.npmmirror.com/istanbul-reports@3.1.5 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-worker: registry.npmmirror.com/jest-worker@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + string-length: registry.npmmirror.com/string-length@4.0.2 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + v8-to-istanbul: registry.npmmirror.com/v8-to-istanbul@9.1.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, tarball: https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz} + name: '@jest/schemas' + version: 29.6.3 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': registry.npmmirror.com/@sinclair/typebox@0.27.8 + dev: true + + registry.npmmirror.com/@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==, tarball: https://registry.npmmirror.com/@jest/source-map/-/source-map-29.6.3.tgz} + name: '@jest/source-map' + version: 29.6.3 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + callsites: registry.npmmirror.com/callsites@3.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + dev: true + + registry.npmmirror.com/@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==, tarball: https://registry.npmmirror.com/@jest/test-result/-/test-result-29.7.0.tgz} + name: '@jest/test-result' + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 + dev: true + + registry.npmmirror.com/@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==, tarball: https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz} + name: '@jest/test-sequencer' + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + dev: true + + registry.npmmirror.com/@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==, tarball: https://registry.npmmirror.com/@jest/transform/-/transform-29.7.0.tgz} + name: '@jest/transform' + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul@6.1.1 + chalk: registry.npmmirror.com/chalk@4.1.2 + convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify@2.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + pirates: registry.npmmirror.com/pirates@4.0.5 + slash: registry.npmmirror.com/slash@3.0.0 + write-file-atomic: registry.npmmirror.com/write-file-atomic@4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, tarball: https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz} + name: '@jest/types' + version: 29.6.3 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': registry.npmmirror.com/@jest/schemas@29.6.3 + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + '@types/istanbul-reports': registry.npmmirror.com/@types/istanbul-reports@3.0.4 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@types/yargs': registry.npmmirror.com/@types/yargs@17.0.31 + chalk: registry.npmmirror.com/chalk@4.1.2 + dev: true + + registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz} + name: '@jridgewell/gen-mapping' + version: 0.3.3 + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array@1.1.2 + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15 + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + dev: true + + registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz} + name: '@jridgewell/resolve-uri' + version: 3.1.0 + engines: {node: '>=6.0.0'} + dev: true + + registry.npmmirror.com/@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, tarball: https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz} + name: '@jridgewell/set-array' + version: 1.1.2 + engines: {node: '>=6.0.0'} + dev: true + + registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz} + name: '@jridgewell/sourcemap-codec' + version: 1.4.15 + dev: true + + registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz} + name: '@jridgewell/trace-mapping' + version: 0.3.20 + dependencies: + '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0 + '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15 + dev: true + + registry.npmmirror.com/@kurkle/color@0.3.2: + resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==, tarball: https://registry.npmmirror.com/@kurkle/color/-/color-0.3.2.tgz} + name: '@kurkle/color' + version: 0.3.2 + dev: false + + registry.npmmirror.com/@ljharb/through@2.3.11: + resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==, tarball: https://registry.npmmirror.com/@ljharb/through/-/through-2.3.11.tgz} + name: '@ljharb/through' + version: 2.3.11 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + dev: true + + registry.npmmirror.com/@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, tarball: https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz} + name: '@nodelib/fs.scandir' + version: 2.1.5 + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': registry.npmmirror.com/@nodelib/fs.stat@2.0.5 + run-parallel: registry.npmmirror.com/run-parallel@1.2.0 + dev: true + + registry.npmmirror.com/@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, tarball: https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz} + name: '@nodelib/fs.stat' + version: 2.0.5 + engines: {node: '>= 8'} + dev: true + + registry.npmmirror.com/@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, tarball: https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz} + name: '@nodelib/fs.walk' + version: 1.2.8 + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': registry.npmmirror.com/@nodelib/fs.scandir@2.1.5 + fastq: registry.npmmirror.com/fastq@1.15.0 + dev: true + + registry.npmmirror.com/@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, tarball: https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz} + name: '@pkgjs/parseargs' + version: 0.11.0 + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/@puppeteer/browsers@1.4.6(typescript@5.1.6): + resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==, tarball: https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-1.4.6.tgz} + id: registry.npmmirror.com/@puppeteer/browsers/1.4.6 + name: '@puppeteer/browsers' + version: 1.4.6 + engines: {node: '>=16.3.0'} + hasBin: true + peerDependencies: + typescript: '>= 4.7.4' + peerDependenciesMeta: + typescript: optional: true - - registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11: - resolution: - { - integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==, - tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz, - } - name: "@esbuild/linux-mips64el" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + extract-zip: registry.npmmirror.com/extract-zip@2.0.1 + progress: registry.npmmirror.com/progress@2.0.3 + proxy-agent: registry.npmmirror.com/proxy-agent@6.3.0 + tar-fs: registry.npmmirror.com/tar-fs@3.0.4 + typescript: 5.1.6 + unbzip2-stream: registry.npmmirror.com/unbzip2-stream@1.4.3 + yargs: registry.npmmirror.com/yargs@17.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@puppeteer/browsers@1.8.0: + resolution: {integrity: sha512-TkRHIV6k2D8OlUe8RtG+5jgOF/H98Myx0M6AOafC8DdNVOFiBSFa5cpRDtpm8LXOa9sVwe0+e6Q3FC56X/DZfg==, tarball: https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-1.8.0.tgz} + name: '@puppeteer/browsers' + version: 1.8.0 + engines: {node: '>=16.3.0'} + hasBin: true + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + extract-zip: registry.npmmirror.com/extract-zip@2.0.1 + progress: registry.npmmirror.com/progress@2.0.3 + proxy-agent: registry.npmmirror.com/proxy-agent@6.3.1 + tar-fs: registry.npmmirror.com/tar-fs@3.0.4 + unbzip2-stream: registry.npmmirror.com/unbzip2-stream@1.4.3 + yargs: registry.npmmirror.com/yargs@17.7.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, tarball: https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz} + name: '@sinclair/typebox' + version: 0.27.8 + dev: true + + registry.npmmirror.com/@sindresorhus/is@5.3.0: + resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==, tarball: https://registry.npmmirror.com/@sindresorhus/is/-/is-5.3.0.tgz} + name: '@sindresorhus/is' + version: 5.3.0 + engines: {node: '>=14.16'} + dev: true + + registry.npmmirror.com/@sinonjs/commons@2.0.0: + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==, tarball: https://registry.npmmirror.com/@sinonjs/commons/-/commons-2.0.0.tgz} + name: '@sinonjs/commons' + version: 2.0.0 + dependencies: + type-detect: registry.npmmirror.com/type-detect@4.0.8 + dev: true + + registry.npmmirror.com/@sinonjs/fake-timers@10.0.2: + resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==, tarball: https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz} + name: '@sinonjs/fake-timers' + version: 10.0.2 + dependencies: + '@sinonjs/commons': registry.npmmirror.com/@sinonjs/commons@2.0.0 + dev: true + + registry.npmmirror.com/@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==, tarball: https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz} + name: '@szmarczak/http-timer' + version: 5.0.1 + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: registry.npmmirror.com/defer-to-connect@2.0.1 + dev: true + + registry.npmmirror.com/@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, tarball: https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz} + name: '@tootallnate/once' + version: 2.0.0 + engines: {node: '>= 10'} + dev: true + + registry.npmmirror.com/@tootallnate/quickjs-emscripten@0.23.0: + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==, tarball: https://registry.npmmirror.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz} + name: '@tootallnate/quickjs-emscripten' + version: 0.23.0 + dev: true + + registry.npmmirror.com/@types/babel__core@7.20.4: + resolution: {integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==, tarball: https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.4.tgz} + name: '@types/babel__core' + version: 7.20.4 + dependencies: + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + '@types/babel__generator': registry.npmmirror.com/@types/babel__generator@7.6.7 + '@types/babel__template': registry.npmmirror.com/@types/babel__template@7.4.4 + '@types/babel__traverse': registry.npmmirror.com/@types/babel__traverse@7.20.4 + dev: true + + registry.npmmirror.com/@types/babel__generator@7.6.7: + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==, tarball: https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.7.tgz} + name: '@types/babel__generator' + version: 7.6.7 + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, tarball: https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz} + name: '@types/babel__template' + version: 7.4.4 + dependencies: + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@types/babel__traverse@7.20.4: + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==, tarball: https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz} + name: '@types/babel__traverse' + version: 7.20.4 + dependencies: + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + dev: true + + registry.npmmirror.com/@types/codemirror@5.60.8: + resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==, tarball: https://registry.npmmirror.com/@types/codemirror/-/codemirror-5.60.8.tgz} + name: '@types/codemirror' + version: 5.60.8 + dependencies: + '@types/tern': registry.npmmirror.com/@types/tern@0.23.7 + dev: true + + registry.npmmirror.com/@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, tarball: https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz} + name: '@types/estree' + version: 1.0.5 + dev: true + + registry.npmmirror.com/@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, tarball: https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz} + name: '@types/graceful-fs' + version: 4.1.9 + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + dev: true + + registry.npmmirror.com/@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==, tarball: https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz} + name: '@types/http-cache-semantics' + version: 4.0.4 + dev: true + + registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, tarball: https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz} + name: '@types/istanbul-lib-coverage' + version: 2.0.6 + dev: true + + registry.npmmirror.com/@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, tarball: https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz} + name: '@types/istanbul-lib-report' + version: 3.0.3 + dependencies: + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + dev: true + + registry.npmmirror.com/@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, tarball: https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz} + name: '@types/istanbul-reports' + version: 3.0.4 + dependencies: + '@types/istanbul-lib-report': registry.npmmirror.com/@types/istanbul-lib-report@3.0.3 + dev: true + + registry.npmmirror.com/@types/jest@29.5.11: + resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==, tarball: https://registry.npmmirror.com/@types/jest/-/jest-29.5.11.tgz} + name: '@types/jest' + version: 29.5.11 + dependencies: + expect: registry.npmmirror.com/expect@29.7.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/@types/jsdom@20.0.1: + resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==, tarball: https://registry.npmmirror.com/@types/jsdom/-/jsdom-20.0.1.tgz} + name: '@types/jsdom' + version: 20.0.1 + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@types/tough-cookie': registry.npmmirror.com/@types/tough-cookie@4.0.5 + parse5: registry.npmmirror.com/parse5@7.1.2 + dev: true + + registry.npmmirror.com/@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, tarball: https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz} + name: '@types/json-schema' + version: 7.0.15 + dev: true + + registry.npmmirror.com/@types/mocha@10.0.4: + resolution: {integrity: sha512-xKU7bUjiFTIttpWaIZ9qvgg+22O1nmbA+HRxdlR+u6TWsGfmFdXrheJoK4fFxrHNVIOBDvDNKZG+LYBpMHpX3w==, tarball: https://registry.npmmirror.com/@types/mocha/-/mocha-10.0.4.tgz} + name: '@types/mocha' + version: 10.0.4 + dev: true + + registry.npmmirror.com/@types/node@20.11.0: + resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==, tarball: https://registry.npmmirror.com/@types/node/-/node-20.11.0.tgz} + name: '@types/node' + version: 20.11.0 + dependencies: + undici-types: registry.npmmirror.com/undici-types@5.26.5 + dev: true + + registry.npmmirror.com/@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, tarball: https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz} + name: '@types/normalize-package-data' + version: 2.4.4 + dev: true + + registry.npmmirror.com/@types/semver@7.5.5: + resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==, tarball: https://registry.npmmirror.com/@types/semver/-/semver-7.5.5.tgz} + name: '@types/semver' + version: 7.5.5 + dev: true + + registry.npmmirror.com/@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, tarball: https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.3.tgz} + name: '@types/stack-utils' + version: 2.0.3 + dev: true + + registry.npmmirror.com/@types/tern@0.23.7: + resolution: {integrity: sha512-0YS9XCZ0LAhlP11HV9SqncUYyz9Ggsgc7Om/AmchKvoeFyj0qPaJmX6rJ93mJVExizWDzUMb49gAtVpI1uHd8Q==, tarball: https://registry.npmmirror.com/@types/tern/-/tern-0.23.7.tgz} + name: '@types/tern' + version: 0.23.7 + dependencies: + '@types/estree': registry.npmmirror.com/@types/estree@1.0.5 + dev: true + + registry.npmmirror.com/@types/tough-cookie@4.0.5: + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==, tarball: https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz} + name: '@types/tough-cookie' + version: 4.0.5 + dev: true + + registry.npmmirror.com/@types/vhtml@2.2.9: + resolution: {integrity: sha512-maEIRJb+PdK2FWDORl0a0aNUSGlniMl8pN+7WbanLzx1Gry4gLfsT0C9O/6JucPPBHCNrqDSImr2QcsUENLKUg==, tarball: https://registry.npmmirror.com/@types/vhtml/-/vhtml-2.2.9.tgz} + name: '@types/vhtml' + version: 2.2.9 + dev: true + + registry.npmmirror.com/@types/which@2.0.2: + resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==, tarball: https://registry.npmmirror.com/@types/which/-/which-2.0.2.tgz} + name: '@types/which' + version: 2.0.2 + dev: true + + registry.npmmirror.com/@types/ws@8.5.9: + resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==, tarball: https://registry.npmmirror.com/@types/ws/-/ws-8.5.9.tgz} + name: '@types/ws' + version: 8.5.9 + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + dev: true + + registry.npmmirror.com/@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, tarball: https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz} + name: '@types/yargs-parser' + version: 21.0.3 + dev: true + + registry.npmmirror.com/@types/yargs@17.0.31: + resolution: {integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==, tarball: https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.31.tgz} + name: '@types/yargs' + version: 17.0.31 + dependencies: + '@types/yargs-parser': registry.npmmirror.com/@types/yargs-parser@21.0.3 + dev: true + + registry.npmmirror.com/@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, tarball: https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz} + name: '@types/yauzl' + version: 2.10.3 + requiresBuild: true + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + dev: true + optional: true + + registry.npmmirror.com/@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.1.6): + resolution: {integrity: sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==, tarball: https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz} + id: registry.npmmirror.com/@typescript-eslint/eslint-plugin/6.18.1 + name: '@typescript-eslint/eslint-plugin' + version: 6.18.1 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11: - resolution: - { - integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==, - tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz, - } - name: "@esbuild/linux-ppc64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@eslint-community/regexpp': registry.npmmirror.com/@eslint-community/regexpp@4.10.0 + '@typescript-eslint/parser': registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 + '@typescript-eslint/type-utils': registry.npmmirror.com/@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) + '@typescript-eslint/utils': registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmmirror.com/eslint@8.56.0 + graphemer: registry.npmmirror.com/graphemer@1.4.0 + ignore: registry.npmmirror.com/ignore@5.2.4 + natural-compare: registry.npmmirror.com/natural-compare@1.4.0 + semver: registry.npmmirror.com/semver@7.5.4 + ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6): + resolution: {integrity: sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==, tarball: https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.18.1.tgz} + id: registry.npmmirror.com/@typescript-eslint/parser/6.18.1 + name: '@typescript-eslint/parser' + version: 6.18.1 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11: - resolution: - { - integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==, - tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz, - } - name: "@esbuild/linux-riscv64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 + '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) + '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmmirror.com/eslint@8.56.0 + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1: + resolution: {integrity: sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==, tarball: https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz} + name: '@typescript-eslint/scope-manager' + version: 6.18.1 + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 + '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 + dev: true + + registry.npmmirror.com/@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.1.6): + resolution: {integrity: sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==, tarball: https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz} + id: registry.npmmirror.com/@typescript-eslint/type-utils/6.18.1 + name: '@typescript-eslint/type-utils' + version: 6.18.1 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - registry.npmmirror.com/@esbuild/linux-s390x@0.19.11: - resolution: - { - integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==, - tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz, - } - name: "@esbuild/linux-s390x" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) + '@typescript-eslint/utils': registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmmirror.com/eslint@8.56.0 + ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/types@6.18.1: + resolution: {integrity: sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==, tarball: https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.18.1.tgz} + name: '@typescript-eslint/types' + version: 6.18.1 + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6): + resolution: {integrity: sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==, tarball: https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz} + id: registry.npmmirror.com/@typescript-eslint/typescript-estree/6.18.1 + name: '@typescript-eslint/typescript-estree' + version: 6.18.1 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - registry.npmmirror.com/@esbuild/linux-x64@0.19.11: - resolution: - { - integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==, - tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz, - } - name: "@esbuild/linux-x64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 + '@typescript-eslint/visitor-keys': registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + globby: registry.npmmirror.com/globby@11.1.0 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + minimatch: registry.npmmirror.com/minimatch@9.0.3 + semver: registry.npmmirror.com/semver@7.5.4 + ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6): + resolution: {integrity: sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==, tarball: https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.18.1.tgz} + id: registry.npmmirror.com/@typescript-eslint/utils/6.18.1 + name: '@typescript-eslint/utils' + version: 6.18.1 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0) + '@types/json-schema': registry.npmmirror.com/@types/json-schema@7.0.15 + '@types/semver': registry.npmmirror.com/@types/semver@7.5.5 + '@typescript-eslint/scope-manager': registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 + '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) + eslint: registry.npmmirror.com/eslint@8.56.0 + semver: registry.npmmirror.com/semver@7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1: + resolution: {integrity: sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==, tarball: https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz} + name: '@typescript-eslint/visitor-keys' + version: 6.18.1 + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': registry.npmmirror.com/@typescript-eslint/types@6.18.1 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 + dev: true + + registry.npmmirror.com/@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, tarball: https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz} + name: '@ungap/structured-clone' + version: 1.2.0 + dev: true + + registry.npmmirror.com/@wdio/cli@8.27.2(typescript@5.1.6): + resolution: {integrity: sha512-gRbwqjjczReWqLFZQX9iwTsCwGPFavJwL7iKSoIeAS645sM9PMmPW7mHzawmkFxqDDAyBWO3qFn4KV2H/2YfdA==, tarball: https://registry.npmmirror.com/@wdio/cli/-/cli-8.27.2.tgz} + id: registry.npmmirror.com/@wdio/cli/8.27.2 + name: '@wdio/cli' + version: 8.27.2 + engines: {node: ^16.13 || >=18} + hasBin: true + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 + '@wdio/globals': registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/protocols': registry.npmmirror.com/@wdio/protocols@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + async-exit-hook: registry.npmmirror.com/async-exit-hook@2.0.1 + chalk: registry.npmmirror.com/chalk@5.3.0 + chokidar: registry.npmmirror.com/chokidar@3.5.3 + cli-spinners: registry.npmmirror.com/cli-spinners@2.9.1 + dotenv: registry.npmmirror.com/dotenv@16.3.1 + ejs: registry.npmmirror.com/ejs@3.1.9 + execa: registry.npmmirror.com/execa@8.0.1 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 + inquirer: registry.npmmirror.com/inquirer@9.2.12 + lodash.flattendeep: registry.npmmirror.com/lodash.flattendeep@4.4.0 + lodash.pickby: registry.npmmirror.com/lodash.pickby@4.6.0 + lodash.union: registry.npmmirror.com/lodash.union@4.6.0 + read-pkg-up: registry.npmmirror.com/read-pkg-up@10.1.0 + recursive-readdir: registry.npmmirror.com/recursive-readdir@2.2.3 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + yargs: registry.npmmirror.com/yargs@17.7.2 + transitivePeerDependencies: + - bufferutil + - devtools + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/@wdio/config@8.27.2: + resolution: {integrity: sha512-qR1r7K7/jsQhi9g5NiW40lgbvbzCcwwk8nz07hzTj6m8fQ8TXkQPob2fnrlDaNrXjzbZC4od0uv0a5fimK9YOQ==, tarball: https://registry.npmmirror.com/@wdio/config/-/config-8.27.2.tgz} + name: '@wdio/config' + version: 8.27.2 + engines: {node: ^16.13 || >=18} + dependencies: + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + glob: registry.npmmirror.com/glob@10.3.10 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6): + resolution: {integrity: sha512-kU9fsOD1HVSROgN0TkjH8+O2SWbd5hHzL952+YOifMHFtt05Ua/n5mqxTTVAWmxUMMCz6VOuySmBt2Dhd4NnKA==, tarball: https://registry.npmmirror.com/@wdio/globals/-/globals-8.27.2.tgz} + id: registry.npmmirror.com/@wdio/globals/8.27.2 + name: '@wdio/globals' + version: 8.27.2 + engines: {node: ^16.13 || >=18} + optionalDependencies: + expect-webdriverio: registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6) + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + transitivePeerDependencies: + - bufferutil + - devtools + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/@wdio/local-runner@8.27.2(typescript@5.1.6): + resolution: {integrity: sha512-7m0vEulOyriMPB1+559ioEdjXlLu7yseM3KfQapCdLqaqTWvURJlMSxiHZZwuHaVGKa6YBPNB7NhRcHoUsqsAg==, tarball: https://registry.npmmirror.com/@wdio/local-runner/-/local-runner-8.27.2.tgz} + id: registry.npmmirror.com/@wdio/local-runner/8.27.2 + name: '@wdio/local-runner' + version: 8.27.2 + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/repl': registry.npmmirror.com/@wdio/repl@8.24.12 + '@wdio/runner': registry.npmmirror.com/@wdio/runner@8.27.2(typescript@5.1.6) + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + async-exit-hook: registry.npmmirror.com/async-exit-hook@2.0.1 + split2: registry.npmmirror.com/split2@4.2.0 + stream-buffers: registry.npmmirror.com/stream-buffers@3.0.2 + transitivePeerDependencies: + - bufferutil + - devtools + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/@wdio/logger@8.24.12: + resolution: {integrity: sha512-QisOiVIWKTUCf1H7S+DOtC+gruhlpimQrUXfWMTeeh672PvAJYnTpOJDWA+BtXfsikkUYFAzAaq8SeMJk8rqKg==, tarball: https://registry.npmmirror.com/@wdio/logger/-/logger-8.24.12.tgz} + name: '@wdio/logger' + version: 8.24.12 + engines: {node: ^16.13 || >=18} + dependencies: + chalk: registry.npmmirror.com/chalk@5.3.0 + loglevel: registry.npmmirror.com/loglevel@1.8.1 + loglevel-plugin-prefix: registry.npmmirror.com/loglevel-plugin-prefix@0.8.4 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 + dev: true + + registry.npmmirror.com/@wdio/mocha-framework@8.27.2: + resolution: {integrity: sha512-R0PRW5X8VDJzpHPhtOGkcPFrcetDOYz9q//4uqvdtdKtngrp4goz2cVNEmnbXJDMUm5VHSYy2GW6YtsjWUxbkA==, tarball: https://registry.npmmirror.com/@wdio/mocha-framework/-/mocha-framework-8.27.2.tgz} + name: '@wdio/mocha-framework' + version: 8.27.2 + engines: {node: ^16.13 || >=18} + dependencies: + '@types/mocha': registry.npmmirror.com/@types/mocha@10.0.4 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + mocha: registry.npmmirror.com/mocha@10.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/@wdio/protocols@8.24.12: + resolution: {integrity: sha512-QnVj3FkapmVD3h2zoZk+ZQ8gevSj9D9MiIQIy8eOnY4FAneYZ9R9GvoW+mgNcCZO8S8++S/jZHetR8n+8Q808g==, tarball: https://registry.npmmirror.com/@wdio/protocols/-/protocols-8.24.12.tgz} + name: '@wdio/protocols' + version: 8.24.12 + dev: true + + registry.npmmirror.com/@wdio/repl@8.24.12: + resolution: {integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==, tarball: https://registry.npmmirror.com/@wdio/repl/-/repl-8.24.12.tgz} + name: '@wdio/repl' + version: 8.24.12 + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + dev: true + + registry.npmmirror.com/@wdio/reporter@8.27.2: + resolution: {integrity: sha512-vMhoTVsowDmk6EXYgJ4nFBd6vvMFLIO3zUL4w/DCCkPDyjS9/6ggs/wpVSlrKxw9qisAph1Z4W9ngtNuhQQuwg==, tarball: https://registry.npmmirror.com/@wdio/reporter/-/reporter-8.27.2.tgz} + name: '@wdio/reporter' + version: 8.27.2 + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + diff: registry.npmmirror.com/diff@5.1.0 + object-inspect: registry.npmmirror.com/object-inspect@1.13.1 + dev: true + + registry.npmmirror.com/@wdio/runner@8.27.2(typescript@5.1.6): + resolution: {integrity: sha512-a72dJ+7ap0DOrkrjx1ofYHzgDYzK0I7RjSGOEvi2cc+SwnwESHnwtPug5F3NfDFEMXV3Y3pN+E/yz81S27WpvQ==, tarball: https://registry.npmmirror.com/@wdio/runner/-/runner-8.27.2.tgz} + id: registry.npmmirror.com/@wdio/runner/8.27.2 + name: '@wdio/runner' + version: 8.27.2 + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 + '@wdio/globals': registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + expect-webdriverio: registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6) + gaze: registry.npmmirror.com/gaze@1.1.3 + webdriver: registry.npmmirror.com/webdriver@8.27.2 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + transitivePeerDependencies: + - bufferutil + - devtools + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/@wdio/spec-reporter@8.27.2: + resolution: {integrity: sha512-2U1MALAHjUqDo3C+PYinN1wAnDBiy+kLG3GrTpMeIWZ2qZ6m1fRWt9GlADX7r07vhiRqShxy131nUenqeoF/qg==, tarball: https://registry.npmmirror.com/@wdio/spec-reporter/-/spec-reporter-8.27.2.tgz} + name: '@wdio/spec-reporter' + version: 8.27.2 + engines: {node: ^16.13 || >=18} + dependencies: + '@wdio/reporter': registry.npmmirror.com/@wdio/reporter@8.27.2 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + chalk: registry.npmmirror.com/chalk@5.3.0 + easy-table: registry.npmmirror.com/easy-table@1.2.0 + pretty-ms: registry.npmmirror.com/pretty-ms@7.0.1 + dev: true + + registry.npmmirror.com/@wdio/types@8.27.2: + resolution: {integrity: sha512-z/TtSQysEtAUNh+DooOs22G7xotTsJC2RcIZKaVtHY4Gl6lF+tn8kLRXD79jem2ta1byB1TpW62K366k1vzcLw==, tarball: https://registry.npmmirror.com/@wdio/types/-/types-8.27.2.tgz} + name: '@wdio/types' + version: 8.27.2 + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + dev: true + + registry.npmmirror.com/@wdio/utils@8.27.2: + resolution: {integrity: sha512-jWxUhGjlZ4L3uOsP96oLKWjkITpoH/KPTtKzU7xdoVGhd1LXK4d/Fr8cTFTNkDBXM7yuM7C+EMmQ8HJHR55KTA==, tarball: https://registry.npmmirror.com/@wdio/utils/-/utils-8.27.2.tgz} + name: '@wdio/utils' + version: 8.27.2 + engines: {node: ^16.13 || >=18} + dependencies: + '@puppeteer/browsers': registry.npmmirror.com/@puppeteer/browsers@1.8.0 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + edgedriver: registry.npmmirror.com/edgedriver@5.3.8 + geckodriver: registry.npmmirror.com/geckodriver@4.2.1 + get-port: registry.npmmirror.com/get-port@7.0.0 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 + locate-app: registry.npmmirror.com/locate-app@2.1.0 + safaridriver: registry.npmmirror.com/safaridriver@0.1.0 + split2: registry.npmmirror.com/split2@4.2.0 + wait-port: registry.npmmirror.com/wait-port@1.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, tarball: https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz} + name: abab + version: 2.0.6 + deprecated: Use your platform's native atob() and btoa() methods instead + dev: true + + registry.npmmirror.com/acorn-globals@7.0.1: + resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==, tarball: https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz} + name: acorn-globals + version: 7.0.1 + dependencies: + acorn: registry.npmmirror.com/acorn@8.11.2 + acorn-walk: registry.npmmirror.com/acorn-walk@8.3.0 + dev: true + + registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, tarball: https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz} + id: registry.npmmirror.com/acorn-jsx/5.3.2 + name: acorn-jsx + version: 5.3.2 + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: registry.npmmirror.com/acorn@8.11.2 + dev: true + + registry.npmmirror.com/acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==, tarball: https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.0.tgz} + name: acorn-walk + version: 8.3.0 + engines: {node: '>=0.4.0'} + dev: true + + registry.npmmirror.com/acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, tarball: https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz} + name: acorn + version: 8.11.2 + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + registry.npmmirror.com/agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, tarball: https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz} + name: agent-base + version: 6.0.2 + engines: {node: '>= 6.0.0'} + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==, tarball: https://registry.npmmirror.com/agent-base/-/agent-base-7.1.0.tgz} + name: agent-base + version: 7.1.0 + engines: {node: '>= 14'} + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, tarball: https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz} + name: ajv + version: 6.12.6 + dependencies: + fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 + fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify@2.1.0 + json-schema-traverse: registry.npmmirror.com/json-schema-traverse@0.4.1 + uri-js: registry.npmmirror.com/uri-js@4.4.1 + dev: true + + registry.npmmirror.com/ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==, tarball: https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz} + name: ansi-colors + version: 4.1.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, tarball: https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz} + name: ansi-escapes + version: 4.3.2 + engines: {node: '>=8'} + dependencies: + type-fest: registry.npmmirror.com/type-fest@0.21.3 + dev: true + + registry.npmmirror.com/ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz} + name: ansi-regex + version: 5.0.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz} + name: ansi-regex + version: 6.0.1 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz} + name: ansi-styles + version: 3.2.1 + engines: {node: '>=4'} + dependencies: + color-convert: registry.npmmirror.com/color-convert@1.9.3 + dev: true + + registry.npmmirror.com/ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz} + name: ansi-styles + version: 4.3.0 + engines: {node: '>=8'} + dependencies: + color-convert: registry.npmmirror.com/color-convert@2.0.1 + dev: true + + registry.npmmirror.com/ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz} + name: ansi-styles + version: 5.2.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz} + name: ansi-styles + version: 6.2.1 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, tarball: https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz} + name: anymatch + version: 3.1.3 + engines: {node: '>= 8'} + dependencies: + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + picomatch: registry.npmmirror.com/picomatch@2.3.1 + dev: true + + registry.npmmirror.com/archiver-utils@4.0.1: + resolution: {integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==, tarball: https://registry.npmmirror.com/archiver-utils/-/archiver-utils-4.0.1.tgz} + name: archiver-utils + version: 4.0.1 + engines: {node: '>= 12.0.0'} + dependencies: + glob: registry.npmmirror.com/glob@8.1.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + lazystream: registry.npmmirror.com/lazystream@1.0.1 + lodash: registry.npmmirror.com/lodash@4.17.21 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + dev: true + + registry.npmmirror.com/archiver@6.0.1: + resolution: {integrity: sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==, tarball: https://registry.npmmirror.com/archiver/-/archiver-6.0.1.tgz} + name: archiver + version: 6.0.1 + engines: {node: '>= 12.0.0'} + dependencies: + archiver-utils: registry.npmmirror.com/archiver-utils@4.0.1 + async: registry.npmmirror.com/async@3.2.5 + buffer-crc32: registry.npmmirror.com/buffer-crc32@0.2.13 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + readdir-glob: registry.npmmirror.com/readdir-glob@1.1.3 + tar-stream: registry.npmmirror.com/tar-stream@3.1.6 + zip-stream: registry.npmmirror.com/zip-stream@5.0.1 + dev: true + + registry.npmmirror.com/argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, tarball: https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz} + name: argparse + version: 1.0.10 + dependencies: + sprintf-js: registry.npmmirror.com/sprintf-js@1.0.3 + dev: true + + registry.npmmirror.com/argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, tarball: https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz} + name: argparse + version: 2.0.1 + dev: true + + registry.npmmirror.com/aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==, tarball: https://registry.npmmirror.com/aria-query/-/aria-query-5.1.3.tgz} + name: aria-query + version: 5.1.3 + dependencies: + deep-equal: registry.npmmirror.com/deep-equal@2.2.1 + dev: true + + registry.npmmirror.com/array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==, tarball: https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz} + name: array-buffer-byte-length + version: 1.0.0 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + is-array-buffer: registry.npmmirror.com/is-array-buffer@3.0.2 + dev: true + + registry.npmmirror.com/array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, tarball: https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz} + name: array-union + version: 2.1.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, tarball: https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz} + name: assertion-error + version: 1.1.0 + dev: true + + registry.npmmirror.com/ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==, tarball: https://registry.npmmirror.com/ast-types/-/ast-types-0.13.4.tgz} + name: ast-types + version: 0.13.4 + engines: {node: '>=4'} + dependencies: + tslib: registry.npmmirror.com/tslib@2.6.1 + dev: true + + registry.npmmirror.com/async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==, tarball: https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz} + name: async-exit-hook + version: 2.0.1 + engines: {node: '>=0.12.0'} + dev: true + + registry.npmmirror.com/async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==, tarball: https://registry.npmmirror.com/async/-/async-3.2.5.tgz} + name: async + version: 3.2.5 + dev: true + + registry.npmmirror.com/asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, tarball: https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz} + name: asynckit + version: 0.4.0 + dev: true + + registry.npmmirror.com/available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, tarball: https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz} + name: available-typed-arrays + version: 1.0.5 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==, tarball: https://registry.npmmirror.com/b4a/-/b4a-1.6.4.tgz} + name: b4a + version: 1.6.4 + dev: true + + registry.npmmirror.com/babel-jest@29.7.0(@babel/core@7.23.3): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==, tarball: https://registry.npmmirror.com/babel-jest/-/babel-jest-29.7.0.tgz} + id: registry.npmmirror.com/babel-jest/29.7.0 + name: babel-jest + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@types/babel__core': registry.npmmirror.com/@types/babel__core@7.20.4 + babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul@6.1.1 + babel-preset-jest: registry.npmmirror.com/babel-preset-jest@29.6.3(@babel/core@7.23.3) + chalk: registry.npmmirror.com/chalk@4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + slash: registry.npmmirror.com/slash@3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, tarball: https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz} + name: babel-plugin-istanbul + version: 6.1.1 + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 + '@istanbuljs/load-nyc-config': registry.npmmirror.com/@istanbuljs/load-nyc-config@1.1.0 + '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 + istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument@5.2.1 + test-exclude: registry.npmmirror.com/test-exclude@6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==, tarball: https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz} + name: babel-plugin-jest-hoist + version: 29.6.3 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': registry.npmmirror.com/@babel/template@7.22.15 + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + '@types/babel__core': registry.npmmirror.com/@types/babel__core@7.20.4 + '@types/babel__traverse': registry.npmmirror.com/@types/babel__traverse@7.20.4 + dev: true + + registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, tarball: https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz} + id: registry.npmmirror.com/babel-preset-current-node-syntax/1.0.1 + name: babel-preset-current-node-syntax + version: 1.0.1 + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/plugin-syntax-async-generators': registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3) + '@babel/plugin-syntax-bigint': registry.npmmirror.com/@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-class-properties': registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3) + '@babel/plugin-syntax-import-meta': registry.npmmirror.com/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-json-strings': registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-logical-assignment-operators': registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-nullish-coalescing-operator': registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-numeric-separator': registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3) + '@babel/plugin-syntax-object-rest-spread': registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-optional-catch-binding': registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-optional-chaining': registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3) + '@babel/plugin-syntax-top-level-await': registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3) + dev: true + + registry.npmmirror.com/babel-preset-jest@29.6.3(@babel/core@7.23.3): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==, tarball: https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz} + id: registry.npmmirror.com/babel-preset-jest/29.6.3 + name: babel-preset-jest + version: 29.6.3 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + babel-plugin-jest-hoist: registry.npmmirror.com/babel-plugin-jest-hoist@29.6.3 + babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3) + dev: true + + registry.npmmirror.com/balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, tarball: https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz} + name: balanced-match + version: 1.0.2 + dev: true + + registry.npmmirror.com/base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, tarball: https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz} + name: base64-js + version: 1.5.1 + dev: true + + registry.npmmirror.com/basic-ftp@5.0.3: + resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==, tarball: https://registry.npmmirror.com/basic-ftp/-/basic-ftp-5.0.3.tgz} + name: basic-ftp + version: 5.0.3 + engines: {node: '>=10.0.0'} + dev: true + + registry.npmmirror.com/big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==, tarball: https://registry.npmmirror.com/big-integer/-/big-integer-1.6.51.tgz} + name: big-integer + version: 1.6.51 + engines: {node: '>=0.6'} + dev: true + + registry.npmmirror.com/binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, tarball: https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz} + name: binary-extensions + version: 2.2.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/binary@0.3.0: + resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==, tarball: https://registry.npmmirror.com/binary/-/binary-0.3.0.tgz} + name: binary + version: 0.3.0 + dependencies: + buffers: registry.npmmirror.com/buffers@0.1.1 + chainsaw: registry.npmmirror.com/chainsaw@0.1.0 + dev: true + + registry.npmmirror.com/bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, tarball: https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz} + name: bl + version: 4.1.0 + dependencies: + buffer: registry.npmmirror.com/buffer@5.7.1 + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + dev: true + + registry.npmmirror.com/bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==, tarball: https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz} + name: bluebird + version: 3.4.7 + dev: true + + registry.npmmirror.com/brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz} + name: brace-expansion + version: 1.1.11 + dependencies: + balanced-match: registry.npmmirror.com/balanced-match@1.0.2 + concat-map: registry.npmmirror.com/concat-map@0.0.1 + dev: true + + registry.npmmirror.com/brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz} + name: brace-expansion + version: 2.0.1 + dependencies: + balanced-match: registry.npmmirror.com/balanced-match@1.0.2 + dev: true + + registry.npmmirror.com/braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, tarball: https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz} + name: braces + version: 3.0.2 + engines: {node: '>=8'} + dependencies: + fill-range: registry.npmmirror.com/fill-range@7.0.1 + dev: true + + registry.npmmirror.com/browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==, tarball: https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz} + name: browser-stdout + version: 1.3.1 + dev: true + + registry.npmmirror.com/browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==, tarball: https://registry.npmmirror.com/browserslist/-/browserslist-4.22.1.tgz} + name: browserslist + version: 4.22.1 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: registry.npmmirror.com/caniuse-lite@1.0.30001561 + electron-to-chromium: registry.npmmirror.com/electron-to-chromium@1.4.581 + node-releases: registry.npmmirror.com/node-releases@2.0.14 + update-browserslist-db: registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1) + dev: true + + registry.npmmirror.com/bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, tarball: https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz} + name: bser + version: 2.1.1 + dependencies: + node-int64: registry.npmmirror.com/node-int64@0.4.0 + dev: true + + registry.npmmirror.com/buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==, tarball: https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz} + name: buffer-crc32 + version: 0.2.13 + dev: true + + registry.npmmirror.com/buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, tarball: https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz} + name: buffer-from + version: 1.1.2 + dev: true + + registry.npmmirror.com/buffer-indexof-polyfill@1.0.2: + resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==, tarball: https://registry.npmmirror.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz} + name: buffer-indexof-polyfill + version: 1.0.2 + engines: {node: '>=0.10'} + dev: true + + registry.npmmirror.com/buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, tarball: https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz} + name: buffer + version: 5.7.1 + dependencies: + base64-js: registry.npmmirror.com/base64-js@1.5.1 + ieee754: registry.npmmirror.com/ieee754@1.2.1 + dev: true + + registry.npmmirror.com/buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==, tarball: https://registry.npmmirror.com/buffers/-/buffers-0.1.1.tgz} + name: buffers + version: 0.1.1 + engines: {node: '>=0.2.0'} + dev: true + + registry.npmmirror.com/cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==, tarball: https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz} + name: cacheable-lookup + version: 7.0.0 + engines: {node: '>=14.16'} + dev: true + + registry.npmmirror.com/cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==, tarball: https://registry.npmmirror.com/cacheable-request/-/cacheable-request-10.2.14.tgz} + name: cacheable-request + version: 10.2.14 + engines: {node: '>=14.16'} + dependencies: + '@types/http-cache-semantics': registry.npmmirror.com/@types/http-cache-semantics@4.0.4 + get-stream: registry.npmmirror.com/get-stream@6.0.1 + http-cache-semantics: registry.npmmirror.com/http-cache-semantics@4.1.1 + keyv: registry.npmmirror.com/keyv@4.5.4 + mimic-response: registry.npmmirror.com/mimic-response@4.0.0 + normalize-url: registry.npmmirror.com/normalize-url@8.0.0 + responselike: registry.npmmirror.com/responselike@3.0.0 + dev: true + + registry.npmmirror.com/call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==, tarball: https://registry.npmmirror.com/call-bind/-/call-bind-1.0.5.tgz} + name: call-bind + version: 1.0.5 + dependencies: + function-bind: registry.npmmirror.com/function-bind@1.1.2 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + set-function-length: registry.npmmirror.com/set-function-length@1.1.1 + dev: true + + registry.npmmirror.com/callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, tarball: https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz} + name: callsites + version: 3.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz} + name: camelcase + version: 5.3.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz} + name: camelcase + version: 6.3.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/caniuse-lite@1.0.30001561: + resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==, tarball: https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz} + name: caniuse-lite + version: 1.0.30001561 + dev: true + + registry.npmmirror.com/chai@4.3.10: + resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==, tarball: https://registry.npmmirror.com/chai/-/chai-4.3.10.tgz} + name: chai + version: 4.3.10 + engines: {node: '>=4'} + dependencies: + assertion-error: registry.npmmirror.com/assertion-error@1.1.0 + check-error: registry.npmmirror.com/check-error@1.0.3 + deep-eql: registry.npmmirror.com/deep-eql@4.1.3 + get-func-name: registry.npmmirror.com/get-func-name@2.0.2 + loupe: registry.npmmirror.com/loupe@2.3.7 + pathval: registry.npmmirror.com/pathval@1.1.1 + type-detect: registry.npmmirror.com/type-detect@4.0.8 + dev: true + + registry.npmmirror.com/chainsaw@0.1.0: + resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==, tarball: https://registry.npmmirror.com/chainsaw/-/chainsaw-0.1.0.tgz} + name: chainsaw + version: 0.1.0 + dependencies: + traverse: registry.npmmirror.com/traverse@0.3.9 + dev: true + + registry.npmmirror.com/chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, tarball: https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz} + name: chalk + version: 2.4.2 + engines: {node: '>=4'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@3.2.1 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@1.0.5 + supports-color: registry.npmmirror.com/supports-color@5.5.0 + dev: true + + registry.npmmirror.com/chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, tarball: https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz} + name: chalk + version: 4.1.2 + engines: {node: '>=10'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 + supports-color: registry.npmmirror.com/supports-color@7.2.0 + dev: true + + registry.npmmirror.com/chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, tarball: https://registry.npmmirror.com/chalk/-/chalk-5.3.0.tgz} + name: chalk + version: 5.3.0 + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + registry.npmmirror.com/char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, tarball: https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz} + name: char-regex + version: 1.0.2 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, tarball: https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz} + name: chardet + version: 0.7.0 + dev: true + + registry.npmmirror.com/chart.js@4.4.1: + resolution: {integrity: sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==, tarball: https://registry.npmmirror.com/chart.js/-/chart.js-4.4.1.tgz} + name: chart.js + version: 4.4.1 + engines: {pnpm: '>=7'} + dependencies: + '@kurkle/color': registry.npmmirror.com/@kurkle/color@0.3.2 + dev: false + + registry.npmmirror.com/check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, tarball: https://registry.npmmirror.com/check-error/-/check-error-1.0.3.tgz} + name: check-error + version: 1.0.3 + dependencies: + get-func-name: registry.npmmirror.com/get-func-name@2.0.2 + dev: true + + registry.npmmirror.com/chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz} + name: chokidar + version: 3.5.3 + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: registry.npmmirror.com/anymatch@3.1.3 + braces: registry.npmmirror.com/braces@3.0.2 + glob-parent: registry.npmmirror.com/glob-parent@5.1.2 + is-binary-path: registry.npmmirror.com/is-binary-path@2.1.0 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + readdirp: registry.npmmirror.com/readdirp@3.6.0 + optionalDependencies: + fsevents: registry.npmmirror.com/fsevents@2.3.3 + dev: true + + registry.npmmirror.com/chromium-bidi@0.4.16(devtools-protocol@0.0.1147663): + resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==, tarball: https://registry.npmmirror.com/chromium-bidi/-/chromium-bidi-0.4.16.tgz} + id: registry.npmmirror.com/chromium-bidi/0.4.16 + name: chromium-bidi + version: 0.4.16 + peerDependencies: + devtools-protocol: '*' + dependencies: + devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1147663 + mitt: registry.npmmirror.com/mitt@3.0.0 + dev: true + + registry.npmmirror.com/ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, tarball: https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz} + name: ci-info + version: 3.9.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/cjs-module-lexer@1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==, tarball: https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz} + name: cjs-module-lexer + version: 1.2.2 + dev: true + + registry.npmmirror.com/cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, tarball: https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz} + name: cli-cursor + version: 3.1.0 + engines: {node: '>=8'} + dependencies: + restore-cursor: registry.npmmirror.com/restore-cursor@3.1.0 + dev: true + + registry.npmmirror.com/cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==, tarball: https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.1.tgz} + name: cli-spinners + version: 2.9.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==, tarball: https://registry.npmmirror.com/cli-width/-/cli-width-4.1.0.tgz} + name: cli-width + version: 4.1.0 + engines: {node: '>= 12'} + dev: true + + registry.npmmirror.com/cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, tarball: https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz} + name: cliui + version: 7.0.4 + dependencies: + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 + dev: true + + registry.npmmirror.com/cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, tarball: https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz} + name: cliui + version: 8.0.1 + engines: {node: '>=12'} + dependencies: + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 + dev: true + + registry.npmmirror.com/clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, tarball: https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz} + name: clone + version: 1.0.4 + engines: {node: '>=0.8'} + requiresBuild: true + dev: true + + registry.npmmirror.com/co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, tarball: https://registry.npmmirror.com/co/-/co-4.6.0.tgz} + name: co + version: 4.6.0 + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + registry.npmmirror.com/collect-v8-coverage@1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==, tarball: https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz} + name: collect-v8-coverage + version: 1.0.1 + dev: true + + registry.npmmirror.com/color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz} + name: color-convert + version: 1.9.3 + dependencies: + color-name: registry.npmmirror.com/color-name@1.1.3 + dev: true + + registry.npmmirror.com/color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz} + name: color-convert + version: 2.0.1 + engines: {node: '>=7.0.0'} + dependencies: + color-name: registry.npmmirror.com/color-name@1.1.4 + dev: true + + registry.npmmirror.com/color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz} + name: color-name + version: 1.1.3 + dev: true + + registry.npmmirror.com/color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz} + name: color-name + version: 1.1.4 + dev: true + + registry.npmmirror.com/combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, tarball: https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz} + name: combined-stream + version: 1.0.8 + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: registry.npmmirror.com/delayed-stream@1.0.0 + dev: true + + registry.npmmirror.com/commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, tarball: https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz} + name: commander + version: 9.5.0 + engines: {node: ^12.20.0 || >=14} + dev: true + + registry.npmmirror.com/compress-commons@5.0.1: + resolution: {integrity: sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==, tarball: https://registry.npmmirror.com/compress-commons/-/compress-commons-5.0.1.tgz} + name: compress-commons + version: 5.0.1 + engines: {node: '>= 12.0.0'} + dependencies: + crc-32: registry.npmmirror.com/crc-32@1.2.2 + crc32-stream: registry.npmmirror.com/crc32-stream@5.0.0 + normalize-path: registry.npmmirror.com/normalize-path@3.0.0 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + dev: true + + registry.npmmirror.com/concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, tarball: https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz} + name: concat-map + version: 0.0.1 + dev: true + + registry.npmmirror.com/convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz} + name: convert-source-map + version: 2.0.0 + dev: true + + registry.npmmirror.com/core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, tarball: https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz} + name: core-util-is + version: 1.0.3 + dev: true + + registry.npmmirror.com/crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, tarball: https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz} + name: crc-32 + version: 1.2.2 + engines: {node: '>=0.8'} + hasBin: true + dev: true + + registry.npmmirror.com/crc32-stream@5.0.0: + resolution: {integrity: sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==, tarball: https://registry.npmmirror.com/crc32-stream/-/crc32-stream-5.0.0.tgz} + name: crc32-stream + version: 5.0.0 + engines: {node: '>= 12.0.0'} + dependencies: + crc-32: registry.npmmirror.com/crc-32@1.2.2 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + dev: true + + registry.npmmirror.com/create-jest@29.7.0(@types/node@20.11.0): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==, tarball: https://registry.npmmirror.com/create-jest/-/create-jest-29.7.0.tgz} + id: registry.npmmirror.com/create-jest/29.7.0 + name: create-jest + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + exit: registry.npmmirror.com/exit@0.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) + jest-util: registry.npmmirror.com/jest-util@29.7.0 + prompts: registry.npmmirror.com/prompts@2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + registry.npmmirror.com/cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==, tarball: https://registry.npmmirror.com/cross-fetch/-/cross-fetch-4.0.0.tgz} + name: cross-fetch + version: 4.0.0 + dependencies: + node-fetch: registry.npmmirror.com/node-fetch@2.7.0 + transitivePeerDependencies: + - encoding + dev: true + + registry.npmmirror.com/cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, tarball: https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz} + name: cross-spawn + version: 7.0.3 + engines: {node: '>= 8'} + dependencies: + path-key: registry.npmmirror.com/path-key@3.1.1 + shebang-command: registry.npmmirror.com/shebang-command@2.0.0 + which: registry.npmmirror.com/which@2.0.2 + dev: true + + registry.npmmirror.com/css-shorthand-properties@1.1.1: + resolution: {integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==, tarball: https://registry.npmmirror.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz} + name: css-shorthand-properties + version: 1.1.1 + dev: true + + registry.npmmirror.com/css-value@0.0.1: + resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==, tarball: https://registry.npmmirror.com/css-value/-/css-value-0.0.1.tgz} + name: css-value + version: 0.0.1 + dev: true + + registry.npmmirror.com/cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==, tarball: https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz} + name: cssom + version: 0.3.8 + dev: true + + registry.npmmirror.com/cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==, tarball: https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz} + name: cssom + version: 0.5.0 + dev: true + + registry.npmmirror.com/cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==, tarball: https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz} + name: cssstyle + version: 2.3.0 + engines: {node: '>=8'} + dependencies: + cssom: registry.npmmirror.com/cssom@0.3.8 + dev: true + + registry.npmmirror.com/data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, tarball: https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz} + name: data-uri-to-buffer + version: 4.0.1 + engines: {node: '>= 12'} + dev: true + + registry.npmmirror.com/data-uri-to-buffer@6.0.1: + resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==, tarball: https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz} + name: data-uri-to-buffer + version: 6.0.1 + engines: {node: '>= 14'} + dev: true + + registry.npmmirror.com/data-urls@3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==, tarball: https://registry.npmmirror.com/data-urls/-/data-urls-3.0.2.tgz} + name: data-urls + version: 3.0.2 + engines: {node: '>=12'} + dependencies: + abab: registry.npmmirror.com/abab@2.0.6 + whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype@3.0.0 + whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0 + dev: true + + registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, tarball: https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz} + id: registry.npmmirror.com/debug/4.3.4 + name: debug + version: 4.3.4 + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: optional: true - - registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11: - resolution: - { - integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==, - tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz, - } - name: "@esbuild/netbsd-x64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + dependencies: + ms: registry.npmmirror.com/ms@2.1.2 + supports-color: registry.npmmirror.com/supports-color@8.1.1 + dev: true + + registry.npmmirror.com/decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==, tarball: https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz} + name: decamelize + version: 4.0.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/decamelize@6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==, tarball: https://registry.npmmirror.com/decamelize/-/decamelize-6.0.0.tgz} + name: decamelize + version: 6.0.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + registry.npmmirror.com/decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, tarball: https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz} + name: decimal.js + version: 10.4.3 + dev: true + + registry.npmmirror.com/decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, tarball: https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz} + name: decompress-response + version: 6.0.0 + engines: {node: '>=10'} + dependencies: + mimic-response: registry.npmmirror.com/mimic-response@3.1.0 + dev: true + + registry.npmmirror.com/dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==, tarball: https://registry.npmmirror.com/dedent/-/dedent-1.5.1.tgz} + name: dedent + version: 1.5.1 + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: optional: true - - registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11: - resolution: - { - integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==, - tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz, - } - name: "@esbuild/openbsd-x64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + dev: true + + registry.npmmirror.com/deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==, tarball: https://registry.npmmirror.com/deep-eql/-/deep-eql-4.1.3.tgz} + name: deep-eql + version: 4.1.3 + engines: {node: '>=6'} + dependencies: + type-detect: registry.npmmirror.com/type-detect@4.0.8 + dev: true + + registry.npmmirror.com/deep-equal@2.2.1: + resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==, tarball: https://registry.npmmirror.com/deep-equal/-/deep-equal-2.2.1.tgz} + name: deep-equal + version: 2.2.1 + dependencies: + array-buffer-byte-length: registry.npmmirror.com/array-buffer-byte-length@1.0.0 + call-bind: registry.npmmirror.com/call-bind@1.0.5 + es-get-iterator: registry.npmmirror.com/es-get-iterator@1.1.3 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + is-arguments: registry.npmmirror.com/is-arguments@1.1.1 + is-array-buffer: registry.npmmirror.com/is-array-buffer@3.0.2 + is-date-object: registry.npmmirror.com/is-date-object@1.0.5 + is-regex: registry.npmmirror.com/is-regex@1.1.4 + is-shared-array-buffer: registry.npmmirror.com/is-shared-array-buffer@1.0.2 + isarray: registry.npmmirror.com/isarray@2.0.5 + object-is: registry.npmmirror.com/object-is@1.1.5 + object-keys: registry.npmmirror.com/object-keys@1.1.1 + object.assign: registry.npmmirror.com/object.assign@4.1.5 + regexp.prototype.flags: registry.npmmirror.com/regexp.prototype.flags@1.5.0 + side-channel: registry.npmmirror.com/side-channel@1.0.4 + which-boxed-primitive: registry.npmmirror.com/which-boxed-primitive@1.0.2 + which-collection: registry.npmmirror.com/which-collection@1.0.1 + which-typed-array: registry.npmmirror.com/which-typed-array@1.1.13 + dev: true + + registry.npmmirror.com/deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, tarball: https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz} + name: deep-is + version: 0.1.4 + dev: true + + registry.npmmirror.com/deepmerge-ts@5.1.0: + resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==, tarball: https://registry.npmmirror.com/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz} + name: deepmerge-ts + version: 5.1.0 + engines: {node: '>=16.0.0'} + dev: true + + registry.npmmirror.com/deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, tarball: https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz} + name: deepmerge + version: 4.3.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, tarball: https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz} + name: defaults + version: 1.0.4 + requiresBuild: true + dependencies: + clone: registry.npmmirror.com/clone@1.0.4 + dev: true + + registry.npmmirror.com/defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, tarball: https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz} + name: defer-to-connect + version: 2.0.1 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==, tarball: https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.1.tgz} + name: define-data-property + version: 1.1.1 + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 + dev: true + + registry.npmmirror.com/define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, tarball: https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz} + name: define-properties + version: 1.2.1 + engines: {node: '>= 0.4'} + dependencies: + define-data-property: registry.npmmirror.com/define-data-property@1.1.1 + has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 + object-keys: registry.npmmirror.com/object-keys@1.1.1 + dev: true + + registry.npmmirror.com/degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==, tarball: https://registry.npmmirror.com/degenerator/-/degenerator-5.0.1.tgz} + name: degenerator + version: 5.0.1 + engines: {node: '>= 14'} + dependencies: + ast-types: registry.npmmirror.com/ast-types@0.13.4 + escodegen: registry.npmmirror.com/escodegen@2.1.0 + esprima: registry.npmmirror.com/esprima@4.0.1 + dev: true + + registry.npmmirror.com/delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, tarball: https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz} + name: delayed-stream + version: 1.0.0 + engines: {node: '>=0.4.0'} + dev: true + + registry.npmmirror.com/detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, tarball: https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz} + name: detect-newline + version: 3.1.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/devtools-protocol@0.0.1147663: + resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==, tarball: https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz} + name: devtools-protocol + version: 0.0.1147663 + dev: true + + registry.npmmirror.com/devtools-protocol@0.0.1239539: + resolution: {integrity: sha512-uS7hZVqZxGyZwR8lX/8wWyNLGEYs1wWWxN7qeRC+wBZ4VM5JXYwCJg8hofEna5yX0W2cavpjHOE4ukHXLHlEaA==, tarball: https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1239539.tgz} + name: devtools-protocol + version: 0.0.1239539 + dev: true + + registry.npmmirror.com/diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, tarball: https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz} + name: diff-sequences + version: 29.6.3 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + registry.npmmirror.com/diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==, tarball: https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz} + name: diff + version: 5.0.0 + engines: {node: '>=0.3.1'} + dev: true + + registry.npmmirror.com/diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==, tarball: https://registry.npmmirror.com/diff/-/diff-5.1.0.tgz} + name: diff + version: 5.1.0 + engines: {node: '>=0.3.1'} + dev: true + + registry.npmmirror.com/dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, tarball: https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz} + name: dir-glob + version: 3.0.1 + engines: {node: '>=8'} + dependencies: + path-type: registry.npmmirror.com/path-type@4.0.0 + dev: true + + registry.npmmirror.com/doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, tarball: https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz} + name: doctrine + version: 3.0.0 + engines: {node: '>=6.0.0'} + dependencies: + esutils: registry.npmmirror.com/esutils@2.0.3 + dev: true + + registry.npmmirror.com/domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==, tarball: https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz} + name: domexception + version: 4.0.0 + engines: {node: '>=12'} + deprecated: Use your platform's native DOMException instead + dependencies: + webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 + dev: true + + registry.npmmirror.com/dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, tarball: https://registry.npmmirror.com/dotenv/-/dotenv-16.3.1.tgz} + name: dotenv + version: 16.3.1 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, tarball: https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz} + name: duplexer2 + version: 0.1.4 + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@2.3.8 + dev: true + + registry.npmmirror.com/eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, tarball: https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz} + name: eastasianwidth + version: 0.2.0 + dev: true + + registry.npmmirror.com/easy-table@1.2.0: + resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==, tarball: https://registry.npmmirror.com/easy-table/-/easy-table-1.2.0.tgz} + name: easy-table + version: 1.2.0 + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 + optionalDependencies: + wcwidth: registry.npmmirror.com/wcwidth@1.0.1 + dev: true + + registry.npmmirror.com/edge-paths@3.0.5: + resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==, tarball: https://registry.npmmirror.com/edge-paths/-/edge-paths-3.0.5.tgz} + name: edge-paths + version: 3.0.5 + engines: {node: '>=14.0.0'} + dependencies: + '@types/which': registry.npmmirror.com/@types/which@2.0.2 + which: registry.npmmirror.com/which@2.0.2 + dev: true + + registry.npmmirror.com/edgedriver@5.3.8: + resolution: {integrity: sha512-FWLPDuwJDeGGgtmlqTXb4lQi/HV9yylLo1F9O1g9TLqSemA5T6xH28seUIfyleVirLFtDQyKNUxKsMhMT4IfnA==, tarball: https://registry.npmmirror.com/edgedriver/-/edgedriver-5.3.8.tgz} + name: edgedriver + version: 5.3.8 + hasBin: true + requiresBuild: true + dependencies: + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + edge-paths: registry.npmmirror.com/edge-paths@3.0.5 + node-fetch: registry.npmmirror.com/node-fetch@3.3.2 + unzipper: registry.npmmirror.com/unzipper@0.10.14 + which: registry.npmmirror.com/which@4.0.0 + dev: true + + registry.npmmirror.com/ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==, tarball: https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz} + name: ejs + version: 3.1.9 + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: registry.npmmirror.com/jake@10.8.5 + dev: true + + registry.npmmirror.com/electron-to-chromium@1.4.581: + resolution: {integrity: sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==, tarball: https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz} + name: electron-to-chromium + version: 1.4.581 + dev: true + + registry.npmmirror.com/emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, tarball: https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz} + name: emittery + version: 0.13.1 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz} + name: emoji-regex + version: 8.0.0 + dev: true + + registry.npmmirror.com/emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz} + name: emoji-regex + version: 9.2.2 + dev: true + + registry.npmmirror.com/end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, tarball: https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz} + name: end-of-stream + version: 1.4.4 + dependencies: + once: registry.npmmirror.com/once@1.4.0 + dev: true + + registry.npmmirror.com/entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, tarball: https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz} + name: entities + version: 4.5.0 + engines: {node: '>=0.12'} + dev: true + + registry.npmmirror.com/error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, tarball: https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz} + name: error-ex + version: 1.3.2 + dependencies: + is-arrayish: registry.npmmirror.com/is-arrayish@0.2.1 + dev: true + + registry.npmmirror.com/es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==, tarball: https://registry.npmmirror.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz} + name: es-get-iterator + version: 1.1.3 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + is-arguments: registry.npmmirror.com/is-arguments@1.1.1 + is-map: registry.npmmirror.com/is-map@2.0.2 + is-set: registry.npmmirror.com/is-set@2.0.2 + is-string: registry.npmmirror.com/is-string@1.0.7 + isarray: registry.npmmirror.com/isarray@2.0.5 + stop-iteration-iterator: registry.npmmirror.com/stop-iteration-iterator@1.0.0 + dev: true + + registry.npmmirror.com/esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==, tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.19.11.tgz} + name: esbuild + version: 0.19.11 + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11 + '@esbuild/android-arm': registry.npmmirror.com/@esbuild/android-arm@0.19.11 + '@esbuild/android-arm64': registry.npmmirror.com/@esbuild/android-arm64@0.19.11 + '@esbuild/android-x64': registry.npmmirror.com/@esbuild/android-x64@0.19.11 + '@esbuild/darwin-arm64': registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11 + '@esbuild/darwin-x64': registry.npmmirror.com/@esbuild/darwin-x64@0.19.11 + '@esbuild/freebsd-arm64': registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11 + '@esbuild/freebsd-x64': registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11 + '@esbuild/linux-arm': registry.npmmirror.com/@esbuild/linux-arm@0.19.11 + '@esbuild/linux-arm64': registry.npmmirror.com/@esbuild/linux-arm64@0.19.11 + '@esbuild/linux-ia32': registry.npmmirror.com/@esbuild/linux-ia32@0.19.11 + '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64@0.19.11 + '@esbuild/linux-mips64el': registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11 + '@esbuild/linux-ppc64': registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11 + '@esbuild/linux-riscv64': registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11 + '@esbuild/linux-s390x': registry.npmmirror.com/@esbuild/linux-s390x@0.19.11 + '@esbuild/linux-x64': registry.npmmirror.com/@esbuild/linux-x64@0.19.11 + '@esbuild/netbsd-x64': registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11 + '@esbuild/openbsd-x64': registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11 + '@esbuild/sunos-x64': registry.npmmirror.com/@esbuild/sunos-x64@0.19.11 + '@esbuild/win32-arm64': registry.npmmirror.com/@esbuild/win32-arm64@0.19.11 + '@esbuild/win32-ia32': registry.npmmirror.com/@esbuild/win32-ia32@0.19.11 + '@esbuild/win32-x64': registry.npmmirror.com/@esbuild/win32-x64@0.19.11 + dev: true + + registry.npmmirror.com/escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, tarball: https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz} + name: escalade + version: 3.1.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz} + name: escape-string-regexp + version: 1.0.5 + engines: {node: '>=0.8.0'} + dev: true + + registry.npmmirror.com/escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz} + name: escape-string-regexp + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz} + name: escape-string-regexp + version: 4.0.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz} + name: escape-string-regexp + version: 5.0.0 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, tarball: https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz} + name: escodegen + version: 2.1.0 + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: registry.npmmirror.com/esprima@4.0.1 + estraverse: registry.npmmirror.com/estraverse@5.3.0 + esutils: registry.npmmirror.com/esutils@2.0.3 + optionalDependencies: + source-map: registry.npmmirror.com/source-map@0.6.1 + dev: true + + registry.npmmirror.com/eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, tarball: https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz} + name: eslint-scope + version: 7.2.2 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: registry.npmmirror.com/esrecurse@4.3.0 + estraverse: registry.npmmirror.com/estraverse@5.3.0 + dev: true + + registry.npmmirror.com/eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, tarball: https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz} + name: eslint-visitor-keys + version: 3.4.3 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + registry.npmmirror.com/eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, tarball: https://registry.npmmirror.com/eslint/-/eslint-8.56.0.tgz} + name: eslint + version: 8.56.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': registry.npmmirror.com/@eslint-community/regexpp@4.10.0 + '@eslint/eslintrc': registry.npmmirror.com/@eslint/eslintrc@2.1.4 + '@eslint/js': registry.npmmirror.com/@eslint/js@8.56.0 + '@humanwhocodes/config-array': registry.npmmirror.com/@humanwhocodes/config-array@0.11.13 + '@humanwhocodes/module-importer': registry.npmmirror.com/@humanwhocodes/module-importer@1.0.1 + '@nodelib/fs.walk': registry.npmmirror.com/@nodelib/fs.walk@1.2.8 + '@ungap/structured-clone': registry.npmmirror.com/@ungap/structured-clone@1.2.0 + ajv: registry.npmmirror.com/ajv@6.12.6 + chalk: registry.npmmirror.com/chalk@4.1.2 + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + doctrine: registry.npmmirror.com/doctrine@3.0.0 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 + eslint-scope: registry.npmmirror.com/eslint-scope@7.2.2 + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 + espree: registry.npmmirror.com/espree@9.6.1 + esquery: registry.npmmirror.com/esquery@1.5.0 + esutils: registry.npmmirror.com/esutils@2.0.3 + fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 + file-entry-cache: registry.npmmirror.com/file-entry-cache@6.0.1 + find-up: registry.npmmirror.com/find-up@5.0.0 + glob-parent: registry.npmmirror.com/glob-parent@6.0.2 + globals: registry.npmmirror.com/globals@13.23.0 + graphemer: registry.npmmirror.com/graphemer@1.4.0 + ignore: registry.npmmirror.com/ignore@5.2.4 + imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 + is-glob: registry.npmmirror.com/is-glob@4.0.3 + is-path-inside: registry.npmmirror.com/is-path-inside@3.0.3 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + json-stable-stringify-without-jsonify: registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1 + levn: registry.npmmirror.com/levn@0.4.1 + lodash.merge: registry.npmmirror.com/lodash.merge@4.6.2 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + natural-compare: registry.npmmirror.com/natural-compare@1.4.0 + optionator: registry.npmmirror.com/optionator@0.9.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + text-table: registry.npmmirror.com/text-table@0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, tarball: https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz} + name: espree + version: 9.6.1 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: registry.npmmirror.com/acorn@8.11.2 + acorn-jsx: registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.11.2) + eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 + dev: true + + registry.npmmirror.com/esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, tarball: https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz} + name: esprima + version: 4.0.1 + engines: {node: '>=4'} + hasBin: true + dev: true + + registry.npmmirror.com/esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, tarball: https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz} + name: esquery + version: 1.5.0 + engines: {node: '>=0.10'} + dependencies: + estraverse: registry.npmmirror.com/estraverse@5.3.0 + dev: true + + registry.npmmirror.com/esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, tarball: https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz} + name: esrecurse + version: 4.3.0 + engines: {node: '>=4.0'} + dependencies: + estraverse: registry.npmmirror.com/estraverse@5.3.0 + dev: true + + registry.npmmirror.com/estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, tarball: https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz} + name: estraverse + version: 5.3.0 + engines: {node: '>=4.0'} + dev: true + + registry.npmmirror.com/esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, tarball: https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz} + name: esutils + version: 2.0.3 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, tarball: https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz} + name: execa + version: 5.1.1 + engines: {node: '>=10'} + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + get-stream: registry.npmmirror.com/get-stream@6.0.1 + human-signals: registry.npmmirror.com/human-signals@2.1.0 + is-stream: registry.npmmirror.com/is-stream@2.0.1 + merge-stream: registry.npmmirror.com/merge-stream@2.0.0 + npm-run-path: registry.npmmirror.com/npm-run-path@4.0.1 + onetime: registry.npmmirror.com/onetime@5.1.2 + signal-exit: registry.npmmirror.com/signal-exit@3.0.7 + strip-final-newline: registry.npmmirror.com/strip-final-newline@2.0.0 + dev: true + + registry.npmmirror.com/execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, tarball: https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz} + name: execa + version: 8.0.1 + engines: {node: '>=16.17'} + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + get-stream: registry.npmmirror.com/get-stream@8.0.1 + human-signals: registry.npmmirror.com/human-signals@5.0.0 + is-stream: registry.npmmirror.com/is-stream@3.0.0 + merge-stream: registry.npmmirror.com/merge-stream@2.0.0 + npm-run-path: registry.npmmirror.com/npm-run-path@5.1.0 + onetime: registry.npmmirror.com/onetime@6.0.0 + signal-exit: registry.npmmirror.com/signal-exit@4.1.0 + strip-final-newline: registry.npmmirror.com/strip-final-newline@3.0.0 + dev: true + + registry.npmmirror.com/exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, tarball: https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz} + name: exit + version: 0.1.2 + engines: {node: '>= 0.8.0'} + dev: true + + registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6): + resolution: {integrity: sha512-JD5aboj/tCiMXdEPCpt3BA0xL3DBhNu1MoiOdBGT9LT+9COIXoDG6Ks6h5S4c4PNwLs6xSeU8s7XxFAmBPu45Q==, tarball: https://registry.npmmirror.com/expect-webdriverio/-/expect-webdriverio-4.8.1.tgz} + id: registry.npmmirror.com/expect-webdriverio/4.8.1 + name: expect-webdriverio + version: 4.8.1 + engines: {node: '>=16 || >=18 || >=20'} + dependencies: + expect: registry.npmmirror.com/expect@29.7.0 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + lodash.isequal: registry.npmmirror.com/lodash.isequal@4.5.0 + optionalDependencies: + '@wdio/globals': registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) + transitivePeerDependencies: + - bufferutil + - devtools + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==, tarball: https://registry.npmmirror.com/expect/-/expect-29.7.0.tgz} + name: expect + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': registry.npmmirror.com/@jest/expect-utils@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + dev: true + + registry.npmmirror.com/external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, tarball: https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz} + name: external-editor + version: 3.1.0 + engines: {node: '>=4'} + dependencies: + chardet: registry.npmmirror.com/chardet@0.7.0 + iconv-lite: registry.npmmirror.com/iconv-lite@0.4.24 + tmp: registry.npmmirror.com/tmp@0.0.33 + dev: true + + registry.npmmirror.com/extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==, tarball: https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz} + name: extract-zip + version: 2.0.1 + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + get-stream: registry.npmmirror.com/get-stream@5.2.0 + yauzl: registry.npmmirror.com/yauzl@2.10.0 + optionalDependencies: + '@types/yauzl': registry.npmmirror.com/@types/yauzl@2.10.3 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==, tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz} + name: fast-deep-equal + version: 2.0.1 + dev: true + + registry.npmmirror.com/fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz} + name: fast-deep-equal + version: 3.1.3 + dev: true + + registry.npmmirror.com/fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, tarball: https://registry.npmmirror.com/fast-fifo/-/fast-fifo-1.3.2.tgz} + name: fast-fifo + version: 1.3.2 + dev: true + + registry.npmmirror.com/fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, tarball: https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz} + name: fast-glob + version: 3.3.2 + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': registry.npmmirror.com/@nodelib/fs.stat@2.0.5 + '@nodelib/fs.walk': registry.npmmirror.com/@nodelib/fs.walk@1.2.8 + glob-parent: registry.npmmirror.com/glob-parent@5.1.2 + merge2: registry.npmmirror.com/merge2@1.4.1 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + dev: true + + registry.npmmirror.com/fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, tarball: https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz} + name: fast-json-stable-stringify + version: 2.1.0 + dev: true + + registry.npmmirror.com/fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, tarball: https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz} + name: fast-levenshtein + version: 2.0.6 + dev: true + + registry.npmmirror.com/fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, tarball: https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz} + name: fastq + version: 1.15.0 + dependencies: + reusify: registry.npmmirror.com/reusify@1.0.4 + dev: true + + registry.npmmirror.com/fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, tarball: https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz} + name: fb-watchman + version: 2.0.2 + dependencies: + bser: registry.npmmirror.com/bser@2.1.1 + dev: true + + registry.npmmirror.com/fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==, tarball: https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz} + name: fd-slicer + version: 1.1.0 + dependencies: + pend: registry.npmmirror.com/pend@1.2.0 + dev: true + + registry.npmmirror.com/fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, tarball: https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz} + name: fetch-blob + version: 3.2.0 + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: registry.npmmirror.com/node-domexception@1.0.0 + web-streams-polyfill: registry.npmmirror.com/web-streams-polyfill@3.2.1 + dev: true + + registry.npmmirror.com/figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==, tarball: https://registry.npmmirror.com/figures/-/figures-5.0.0.tgz} + name: figures + version: 5.0.0 + engines: {node: '>=14'} + dependencies: + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@5.0.0 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported@1.3.0 + dev: true + + registry.npmmirror.com/file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, tarball: https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz} + name: file-entry-cache + version: 6.0.1 + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: registry.npmmirror.com/flat-cache@3.1.1 + dev: true + + registry.npmmirror.com/filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, tarball: https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz} + name: filelist + version: 1.0.4 + dependencies: + minimatch: registry.npmmirror.com/minimatch@5.1.6 + dev: true + + registry.npmmirror.com/fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, tarball: https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz} + name: fill-range + version: 7.0.1 + engines: {node: '>=8'} + dependencies: + to-regex-range: registry.npmmirror.com/to-regex-range@5.0.1 + dev: true + + registry.npmmirror.com/find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, tarball: https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz} + name: find-up + version: 4.1.0 + engines: {node: '>=8'} + dependencies: + locate-path: registry.npmmirror.com/locate-path@5.0.0 + path-exists: registry.npmmirror.com/path-exists@4.0.0 + dev: true + + registry.npmmirror.com/find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, tarball: https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz} + name: find-up + version: 5.0.0 + engines: {node: '>=10'} + dependencies: + locate-path: registry.npmmirror.com/locate-path@6.0.0 + path-exists: registry.npmmirror.com/path-exists@4.0.0 + dev: true + + registry.npmmirror.com/find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==, tarball: https://registry.npmmirror.com/find-up/-/find-up-6.3.0.tgz} + name: find-up + version: 6.3.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: registry.npmmirror.com/locate-path@7.2.0 + path-exists: registry.npmmirror.com/path-exists@5.0.0 + dev: true + + registry.npmmirror.com/flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==, tarball: https://registry.npmmirror.com/flat-cache/-/flat-cache-3.1.1.tgz} + name: flat-cache + version: 3.1.1 + engines: {node: '>=12.0.0'} + dependencies: + flatted: registry.npmmirror.com/flatted@3.2.9 + keyv: registry.npmmirror.com/keyv@4.5.4 + rimraf: registry.npmmirror.com/rimraf@3.0.2 + dev: true + + registry.npmmirror.com/flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, tarball: https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz} + name: flat + version: 5.0.2 + hasBin: true + dev: true + + registry.npmmirror.com/flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, tarball: https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz} + name: flatted + version: 3.2.9 + dev: true + + registry.npmmirror.com/for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, tarball: https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz} + name: for-each + version: 0.3.3 + dependencies: + is-callable: registry.npmmirror.com/is-callable@1.2.7 + dev: true + + registry.npmmirror.com/foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, tarball: https://registry.npmmirror.com/foreground-child/-/foreground-child-3.1.1.tgz} + name: foreground-child + version: 3.1.1 + engines: {node: '>=14'} + dependencies: + cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 + signal-exit: registry.npmmirror.com/signal-exit@4.1.0 + dev: true + + registry.npmmirror.com/form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==, tarball: https://registry.npmmirror.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz} + name: form-data-encoder + version: 2.1.4 + engines: {node: '>= 14.17'} + dev: true + + registry.npmmirror.com/form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, tarball: https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz} + name: form-data + version: 4.0.0 + engines: {node: '>= 6'} + dependencies: + asynckit: registry.npmmirror.com/asynckit@0.4.0 + combined-stream: registry.npmmirror.com/combined-stream@1.0.8 + mime-types: registry.npmmirror.com/mime-types@2.1.35 + dev: true + + registry.npmmirror.com/formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, tarball: https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz} + name: formdata-polyfill + version: 4.0.10 + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: registry.npmmirror.com/fetch-blob@3.2.0 + dev: true + + registry.npmmirror.com/fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, tarball: https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz} + name: fs-extra + version: 8.1.0 + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jsonfile: registry.npmmirror.com/jsonfile@4.0.0 + universalify: registry.npmmirror.com/universalify@0.1.2 + dev: true + + registry.npmmirror.com/fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, tarball: https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz} + name: fs.realpath + version: 1.0.0 + dev: true + + registry.npmmirror.com/fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz} + name: fsevents + version: 2.3.3 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/fsrs.js@1.2.1: + resolution: {integrity: sha512-nPvEhYKtXYzCdaSwT024dqwfXAaRmQ+qhppu2JxL3hQDYku7+2DrQH1R6s777VVo2Og7vuACTYyz64DcuDZ78A==, tarball: https://registry.npmmirror.com/fsrs.js/-/fsrs.js-1.2.1.tgz} + name: fsrs.js + version: 1.2.1 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==, tarball: https://registry.npmmirror.com/fstream/-/fstream-1.0.12.tgz} + name: fstream + version: 1.0.12 + engines: {node: '>=0.6'} + dependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + inherits: registry.npmmirror.com/inherits@2.0.4 + mkdirp: registry.npmmirror.com/mkdirp@0.5.6 + rimraf: registry.npmmirror.com/rimraf@2.7.1 + dev: true + + registry.npmmirror.com/function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz} + name: function-bind + version: 1.1.2 + dev: true + + registry.npmmirror.com/functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, tarball: https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz} + name: functions-have-names + version: 1.2.3 + dev: true + + registry.npmmirror.com/gaze@1.1.3: + resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==, tarball: https://registry.npmmirror.com/gaze/-/gaze-1.1.3.tgz} + name: gaze + version: 1.1.3 + engines: {node: '>= 4.0.0'} + dependencies: + globule: registry.npmmirror.com/globule@1.3.4 + dev: true + + registry.npmmirror.com/geckodriver@4.2.1: + resolution: {integrity: sha512-4m/CRk0OI8MaANRuFIahvOxYTSjlNAO2p9JmE14zxueknq6cdtB5M9UGRQ8R9aMV0bLGNVHHDnDXmoXdOwJfWg==, tarball: https://registry.npmmirror.com/geckodriver/-/geckodriver-4.2.1.tgz} + name: geckodriver + version: 4.2.1 + engines: {node: ^16.13 || >=18 || >=20} + hasBin: true + requiresBuild: true + dependencies: + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + decamelize: registry.npmmirror.com/decamelize@6.0.0 + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + node-fetch: registry.npmmirror.com/node-fetch@3.3.2 + tar-fs: registry.npmmirror.com/tar-fs@3.0.4 + unzipper: registry.npmmirror.com/unzipper@0.10.14 + which: registry.npmmirror.com/which@4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, tarball: https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz} + name: gensync + version: 1.0.0-beta.2 + engines: {node: '>=6.9.0'} + dev: true + + registry.npmmirror.com/get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, tarball: https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz} + name: get-caller-file + version: 2.0.5 + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + registry.npmmirror.com/get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, tarball: https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.2.tgz} + name: get-func-name + version: 2.0.2 + dev: true + + registry.npmmirror.com/get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==, tarball: https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz} + name: get-intrinsic + version: 1.2.2 + dependencies: + function-bind: registry.npmmirror.com/function-bind@1.1.2 + has-proto: registry.npmmirror.com/has-proto@1.0.1 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + hasown: registry.npmmirror.com/hasown@2.0.0 + dev: true + + registry.npmmirror.com/get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, tarball: https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz} + name: get-package-type + version: 0.1.0 + engines: {node: '>=8.0.0'} + dev: true + + registry.npmmirror.com/get-port@7.0.0: + resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==, tarball: https://registry.npmmirror.com/get-port/-/get-port-7.0.0.tgz} + name: get-port + version: 7.0.0 + engines: {node: '>=16'} + dev: true + + registry.npmmirror.com/get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz} + name: get-stream + version: 5.2.0 + engines: {node: '>=8'} + dependencies: + pump: registry.npmmirror.com/pump@3.0.0 + dev: true + + registry.npmmirror.com/get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz} + name: get-stream + version: 6.0.1 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, tarball: https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz} + name: get-stream + version: 8.0.1 + engines: {node: '>=16'} + dev: true + + registry.npmmirror.com/get-uri@6.0.2: + resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==, tarball: https://registry.npmmirror.com/get-uri/-/get-uri-6.0.2.tgz} + name: get-uri + version: 6.0.2 + engines: {node: '>= 14'} + dependencies: + basic-ftp: registry.npmmirror.com/basic-ftp@5.0.3 + data-uri-to-buffer: registry.npmmirror.com/data-uri-to-buffer@6.0.1 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + fs-extra: registry.npmmirror.com/fs-extra@8.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz} + name: glob-parent + version: 5.1.2 + engines: {node: '>= 6'} + dependencies: + is-glob: registry.npmmirror.com/is-glob@4.0.3 + dev: true + + registry.npmmirror.com/glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz} + name: glob-parent + version: 6.0.2 + engines: {node: '>=10.13.0'} + dependencies: + is-glob: registry.npmmirror.com/is-glob@4.0.3 + dev: true + + registry.npmmirror.com/glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==, tarball: https://registry.npmmirror.com/glob/-/glob-10.3.10.tgz} + name: glob + version: 10.3.10 + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: registry.npmmirror.com/foreground-child@3.1.1 + jackspeak: registry.npmmirror.com/jackspeak@2.3.6 + minimatch: registry.npmmirror.com/minimatch@9.0.3 + minipass: registry.npmmirror.com/minipass@7.0.4 + path-scurry: registry.npmmirror.com/path-scurry@1.10.1 + dev: true + + registry.npmmirror.com/glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==, tarball: https://registry.npmmirror.com/glob/-/glob-7.1.7.tgz} + name: glob + version: 7.1.7 + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + once: registry.npmmirror.com/once@1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 + dev: true + + registry.npmmirror.com/glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, tarball: https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz} + name: glob + version: 7.2.0 + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + once: registry.npmmirror.com/once@1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 + dev: true + + registry.npmmirror.com/glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, tarball: https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz} + name: glob + version: 7.2.3 + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + once: registry.npmmirror.com/once@1.4.0 + path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 + dev: true + + registry.npmmirror.com/glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, tarball: https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz} + name: glob + version: 8.1.0 + engines: {node: '>=12'} + dependencies: + fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 + inflight: registry.npmmirror.com/inflight@1.0.6 + inherits: registry.npmmirror.com/inherits@2.0.4 + minimatch: registry.npmmirror.com/minimatch@5.1.6 + once: registry.npmmirror.com/once@1.4.0 + dev: true + + registry.npmmirror.com/globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, tarball: https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz} + name: globals + version: 11.12.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, tarball: https://registry.npmmirror.com/globals/-/globals-13.23.0.tgz} + name: globals + version: 13.23.0 + engines: {node: '>=8'} + dependencies: + type-fest: registry.npmmirror.com/type-fest@0.20.2 + dev: true + + registry.npmmirror.com/globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, tarball: https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz} + name: globby + version: 11.1.0 + engines: {node: '>=10'} + dependencies: + array-union: registry.npmmirror.com/array-union@2.1.0 + dir-glob: registry.npmmirror.com/dir-glob@3.0.1 + fast-glob: registry.npmmirror.com/fast-glob@3.3.2 + ignore: registry.npmmirror.com/ignore@5.2.4 + merge2: registry.npmmirror.com/merge2@1.4.1 + slash: registry.npmmirror.com/slash@3.0.0 + dev: true + + registry.npmmirror.com/globule@1.3.4: + resolution: {integrity: sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==, tarball: https://registry.npmmirror.com/globule/-/globule-1.3.4.tgz} + name: globule + version: 1.3.4 + engines: {node: '>= 0.10'} + dependencies: + glob: registry.npmmirror.com/glob@7.1.7 + lodash: registry.npmmirror.com/lodash@4.17.21 + minimatch: registry.npmmirror.com/minimatch@3.0.8 + dev: true + + registry.npmmirror.com/gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, tarball: https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz} + name: gopd + version: 1.0.1 + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + dev: true + + registry.npmmirror.com/got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==, tarball: https://registry.npmmirror.com/got/-/got-12.6.1.tgz} + name: got + version: 12.6.1 + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': registry.npmmirror.com/@sindresorhus/is@5.3.0 + '@szmarczak/http-timer': registry.npmmirror.com/@szmarczak/http-timer@5.0.1 + cacheable-lookup: registry.npmmirror.com/cacheable-lookup@7.0.0 + cacheable-request: registry.npmmirror.com/cacheable-request@10.2.14 + decompress-response: registry.npmmirror.com/decompress-response@6.0.0 + form-data-encoder: registry.npmmirror.com/form-data-encoder@2.1.4 + get-stream: registry.npmmirror.com/get-stream@6.0.1 + http2-wrapper: registry.npmmirror.com/http2-wrapper@2.2.1 + lowercase-keys: registry.npmmirror.com/lowercase-keys@3.0.0 + p-cancelable: registry.npmmirror.com/p-cancelable@3.0.0 + responselike: registry.npmmirror.com/responselike@3.0.0 + dev: true + + registry.npmmirror.com/graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz} + name: graceful-fs + version: 4.2.11 + dev: true + + registry.npmmirror.com/grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, tarball: https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz} + name: grapheme-splitter + version: 1.0.4 + dev: true + + registry.npmmirror.com/graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, tarball: https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz} + name: graphemer + version: 1.4.0 + dev: true + + registry.npmmirror.com/has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, tarball: https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz} + name: has-bigints + version: 1.0.2 + dev: true + + registry.npmmirror.com/has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz} + name: has-flag + version: 3.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz} + name: has-flag + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==, tarball: https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz} + name: has-property-descriptors + version: 1.0.1 + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + dev: true + + registry.npmmirror.com/has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, tarball: https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz} + name: has-proto + version: 1.0.1 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, tarball: https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz} + name: has-symbols + version: 1.0.3 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, tarball: https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz} + name: has-tostringtag + version: 1.0.0 + engines: {node: '>= 0.4'} + dependencies: + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + dev: true + + registry.npmmirror.com/has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==, tarball: https://registry.npmmirror.com/has/-/has-1.0.4.tgz} + name: has + version: 1.0.4 + engines: {node: '>= 0.4.0'} + dev: true + + registry.npmmirror.com/hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, tarball: https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz} + name: hasown + version: 2.0.0 + engines: {node: '>= 0.4'} + dependencies: + function-bind: registry.npmmirror.com/function-bind@1.1.2 + dev: true + + registry.npmmirror.com/he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, tarball: https://registry.npmmirror.com/he/-/he-1.2.0.tgz} + name: he + version: 1.2.0 + hasBin: true + dev: true + + registry.npmmirror.com/hosted-git-info@7.0.1: + resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==, tarball: https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz} + name: hosted-git-info + version: 7.0.1 + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + lru-cache: registry.npmmirror.com/lru-cache@10.0.2 + dev: true + + registry.npmmirror.com/html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==, tarball: https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz} + name: html-encoding-sniffer + version: 3.0.0 + engines: {node: '>=12'} + dependencies: + whatwg-encoding: registry.npmmirror.com/whatwg-encoding@2.0.0 + dev: true + + registry.npmmirror.com/html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, tarball: https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz} + name: html-escaper + version: 2.0.2 + dev: true + + registry.npmmirror.com/http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, tarball: https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz} + name: http-cache-semantics + version: 4.1.1 + dev: true + + registry.npmmirror.com/http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, tarball: https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz} + name: http-proxy-agent + version: 5.0.0 + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': registry.npmmirror.com/@tootallnate/once@2.0.0 + agent-base: registry.npmmirror.com/agent-base@6.0.2 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==, tarball: https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz} + name: http-proxy-agent + version: 7.0.0 + engines: {node: '>= 14'} + dependencies: + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==, tarball: https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz} + name: http2-wrapper + version: 2.2.1 + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: registry.npmmirror.com/quick-lru@5.1.1 + resolve-alpn: registry.npmmirror.com/resolve-alpn@1.2.1 + dev: true + + registry.npmmirror.com/https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, tarball: https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz} + name: https-proxy-agent + version: 5.0.1 + engines: {node: '>= 6'} + dependencies: + agent-base: registry.npmmirror.com/agent-base@6.0.2 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, tarball: https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz} + name: https-proxy-agent + version: 7.0.2 + engines: {node: '>= 14'} + dependencies: + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, tarball: https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz} + name: human-signals + version: 2.1.0 + engines: {node: '>=10.17.0'} + dev: true + + registry.npmmirror.com/human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, tarball: https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz} + name: human-signals + version: 5.0.0 + engines: {node: '>=16.17.0'} + dev: true + + registry.npmmirror.com/iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz} + name: iconv-lite + version: 0.4.24 + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 + dev: true + + registry.npmmirror.com/iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz} + name: iconv-lite + version: 0.6.3 + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 + dev: true + + registry.npmmirror.com/ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, tarball: https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz} + name: ieee754 + version: 1.2.1 + dev: true + + registry.npmmirror.com/ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, tarball: https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz} + name: ignore + version: 5.2.4 + engines: {node: '>= 4'} + dev: true + + registry.npmmirror.com/import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, tarball: https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz} + name: import-fresh + version: 3.3.0 + engines: {node: '>=6'} + dependencies: + parent-module: registry.npmmirror.com/parent-module@1.0.1 + resolve-from: registry.npmmirror.com/resolve-from@4.0.0 + dev: true + + registry.npmmirror.com/import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, tarball: https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz} + name: import-local + version: 3.1.0 + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: registry.npmmirror.com/pkg-dir@4.2.0 + resolve-cwd: registry.npmmirror.com/resolve-cwd@3.0.0 + dev: true + + registry.npmmirror.com/import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==, tarball: https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz} + name: import-meta-resolve + version: 4.0.0 + dev: true + + registry.npmmirror.com/imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, tarball: https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz} + name: imurmurhash + version: 0.1.4 + engines: {node: '>=0.8.19'} + dev: true + + registry.npmmirror.com/inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, tarball: https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz} + name: inflight + version: 1.0.6 + dependencies: + once: registry.npmmirror.com/once@1.4.0 + wrappy: registry.npmmirror.com/wrappy@1.0.2 + dev: true + + registry.npmmirror.com/inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz} + name: inherits + version: 2.0.4 + dev: true + + registry.npmmirror.com/inquirer@9.2.12: + resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==, tarball: https://registry.npmmirror.com/inquirer/-/inquirer-9.2.12.tgz} + name: inquirer + version: 9.2.12 + engines: {node: '>=14.18.0'} + dependencies: + '@ljharb/through': registry.npmmirror.com/@ljharb/through@2.3.11 + ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 + chalk: registry.npmmirror.com/chalk@5.3.0 + cli-cursor: registry.npmmirror.com/cli-cursor@3.1.0 + cli-width: registry.npmmirror.com/cli-width@4.1.0 + external-editor: registry.npmmirror.com/external-editor@3.1.0 + figures: registry.npmmirror.com/figures@5.0.0 + lodash: registry.npmmirror.com/lodash@4.17.21 + mute-stream: registry.npmmirror.com/mute-stream@1.0.0 + ora: registry.npmmirror.com/ora@5.4.1 + run-async: registry.npmmirror.com/run-async@3.0.0 + rxjs: registry.npmmirror.com/rxjs@7.8.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wrap-ansi: registry.npmmirror.com/wrap-ansi@6.2.0 + dev: true + + registry.npmmirror.com/internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==, tarball: https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz} + name: internal-slot + version: 1.0.5 + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + has: registry.npmmirror.com/has@1.0.4 + side-channel: registry.npmmirror.com/side-channel@1.0.4 + dev: true + + registry.npmmirror.com/ip@1.1.8: + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==, tarball: https://registry.npmmirror.com/ip/-/ip-1.1.8.tgz} + name: ip + version: 1.1.8 + dev: true + + registry.npmmirror.com/ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==, tarball: https://registry.npmmirror.com/ip/-/ip-2.0.0.tgz} + name: ip + version: 2.0.0 + dev: true + + registry.npmmirror.com/is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, tarball: https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz} + name: is-arguments + version: 1.1.1 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==, tarball: https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz} + name: is-array-buffer + version: 3.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + is-typed-array: registry.npmmirror.com/is-typed-array@1.1.10 + dev: true + + registry.npmmirror.com/is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, tarball: https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz} + name: is-arrayish + version: 0.2.1 + dev: true + + registry.npmmirror.com/is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, tarball: https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz} + name: is-bigint + version: 1.0.4 + dependencies: + has-bigints: registry.npmmirror.com/has-bigints@1.0.2 + dev: true + + registry.npmmirror.com/is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, tarball: https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz} + name: is-binary-path + version: 2.1.0 + engines: {node: '>=8'} + dependencies: + binary-extensions: registry.npmmirror.com/binary-extensions@2.2.0 + dev: true + + registry.npmmirror.com/is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, tarball: https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz} + name: is-boolean-object + version: 1.1.2 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, tarball: https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz} + name: is-callable + version: 1.2.7 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, tarball: https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz} + name: is-core-module + version: 2.13.1 + dependencies: + hasown: registry.npmmirror.com/hasown@2.0.0 + dev: true + + registry.npmmirror.com/is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, tarball: https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz} + name: is-date-object + version: 1.0.5 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, tarball: https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz} + name: is-extglob + version: 2.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, tarball: https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz} + name: is-fullwidth-code-point + version: 3.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, tarball: https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz} + name: is-generator-fn + version: 2.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, tarball: https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz} + name: is-glob + version: 4.0.3 + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: registry.npmmirror.com/is-extglob@2.1.1 + dev: true + + registry.npmmirror.com/is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, tarball: https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz} + name: is-interactive + version: 1.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==, tarball: https://registry.npmmirror.com/is-map/-/is-map-2.0.2.tgz} + name: is-map + version: 2.0.2 + dev: true + + registry.npmmirror.com/is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, tarball: https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz} + name: is-number-object + version: 1.0.7 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, tarball: https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz} + name: is-number + version: 7.0.0 + engines: {node: '>=0.12.0'} + dev: true + + registry.npmmirror.com/is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, tarball: https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz} + name: is-path-inside + version: 3.0.3 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz} + name: is-plain-obj + version: 2.1.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz} + name: is-plain-obj + version: 4.1.0 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, tarball: https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz} + name: is-potential-custom-element-name + version: 1.0.1 + dev: true + + registry.npmmirror.com/is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, tarball: https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz} + name: is-regex + version: 1.1.4 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==, tarball: https://registry.npmmirror.com/is-set/-/is-set-2.0.2.tgz} + name: is-set + version: 2.0.2 + dev: true + + registry.npmmirror.com/is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, tarball: https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz} + name: is-shared-array-buffer + version: 1.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + dev: true + + registry.npmmirror.com/is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz} + name: is-stream + version: 2.0.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz} + name: is-stream + version: 3.0.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + registry.npmmirror.com/is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, tarball: https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz} + name: is-string + version: 1.0.7 + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, tarball: https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz} + name: is-symbol + version: 1.0.4 + engines: {node: '>= 0.4'} + dependencies: + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + dev: true + + registry.npmmirror.com/is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==, tarball: https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz} + name: is-typed-array + version: 1.1.10 + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 + call-bind: registry.npmmirror.com/call-bind@1.0.5 + for-each: registry.npmmirror.com/for-each@0.3.3 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz} + name: is-unicode-supported + version: 0.1.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==, tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz} + name: is-unicode-supported + version: 1.3.0 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==, tarball: https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.1.tgz} + name: is-weakmap + version: 2.0.1 + dev: true + + registry.npmmirror.com/is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==, tarball: https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.2.tgz} + name: is-weakset + version: 2.0.2 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + dev: true + + registry.npmmirror.com/isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, tarball: https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz} + name: isarray + version: 1.0.0 + dev: true + + registry.npmmirror.com/isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, tarball: https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz} + name: isarray + version: 2.0.5 + dev: true + + registry.npmmirror.com/isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, tarball: https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz} + name: isexe + version: 2.0.0 + dev: true + + registry.npmmirror.com/isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, tarball: https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz} + name: isexe + version: 3.1.1 + engines: {node: '>=16'} + dev: true + + registry.npmmirror.com/istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, tarball: https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz} + name: istanbul-lib-coverage + version: 3.2.2 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, tarball: https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz} + name: istanbul-lib-instrument + version: 5.2.1 + engines: {node: '>=8'} + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + semver: registry.npmmirror.com/semver@6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/istanbul-lib-instrument@6.0.1: + resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==, tarball: https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz} + name: istanbul-lib-instrument + version: 6.0.1 + engines: {node: '>=10'} + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/parser': registry.npmmirror.com/@babel/parser@7.23.3 + '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + semver: registry.npmmirror.com/semver@7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, tarball: https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz} + name: istanbul-lib-report + version: 3.0.1 + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + make-dir: registry.npmmirror.com/make-dir@4.0.0 + supports-color: registry.npmmirror.com/supports-color@7.2.0 + dev: true + + registry.npmmirror.com/istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, tarball: https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz} + name: istanbul-lib-source-maps + version: 4.0.1 + engines: {node: '>=10'} + dependencies: + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 + source-map: registry.npmmirror.com/source-map@0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==, tarball: https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz} + name: istanbul-reports + version: 3.1.5 + engines: {node: '>=8'} + dependencies: + html-escaper: registry.npmmirror.com/html-escaper@2.0.2 + istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.1 + dev: true + + registry.npmmirror.com/jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, tarball: https://registry.npmmirror.com/jackspeak/-/jackspeak-2.3.6.tgz} + name: jackspeak + version: 2.3.6 + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': registry.npmmirror.com/@isaacs/cliui@8.0.2 + optionalDependencies: + '@pkgjs/parseargs': registry.npmmirror.com/@pkgjs/parseargs@0.11.0 + dev: true + + registry.npmmirror.com/jake@10.8.5: + resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==, tarball: https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz} + name: jake + version: 10.8.5 + engines: {node: '>=10'} + hasBin: true + dependencies: + async: registry.npmmirror.com/async@3.2.5 + chalk: registry.npmmirror.com/chalk@4.1.2 + filelist: registry.npmmirror.com/filelist@1.0.4 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + dev: true + + registry.npmmirror.com/jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==, tarball: https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz} + name: jest-changed-files + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: registry.npmmirror.com/execa@5.1.1 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + p-limit: registry.npmmirror.com/p-limit@3.1.0 + dev: true + + registry.npmmirror.com/jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==, tarball: https://registry.npmmirror.com/jest-circus/-/jest-circus-29.7.0.tgz} + name: jest-circus + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/expect': registry.npmmirror.com/@jest/expect@29.7.0 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + co: registry.npmmirror.com/co@4.6.0 + dedent: registry.npmmirror.com/dedent@1.5.1 + is-generator-fn: registry.npmmirror.com/is-generator-fn@2.1.0 + jest-each: registry.npmmirror.com/jest-each@29.7.0 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + p-limit: registry.npmmirror.com/p-limit@3.1.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + pure-rand: registry.npmmirror.com/pure-rand@6.0.4 + slash: registry.npmmirror.com/slash@3.0.0 + stack-utils: registry.npmmirror.com/stack-utils@2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + registry.npmmirror.com/jest-cli@29.7.0(@types/node@20.11.0): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==, tarball: https://registry.npmmirror.com/jest-cli/-/jest-cli-29.7.0.tgz} + id: registry.npmmirror.com/jest-cli/29.7.0 + name: jest-cli + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - registry.npmmirror.com/@esbuild/sunos-x64@0.19.11: - resolution: - { - integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==, - tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz, - } - name: "@esbuild/sunos-x64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + dependencies: + '@jest/core': registry.npmmirror.com/@jest/core@29.7.0 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + create-jest: registry.npmmirror.com/create-jest@29.7.0(@types/node@20.11.0) + exit: registry.npmmirror.com/exit@0.1.2 + import-local: registry.npmmirror.com/import-local@3.1.0 + jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + yargs: registry.npmmirror.com/yargs@17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==, tarball: https://registry.npmmirror.com/jest-config/-/jest-config-29.7.0.tgz} + id: registry.npmmirror.com/jest-config/29.7.0 + name: jest-config + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': optional: true - - registry.npmmirror.com/@esbuild/win32-arm64@0.19.11: - resolution: - { - integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==, - tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz, - } - name: "@esbuild/win32-arm64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + ts-node: optional: true - - registry.npmmirror.com/@esbuild/win32-ia32@0.19.11: - resolution: - { - integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==, - tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz, - } - name: "@esbuild/win32-ia32" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@jest/test-sequencer': registry.npmmirror.com/@jest/test-sequencer@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + babel-jest: registry.npmmirror.com/babel-jest@29.7.0(@babel/core@7.23.3) + chalk: registry.npmmirror.com/chalk@4.1.2 + ci-info: registry.npmmirror.com/ci-info@3.9.0 + deepmerge: registry.npmmirror.com/deepmerge@4.3.1 + glob: registry.npmmirror.com/glob@7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-circus: registry.npmmirror.com/jest-circus@29.7.0 + jest-environment-node: registry.npmmirror.com/jest-environment-node@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-runner: registry.npmmirror.com/jest-runner@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + parse-json: registry.npmmirror.com/parse-json@5.2.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + registry.npmmirror.com/jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==, tarball: https://registry.npmmirror.com/jest-diff/-/jest-diff-29.7.0.tgz} + name: jest-diff + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: registry.npmmirror.com/chalk@4.1.2 + diff-sequences: registry.npmmirror.com/diff-sequences@29.6.3 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==, tarball: https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.7.0.tgz} + name: jest-docblock + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: registry.npmmirror.com/detect-newline@3.1.0 + dev: true + + registry.npmmirror.com/jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==, tarball: https://registry.npmmirror.com/jest-each/-/jest-each-29.7.0.tgz} + name: jest-each + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/jest-environment-jsdom@29.7.0: + resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==, tarball: https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz} + name: jest-environment-jsdom + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: optional: true - - registry.npmmirror.com/@esbuild/win32-x64@0.19.11: - resolution: - { - integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==, - tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz, - } - name: "@esbuild/win32-x64" - version: 0.19.11 - engines: { node: ">=12" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + dependencies: + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/jsdom': registry.npmmirror.com/@types/jsdom@20.0.1 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jsdom: registry.npmmirror.com/jsdom@20.0.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==, tarball: https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz} + name: jest-environment-node + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + dev: true + + registry.npmmirror.com/jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, tarball: https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.6.3.tgz} + name: jest-get-type + version: 29.6.3 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + registry.npmmirror.com/jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==, tarball: https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz} + name: jest-haste-map + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/graceful-fs': registry.npmmirror.com/@types/graceful-fs@4.1.9 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + anymatch: registry.npmmirror.com/anymatch@3.1.3 + fb-watchman: registry.npmmirror.com/fb-watchman@2.0.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-worker: registry.npmmirror.com/jest-worker@29.7.0 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + walker: registry.npmmirror.com/walker@1.0.8 + optionalDependencies: + fsevents: registry.npmmirror.com/fsevents@2.3.3 + dev: true + + registry.npmmirror.com/jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==, tarball: https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz} + name: jest-leak-detector + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==, tarball: https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz} + name: jest-matcher-utils + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-diff: registry.npmmirror.com/jest-diff@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==, tarball: https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.7.0.tgz} + name: jest-message-util + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/stack-utils': registry.npmmirror.com/@types/stack-utils@2.0.3 + chalk: registry.npmmirror.com/chalk@4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + micromatch: registry.npmmirror.com/micromatch@4.0.5 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + stack-utils: registry.npmmirror.com/stack-utils@2.0.6 + dev: true + + registry.npmmirror.com/jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==, tarball: https://registry.npmmirror.com/jest-mock/-/jest-mock-29.7.0.tgz} + name: jest-mock + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + dev: true + + registry.npmmirror.com/jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, tarball: https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz} + id: registry.npmmirror.com/jest-pnp-resolver/1.2.3 + name: jest-pnp-resolver + version: 1.2.3 + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: optional: true - - registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): - resolution: - { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, - tarball: https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz, - } - id: registry.npmmirror.com/@eslint-community/eslint-utils/4.4.0 - name: "@eslint-community/eslint-utils" - version: 4.4.0 - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: registry.npmmirror.com/eslint@8.56.0 - eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 - dev: true - - registry.npmmirror.com/@eslint-community/regexpp@4.10.0: - resolution: - { - integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, - tarball: https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz, - } - name: "@eslint-community/regexpp" - version: 4.10.0 - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - dev: true - - registry.npmmirror.com/@eslint/eslintrc@2.1.4: - resolution: - { - integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, - tarball: https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz, - } - name: "@eslint/eslintrc" - version: 2.1.4 - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: registry.npmmirror.com/ajv@6.12.6 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - espree: registry.npmmirror.com/espree@9.6.1 - globals: registry.npmmirror.com/globals@13.23.0 - ignore: registry.npmmirror.com/ignore@5.2.4 - import-fresh: registry.npmmirror.com/import-fresh@3.3.0 - js-yaml: registry.npmmirror.com/js-yaml@4.1.0 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@eslint/js@8.56.0: - resolution: - { - integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, - tarball: https://registry.npmmirror.com/@eslint/js/-/js-8.56.0.tgz, - } - name: "@eslint/js" - version: 8.56.0 - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true - - registry.npmmirror.com/@humanwhocodes/config-array@0.11.13: - resolution: - { - integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, - tarball: https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz, - } - name: "@humanwhocodes/config-array" - version: 0.11.13 - engines: { node: ">=10.10.0" } - dependencies: - "@humanwhocodes/object-schema": registry.npmmirror.com/@humanwhocodes/object-schema@2.0.1 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - minimatch: registry.npmmirror.com/minimatch@3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@humanwhocodes/module-importer@1.0.1: - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - tarball: https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz, - } - name: "@humanwhocodes/module-importer" - version: 1.0.1 - engines: { node: ">=12.22" } - dev: true - - registry.npmmirror.com/@humanwhocodes/object-schema@2.0.1: - resolution: - { - integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, - tarball: https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz, - } - name: "@humanwhocodes/object-schema" - version: 2.0.1 - dev: true - - registry.npmmirror.com/@isaacs/cliui@8.0.2: - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - tarball: https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz, - } - name: "@isaacs/cliui" - version: 8.0.2 - engines: { node: ">=12" } - dependencies: - string-width: registry.npmmirror.com/string-width@5.1.2 - string-width-cjs: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 - strip-ansi-cjs: registry.npmmirror.com/strip-ansi@6.0.1 - wrap-ansi: registry.npmmirror.com/wrap-ansi@8.1.0 - wrap-ansi-cjs: registry.npmmirror.com/wrap-ansi@7.0.0 - dev: true - - registry.npmmirror.com/@istanbuljs/load-nyc-config@1.1.0: - resolution: - { - integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, - tarball: https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz, - } - name: "@istanbuljs/load-nyc-config" - version: 1.1.0 - engines: { node: ">=8" } - dependencies: - camelcase: registry.npmmirror.com/camelcase@5.3.1 - find-up: registry.npmmirror.com/find-up@4.1.0 - get-package-type: registry.npmmirror.com/get-package-type@0.1.0 - js-yaml: registry.npmmirror.com/js-yaml@3.14.1 - resolve-from: registry.npmmirror.com/resolve-from@5.0.0 - dev: true - - registry.npmmirror.com/@istanbuljs/schema@0.1.3: - resolution: - { - integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, - tarball: https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz, - } - name: "@istanbuljs/schema" - version: 0.1.3 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/@jest/console@29.7.0: - resolution: - { - integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==, - tarball: https://registry.npmmirror.com/@jest/console/-/console-29.7.0.tgz, - } - name: "@jest/console" - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - dev: true - - registry.npmmirror.com/@jest/core@29.7.0: - resolution: - { - integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==, - tarball: https://registry.npmmirror.com/@jest/core/-/core-29.7.0.tgz, - } - name: "@jest/core" - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - "@jest/console": registry.npmmirror.com/@jest/console@29.7.0 - "@jest/reporters": registry.npmmirror.com/@jest/reporters@29.7.0 - "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 - "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 - chalk: registry.npmmirror.com/chalk@4.1.2 - ci-info: registry.npmmirror.com/ci-info@3.9.0 - exit: registry.npmmirror.com/exit@0.1.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-changed-files: registry.npmmirror.com/jest-changed-files@29.7.0 - jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 - jest-resolve-dependencies: registry.npmmirror.com/jest-resolve-dependencies@29.7.0 - jest-runner: registry.npmmirror.com/jest-runner@29.7.0 - jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 - jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-validate: registry.npmmirror.com/jest-validate@29.7.0 - jest-watcher: registry.npmmirror.com/jest-watcher@29.7.0 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - registry.npmmirror.com/@jest/environment@29.7.0: - resolution: - { - integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==, - tarball: https://registry.npmmirror.com/@jest/environment/-/environment-29.7.0.tgz, - } - name: "@jest/environment" - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/fake-timers": registry.npmmirror.com/@jest/fake-timers@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - dev: true - - registry.npmmirror.com/@jest/expect-utils@29.7.0: - resolution: - { - integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==, - tarball: https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz, - } - name: "@jest/expect-utils" - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - dev: true - - registry.npmmirror.com/@jest/expect@29.7.0: - resolution: - { - integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==, - tarball: https://registry.npmmirror.com/@jest/expect/-/expect-29.7.0.tgz, - } - name: "@jest/expect" - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - expect: registry.npmmirror.com/expect@29.7.0 - jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@jest/fake-timers@29.7.0: - resolution: - { - integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==, - tarball: https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz, - } - name: "@jest/fake-timers" - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@sinonjs/fake-timers": registry.npmmirror.com/@sinonjs/fake-timers@10.0.2 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - dev: true - - registry.npmmirror.com/@jest/globals@29.7.0: - resolution: - { - integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==, - tarball: https://registry.npmmirror.com/@jest/globals/-/globals-29.7.0.tgz, - } - name: "@jest/globals" - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 - "@jest/expect": registry.npmmirror.com/@jest/expect@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@jest/reporters@29.7.0: - resolution: - { - integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==, - tarball: https://registry.npmmirror.com/@jest/reporters/-/reporters-29.7.0.tgz, - } - name: "@jest/reporters" - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - "@bcoe/v8-coverage": registry.npmmirror.com/@bcoe/v8-coverage@0.2.3 - "@jest/console": registry.npmmirror.com/@jest/console@29.7.0 - "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 - "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 - exit: registry.npmmirror.com/exit@0.1.2 - glob: registry.npmmirror.com/glob@7.2.3 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 - istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument@6.0.1 - istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.1 - istanbul-lib-source-maps: registry.npmmirror.com/istanbul-lib-source-maps@4.0.1 - istanbul-reports: registry.npmmirror.com/istanbul-reports@3.1.5 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-worker: registry.npmmirror.com/jest-worker@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - string-length: registry.npmmirror.com/string-length@4.0.2 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - v8-to-istanbul: registry.npmmirror.com/v8-to-istanbul@9.1.3 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@jest/schemas@29.6.3: - resolution: - { - integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, - tarball: https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz, - } - name: "@jest/schemas" - version: 29.6.3 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@sinclair/typebox": registry.npmmirror.com/@sinclair/typebox@0.27.8 - dev: true - - registry.npmmirror.com/@jest/source-map@29.6.3: - resolution: - { - integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==, - tarball: https://registry.npmmirror.com/@jest/source-map/-/source-map-29.6.3.tgz, - } - name: "@jest/source-map" - version: 29.6.3 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - callsites: registry.npmmirror.com/callsites@3.1.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - dev: true - - registry.npmmirror.com/@jest/test-result@29.7.0: - resolution: - { - integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==, - tarball: https://registry.npmmirror.com/@jest/test-result/-/test-result-29.7.0.tgz, - } - name: "@jest/test-result" - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/console": registry.npmmirror.com/@jest/console@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/istanbul-lib-coverage": registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 - collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 - dev: true - - registry.npmmirror.com/@jest/test-sequencer@29.7.0: - resolution: - { - integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==, - tarball: https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz, - } - name: "@jest/test-sequencer" - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - dev: true - - registry.npmmirror.com/@jest/transform@29.7.0: - resolution: - { - integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==, - tarball: https://registry.npmmirror.com/@jest/transform/-/transform-29.7.0.tgz, - } - name: "@jest/transform" - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul@6.1.1 - chalk: registry.npmmirror.com/chalk@4.1.2 - convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 - fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify@2.1.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - pirates: registry.npmmirror.com/pirates@4.0.5 - slash: registry.npmmirror.com/slash@3.0.0 - write-file-atomic: registry.npmmirror.com/write-file-atomic@4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@jest/types@29.6.3: - resolution: - { - integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, - tarball: https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz, - } - name: "@jest/types" - version: 29.6.3 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/schemas": registry.npmmirror.com/@jest/schemas@29.6.3 - "@types/istanbul-lib-coverage": registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 - "@types/istanbul-reports": registry.npmmirror.com/@types/istanbul-reports@3.0.4 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - "@types/yargs": registry.npmmirror.com/@types/yargs@17.0.31 - chalk: registry.npmmirror.com/chalk@4.1.2 - dev: true - - registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3: - resolution: - { - integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, - tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz, - } - name: "@jridgewell/gen-mapping" - version: 0.3.3 - engines: { node: ">=6.0.0" } - dependencies: - "@jridgewell/set-array": registry.npmmirror.com/@jridgewell/set-array@1.1.2 - "@jridgewell/sourcemap-codec": registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15 - "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - dev: true - - registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0: - resolution: - { - integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, - tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz, - } - name: "@jridgewell/resolve-uri" - version: 3.1.0 - engines: { node: ">=6.0.0" } - dev: true - - registry.npmmirror.com/@jridgewell/set-array@1.1.2: - resolution: - { - integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, - tarball: https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz, - } - name: "@jridgewell/set-array" - version: 1.1.2 - engines: { node: ">=6.0.0" } - dev: true - - registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15: - resolution: - { - integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, - tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz, - } - name: "@jridgewell/sourcemap-codec" - version: 1.4.15 - dev: true - - registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20: - resolution: - { - integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==, - tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz, - } - name: "@jridgewell/trace-mapping" - version: 0.3.20 - dependencies: - "@jridgewell/resolve-uri": registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0 - "@jridgewell/sourcemap-codec": registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15 - dev: true - - registry.npmmirror.com/@kurkle/color@0.3.2: - resolution: - { - integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==, - tarball: https://registry.npmmirror.com/@kurkle/color/-/color-0.3.2.tgz, - } - name: "@kurkle/color" - version: 0.3.2 - dev: false - - registry.npmmirror.com/@ljharb/through@2.3.11: - resolution: - { - integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==, - tarball: https://registry.npmmirror.com/@ljharb/through/-/through-2.3.11.tgz, - } - name: "@ljharb/through" - version: 2.3.11 - engines: { node: ">= 0.4" } - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - dev: true - - registry.npmmirror.com/@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - tarball: https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz, - } - name: "@nodelib/fs.scandir" - version: 2.1.5 - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": registry.npmmirror.com/@nodelib/fs.stat@2.0.5 - run-parallel: registry.npmmirror.com/run-parallel@1.2.0 - dev: true - - registry.npmmirror.com/@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - tarball: https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz, - } - name: "@nodelib/fs.stat" - version: 2.0.5 - engines: { node: ">= 8" } - dev: true - - registry.npmmirror.com/@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - tarball: https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz, - } - name: "@nodelib/fs.walk" - version: 1.2.8 - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.scandir": registry.npmmirror.com/@nodelib/fs.scandir@2.1.5 - fastq: registry.npmmirror.com/fastq@1.15.0 - dev: true - - registry.npmmirror.com/@pkgjs/parseargs@0.11.0: - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - tarball: https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz, - } - name: "@pkgjs/parseargs" - version: 0.11.0 - engines: { node: ">=14" } - requiresBuild: true - dev: true + dependencies: + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + dev: true + + registry.npmmirror.com/jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==, tarball: https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz} + name: jest-regex-util + version: 29.6.3 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + registry.npmmirror.com/jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==, tarball: https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz} + name: jest-resolve-dependencies + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==, tarball: https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.7.0.tgz} + name: jest-resolve + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: registry.npmmirror.com/chalk@4.1.2 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-pnp-resolver: registry.npmmirror.com/jest-pnp-resolver@1.2.3(jest-resolve@29.7.0) + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-validate: registry.npmmirror.com/jest-validate@29.7.0 + resolve: registry.npmmirror.com/resolve@1.22.8 + resolve.exports: registry.npmmirror.com/resolve.exports@2.0.2 + slash: registry.npmmirror.com/slash@3.0.0 + dev: true + + registry.npmmirror.com/jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==, tarball: https://registry.npmmirror.com/jest-runner/-/jest-runner-29.7.0.tgz} + name: jest-runner + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': registry.npmmirror.com/@jest/console@29.7.0 + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + emittery: registry.npmmirror.com/emittery@0.13.1 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-docblock: registry.npmmirror.com/jest-docblock@29.7.0 + jest-environment-node: registry.npmmirror.com/jest-environment-node@29.7.0 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-leak-detector: registry.npmmirror.com/jest-leak-detector@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + jest-watcher: registry.npmmirror.com/jest-watcher@29.7.0 + jest-worker: registry.npmmirror.com/jest-worker@29.7.0 + p-limit: registry.npmmirror.com/p-limit@3.1.0 + source-map-support: registry.npmmirror.com/source-map-support@0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==, tarball: https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.7.0.tgz} + name: jest-runtime + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': registry.npmmirror.com/@jest/environment@29.7.0 + '@jest/fake-timers': registry.npmmirror.com/@jest/fake-timers@29.7.0 + '@jest/globals': registry.npmmirror.com/@jest/globals@29.7.0 + '@jest/source-map': registry.npmmirror.com/@jest/source-map@29.6.3 + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + cjs-module-lexer: registry.npmmirror.com/cjs-module-lexer@1.2.2 + collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 + glob: registry.npmmirror.com/glob@7.2.3 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-mock: registry.npmmirror.com/jest-mock@29.7.0 + jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 + jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 + jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + slash: registry.npmmirror.com/slash@3.0.0 + strip-bom: registry.npmmirror.com/strip-bom@4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==, tarball: https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz} + name: jest-snapshot + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.23.3 + '@babel/generator': registry.npmmirror.com/@babel/generator@7.23.3 + '@babel/plugin-syntax-jsx': registry.npmmirror.com/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3) + '@babel/plugin-syntax-typescript': registry.npmmirror.com/@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3) + '@babel/types': registry.npmmirror.com/@babel/types@7.23.3 + '@jest/expect-utils': registry.npmmirror.com/@jest/expect-utils@29.7.0 + '@jest/transform': registry.npmmirror.com/@jest/transform@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3) + chalk: registry.npmmirror.com/chalk@4.1.2 + expect: registry.npmmirror.com/expect@29.7.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + jest-diff: registry.npmmirror.com/jest-diff@29.7.0 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 + jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + natural-compare: registry.npmmirror.com/natural-compare@1.4.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + semver: registry.npmmirror.com/semver@7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, tarball: https://registry.npmmirror.com/jest-util/-/jest-util-29.7.0.tgz} + name: jest-util + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + ci-info: registry.npmmirror.com/ci-info@3.9.0 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + picomatch: registry.npmmirror.com/picomatch@2.3.1 + dev: true + + registry.npmmirror.com/jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==, tarball: https://registry.npmmirror.com/jest-validate/-/jest-validate-29.7.0.tgz} + name: jest-validate + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + camelcase: registry.npmmirror.com/camelcase@6.3.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 + leven: registry.npmmirror.com/leven@3.1.0 + pretty-format: registry.npmmirror.com/pretty-format@29.7.0 + dev: true + + registry.npmmirror.com/jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==, tarball: https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.7.0.tgz} + name: jest-watcher + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': registry.npmmirror.com/@jest/test-result@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 + chalk: registry.npmmirror.com/chalk@4.1.2 + emittery: registry.npmmirror.com/emittery@0.13.1 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + string-length: registry.npmmirror.com/string-length@4.0.2 + dev: true + + registry.npmmirror.com/jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==, tarball: https://registry.npmmirror.com/jest-worker/-/jest-worker-29.7.0.tgz} + name: jest-worker + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + jest-util: registry.npmmirror.com/jest-util@29.7.0 + merge-stream: registry.npmmirror.com/merge-stream@2.0.0 + supports-color: registry.npmmirror.com/supports-color@8.1.1 + dev: true + + registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==, tarball: https://registry.npmmirror.com/jest/-/jest-29.7.0.tgz} + id: registry.npmmirror.com/jest/29.7.0 + name: jest + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: optional: true - - registry.npmmirror.com/@puppeteer/browsers@1.4.6(typescript@5.1.6): - resolution: - { - integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==, - tarball: https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-1.4.6.tgz, - } - id: registry.npmmirror.com/@puppeteer/browsers/1.4.6 - name: "@puppeteer/browsers" - version: 1.4.6 - engines: { node: ">=16.3.0" } - hasBin: true - peerDependencies: - typescript: ">= 4.7.4" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - extract-zip: registry.npmmirror.com/extract-zip@2.0.1 - progress: registry.npmmirror.com/progress@2.0.3 - proxy-agent: registry.npmmirror.com/proxy-agent@6.3.0 - tar-fs: registry.npmmirror.com/tar-fs@3.0.4 - typescript: 5.1.6 - unbzip2-stream: registry.npmmirror.com/unbzip2-stream@1.4.3 - yargs: registry.npmmirror.com/yargs@17.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@puppeteer/browsers@1.8.0: - resolution: - { - integrity: sha512-TkRHIV6k2D8OlUe8RtG+5jgOF/H98Myx0M6AOafC8DdNVOFiBSFa5cpRDtpm8LXOa9sVwe0+e6Q3FC56X/DZfg==, - tarball: https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-1.8.0.tgz, - } - name: "@puppeteer/browsers" - version: 1.8.0 - engines: { node: ">=16.3.0" } - hasBin: true - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - extract-zip: registry.npmmirror.com/extract-zip@2.0.1 - progress: registry.npmmirror.com/progress@2.0.3 - proxy-agent: registry.npmmirror.com/proxy-agent@6.3.1 - tar-fs: registry.npmmirror.com/tar-fs@3.0.4 - unbzip2-stream: registry.npmmirror.com/unbzip2-stream@1.4.3 - yargs: registry.npmmirror.com/yargs@17.7.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@sinclair/typebox@0.27.8: - resolution: - { - integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, - tarball: https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz, - } - name: "@sinclair/typebox" - version: 0.27.8 - dev: true - - registry.npmmirror.com/@sindresorhus/is@5.3.0: - resolution: - { - integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==, - tarball: https://registry.npmmirror.com/@sindresorhus/is/-/is-5.3.0.tgz, - } - name: "@sindresorhus/is" - version: 5.3.0 - engines: { node: ">=14.16" } - dev: true - - registry.npmmirror.com/@sinonjs/commons@2.0.0: - resolution: - { - integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==, - tarball: https://registry.npmmirror.com/@sinonjs/commons/-/commons-2.0.0.tgz, - } - name: "@sinonjs/commons" - version: 2.0.0 - dependencies: - type-detect: registry.npmmirror.com/type-detect@4.0.8 - dev: true - - registry.npmmirror.com/@sinonjs/fake-timers@10.0.2: - resolution: - { - integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==, - tarball: https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz, - } - name: "@sinonjs/fake-timers" - version: 10.0.2 - dependencies: - "@sinonjs/commons": registry.npmmirror.com/@sinonjs/commons@2.0.0 - dev: true - - registry.npmmirror.com/@szmarczak/http-timer@5.0.1: - resolution: - { - integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==, - tarball: https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz, - } - name: "@szmarczak/http-timer" - version: 5.0.1 - engines: { node: ">=14.16" } - dependencies: - defer-to-connect: registry.npmmirror.com/defer-to-connect@2.0.1 - dev: true - - registry.npmmirror.com/@tootallnate/once@2.0.0: - resolution: - { - integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, - tarball: https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz, - } - name: "@tootallnate/once" - version: 2.0.0 - engines: { node: ">= 10" } - dev: true - - registry.npmmirror.com/@tootallnate/quickjs-emscripten@0.23.0: - resolution: - { - integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==, - tarball: https://registry.npmmirror.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz, - } - name: "@tootallnate/quickjs-emscripten" - version: 0.23.0 - dev: true - - registry.npmmirror.com/@types/babel__core@7.20.4: - resolution: - { - integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==, - tarball: https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.4.tgz, - } - name: "@types/babel__core" - version: 7.20.4 - dependencies: - "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - "@types/babel__generator": registry.npmmirror.com/@types/babel__generator@7.6.7 - "@types/babel__template": registry.npmmirror.com/@types/babel__template@7.4.4 - "@types/babel__traverse": registry.npmmirror.com/@types/babel__traverse@7.20.4 - dev: true - - registry.npmmirror.com/@types/babel__generator@7.6.7: - resolution: - { - integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==, - tarball: https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.7.tgz, - } - name: "@types/babel__generator" - version: 7.6.7 - dependencies: - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@types/babel__template@7.4.4: - resolution: - { - integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, - tarball: https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz, - } - name: "@types/babel__template" - version: 7.4.4 - dependencies: - "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@types/babel__traverse@7.20.4: - resolution: - { - integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==, - tarball: https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz, - } - name: "@types/babel__traverse" - version: 7.20.4 - dependencies: - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - dev: true - - registry.npmmirror.com/@types/codemirror@5.60.8: - resolution: - { - integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==, - tarball: https://registry.npmmirror.com/@types/codemirror/-/codemirror-5.60.8.tgz, - } - name: "@types/codemirror" - version: 5.60.8 - dependencies: - "@types/tern": registry.npmmirror.com/@types/tern@0.23.7 - dev: true - - registry.npmmirror.com/@types/estree@1.0.5: - resolution: - { - integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, - tarball: https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz, - } - name: "@types/estree" - version: 1.0.5 - dev: true - - registry.npmmirror.com/@types/graceful-fs@4.1.9: - resolution: - { - integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, - tarball: https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz, - } - name: "@types/graceful-fs" - version: 4.1.9 - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - dev: true - - registry.npmmirror.com/@types/http-cache-semantics@4.0.4: - resolution: - { - integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==, - tarball: https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz, - } - name: "@types/http-cache-semantics" - version: 4.0.4 - dev: true - - registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6: - resolution: - { - integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, - tarball: https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz, - } - name: "@types/istanbul-lib-coverage" - version: 2.0.6 - dev: true - - registry.npmmirror.com/@types/istanbul-lib-report@3.0.3: - resolution: - { - integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, - tarball: https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz, - } - name: "@types/istanbul-lib-report" - version: 3.0.3 - dependencies: - "@types/istanbul-lib-coverage": registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 - dev: true - - registry.npmmirror.com/@types/istanbul-reports@3.0.4: - resolution: - { - integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, - tarball: https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz, - } - name: "@types/istanbul-reports" - version: 3.0.4 - dependencies: - "@types/istanbul-lib-report": registry.npmmirror.com/@types/istanbul-lib-report@3.0.3 - dev: true - - registry.npmmirror.com/@types/jest@29.5.11: - resolution: - { - integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==, - tarball: https://registry.npmmirror.com/@types/jest/-/jest-29.5.11.tgz, - } - name: "@types/jest" - version: 29.5.11 - dependencies: - expect: registry.npmmirror.com/expect@29.7.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/@types/jsdom@20.0.1: - resolution: - { - integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==, - tarball: https://registry.npmmirror.com/@types/jsdom/-/jsdom-20.0.1.tgz, - } - name: "@types/jsdom" - version: 20.0.1 - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - "@types/tough-cookie": registry.npmmirror.com/@types/tough-cookie@4.0.5 - parse5: registry.npmmirror.com/parse5@7.1.2 - dev: true - - registry.npmmirror.com/@types/json-schema@7.0.15: - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - tarball: https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz, - } - name: "@types/json-schema" - version: 7.0.15 - dev: true - - registry.npmmirror.com/@types/mocha@10.0.4: - resolution: - { - integrity: sha512-xKU7bUjiFTIttpWaIZ9qvgg+22O1nmbA+HRxdlR+u6TWsGfmFdXrheJoK4fFxrHNVIOBDvDNKZG+LYBpMHpX3w==, - tarball: https://registry.npmmirror.com/@types/mocha/-/mocha-10.0.4.tgz, - } - name: "@types/mocha" - version: 10.0.4 - dev: true - - registry.npmmirror.com/@types/node@20.11.0: - resolution: - { - integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==, - tarball: https://registry.npmmirror.com/@types/node/-/node-20.11.0.tgz, - } - name: "@types/node" - version: 20.11.0 - dependencies: - undici-types: registry.npmmirror.com/undici-types@5.26.5 - dev: true - - registry.npmmirror.com/@types/normalize-package-data@2.4.4: - resolution: - { - integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, - tarball: https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz, - } - name: "@types/normalize-package-data" - version: 2.4.4 - dev: true - - registry.npmmirror.com/@types/semver@7.5.5: - resolution: - { - integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==, - tarball: https://registry.npmmirror.com/@types/semver/-/semver-7.5.5.tgz, - } - name: "@types/semver" - version: 7.5.5 - dev: true - - registry.npmmirror.com/@types/stack-utils@2.0.3: - resolution: - { - integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, - tarball: https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.3.tgz, - } - name: "@types/stack-utils" - version: 2.0.3 - dev: true - - registry.npmmirror.com/@types/tern@0.23.7: - resolution: - { - integrity: sha512-0YS9XCZ0LAhlP11HV9SqncUYyz9Ggsgc7Om/AmchKvoeFyj0qPaJmX6rJ93mJVExizWDzUMb49gAtVpI1uHd8Q==, - tarball: https://registry.npmmirror.com/@types/tern/-/tern-0.23.7.tgz, - } - name: "@types/tern" - version: 0.23.7 - dependencies: - "@types/estree": registry.npmmirror.com/@types/estree@1.0.5 - dev: true - - registry.npmmirror.com/@types/tough-cookie@4.0.5: - resolution: - { - integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==, - tarball: https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz, - } - name: "@types/tough-cookie" - version: 4.0.5 - dev: true - - registry.npmmirror.com/@types/vhtml@2.2.9: - resolution: - { - integrity: sha512-maEIRJb+PdK2FWDORl0a0aNUSGlniMl8pN+7WbanLzx1Gry4gLfsT0C9O/6JucPPBHCNrqDSImr2QcsUENLKUg==, - tarball: https://registry.npmmirror.com/@types/vhtml/-/vhtml-2.2.9.tgz, - } - name: "@types/vhtml" - version: 2.2.9 - dev: true - - registry.npmmirror.com/@types/which@2.0.2: - resolution: - { - integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==, - tarball: https://registry.npmmirror.com/@types/which/-/which-2.0.2.tgz, - } - name: "@types/which" - version: 2.0.2 - dev: true - - registry.npmmirror.com/@types/ws@8.5.9: - resolution: - { - integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==, - tarball: https://registry.npmmirror.com/@types/ws/-/ws-8.5.9.tgz, - } - name: "@types/ws" - version: 8.5.9 - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - dev: true - - registry.npmmirror.com/@types/yargs-parser@21.0.3: - resolution: - { - integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, - tarball: https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz, - } - name: "@types/yargs-parser" - version: 21.0.3 - dev: true - - registry.npmmirror.com/@types/yargs@17.0.31: - resolution: - { - integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==, - tarball: https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.31.tgz, - } - name: "@types/yargs" - version: 17.0.31 - dependencies: - "@types/yargs-parser": registry.npmmirror.com/@types/yargs-parser@21.0.3 - dev: true - - registry.npmmirror.com/@types/yauzl@2.10.3: - resolution: - { - integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, - tarball: https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz, - } - name: "@types/yauzl" - version: 2.10.3 - requiresBuild: true - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - dev: true + dependencies: + '@jest/core': registry.npmmirror.com/@jest/core@29.7.0 + '@jest/types': registry.npmmirror.com/@jest/types@29.6.3 + import-local: registry.npmmirror.com/import-local@3.1.0 + jest-cli: registry.npmmirror.com/jest-cli@29.7.0(@types/node@20.11.0) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + registry.npmmirror.com/js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, tarball: https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz} + name: js-tokens + version: 4.0.0 + dev: true + + registry.npmmirror.com/js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz} + name: js-yaml + version: 3.14.1 + hasBin: true + dependencies: + argparse: registry.npmmirror.com/argparse@1.0.10 + esprima: registry.npmmirror.com/esprima@4.0.1 + dev: true + + registry.npmmirror.com/js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz} + name: js-yaml + version: 4.1.0 + hasBin: true + dependencies: + argparse: registry.npmmirror.com/argparse@2.0.1 + dev: true + + registry.npmmirror.com/jsdom@20.0.3: + resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==, tarball: https://registry.npmmirror.com/jsdom/-/jsdom-20.0.3.tgz} + name: jsdom + version: 20.0.3 + engines: {node: '>=14'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: optional: true - - registry.npmmirror.com/@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.1.6): - resolution: - { - integrity: sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==, - tarball: https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz, - } - id: registry.npmmirror.com/@typescript-eslint/eslint-plugin/6.18.1 - name: "@typescript-eslint/eslint-plugin" - version: 6.18.1 - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@eslint-community/regexpp": registry.npmmirror.com/@eslint-community/regexpp@4.10.0 - "@typescript-eslint/parser": registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6) - "@typescript-eslint/scope-manager": registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 - "@typescript-eslint/type-utils": registry.npmmirror.com/@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) - "@typescript-eslint/utils": registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) - "@typescript-eslint/visitor-keys": registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - eslint: registry.npmmirror.com/eslint@8.56.0 - graphemer: registry.npmmirror.com/graphemer@1.4.0 - ignore: registry.npmmirror.com/ignore@5.2.4 - natural-compare: registry.npmmirror.com/natural-compare@1.4.0 - semver: registry.npmmirror.com/semver@7.5.4 - ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.1.6): - resolution: - { - integrity: sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==, - tarball: https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.18.1.tgz, - } - id: registry.npmmirror.com/@typescript-eslint/parser/6.18.1 - name: "@typescript-eslint/parser" - version: 6.18.1 - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/scope-manager": registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 - "@typescript-eslint/types": registry.npmmirror.com/@typescript-eslint/types@6.18.1 - "@typescript-eslint/typescript-estree": registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) - "@typescript-eslint/visitor-keys": registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - eslint: registry.npmmirror.com/eslint@8.56.0 - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1: - resolution: - { - integrity: sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==, - tarball: https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz, - } - name: "@typescript-eslint/scope-manager" - version: 6.18.1 - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": registry.npmmirror.com/@typescript-eslint/types@6.18.1 - "@typescript-eslint/visitor-keys": registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 - dev: true - - registry.npmmirror.com/@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.1.6): - resolution: - { - integrity: sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==, - tarball: https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz, - } - id: registry.npmmirror.com/@typescript-eslint/type-utils/6.18.1 - name: "@typescript-eslint/type-utils" - version: 6.18.1 - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/typescript-estree": registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) - "@typescript-eslint/utils": registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6) - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - eslint: registry.npmmirror.com/eslint@8.56.0 - ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@typescript-eslint/types@6.18.1: - resolution: - { - integrity: sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==, - tarball: https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.18.1.tgz, - } - name: "@typescript-eslint/types" - version: 6.18.1 - engines: { node: ^16.0.0 || >=18.0.0 } - dev: true - - registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6): - resolution: - { - integrity: sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==, - tarball: https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz, - } - id: registry.npmmirror.com/@typescript-eslint/typescript-estree/6.18.1 - name: "@typescript-eslint/typescript-estree" - version: 6.18.1 - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/types": registry.npmmirror.com/@typescript-eslint/types@6.18.1 - "@typescript-eslint/visitor-keys": registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - globby: registry.npmmirror.com/globby@11.1.0 - is-glob: registry.npmmirror.com/is-glob@4.0.3 - minimatch: registry.npmmirror.com/minimatch@9.0.3 - semver: registry.npmmirror.com/semver@7.5.4 - ts-api-utils: registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.1.6): - resolution: - { - integrity: sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==, - tarball: https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.18.1.tgz, - } - id: registry.npmmirror.com/@typescript-eslint/utils/6.18.1 - name: "@typescript-eslint/utils" - version: 6.18.1 - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - "@eslint-community/eslint-utils": registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0) - "@types/json-schema": registry.npmmirror.com/@types/json-schema@7.0.15 - "@types/semver": registry.npmmirror.com/@types/semver@7.5.5 - "@typescript-eslint/scope-manager": registry.npmmirror.com/@typescript-eslint/scope-manager@6.18.1 - "@typescript-eslint/types": registry.npmmirror.com/@typescript-eslint/types@6.18.1 - "@typescript-eslint/typescript-estree": registry.npmmirror.com/@typescript-eslint/typescript-estree@6.18.1(typescript@5.1.6) - eslint: registry.npmmirror.com/eslint@8.56.0 - semver: registry.npmmirror.com/semver@7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - registry.npmmirror.com/@typescript-eslint/visitor-keys@6.18.1: - resolution: - { - integrity: sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==, - tarball: https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz, - } - name: "@typescript-eslint/visitor-keys" - version: 6.18.1 - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": registry.npmmirror.com/@typescript-eslint/types@6.18.1 - eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 - dev: true - - registry.npmmirror.com/@ungap/structured-clone@1.2.0: - resolution: - { - integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, - tarball: https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz, - } - name: "@ungap/structured-clone" - version: 1.2.0 - dev: true - - registry.npmmirror.com/@wdio/cli@8.27.2(typescript@5.1.6): - resolution: - { - integrity: sha512-gRbwqjjczReWqLFZQX9iwTsCwGPFavJwL7iKSoIeAS645sM9PMmPW7mHzawmkFxqDDAyBWO3qFn4KV2H/2YfdA==, - tarball: https://registry.npmmirror.com/@wdio/cli/-/cli-8.27.2.tgz, - } - id: registry.npmmirror.com/@wdio/cli/8.27.2 - name: "@wdio/cli" - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - hasBin: true - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - "@wdio/config": registry.npmmirror.com/@wdio/config@8.27.2 - "@wdio/globals": registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - "@wdio/protocols": registry.npmmirror.com/@wdio/protocols@8.24.12 - "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 - "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 - async-exit-hook: registry.npmmirror.com/async-exit-hook@2.0.1 - chalk: registry.npmmirror.com/chalk@5.3.0 - chokidar: registry.npmmirror.com/chokidar@3.5.3 - cli-spinners: registry.npmmirror.com/cli-spinners@2.9.1 - dotenv: registry.npmmirror.com/dotenv@16.3.1 - ejs: registry.npmmirror.com/ejs@3.1.9 - execa: registry.npmmirror.com/execa@8.0.1 - import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 - inquirer: registry.npmmirror.com/inquirer@9.2.12 - lodash.flattendeep: registry.npmmirror.com/lodash.flattendeep@4.4.0 - lodash.pickby: registry.npmmirror.com/lodash.pickby@4.6.0 - lodash.union: registry.npmmirror.com/lodash.union@4.6.0 - read-pkg-up: registry.npmmirror.com/read-pkg-up@10.1.0 - recursive-readdir: registry.npmmirror.com/recursive-readdir@2.2.3 - webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) - yargs: registry.npmmirror.com/yargs@17.7.2 - transitivePeerDependencies: - - bufferutil - - devtools - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/@wdio/config@8.27.2: - resolution: - { - integrity: sha512-qR1r7K7/jsQhi9g5NiW40lgbvbzCcwwk8nz07hzTj6m8fQ8TXkQPob2fnrlDaNrXjzbZC4od0uv0a5fimK9YOQ==, - tarball: https://registry.npmmirror.com/@wdio/config/-/config-8.27.2.tgz, - } - name: "@wdio/config" - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - dependencies: - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 - "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 - decamelize: registry.npmmirror.com/decamelize@6.0.0 - deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 - glob: registry.npmmirror.com/glob@10.3.10 - import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6): - resolution: - { - integrity: sha512-kU9fsOD1HVSROgN0TkjH8+O2SWbd5hHzL952+YOifMHFtt05Ua/n5mqxTTVAWmxUMMCz6VOuySmBt2Dhd4NnKA==, - tarball: https://registry.npmmirror.com/@wdio/globals/-/globals-8.27.2.tgz, - } - id: registry.npmmirror.com/@wdio/globals/8.27.2 - name: "@wdio/globals" - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - optionalDependencies: - expect-webdriverio: registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6) - webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) - transitivePeerDependencies: - - bufferutil - - devtools - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/@wdio/local-runner@8.27.2(typescript@5.1.6): - resolution: - { - integrity: sha512-7m0vEulOyriMPB1+559ioEdjXlLu7yseM3KfQapCdLqaqTWvURJlMSxiHZZwuHaVGKa6YBPNB7NhRcHoUsqsAg==, - tarball: https://registry.npmmirror.com/@wdio/local-runner/-/local-runner-8.27.2.tgz, - } - id: registry.npmmirror.com/@wdio/local-runner/8.27.2 - name: "@wdio/local-runner" - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - "@wdio/repl": registry.npmmirror.com/@wdio/repl@8.24.12 - "@wdio/runner": registry.npmmirror.com/@wdio/runner@8.27.2(typescript@5.1.6) - "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 - async-exit-hook: registry.npmmirror.com/async-exit-hook@2.0.1 - split2: registry.npmmirror.com/split2@4.2.0 - stream-buffers: registry.npmmirror.com/stream-buffers@3.0.2 - transitivePeerDependencies: - - bufferutil - - devtools - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/@wdio/logger@8.24.12: - resolution: - { - integrity: sha512-QisOiVIWKTUCf1H7S+DOtC+gruhlpimQrUXfWMTeeh672PvAJYnTpOJDWA+BtXfsikkUYFAzAaq8SeMJk8rqKg==, - tarball: https://registry.npmmirror.com/@wdio/logger/-/logger-8.24.12.tgz, - } - name: "@wdio/logger" - version: 8.24.12 - engines: { node: ^16.13 || >=18 } - dependencies: - chalk: registry.npmmirror.com/chalk@5.3.0 - loglevel: registry.npmmirror.com/loglevel@1.8.1 - loglevel-plugin-prefix: registry.npmmirror.com/loglevel-plugin-prefix@0.8.4 - strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 - dev: true - - registry.npmmirror.com/@wdio/mocha-framework@8.27.2: - resolution: - { - integrity: sha512-R0PRW5X8VDJzpHPhtOGkcPFrcetDOYz9q//4uqvdtdKtngrp4goz2cVNEmnbXJDMUm5VHSYy2GW6YtsjWUxbkA==, - tarball: https://registry.npmmirror.com/@wdio/mocha-framework/-/mocha-framework-8.27.2.tgz, - } - name: "@wdio/mocha-framework" - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - dependencies: - "@types/mocha": registry.npmmirror.com/@types/mocha@10.0.4 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 - "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 - mocha: registry.npmmirror.com/mocha@10.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@wdio/protocols@8.24.12: - resolution: - { - integrity: sha512-QnVj3FkapmVD3h2zoZk+ZQ8gevSj9D9MiIQIy8eOnY4FAneYZ9R9GvoW+mgNcCZO8S8++S/jZHetR8n+8Q808g==, - tarball: https://registry.npmmirror.com/@wdio/protocols/-/protocols-8.24.12.tgz, - } - name: "@wdio/protocols" - version: 8.24.12 - dev: true - - registry.npmmirror.com/@wdio/repl@8.24.12: - resolution: - { - integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==, - tarball: https://registry.npmmirror.com/@wdio/repl/-/repl-8.24.12.tgz, - } - name: "@wdio/repl" - version: 8.24.12 - engines: { node: ^16.13 || >=18 } - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - dev: true - - registry.npmmirror.com/@wdio/reporter@8.27.2: - resolution: - { - integrity: sha512-vMhoTVsowDmk6EXYgJ4nFBd6vvMFLIO3zUL4w/DCCkPDyjS9/6ggs/wpVSlrKxw9qisAph1Z4W9ngtNuhQQuwg==, - tarball: https://registry.npmmirror.com/@wdio/reporter/-/reporter-8.27.2.tgz, - } - name: "@wdio/reporter" - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 - diff: registry.npmmirror.com/diff@5.1.0 - object-inspect: registry.npmmirror.com/object-inspect@1.13.1 - dev: true - - registry.npmmirror.com/@wdio/runner@8.27.2(typescript@5.1.6): - resolution: - { - integrity: sha512-a72dJ+7ap0DOrkrjx1ofYHzgDYzK0I7RjSGOEvi2cc+SwnwESHnwtPug5F3NfDFEMXV3Y3pN+E/yz81S27WpvQ==, - tarball: https://registry.npmmirror.com/@wdio/runner/-/runner-8.27.2.tgz, - } - id: registry.npmmirror.com/@wdio/runner/8.27.2 - name: "@wdio/runner" - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - "@wdio/config": registry.npmmirror.com/@wdio/config@8.27.2 - "@wdio/globals": registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 - "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 - deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 - expect-webdriverio: registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6) - gaze: registry.npmmirror.com/gaze@1.1.3 - webdriver: registry.npmmirror.com/webdriver@8.27.2 - webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) - transitivePeerDependencies: - - bufferutil - - devtools - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/@wdio/spec-reporter@8.27.2: - resolution: - { - integrity: sha512-2U1MALAHjUqDo3C+PYinN1wAnDBiy+kLG3GrTpMeIWZ2qZ6m1fRWt9GlADX7r07vhiRqShxy131nUenqeoF/qg==, - tarball: https://registry.npmmirror.com/@wdio/spec-reporter/-/spec-reporter-8.27.2.tgz, - } - name: "@wdio/spec-reporter" - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - dependencies: - "@wdio/reporter": registry.npmmirror.com/@wdio/reporter@8.27.2 - "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 - chalk: registry.npmmirror.com/chalk@5.3.0 - easy-table: registry.npmmirror.com/easy-table@1.2.0 - pretty-ms: registry.npmmirror.com/pretty-ms@7.0.1 - dev: true - - registry.npmmirror.com/@wdio/types@8.27.2: - resolution: - { - integrity: sha512-z/TtSQysEtAUNh+DooOs22G7xotTsJC2RcIZKaVtHY4Gl6lF+tn8kLRXD79jem2ta1byB1TpW62K366k1vzcLw==, - tarball: https://registry.npmmirror.com/@wdio/types/-/types-8.27.2.tgz, - } - name: "@wdio/types" - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - dev: true - - registry.npmmirror.com/@wdio/utils@8.27.2: - resolution: - { - integrity: sha512-jWxUhGjlZ4L3uOsP96oLKWjkITpoH/KPTtKzU7xdoVGhd1LXK4d/Fr8cTFTNkDBXM7yuM7C+EMmQ8HJHR55KTA==, - tarball: https://registry.npmmirror.com/@wdio/utils/-/utils-8.27.2.tgz, - } - name: "@wdio/utils" - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - dependencies: - "@puppeteer/browsers": registry.npmmirror.com/@puppeteer/browsers@1.8.0 - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 - decamelize: registry.npmmirror.com/decamelize@6.0.0 - deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 - edgedriver: registry.npmmirror.com/edgedriver@5.3.8 - geckodriver: registry.npmmirror.com/geckodriver@4.2.1 - get-port: registry.npmmirror.com/get-port@7.0.0 - import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 - locate-app: registry.npmmirror.com/locate-app@2.1.0 - safaridriver: registry.npmmirror.com/safaridriver@0.1.0 - split2: registry.npmmirror.com/split2@4.2.0 - wait-port: registry.npmmirror.com/wait-port@1.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/abab@2.0.6: - resolution: - { - integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, - tarball: https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz, - } - name: abab - version: 2.0.6 - deprecated: Use your platform's native atob() and btoa() methods instead - dev: true - - registry.npmmirror.com/acorn-globals@7.0.1: - resolution: - { - integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==, - tarball: https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz, - } - name: acorn-globals - version: 7.0.1 - dependencies: - acorn: registry.npmmirror.com/acorn@8.11.2 - acorn-walk: registry.npmmirror.com/acorn-walk@8.3.0 - dev: true - - registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.11.2): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - tarball: https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz, - } - id: registry.npmmirror.com/acorn-jsx/5.3.2 - name: acorn-jsx - version: 5.3.2 - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: registry.npmmirror.com/acorn@8.11.2 - dev: true - - registry.npmmirror.com/acorn-walk@8.3.0: - resolution: - { - integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==, - tarball: https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.0.tgz, - } - name: acorn-walk - version: 8.3.0 - engines: { node: ">=0.4.0" } - dev: true - - registry.npmmirror.com/acorn@8.11.2: - resolution: - { - integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, - tarball: https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz, - } - name: acorn - version: 8.11.2 - engines: { node: ">=0.4.0" } - hasBin: true - dev: true - - registry.npmmirror.com/agent-base@6.0.2: - resolution: - { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, - tarball: https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz, - } - name: agent-base - version: 6.0.2 - engines: { node: ">= 6.0.0" } - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/agent-base@7.1.0: - resolution: - { - integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==, - tarball: https://registry.npmmirror.com/agent-base/-/agent-base-7.1.0.tgz, - } - name: agent-base - version: 7.1.0 - engines: { node: ">= 14" } - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - tarball: https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz, - } - name: ajv - version: 6.12.6 - dependencies: - fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 - fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify@2.1.0 - json-schema-traverse: registry.npmmirror.com/json-schema-traverse@0.4.1 - uri-js: registry.npmmirror.com/uri-js@4.4.1 - dev: true - - registry.npmmirror.com/ansi-colors@4.1.1: - resolution: - { - integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==, - tarball: https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz, - } - name: ansi-colors - version: 4.1.1 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/ansi-escapes@4.3.2: - resolution: - { - integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, - tarball: https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz, - } - name: ansi-escapes - version: 4.3.2 - engines: { node: ">=8" } - dependencies: - type-fest: registry.npmmirror.com/type-fest@0.21.3 - dev: true - - registry.npmmirror.com/ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz, - } - name: ansi-regex - version: 5.0.1 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/ansi-regex@6.0.1: - resolution: - { - integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, - tarball: https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz, - } - name: ansi-regex - version: 6.0.1 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/ansi-styles@3.2.1: - resolution: - { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, - tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz, - } - name: ansi-styles - version: 3.2.1 - engines: { node: ">=4" } - dependencies: - color-convert: registry.npmmirror.com/color-convert@1.9.3 - dev: true - - registry.npmmirror.com/ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz, - } - name: ansi-styles - version: 4.3.0 - engines: { node: ">=8" } - dependencies: - color-convert: registry.npmmirror.com/color-convert@2.0.1 - dev: true - - registry.npmmirror.com/ansi-styles@5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz, - } - name: ansi-styles - version: 5.2.0 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/ansi-styles@6.2.1: - resolution: - { - integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, - tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz, - } - name: ansi-styles - version: 6.2.1 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - tarball: https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz, - } - name: anymatch - version: 3.1.3 - engines: { node: ">= 8" } - dependencies: - normalize-path: registry.npmmirror.com/normalize-path@3.0.0 - picomatch: registry.npmmirror.com/picomatch@2.3.1 - dev: true - - registry.npmmirror.com/archiver-utils@4.0.1: - resolution: - { - integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==, - tarball: https://registry.npmmirror.com/archiver-utils/-/archiver-utils-4.0.1.tgz, - } - name: archiver-utils - version: 4.0.1 - engines: { node: ">= 12.0.0" } - dependencies: - glob: registry.npmmirror.com/glob@8.1.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - lazystream: registry.npmmirror.com/lazystream@1.0.1 - lodash: registry.npmmirror.com/lodash@4.17.21 - normalize-path: registry.npmmirror.com/normalize-path@3.0.0 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - dev: true - - registry.npmmirror.com/archiver@6.0.1: - resolution: - { - integrity: sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==, - tarball: https://registry.npmmirror.com/archiver/-/archiver-6.0.1.tgz, - } - name: archiver - version: 6.0.1 - engines: { node: ">= 12.0.0" } - dependencies: - archiver-utils: registry.npmmirror.com/archiver-utils@4.0.1 - async: registry.npmmirror.com/async@3.2.5 - buffer-crc32: registry.npmmirror.com/buffer-crc32@0.2.13 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - readdir-glob: registry.npmmirror.com/readdir-glob@1.1.3 - tar-stream: registry.npmmirror.com/tar-stream@3.1.6 - zip-stream: registry.npmmirror.com/zip-stream@5.0.1 - dev: true - - registry.npmmirror.com/argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - tarball: https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz, - } - name: argparse - version: 1.0.10 - dependencies: - sprintf-js: registry.npmmirror.com/sprintf-js@1.0.3 - dev: true - - registry.npmmirror.com/argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - tarball: https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz, - } - name: argparse - version: 2.0.1 - dev: true - - registry.npmmirror.com/aria-query@5.1.3: - resolution: - { - integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==, - tarball: https://registry.npmmirror.com/aria-query/-/aria-query-5.1.3.tgz, - } - name: aria-query - version: 5.1.3 - dependencies: - deep-equal: registry.npmmirror.com/deep-equal@2.2.1 - dev: true - - registry.npmmirror.com/array-buffer-byte-length@1.0.0: - resolution: - { - integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==, - tarball: https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz, - } - name: array-buffer-byte-length - version: 1.0.0 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - is-array-buffer: registry.npmmirror.com/is-array-buffer@3.0.2 - dev: true - - registry.npmmirror.com/array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - tarball: https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz, - } - name: array-union - version: 2.1.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/assertion-error@1.1.0: - resolution: - { - integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, - tarball: https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz, - } - name: assertion-error - version: 1.1.0 - dev: true - - registry.npmmirror.com/ast-types@0.13.4: - resolution: - { - integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==, - tarball: https://registry.npmmirror.com/ast-types/-/ast-types-0.13.4.tgz, - } - name: ast-types - version: 0.13.4 - engines: { node: ">=4" } - dependencies: - tslib: registry.npmmirror.com/tslib@2.6.1 - dev: true - - registry.npmmirror.com/async-exit-hook@2.0.1: - resolution: - { - integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==, - tarball: https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz, - } - name: async-exit-hook - version: 2.0.1 - engines: { node: ">=0.12.0" } - dev: true - - registry.npmmirror.com/async@3.2.5: - resolution: - { - integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==, - tarball: https://registry.npmmirror.com/async/-/async-3.2.5.tgz, - } - name: async - version: 3.2.5 - dev: true - - registry.npmmirror.com/asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - tarball: https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz, - } - name: asynckit - version: 0.4.0 - dev: true - - registry.npmmirror.com/available-typed-arrays@1.0.5: - resolution: - { - integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, - tarball: https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz, - } - name: available-typed-arrays - version: 1.0.5 - engines: { node: ">= 0.4" } - dev: true - - registry.npmmirror.com/b4a@1.6.4: - resolution: - { - integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==, - tarball: https://registry.npmmirror.com/b4a/-/b4a-1.6.4.tgz, - } - name: b4a - version: 1.6.4 - dev: true - - registry.npmmirror.com/babel-jest@29.7.0(@babel/core@7.23.3): - resolution: - { - integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==, - tarball: https://registry.npmmirror.com/babel-jest/-/babel-jest-29.7.0.tgz, - } - id: registry.npmmirror.com/babel-jest/29.7.0 - name: babel-jest - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - "@babel/core": ^7.8.0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 - "@types/babel__core": registry.npmmirror.com/@types/babel__core@7.20.4 - babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul@6.1.1 - babel-preset-jest: registry.npmmirror.com/babel-preset-jest@29.6.3(@babel/core@7.23.3) - chalk: registry.npmmirror.com/chalk@4.1.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - slash: registry.npmmirror.com/slash@3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/babel-plugin-istanbul@6.1.1: - resolution: - { - integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, - tarball: https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz, - } - name: babel-plugin-istanbul - version: 6.1.1 - engines: { node: ">=8" } - dependencies: - "@babel/helper-plugin-utils": registry.npmmirror.com/@babel/helper-plugin-utils@7.22.5 - "@istanbuljs/load-nyc-config": registry.npmmirror.com/@istanbuljs/load-nyc-config@1.1.0 - "@istanbuljs/schema": registry.npmmirror.com/@istanbuljs/schema@0.1.3 - istanbul-lib-instrument: registry.npmmirror.com/istanbul-lib-instrument@5.2.1 - test-exclude: registry.npmmirror.com/test-exclude@6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/babel-plugin-jest-hoist@29.6.3: - resolution: - { - integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==, - tarball: https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz, - } - name: babel-plugin-jest-hoist - version: 29.6.3 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@babel/template": registry.npmmirror.com/@babel/template@7.22.15 - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - "@types/babel__core": registry.npmmirror.com/@types/babel__core@7.20.4 - "@types/babel__traverse": registry.npmmirror.com/@types/babel__traverse@7.20.4 - dev: true - - registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3): - resolution: - { - integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==, - tarball: https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz, - } - id: registry.npmmirror.com/babel-preset-current-node-syntax/1.0.1 - name: babel-preset-current-node-syntax - version: 1.0.1 - peerDependencies: - "@babel/core": ^7.0.0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/plugin-syntax-async-generators": registry.npmmirror.com/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.3) - "@babel/plugin-syntax-bigint": registry.npmmirror.com/@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.3) - "@babel/plugin-syntax-class-properties": registry.npmmirror.com/@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.3) - "@babel/plugin-syntax-import-meta": registry.npmmirror.com/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.3) - "@babel/plugin-syntax-json-strings": registry.npmmirror.com/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.3) - "@babel/plugin-syntax-logical-assignment-operators": registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.3) - "@babel/plugin-syntax-nullish-coalescing-operator": registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.3) - "@babel/plugin-syntax-numeric-separator": registry.npmmirror.com/@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.3) - "@babel/plugin-syntax-object-rest-spread": registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.3) - "@babel/plugin-syntax-optional-catch-binding": registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.3) - "@babel/plugin-syntax-optional-chaining": registry.npmmirror.com/@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.3) - "@babel/plugin-syntax-top-level-await": registry.npmmirror.com/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.3) - dev: true - - registry.npmmirror.com/babel-preset-jest@29.6.3(@babel/core@7.23.3): - resolution: - { - integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==, - tarball: https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz, - } - id: registry.npmmirror.com/babel-preset-jest/29.6.3 - name: babel-preset-jest - version: 29.6.3 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - "@babel/core": ^7.0.0 - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - babel-plugin-jest-hoist: registry.npmmirror.com/babel-plugin-jest-hoist@29.6.3 - babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3) - dev: true - - registry.npmmirror.com/balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - tarball: https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz, - } - name: balanced-match - version: 1.0.2 - dev: true - - registry.npmmirror.com/base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - tarball: https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz, - } - name: base64-js - version: 1.5.1 - dev: true - - registry.npmmirror.com/basic-ftp@5.0.3: - resolution: - { - integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==, - tarball: https://registry.npmmirror.com/basic-ftp/-/basic-ftp-5.0.3.tgz, - } - name: basic-ftp - version: 5.0.3 - engines: { node: ">=10.0.0" } - dev: true - - registry.npmmirror.com/big-integer@1.6.51: - resolution: - { - integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==, - tarball: https://registry.npmmirror.com/big-integer/-/big-integer-1.6.51.tgz, - } - name: big-integer - version: 1.6.51 - engines: { node: ">=0.6" } - dev: true - - registry.npmmirror.com/binary-extensions@2.2.0: - resolution: - { - integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, - tarball: https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz, - } - name: binary-extensions - version: 2.2.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/binary@0.3.0: - resolution: - { - integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==, - tarball: https://registry.npmmirror.com/binary/-/binary-0.3.0.tgz, - } - name: binary - version: 0.3.0 - dependencies: - buffers: registry.npmmirror.com/buffers@0.1.1 - chainsaw: registry.npmmirror.com/chainsaw@0.1.0 - dev: true - - registry.npmmirror.com/bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - tarball: https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz, - } - name: bl - version: 4.1.0 - dependencies: - buffer: registry.npmmirror.com/buffer@5.7.1 - inherits: registry.npmmirror.com/inherits@2.0.4 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - dev: true - - registry.npmmirror.com/bluebird@3.4.7: - resolution: - { - integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==, - tarball: https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz, - } - name: bluebird - version: 3.4.7 - dev: true - - registry.npmmirror.com/brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz, - } - name: brace-expansion - version: 1.1.11 - dependencies: - balanced-match: registry.npmmirror.com/balanced-match@1.0.2 - concat-map: registry.npmmirror.com/concat-map@0.0.1 - dev: true - - registry.npmmirror.com/brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - tarball: https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz, - } - name: brace-expansion - version: 2.0.1 - dependencies: - balanced-match: registry.npmmirror.com/balanced-match@1.0.2 - dev: true - - registry.npmmirror.com/braces@3.0.2: - resolution: - { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, - tarball: https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz, - } - name: braces - version: 3.0.2 - engines: { node: ">=8" } - dependencies: - fill-range: registry.npmmirror.com/fill-range@7.0.1 - dev: true - - registry.npmmirror.com/browser-stdout@1.3.1: - resolution: - { - integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==, - tarball: https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz, - } - name: browser-stdout - version: 1.3.1 - dev: true - - registry.npmmirror.com/browserslist@4.22.1: - resolution: - { - integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==, - tarball: https://registry.npmmirror.com/browserslist/-/browserslist-4.22.1.tgz, - } - name: browserslist - version: 4.22.1 - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true - dependencies: - caniuse-lite: registry.npmmirror.com/caniuse-lite@1.0.30001561 - electron-to-chromium: registry.npmmirror.com/electron-to-chromium@1.4.581 - node-releases: registry.npmmirror.com/node-releases@2.0.14 - update-browserslist-db: registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1) - dev: true - - registry.npmmirror.com/bser@2.1.1: - resolution: - { - integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, - tarball: https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz, - } - name: bser - version: 2.1.1 - dependencies: - node-int64: registry.npmmirror.com/node-int64@0.4.0 - dev: true - - registry.npmmirror.com/buffer-crc32@0.2.13: - resolution: - { - integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==, - tarball: https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz, - } - name: buffer-crc32 - version: 0.2.13 - dev: true - - registry.npmmirror.com/buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - tarball: https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz, - } - name: buffer-from - version: 1.1.2 - dev: true - - registry.npmmirror.com/buffer-indexof-polyfill@1.0.2: - resolution: - { - integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==, - tarball: https://registry.npmmirror.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz, - } - name: buffer-indexof-polyfill - version: 1.0.2 - engines: { node: ">=0.10" } - dev: true - - registry.npmmirror.com/buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - tarball: https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz, - } - name: buffer - version: 5.7.1 - dependencies: - base64-js: registry.npmmirror.com/base64-js@1.5.1 - ieee754: registry.npmmirror.com/ieee754@1.2.1 - dev: true - - registry.npmmirror.com/buffers@0.1.1: - resolution: - { - integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==, - tarball: https://registry.npmmirror.com/buffers/-/buffers-0.1.1.tgz, - } - name: buffers - version: 0.1.1 - engines: { node: ">=0.2.0" } - dev: true - - registry.npmmirror.com/cacheable-lookup@7.0.0: - resolution: - { - integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==, - tarball: https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz, - } - name: cacheable-lookup - version: 7.0.0 - engines: { node: ">=14.16" } - dev: true - - registry.npmmirror.com/cacheable-request@10.2.14: - resolution: - { - integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==, - tarball: https://registry.npmmirror.com/cacheable-request/-/cacheable-request-10.2.14.tgz, - } - name: cacheable-request - version: 10.2.14 - engines: { node: ">=14.16" } - dependencies: - "@types/http-cache-semantics": registry.npmmirror.com/@types/http-cache-semantics@4.0.4 - get-stream: registry.npmmirror.com/get-stream@6.0.1 - http-cache-semantics: registry.npmmirror.com/http-cache-semantics@4.1.1 - keyv: registry.npmmirror.com/keyv@4.5.4 - mimic-response: registry.npmmirror.com/mimic-response@4.0.0 - normalize-url: registry.npmmirror.com/normalize-url@8.0.0 - responselike: registry.npmmirror.com/responselike@3.0.0 - dev: true - - registry.npmmirror.com/call-bind@1.0.5: - resolution: - { - integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==, - tarball: https://registry.npmmirror.com/call-bind/-/call-bind-1.0.5.tgz, - } - name: call-bind - version: 1.0.5 - dependencies: - function-bind: registry.npmmirror.com/function-bind@1.1.2 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - set-function-length: registry.npmmirror.com/set-function-length@1.1.1 - dev: true - - registry.npmmirror.com/callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - tarball: https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz, - } - name: callsites - version: 3.1.0 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/camelcase@5.3.1: - resolution: - { - integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, - tarball: https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz, - } - name: camelcase - version: 5.3.1 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/camelcase@6.3.0: - resolution: - { - integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, - tarball: https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz, - } - name: camelcase - version: 6.3.0 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/caniuse-lite@1.0.30001561: - resolution: - { - integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==, - tarball: https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz, - } - name: caniuse-lite - version: 1.0.30001561 - dev: true - - registry.npmmirror.com/chai@4.3.10: - resolution: - { - integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==, - tarball: https://registry.npmmirror.com/chai/-/chai-4.3.10.tgz, - } - name: chai - version: 4.3.10 - engines: { node: ">=4" } - dependencies: - assertion-error: registry.npmmirror.com/assertion-error@1.1.0 - check-error: registry.npmmirror.com/check-error@1.0.3 - deep-eql: registry.npmmirror.com/deep-eql@4.1.3 - get-func-name: registry.npmmirror.com/get-func-name@2.0.2 - loupe: registry.npmmirror.com/loupe@2.3.7 - pathval: registry.npmmirror.com/pathval@1.1.1 - type-detect: registry.npmmirror.com/type-detect@4.0.8 - dev: true - - registry.npmmirror.com/chainsaw@0.1.0: - resolution: - { - integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==, - tarball: https://registry.npmmirror.com/chainsaw/-/chainsaw-0.1.0.tgz, - } - name: chainsaw - version: 0.1.0 - dependencies: - traverse: registry.npmmirror.com/traverse@0.3.9 - dev: true - - registry.npmmirror.com/chalk@2.4.2: - resolution: - { - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, - tarball: https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz, - } - name: chalk - version: 2.4.2 - engines: { node: ">=4" } - dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles@3.2.1 - escape-string-regexp: registry.npmmirror.com/escape-string-regexp@1.0.5 - supports-color: registry.npmmirror.com/supports-color@5.5.0 - dev: true - - registry.npmmirror.com/chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - tarball: https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz, - } - name: chalk - version: 4.1.2 - engines: { node: ">=10" } - dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 - supports-color: registry.npmmirror.com/supports-color@7.2.0 - dev: true - - registry.npmmirror.com/chalk@5.3.0: - resolution: - { - integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, - tarball: https://registry.npmmirror.com/chalk/-/chalk-5.3.0.tgz, - } - name: chalk - version: 5.3.0 - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: true - - registry.npmmirror.com/char-regex@1.0.2: - resolution: - { - integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, - tarball: https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz, - } - name: char-regex - version: 1.0.2 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/chardet@0.7.0: - resolution: - { - integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, - tarball: https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz, - } - name: chardet - version: 0.7.0 - dev: true - - registry.npmmirror.com/chart.js@4.4.1: - resolution: - { - integrity: sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==, - tarball: https://registry.npmmirror.com/chart.js/-/chart.js-4.4.1.tgz, - } - name: chart.js - version: 4.4.1 - engines: { pnpm: ">=7" } - dependencies: - "@kurkle/color": registry.npmmirror.com/@kurkle/color@0.3.2 - dev: false - - registry.npmmirror.com/check-error@1.0.3: - resolution: - { - integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, - tarball: https://registry.npmmirror.com/check-error/-/check-error-1.0.3.tgz, - } - name: check-error - version: 1.0.3 - dependencies: - get-func-name: registry.npmmirror.com/get-func-name@2.0.2 - dev: true - - registry.npmmirror.com/chokidar@3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz, - } - name: chokidar - version: 3.5.3 - engines: { node: ">= 8.10.0" } - dependencies: - anymatch: registry.npmmirror.com/anymatch@3.1.3 - braces: registry.npmmirror.com/braces@3.0.2 - glob-parent: registry.npmmirror.com/glob-parent@5.1.2 - is-binary-path: registry.npmmirror.com/is-binary-path@2.1.0 - is-glob: registry.npmmirror.com/is-glob@4.0.3 - normalize-path: registry.npmmirror.com/normalize-path@3.0.0 - readdirp: registry.npmmirror.com/readdirp@3.6.0 - optionalDependencies: - fsevents: registry.npmmirror.com/fsevents@2.3.3 - dev: true - - registry.npmmirror.com/chromium-bidi@0.4.16(devtools-protocol@0.0.1147663): - resolution: - { - integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==, - tarball: https://registry.npmmirror.com/chromium-bidi/-/chromium-bidi-0.4.16.tgz, - } - id: registry.npmmirror.com/chromium-bidi/0.4.16 - name: chromium-bidi - version: 0.4.16 - peerDependencies: - devtools-protocol: "*" - dependencies: - devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1147663 - mitt: registry.npmmirror.com/mitt@3.0.0 - dev: true - - registry.npmmirror.com/ci-info@3.9.0: - resolution: - { - integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, - tarball: https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz, - } - name: ci-info - version: 3.9.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/cjs-module-lexer@1.2.2: - resolution: - { - integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==, - tarball: https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz, - } - name: cjs-module-lexer - version: 1.2.2 - dev: true - - registry.npmmirror.com/cli-cursor@3.1.0: - resolution: - { - integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, - tarball: https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz, - } - name: cli-cursor - version: 3.1.0 - engines: { node: ">=8" } - dependencies: - restore-cursor: registry.npmmirror.com/restore-cursor@3.1.0 - dev: true - - registry.npmmirror.com/cli-spinners@2.9.1: - resolution: - { - integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==, - tarball: https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.1.tgz, - } - name: cli-spinners - version: 2.9.1 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/cli-width@4.1.0: - resolution: - { - integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==, - tarball: https://registry.npmmirror.com/cli-width/-/cli-width-4.1.0.tgz, - } - name: cli-width - version: 4.1.0 - engines: { node: ">= 12" } - dev: true - - registry.npmmirror.com/cliui@7.0.4: - resolution: - { - integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, - tarball: https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz, - } - name: cliui - version: 7.0.4 - dependencies: - string-width: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 - dev: true - - registry.npmmirror.com/cliui@8.0.1: - resolution: - { - integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, - tarball: https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz, - } - name: cliui - version: 8.0.1 - engines: { node: ">=12" } - dependencies: - string-width: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - wrap-ansi: registry.npmmirror.com/wrap-ansi@7.0.0 - dev: true - - registry.npmmirror.com/clone@1.0.4: - resolution: - { - integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, - tarball: https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz, - } - name: clone - version: 1.0.4 - engines: { node: ">=0.8" } - requiresBuild: true - dev: true - - registry.npmmirror.com/co@4.6.0: - resolution: - { - integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, - tarball: https://registry.npmmirror.com/co/-/co-4.6.0.tgz, - } - name: co - version: 4.6.0 - engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } - dev: true - - registry.npmmirror.com/collect-v8-coverage@1.0.1: - resolution: - { - integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==, - tarball: https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz, - } - name: collect-v8-coverage - version: 1.0.1 - dev: true - - registry.npmmirror.com/color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - tarball: https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz, - } - name: color-convert - version: 1.9.3 - dependencies: - color-name: registry.npmmirror.com/color-name@1.1.3 - dev: true - - registry.npmmirror.com/color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - tarball: https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz, - } - name: color-convert - version: 2.0.1 - engines: { node: ">=7.0.0" } - dependencies: - color-name: registry.npmmirror.com/color-name@1.1.4 - dev: true - - registry.npmmirror.com/color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz, - } - name: color-name - version: 1.1.3 - dev: true - - registry.npmmirror.com/color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz, - } - name: color-name - version: 1.1.4 - dev: true - - registry.npmmirror.com/combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - tarball: https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz, - } - name: combined-stream - version: 1.0.8 - engines: { node: ">= 0.8" } - dependencies: - delayed-stream: registry.npmmirror.com/delayed-stream@1.0.0 - dev: true - - registry.npmmirror.com/commander@9.5.0: - resolution: - { - integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, - tarball: https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz, - } - name: commander - version: 9.5.0 - engines: { node: ^12.20.0 || >=14 } - dev: true - - registry.npmmirror.com/compress-commons@5.0.1: - resolution: - { - integrity: sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==, - tarball: https://registry.npmmirror.com/compress-commons/-/compress-commons-5.0.1.tgz, - } - name: compress-commons - version: 5.0.1 - engines: { node: ">= 12.0.0" } - dependencies: - crc-32: registry.npmmirror.com/crc-32@1.2.2 - crc32-stream: registry.npmmirror.com/crc32-stream@5.0.0 - normalize-path: registry.npmmirror.com/normalize-path@3.0.0 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - dev: true - - registry.npmmirror.com/concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - tarball: https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz, - } - name: concat-map - version: 0.0.1 - dev: true - - registry.npmmirror.com/convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz, - } - name: convert-source-map - version: 2.0.0 - dev: true - - registry.npmmirror.com/core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - tarball: https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz, - } - name: core-util-is - version: 1.0.3 - dev: true - - registry.npmmirror.com/crc-32@1.2.2: - resolution: - { - integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, - tarball: https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz, - } - name: crc-32 - version: 1.2.2 - engines: { node: ">=0.8" } - hasBin: true - dev: true - - registry.npmmirror.com/crc32-stream@5.0.0: - resolution: - { - integrity: sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==, - tarball: https://registry.npmmirror.com/crc32-stream/-/crc32-stream-5.0.0.tgz, - } - name: crc32-stream - version: 5.0.0 - engines: { node: ">= 12.0.0" } - dependencies: - crc-32: registry.npmmirror.com/crc-32@1.2.2 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - dev: true - - registry.npmmirror.com/create-jest@29.7.0(@types/node@20.11.0): - resolution: - { - integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==, - tarball: https://registry.npmmirror.com/create-jest/-/create-jest-29.7.0.tgz, - } - id: registry.npmmirror.com/create-jest/29.7.0 - name: create-jest - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - dependencies: - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - chalk: registry.npmmirror.com/chalk@4.1.2 - exit: registry.npmmirror.com/exit@0.1.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) - jest-util: registry.npmmirror.com/jest-util@29.7.0 - prompts: registry.npmmirror.com/prompts@2.4.2 - transitivePeerDependencies: - - "@types/node" - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - registry.npmmirror.com/cross-fetch@4.0.0: - resolution: - { - integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==, - tarball: https://registry.npmmirror.com/cross-fetch/-/cross-fetch-4.0.0.tgz, - } - name: cross-fetch - version: 4.0.0 - dependencies: - node-fetch: registry.npmmirror.com/node-fetch@2.7.0 - transitivePeerDependencies: - - encoding - dev: true - - registry.npmmirror.com/cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - tarball: https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz, - } - name: cross-spawn - version: 7.0.3 - engines: { node: ">= 8" } - dependencies: - path-key: registry.npmmirror.com/path-key@3.1.1 - shebang-command: registry.npmmirror.com/shebang-command@2.0.0 - which: registry.npmmirror.com/which@2.0.2 - dev: true - - registry.npmmirror.com/css-shorthand-properties@1.1.1: - resolution: - { - integrity: sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==, - tarball: https://registry.npmmirror.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz, - } - name: css-shorthand-properties - version: 1.1.1 - dev: true - - registry.npmmirror.com/css-value@0.0.1: - resolution: - { - integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==, - tarball: https://registry.npmmirror.com/css-value/-/css-value-0.0.1.tgz, - } - name: css-value - version: 0.0.1 - dev: true - - registry.npmmirror.com/cssom@0.3.8: - resolution: - { - integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==, - tarball: https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz, - } - name: cssom - version: 0.3.8 - dev: true - - registry.npmmirror.com/cssom@0.5.0: - resolution: - { - integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==, - tarball: https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz, - } - name: cssom - version: 0.5.0 - dev: true - - registry.npmmirror.com/cssstyle@2.3.0: - resolution: - { - integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==, - tarball: https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz, - } - name: cssstyle - version: 2.3.0 - engines: { node: ">=8" } - dependencies: - cssom: registry.npmmirror.com/cssom@0.3.8 - dev: true - - registry.npmmirror.com/data-uri-to-buffer@4.0.1: - resolution: - { - integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, - tarball: https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz, - } - name: data-uri-to-buffer - version: 4.0.1 - engines: { node: ">= 12" } - dev: true - - registry.npmmirror.com/data-uri-to-buffer@6.0.1: - resolution: - { - integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==, - tarball: https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz, - } - name: data-uri-to-buffer - version: 6.0.1 - engines: { node: ">= 14" } - dev: true - - registry.npmmirror.com/data-urls@3.0.2: - resolution: - { - integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==, - tarball: https://registry.npmmirror.com/data-urls/-/data-urls-3.0.2.tgz, - } - name: data-urls - version: 3.0.2 - engines: { node: ">=12" } - dependencies: - abab: registry.npmmirror.com/abab@2.0.6 - whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype@3.0.0 - whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0 - dev: true - - registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1): - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - tarball: https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz, - } - id: registry.npmmirror.com/debug/4.3.4 - name: debug - version: 4.3.4 - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: registry.npmmirror.com/ms@2.1.2 - supports-color: registry.npmmirror.com/supports-color@8.1.1 - dev: true - - registry.npmmirror.com/decamelize@4.0.0: - resolution: - { - integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==, - tarball: https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz, - } - name: decamelize - version: 4.0.0 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/decamelize@6.0.0: - resolution: - { - integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==, - tarball: https://registry.npmmirror.com/decamelize/-/decamelize-6.0.0.tgz, - } - name: decamelize - version: 6.0.0 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true - - registry.npmmirror.com/decimal.js@10.4.3: - resolution: - { - integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, - tarball: https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz, - } - name: decimal.js - version: 10.4.3 - dev: true - - registry.npmmirror.com/decompress-response@6.0.0: - resolution: - { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, - tarball: https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz, - } - name: decompress-response - version: 6.0.0 - engines: { node: ">=10" } - dependencies: - mimic-response: registry.npmmirror.com/mimic-response@3.1.0 - dev: true - - registry.npmmirror.com/dedent@1.5.1: - resolution: - { - integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==, - tarball: https://registry.npmmirror.com/dedent/-/dedent-1.5.1.tgz, - } - name: dedent - version: 1.5.1 - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: true - - registry.npmmirror.com/deep-eql@4.1.3: - resolution: - { - integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==, - tarball: https://registry.npmmirror.com/deep-eql/-/deep-eql-4.1.3.tgz, - } - name: deep-eql - version: 4.1.3 - engines: { node: ">=6" } - dependencies: - type-detect: registry.npmmirror.com/type-detect@4.0.8 - dev: true - - registry.npmmirror.com/deep-equal@2.2.1: - resolution: - { - integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==, - tarball: https://registry.npmmirror.com/deep-equal/-/deep-equal-2.2.1.tgz, - } - name: deep-equal - version: 2.2.1 - dependencies: - array-buffer-byte-length: registry.npmmirror.com/array-buffer-byte-length@1.0.0 - call-bind: registry.npmmirror.com/call-bind@1.0.5 - es-get-iterator: registry.npmmirror.com/es-get-iterator@1.1.3 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - is-arguments: registry.npmmirror.com/is-arguments@1.1.1 - is-array-buffer: registry.npmmirror.com/is-array-buffer@3.0.2 - is-date-object: registry.npmmirror.com/is-date-object@1.0.5 - is-regex: registry.npmmirror.com/is-regex@1.1.4 - is-shared-array-buffer: registry.npmmirror.com/is-shared-array-buffer@1.0.2 - isarray: registry.npmmirror.com/isarray@2.0.5 - object-is: registry.npmmirror.com/object-is@1.1.5 - object-keys: registry.npmmirror.com/object-keys@1.1.1 - object.assign: registry.npmmirror.com/object.assign@4.1.5 - regexp.prototype.flags: registry.npmmirror.com/regexp.prototype.flags@1.5.0 - side-channel: registry.npmmirror.com/side-channel@1.0.4 - which-boxed-primitive: registry.npmmirror.com/which-boxed-primitive@1.0.2 - which-collection: registry.npmmirror.com/which-collection@1.0.1 - which-typed-array: registry.npmmirror.com/which-typed-array@1.1.13 - dev: true - - registry.npmmirror.com/deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - tarball: https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz, - } - name: deep-is - version: 0.1.4 - dev: true - - registry.npmmirror.com/deepcopy@2.1.0: - resolution: - { - integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==, - tarball: https://registry.npmmirror.com/deepcopy/-/deepcopy-2.1.0.tgz, - } - name: deepcopy - version: 2.1.0 - dependencies: - type-detect: registry.npmmirror.com/type-detect@4.0.8 - dev: true - - registry.npmmirror.com/deepmerge-ts@5.1.0: - resolution: - { - integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==, - tarball: https://registry.npmmirror.com/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz, - } - name: deepmerge-ts - version: 5.1.0 - engines: { node: ">=16.0.0" } - dev: true - - registry.npmmirror.com/deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - tarball: https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz, - } - name: deepmerge - version: 4.3.1 - engines: { node: ">=0.10.0" } - dev: true - - registry.npmmirror.com/defaults@1.0.4: - resolution: - { - integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, - tarball: https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz, - } - name: defaults - version: 1.0.4 - requiresBuild: true - dependencies: - clone: registry.npmmirror.com/clone@1.0.4 - dev: true - - registry.npmmirror.com/defer-to-connect@2.0.1: - resolution: - { - integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, - tarball: https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz, - } - name: defer-to-connect - version: 2.0.1 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/define-data-property@1.1.1: - resolution: - { - integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==, - tarball: https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.1.tgz, - } - name: define-data-property - version: 1.1.1 - engines: { node: ">= 0.4" } - dependencies: - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - gopd: registry.npmmirror.com/gopd@1.0.1 - has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 - dev: true - - registry.npmmirror.com/define-properties@1.2.1: - resolution: - { - integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, - tarball: https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz, - } - name: define-properties - version: 1.2.1 - engines: { node: ">= 0.4" } - dependencies: - define-data-property: registry.npmmirror.com/define-data-property@1.1.1 - has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 - object-keys: registry.npmmirror.com/object-keys@1.1.1 - dev: true - - registry.npmmirror.com/degenerator@5.0.1: - resolution: - { - integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==, - tarball: https://registry.npmmirror.com/degenerator/-/degenerator-5.0.1.tgz, - } - name: degenerator - version: 5.0.1 - engines: { node: ">= 14" } - dependencies: - ast-types: registry.npmmirror.com/ast-types@0.13.4 - escodegen: registry.npmmirror.com/escodegen@2.1.0 - esprima: registry.npmmirror.com/esprima@4.0.1 - dev: true - - registry.npmmirror.com/delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - tarball: https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz, - } - name: delayed-stream - version: 1.0.0 - engines: { node: ">=0.4.0" } - dev: true - - registry.npmmirror.com/detect-newline@3.1.0: - resolution: - { - integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, - tarball: https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz, - } - name: detect-newline - version: 3.1.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/devtools-protocol@0.0.1147663: - resolution: - { - integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==, - tarball: https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz, - } - name: devtools-protocol - version: 0.0.1147663 - dev: true - - registry.npmmirror.com/devtools-protocol@0.0.1239539: - resolution: - { - integrity: sha512-uS7hZVqZxGyZwR8lX/8wWyNLGEYs1wWWxN7qeRC+wBZ4VM5JXYwCJg8hofEna5yX0W2cavpjHOE4ukHXLHlEaA==, - tarball: https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1239539.tgz, - } - name: devtools-protocol - version: 0.0.1239539 - dev: true - - registry.npmmirror.com/diff-sequences@29.6.3: - resolution: - { - integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, - tarball: https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz, - } - name: diff-sequences - version: 29.6.3 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dev: true - - registry.npmmirror.com/diff@5.0.0: - resolution: - { - integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==, - tarball: https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz, - } - name: diff - version: 5.0.0 - engines: { node: ">=0.3.1" } - dev: true - - registry.npmmirror.com/diff@5.1.0: - resolution: - { - integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==, - tarball: https://registry.npmmirror.com/diff/-/diff-5.1.0.tgz, - } - name: diff - version: 5.1.0 - engines: { node: ">=0.3.1" } - dev: true - - registry.npmmirror.com/dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - tarball: https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz, - } - name: dir-glob - version: 3.0.1 - engines: { node: ">=8" } - dependencies: - path-type: registry.npmmirror.com/path-type@4.0.0 - dev: true - - registry.npmmirror.com/doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - tarball: https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz, - } - name: doctrine - version: 3.0.0 - engines: { node: ">=6.0.0" } - dependencies: - esutils: registry.npmmirror.com/esutils@2.0.3 - dev: true - - registry.npmmirror.com/domexception@4.0.0: - resolution: - { - integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==, - tarball: https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz, - } - name: domexception - version: 4.0.0 - engines: { node: ">=12" } - deprecated: Use your platform's native DOMException instead - dependencies: - webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 - dev: true - - registry.npmmirror.com/dotenv@16.3.1: - resolution: - { - integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, - tarball: https://registry.npmmirror.com/dotenv/-/dotenv-16.3.1.tgz, - } - name: dotenv - version: 16.3.1 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/duplexer2@0.1.4: - resolution: - { - integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, - tarball: https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz, - } - name: duplexer2 - version: 0.1.4 - dependencies: - readable-stream: registry.npmmirror.com/readable-stream@2.3.8 - dev: true - - registry.npmmirror.com/eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - tarball: https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz, - } - name: eastasianwidth - version: 0.2.0 - dev: true - - registry.npmmirror.com/easy-table@1.2.0: - resolution: - { - integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==, - tarball: https://registry.npmmirror.com/easy-table/-/easy-table-1.2.0.tgz, - } - name: easy-table - version: 1.2.0 - dependencies: - ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 - optionalDependencies: - wcwidth: registry.npmmirror.com/wcwidth@1.0.1 - dev: true - - registry.npmmirror.com/edge-paths@3.0.5: - resolution: - { - integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==, - tarball: https://registry.npmmirror.com/edge-paths/-/edge-paths-3.0.5.tgz, - } - name: edge-paths - version: 3.0.5 - engines: { node: ">=14.0.0" } - dependencies: - "@types/which": registry.npmmirror.com/@types/which@2.0.2 - which: registry.npmmirror.com/which@2.0.2 - dev: true - - registry.npmmirror.com/edgedriver@5.3.8: - resolution: - { - integrity: sha512-FWLPDuwJDeGGgtmlqTXb4lQi/HV9yylLo1F9O1g9TLqSemA5T6xH28seUIfyleVirLFtDQyKNUxKsMhMT4IfnA==, - tarball: https://registry.npmmirror.com/edgedriver/-/edgedriver-5.3.8.tgz, - } - name: edgedriver - version: 5.3.8 - hasBin: true - requiresBuild: true - dependencies: - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - decamelize: registry.npmmirror.com/decamelize@6.0.0 - edge-paths: registry.npmmirror.com/edge-paths@3.0.5 - node-fetch: registry.npmmirror.com/node-fetch@3.3.2 - unzipper: registry.npmmirror.com/unzipper@0.10.14 - which: registry.npmmirror.com/which@4.0.0 - dev: true - - registry.npmmirror.com/ejs@3.1.9: - resolution: - { - integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==, - tarball: https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz, - } - name: ejs - version: 3.1.9 - engines: { node: ">=0.10.0" } - hasBin: true - dependencies: - jake: registry.npmmirror.com/jake@10.8.5 - dev: true - - registry.npmmirror.com/electron-to-chromium@1.4.581: - resolution: - { - integrity: sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==, - tarball: https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz, - } - name: electron-to-chromium - version: 1.4.581 - dev: true - - registry.npmmirror.com/emittery@0.13.1: - resolution: - { - integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, - tarball: https://registry.npmmirror.com/emittery/-/emittery-0.13.1.tgz, - } - name: emittery - version: 0.13.1 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz, - } - name: emoji-regex - version: 8.0.0 - dev: true - - registry.npmmirror.com/emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - tarball: https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz, - } - name: emoji-regex - version: 9.2.2 - dev: true - - registry.npmmirror.com/end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - tarball: https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz, - } - name: end-of-stream - version: 1.4.4 - dependencies: - once: registry.npmmirror.com/once@1.4.0 - dev: true - - registry.npmmirror.com/entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - tarball: https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz, - } - name: entities - version: 4.5.0 - engines: { node: ">=0.12" } - dev: true - - registry.npmmirror.com/error-ex@1.3.2: - resolution: - { - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, - tarball: https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz, - } - name: error-ex - version: 1.3.2 - dependencies: - is-arrayish: registry.npmmirror.com/is-arrayish@0.2.1 - dev: true - - registry.npmmirror.com/es-get-iterator@1.1.3: - resolution: - { - integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==, - tarball: https://registry.npmmirror.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz, - } - name: es-get-iterator - version: 1.1.3 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - has-symbols: registry.npmmirror.com/has-symbols@1.0.3 - is-arguments: registry.npmmirror.com/is-arguments@1.1.1 - is-map: registry.npmmirror.com/is-map@2.0.2 - is-set: registry.npmmirror.com/is-set@2.0.2 - is-string: registry.npmmirror.com/is-string@1.0.7 - isarray: registry.npmmirror.com/isarray@2.0.5 - stop-iteration-iterator: registry.npmmirror.com/stop-iteration-iterator@1.0.0 - dev: true - - registry.npmmirror.com/esbuild@0.19.11: - resolution: - { - integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==, - tarball: https://registry.npmmirror.com/esbuild/-/esbuild-0.19.11.tgz, - } - name: esbuild - version: 0.19.11 - engines: { node: ">=12" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@esbuild/aix-ppc64": registry.npmmirror.com/@esbuild/aix-ppc64@0.19.11 - "@esbuild/android-arm": registry.npmmirror.com/@esbuild/android-arm@0.19.11 - "@esbuild/android-arm64": registry.npmmirror.com/@esbuild/android-arm64@0.19.11 - "@esbuild/android-x64": registry.npmmirror.com/@esbuild/android-x64@0.19.11 - "@esbuild/darwin-arm64": registry.npmmirror.com/@esbuild/darwin-arm64@0.19.11 - "@esbuild/darwin-x64": registry.npmmirror.com/@esbuild/darwin-x64@0.19.11 - "@esbuild/freebsd-arm64": registry.npmmirror.com/@esbuild/freebsd-arm64@0.19.11 - "@esbuild/freebsd-x64": registry.npmmirror.com/@esbuild/freebsd-x64@0.19.11 - "@esbuild/linux-arm": registry.npmmirror.com/@esbuild/linux-arm@0.19.11 - "@esbuild/linux-arm64": registry.npmmirror.com/@esbuild/linux-arm64@0.19.11 - "@esbuild/linux-ia32": registry.npmmirror.com/@esbuild/linux-ia32@0.19.11 - "@esbuild/linux-loong64": registry.npmmirror.com/@esbuild/linux-loong64@0.19.11 - "@esbuild/linux-mips64el": registry.npmmirror.com/@esbuild/linux-mips64el@0.19.11 - "@esbuild/linux-ppc64": registry.npmmirror.com/@esbuild/linux-ppc64@0.19.11 - "@esbuild/linux-riscv64": registry.npmmirror.com/@esbuild/linux-riscv64@0.19.11 - "@esbuild/linux-s390x": registry.npmmirror.com/@esbuild/linux-s390x@0.19.11 - "@esbuild/linux-x64": registry.npmmirror.com/@esbuild/linux-x64@0.19.11 - "@esbuild/netbsd-x64": registry.npmmirror.com/@esbuild/netbsd-x64@0.19.11 - "@esbuild/openbsd-x64": registry.npmmirror.com/@esbuild/openbsd-x64@0.19.11 - "@esbuild/sunos-x64": registry.npmmirror.com/@esbuild/sunos-x64@0.19.11 - "@esbuild/win32-arm64": registry.npmmirror.com/@esbuild/win32-arm64@0.19.11 - "@esbuild/win32-ia32": registry.npmmirror.com/@esbuild/win32-ia32@0.19.11 - "@esbuild/win32-x64": registry.npmmirror.com/@esbuild/win32-x64@0.19.11 - dev: true - - registry.npmmirror.com/escalade@3.1.1: - resolution: - { - integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, - tarball: https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz, - } - name: escalade - version: 3.1.1 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz, - } - name: escape-string-regexp - version: 1.0.5 - engines: { node: ">=0.8.0" } - dev: true - - registry.npmmirror.com/escape-string-regexp@2.0.0: - resolution: - { - integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, - tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz, - } - name: escape-string-regexp - version: 2.0.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz, - } - name: escape-string-regexp - version: 4.0.0 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/escape-string-regexp@5.0.0: - resolution: - { - integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, - tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz, - } - name: escape-string-regexp - version: 5.0.0 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/escodegen@2.1.0: - resolution: - { - integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, - tarball: https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz, - } - name: escodegen - version: 2.1.0 - engines: { node: ">=6.0" } - hasBin: true - dependencies: - esprima: registry.npmmirror.com/esprima@4.0.1 - estraverse: registry.npmmirror.com/estraverse@5.3.0 - esutils: registry.npmmirror.com/esutils@2.0.3 - optionalDependencies: - source-map: registry.npmmirror.com/source-map@0.6.1 - dev: true - - registry.npmmirror.com/eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - tarball: https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz, - } - name: eslint-scope - version: 7.2.2 - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - esrecurse: registry.npmmirror.com/esrecurse@4.3.0 - estraverse: registry.npmmirror.com/estraverse@5.3.0 - dev: true - - registry.npmmirror.com/eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - tarball: https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz, - } - name: eslint-visitor-keys - version: 3.4.3 - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true - - registry.npmmirror.com/eslint@8.56.0: - resolution: - { - integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, - tarball: https://registry.npmmirror.com/eslint/-/eslint-8.56.0.tgz, - } - name: eslint - version: 8.56.0 - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - "@eslint-community/eslint-utils": registry.npmmirror.com/@eslint-community/eslint-utils@4.4.0(eslint@8.56.0) - "@eslint-community/regexpp": registry.npmmirror.com/@eslint-community/regexpp@4.10.0 - "@eslint/eslintrc": registry.npmmirror.com/@eslint/eslintrc@2.1.4 - "@eslint/js": registry.npmmirror.com/@eslint/js@8.56.0 - "@humanwhocodes/config-array": registry.npmmirror.com/@humanwhocodes/config-array@0.11.13 - "@humanwhocodes/module-importer": registry.npmmirror.com/@humanwhocodes/module-importer@1.0.1 - "@nodelib/fs.walk": registry.npmmirror.com/@nodelib/fs.walk@1.2.8 - "@ungap/structured-clone": registry.npmmirror.com/@ungap/structured-clone@1.2.0 - ajv: registry.npmmirror.com/ajv@6.12.6 - chalk: registry.npmmirror.com/chalk@4.1.2 - cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - doctrine: registry.npmmirror.com/doctrine@3.0.0 - escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 - eslint-scope: registry.npmmirror.com/eslint-scope@7.2.2 - eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 - espree: registry.npmmirror.com/espree@9.6.1 - esquery: registry.npmmirror.com/esquery@1.5.0 - esutils: registry.npmmirror.com/esutils@2.0.3 - fast-deep-equal: registry.npmmirror.com/fast-deep-equal@3.1.3 - file-entry-cache: registry.npmmirror.com/file-entry-cache@6.0.1 - find-up: registry.npmmirror.com/find-up@5.0.0 - glob-parent: registry.npmmirror.com/glob-parent@6.0.2 - globals: registry.npmmirror.com/globals@13.23.0 - graphemer: registry.npmmirror.com/graphemer@1.4.0 - ignore: registry.npmmirror.com/ignore@5.2.4 - imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 - is-glob: registry.npmmirror.com/is-glob@4.0.3 - is-path-inside: registry.npmmirror.com/is-path-inside@3.0.3 - js-yaml: registry.npmmirror.com/js-yaml@4.1.0 - json-stable-stringify-without-jsonify: registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1 - levn: registry.npmmirror.com/levn@0.4.1 - lodash.merge: registry.npmmirror.com/lodash.merge@4.6.2 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - natural-compare: registry.npmmirror.com/natural-compare@1.4.0 - optionator: registry.npmmirror.com/optionator@0.9.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - text-table: registry.npmmirror.com/text-table@0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - tarball: https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz, - } - name: espree - version: 9.6.1 - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - acorn: registry.npmmirror.com/acorn@8.11.2 - acorn-jsx: registry.npmmirror.com/acorn-jsx@5.3.2(acorn@8.11.2) - eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys@3.4.3 - dev: true - - registry.npmmirror.com/esprima@4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - tarball: https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz, - } - name: esprima - version: 4.0.1 - engines: { node: ">=4" } - hasBin: true - dev: true - - registry.npmmirror.com/esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - tarball: https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz, - } - name: esquery - version: 1.5.0 - engines: { node: ">=0.10" } - dependencies: - estraverse: registry.npmmirror.com/estraverse@5.3.0 - dev: true - - registry.npmmirror.com/esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - tarball: https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz, - } - name: esrecurse - version: 4.3.0 - engines: { node: ">=4.0" } - dependencies: - estraverse: registry.npmmirror.com/estraverse@5.3.0 - dev: true - - registry.npmmirror.com/estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - tarball: https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz, - } - name: estraverse - version: 5.3.0 - engines: { node: ">=4.0" } - dev: true - - registry.npmmirror.com/esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - tarball: https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz, - } - name: esutils - version: 2.0.3 - engines: { node: ">=0.10.0" } - dev: true - - registry.npmmirror.com/execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - tarball: https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz, - } - name: execa - version: 5.1.1 - engines: { node: ">=10" } - dependencies: - cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 - get-stream: registry.npmmirror.com/get-stream@6.0.1 - human-signals: registry.npmmirror.com/human-signals@2.1.0 - is-stream: registry.npmmirror.com/is-stream@2.0.1 - merge-stream: registry.npmmirror.com/merge-stream@2.0.0 - npm-run-path: registry.npmmirror.com/npm-run-path@4.0.1 - onetime: registry.npmmirror.com/onetime@5.1.2 - signal-exit: registry.npmmirror.com/signal-exit@3.0.7 - strip-final-newline: registry.npmmirror.com/strip-final-newline@2.0.0 - dev: true - - registry.npmmirror.com/execa@8.0.1: - resolution: - { - integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, - tarball: https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz, - } - name: execa - version: 8.0.1 - engines: { node: ">=16.17" } - dependencies: - cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 - get-stream: registry.npmmirror.com/get-stream@8.0.1 - human-signals: registry.npmmirror.com/human-signals@5.0.0 - is-stream: registry.npmmirror.com/is-stream@3.0.0 - merge-stream: registry.npmmirror.com/merge-stream@2.0.0 - npm-run-path: registry.npmmirror.com/npm-run-path@5.1.0 - onetime: registry.npmmirror.com/onetime@6.0.0 - signal-exit: registry.npmmirror.com/signal-exit@4.1.0 - strip-final-newline: registry.npmmirror.com/strip-final-newline@3.0.0 - dev: true - - registry.npmmirror.com/exit@0.1.2: - resolution: - { - integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, - tarball: https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz, - } - name: exit - version: 0.1.2 - engines: { node: ">= 0.8.0" } - dev: true - - registry.npmmirror.com/expect-webdriverio@4.8.1(typescript@5.1.6): - resolution: - { - integrity: sha512-JD5aboj/tCiMXdEPCpt3BA0xL3DBhNu1MoiOdBGT9LT+9COIXoDG6Ks6h5S4c4PNwLs6xSeU8s7XxFAmBPu45Q==, - tarball: https://registry.npmmirror.com/expect-webdriverio/-/expect-webdriverio-4.8.1.tgz, - } - id: registry.npmmirror.com/expect-webdriverio/4.8.1 - name: expect-webdriverio - version: 4.8.1 - engines: { node: ">=16 || >=18 || >=20" } - dependencies: - expect: registry.npmmirror.com/expect@29.7.0 - jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 - lodash.isequal: registry.npmmirror.com/lodash.isequal@4.5.0 - optionalDependencies: - "@wdio/globals": registry.npmmirror.com/@wdio/globals@8.27.2(typescript@5.1.6) - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - webdriverio: registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6) - transitivePeerDependencies: - - bufferutil - - devtools - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/expect@29.7.0: - resolution: - { - integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==, - tarball: https://registry.npmmirror.com/expect/-/expect-29.7.0.tgz, - } - name: expect - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/expect-utils": registry.npmmirror.com/@jest/expect-utils@29.7.0 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - dev: true - - registry.npmmirror.com/external-editor@3.1.0: - resolution: - { - integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, - tarball: https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz, - } - name: external-editor - version: 3.1.0 - engines: { node: ">=4" } - dependencies: - chardet: registry.npmmirror.com/chardet@0.7.0 - iconv-lite: registry.npmmirror.com/iconv-lite@0.4.24 - tmp: registry.npmmirror.com/tmp@0.0.33 - dev: true - - registry.npmmirror.com/extract-zip@2.0.1: - resolution: - { - integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==, - tarball: https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz, - } - name: extract-zip - version: 2.0.1 - engines: { node: ">= 10.17.0" } - hasBin: true - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - get-stream: registry.npmmirror.com/get-stream@5.2.0 - yauzl: registry.npmmirror.com/yauzl@2.10.0 - optionalDependencies: - "@types/yauzl": registry.npmmirror.com/@types/yauzl@2.10.3 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/fast-deep-equal@2.0.1: - resolution: - { - integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==, - tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz, - } - name: fast-deep-equal - version: 2.0.1 - dev: true - - registry.npmmirror.com/fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - tarball: https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz, - } - name: fast-deep-equal - version: 3.1.3 - dev: true - - registry.npmmirror.com/fast-fifo@1.3.2: - resolution: - { - integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, - tarball: https://registry.npmmirror.com/fast-fifo/-/fast-fifo-1.3.2.tgz, - } - name: fast-fifo - version: 1.3.2 - dev: true - - registry.npmmirror.com/fast-glob@3.3.2: - resolution: - { - integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, - tarball: https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz, - } - name: fast-glob - version: 3.3.2 - engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": registry.npmmirror.com/@nodelib/fs.stat@2.0.5 - "@nodelib/fs.walk": registry.npmmirror.com/@nodelib/fs.walk@1.2.8 - glob-parent: registry.npmmirror.com/glob-parent@5.1.2 - merge2: registry.npmmirror.com/merge2@1.4.1 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - dev: true - - registry.npmmirror.com/fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - tarball: https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz, - } - name: fast-json-stable-stringify - version: 2.1.0 - dev: true - - registry.npmmirror.com/fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - tarball: https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz, - } - name: fast-levenshtein - version: 2.0.6 - dev: true - - registry.npmmirror.com/fastq@1.15.0: - resolution: - { - integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, - tarball: https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz, - } - name: fastq - version: 1.15.0 - dependencies: - reusify: registry.npmmirror.com/reusify@1.0.4 - dev: true - - registry.npmmirror.com/fb-watchman@2.0.2: - resolution: - { - integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, - tarball: https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz, - } - name: fb-watchman - version: 2.0.2 - dependencies: - bser: registry.npmmirror.com/bser@2.1.1 - dev: true - - registry.npmmirror.com/fd-slicer@1.1.0: - resolution: - { - integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==, - tarball: https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz, - } - name: fd-slicer - version: 1.1.0 - dependencies: - pend: registry.npmmirror.com/pend@1.2.0 - dev: true - - registry.npmmirror.com/fetch-blob@3.2.0: - resolution: - { - integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, - tarball: https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz, - } - name: fetch-blob - version: 3.2.0 - engines: { node: ^12.20 || >= 14.13 } - dependencies: - node-domexception: registry.npmmirror.com/node-domexception@1.0.0 - web-streams-polyfill: registry.npmmirror.com/web-streams-polyfill@3.2.1 - dev: true - - registry.npmmirror.com/figures@5.0.0: - resolution: - { - integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==, - tarball: https://registry.npmmirror.com/figures/-/figures-5.0.0.tgz, - } - name: figures - version: 5.0.0 - engines: { node: ">=14" } - dependencies: - escape-string-regexp: registry.npmmirror.com/escape-string-regexp@5.0.0 - is-unicode-supported: registry.npmmirror.com/is-unicode-supported@1.3.0 - dev: true - - registry.npmmirror.com/file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - tarball: https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz, - } - name: file-entry-cache - version: 6.0.1 - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flat-cache: registry.npmmirror.com/flat-cache@3.1.1 - dev: true - - registry.npmmirror.com/filelist@1.0.4: - resolution: - { - integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, - tarball: https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz, - } - name: filelist - version: 1.0.4 - dependencies: - minimatch: registry.npmmirror.com/minimatch@5.1.6 - dev: true - - registry.npmmirror.com/fill-range@7.0.1: - resolution: - { - integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, - tarball: https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz, - } - name: fill-range - version: 7.0.1 - engines: { node: ">=8" } - dependencies: - to-regex-range: registry.npmmirror.com/to-regex-range@5.0.1 - dev: true - - registry.npmmirror.com/find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - tarball: https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz, - } - name: find-up - version: 4.1.0 - engines: { node: ">=8" } - dependencies: - locate-path: registry.npmmirror.com/locate-path@5.0.0 - path-exists: registry.npmmirror.com/path-exists@4.0.0 - dev: true - - registry.npmmirror.com/find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - tarball: https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz, - } - name: find-up - version: 5.0.0 - engines: { node: ">=10" } - dependencies: - locate-path: registry.npmmirror.com/locate-path@6.0.0 - path-exists: registry.npmmirror.com/path-exists@4.0.0 - dev: true - - registry.npmmirror.com/find-up@6.3.0: - resolution: - { - integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==, - tarball: https://registry.npmmirror.com/find-up/-/find-up-6.3.0.tgz, - } - name: find-up - version: 6.3.0 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - locate-path: registry.npmmirror.com/locate-path@7.2.0 - path-exists: registry.npmmirror.com/path-exists@5.0.0 - dev: true - - registry.npmmirror.com/flat-cache@3.1.1: - resolution: - { - integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==, - tarball: https://registry.npmmirror.com/flat-cache/-/flat-cache-3.1.1.tgz, - } - name: flat-cache - version: 3.1.1 - engines: { node: ">=12.0.0" } - dependencies: - flatted: registry.npmmirror.com/flatted@3.2.9 - keyv: registry.npmmirror.com/keyv@4.5.4 - rimraf: registry.npmmirror.com/rimraf@3.0.2 - dev: true - - registry.npmmirror.com/flat@5.0.2: - resolution: - { - integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, - tarball: https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz, - } - name: flat - version: 5.0.2 - hasBin: true - dev: true - - registry.npmmirror.com/flatted@3.2.9: - resolution: - { - integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, - tarball: https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz, - } - name: flatted - version: 3.2.9 - dev: true - - registry.npmmirror.com/for-each@0.3.3: - resolution: - { - integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, - tarball: https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz, - } - name: for-each - version: 0.3.3 - dependencies: - is-callable: registry.npmmirror.com/is-callable@1.2.7 - dev: true - - registry.npmmirror.com/foreground-child@3.1.1: - resolution: - { - integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, - tarball: https://registry.npmmirror.com/foreground-child/-/foreground-child-3.1.1.tgz, - } - name: foreground-child - version: 3.1.1 - engines: { node: ">=14" } - dependencies: - cross-spawn: registry.npmmirror.com/cross-spawn@7.0.3 - signal-exit: registry.npmmirror.com/signal-exit@4.1.0 - dev: true - - registry.npmmirror.com/form-data-encoder@2.1.4: - resolution: - { - integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==, - tarball: https://registry.npmmirror.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz, - } - name: form-data-encoder - version: 2.1.4 - engines: { node: ">= 14.17" } - dev: true - - registry.npmmirror.com/form-data@4.0.0: - resolution: - { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, - tarball: https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz, - } - name: form-data - version: 4.0.0 - engines: { node: ">= 6" } - dependencies: - asynckit: registry.npmmirror.com/asynckit@0.4.0 - combined-stream: registry.npmmirror.com/combined-stream@1.0.8 - mime-types: registry.npmmirror.com/mime-types@2.1.35 - dev: true - - registry.npmmirror.com/formdata-polyfill@4.0.10: - resolution: - { - integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, - tarball: https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz, - } - name: formdata-polyfill - version: 4.0.10 - engines: { node: ">=12.20.0" } - dependencies: - fetch-blob: registry.npmmirror.com/fetch-blob@3.2.0 - dev: true - - registry.npmmirror.com/fs-extra@8.1.0: - resolution: - { - integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, - tarball: https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz, - } - name: fs-extra - version: 8.1.0 - engines: { node: ">=6 <7 || >=8" } - dependencies: - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jsonfile: registry.npmmirror.com/jsonfile@4.0.0 - universalify: registry.npmmirror.com/universalify@0.1.2 - dev: true - - registry.npmmirror.com/fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - tarball: https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz, - } - name: fs.realpath - version: 1.0.0 - dev: true - - registry.npmmirror.com/fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz, - } - name: fsevents - version: 2.3.3 - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: true + dependencies: + abab: registry.npmmirror.com/abab@2.0.6 + acorn: registry.npmmirror.com/acorn@8.11.2 + acorn-globals: registry.npmmirror.com/acorn-globals@7.0.1 + cssom: registry.npmmirror.com/cssom@0.5.0 + cssstyle: registry.npmmirror.com/cssstyle@2.3.0 + data-urls: registry.npmmirror.com/data-urls@3.0.2 + decimal.js: registry.npmmirror.com/decimal.js@10.4.3 + domexception: registry.npmmirror.com/domexception@4.0.0 + escodegen: registry.npmmirror.com/escodegen@2.1.0 + form-data: registry.npmmirror.com/form-data@4.0.0 + html-encoding-sniffer: registry.npmmirror.com/html-encoding-sniffer@3.0.0 + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@5.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@5.0.1 + is-potential-custom-element-name: registry.npmmirror.com/is-potential-custom-element-name@1.0.1 + nwsapi: registry.npmmirror.com/nwsapi@2.2.4 + parse5: registry.npmmirror.com/parse5@7.1.2 + saxes: registry.npmmirror.com/saxes@6.0.0 + symbol-tree: registry.npmmirror.com/symbol-tree@3.2.4 + tough-cookie: registry.npmmirror.com/tough-cookie@4.1.2 + w3c-xmlserializer: registry.npmmirror.com/w3c-xmlserializer@4.0.0 + webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 + whatwg-encoding: registry.npmmirror.com/whatwg-encoding@2.0.0 + whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype@3.0.0 + whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0 + ws: registry.npmmirror.com/ws@8.14.2 + xml-name-validator: registry.npmmirror.com/xml-name-validator@4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, tarball: https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz} + name: jsesc + version: 2.5.2 + engines: {node: '>=4'} + hasBin: true + dev: true + + registry.npmmirror.com/json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, tarball: https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz} + name: json-buffer + version: 3.0.1 + dev: true + + registry.npmmirror.com/json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz} + name: json-parse-even-better-errors + version: 2.3.1 + dev: true + + registry.npmmirror.com/json-parse-even-better-errors@3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==, tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz} + name: json-parse-even-better-errors + version: 3.0.0 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + registry.npmmirror.com/json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, tarball: https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz} + name: json-schema-traverse + version: 0.4.1 + dev: true + + registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, tarball: https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz} + name: json-stable-stringify-without-jsonify + version: 1.0.1 + dev: true + + registry.npmmirror.com/json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, tarball: https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz} + name: json5 + version: 2.2.3 + engines: {node: '>=6'} + hasBin: true + dev: true + + registry.npmmirror.com/jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, tarball: https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz} + name: jsonfile + version: 4.0.0 + optionalDependencies: + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + dev: true + + registry.npmmirror.com/keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, tarball: https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz} + name: keyv + version: 4.5.4 + dependencies: + json-buffer: registry.npmmirror.com/json-buffer@3.0.1 + dev: true + + registry.npmmirror.com/kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, tarball: https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz} + name: kleur + version: 3.0.3 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/ky@0.33.3: + resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==, tarball: https://registry.npmmirror.com/ky/-/ky-0.33.3.tgz} + name: ky + version: 0.33.3 + engines: {node: '>=14.16'} + dev: true + + registry.npmmirror.com/lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==, tarball: https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz} + name: lazystream + version: 1.0.1 + engines: {node: '>= 0.6.3'} + dependencies: + readable-stream: registry.npmmirror.com/readable-stream@2.3.8 + dev: true + + registry.npmmirror.com/leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, tarball: https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz} + name: leven + version: 3.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, tarball: https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz} + name: levn + version: 0.4.1 + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 + type-check: registry.npmmirror.com/type-check@0.4.0 + dev: true + + registry.npmmirror.com/lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, tarball: https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz} + name: lines-and-columns + version: 1.2.4 + dev: true + + registry.npmmirror.com/lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==, tarball: https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz} + name: lines-and-columns + version: 2.0.4 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + registry.npmmirror.com/listenercount@1.0.1: + resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==, tarball: https://registry.npmmirror.com/listenercount/-/listenercount-1.0.1.tgz} + name: listenercount + version: 1.0.1 + dev: true + + registry.npmmirror.com/locate-app@2.1.0: + resolution: {integrity: sha512-rcVo/iLUxrd9d0lrmregK/Z5Y5NCpSwf9KlMbPpOHmKmdxdQY1Fj8NDQ5QymJTryCsBLqwmniFv2f3JKbk9Bvg==, tarball: https://registry.npmmirror.com/locate-app/-/locate-app-2.1.0.tgz} + name: locate-app + version: 2.1.0 + dependencies: + n12: registry.npmmirror.com/n12@0.4.0 + type-fest: registry.npmmirror.com/type-fest@2.13.0 + userhome: registry.npmmirror.com/userhome@1.0.0 + dev: true + + registry.npmmirror.com/locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz} + name: locate-path + version: 5.0.0 + engines: {node: '>=8'} + dependencies: + p-locate: registry.npmmirror.com/p-locate@4.1.0 + dev: true + + registry.npmmirror.com/locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz} + name: locate-path + version: 6.0.0 + engines: {node: '>=10'} + dependencies: + p-locate: registry.npmmirror.com/p-locate@5.0.0 + dev: true + + registry.npmmirror.com/locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, tarball: https://registry.npmmirror.com/locate-path/-/locate-path-7.2.0.tgz} + name: locate-path + version: 7.2.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: registry.npmmirror.com/p-locate@6.0.0 + dev: true + + registry.npmmirror.com/lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==, tarball: https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz} + name: lodash.clonedeep + version: 4.5.0 + dev: true + + registry.npmmirror.com/lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==, tarball: https://registry.npmmirror.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz} + name: lodash.flattendeep + version: 4.4.0 + dev: true + + registry.npmmirror.com/lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, tarball: https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz} + name: lodash.isequal + version: 4.5.0 + dev: true + + registry.npmmirror.com/lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, tarball: https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz} + name: lodash.merge + version: 4.6.2 + dev: true + + registry.npmmirror.com/lodash.pickby@4.6.0: + resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==, tarball: https://registry.npmmirror.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz} + name: lodash.pickby + version: 4.6.0 + dev: true + + registry.npmmirror.com/lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==, tarball: https://registry.npmmirror.com/lodash.union/-/lodash.union-4.6.0.tgz} + name: lodash.union + version: 4.6.0 + dev: true + + registry.npmmirror.com/lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==, tarball: https://registry.npmmirror.com/lodash.zip/-/lodash.zip-4.2.0.tgz} + name: lodash.zip + version: 4.2.0 + dev: true + + registry.npmmirror.com/lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz} + name: lodash + version: 4.17.21 + dev: true + + registry.npmmirror.com/log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, tarball: https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz} + name: log-symbols + version: 4.1.0 + engines: {node: '>=10'} + dependencies: + chalk: registry.npmmirror.com/chalk@4.1.2 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported@0.1.0 + dev: true + + registry.npmmirror.com/loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==, tarball: https://registry.npmmirror.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz} + name: loglevel-plugin-prefix + version: 0.8.4 + dev: true + + registry.npmmirror.com/loglevel@1.8.1: + resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==, tarball: https://registry.npmmirror.com/loglevel/-/loglevel-1.8.1.tgz} + name: loglevel + version: 1.8.1 + engines: {node: '>= 0.6.0'} + dev: true + + registry.npmmirror.com/loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, tarball: https://registry.npmmirror.com/loupe/-/loupe-2.3.7.tgz} + name: loupe + version: 2.3.7 + dependencies: + get-func-name: registry.npmmirror.com/get-func-name@2.0.2 + dev: true + + registry.npmmirror.com/lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==, tarball: https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz} + name: lowercase-keys + version: 3.0.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + registry.npmmirror.com/lru-cache@10.0.2: + resolution: {integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-10.0.2.tgz} + name: lru-cache + version: 10.0.2 + engines: {node: 14 || >=16.14} + dependencies: + semver: registry.npmmirror.com/semver@7.5.4 + dev: true + + registry.npmmirror.com/lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz} + name: lru-cache + version: 5.1.1 + dependencies: + yallist: registry.npmmirror.com/yallist@3.1.1 + dev: true + + registry.npmmirror.com/lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz} + name: lru-cache + version: 6.0.0 + engines: {node: '>=10'} + dependencies: + yallist: registry.npmmirror.com/yallist@4.0.0 + dev: true + + registry.npmmirror.com/lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz} + name: lru-cache + version: 7.18.3 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, tarball: https://registry.npmmirror.com/make-dir/-/make-dir-4.0.0.tgz} + name: make-dir + version: 4.0.0 + engines: {node: '>=10'} + dependencies: + semver: registry.npmmirror.com/semver@7.5.4 + dev: true + + registry.npmmirror.com/makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, tarball: https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz} + name: makeerror + version: 1.0.12 + dependencies: + tmpl: registry.npmmirror.com/tmpl@1.0.5 + dev: true + + registry.npmmirror.com/merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, tarball: https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz} + name: merge-stream + version: 2.0.0 + dev: true + + registry.npmmirror.com/merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, tarball: https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz} + name: merge2 + version: 1.4.1 + engines: {node: '>= 8'} + dev: true + + registry.npmmirror.com/micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, tarball: https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz} + name: micromatch + version: 4.0.5 + engines: {node: '>=8.6'} + dependencies: + braces: registry.npmmirror.com/braces@3.0.2 + picomatch: registry.npmmirror.com/picomatch@2.3.1 + dev: true + + registry.npmmirror.com/mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, tarball: https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz} + name: mime-db + version: 1.52.0 + engines: {node: '>= 0.6'} + dev: true + + registry.npmmirror.com/mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, tarball: https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz} + name: mime-types + version: 2.1.35 + engines: {node: '>= 0.6'} + dependencies: + mime-db: registry.npmmirror.com/mime-db@1.52.0 + dev: true + + registry.npmmirror.com/mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, tarball: https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz} + name: mimic-fn + version: 2.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, tarball: https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz} + name: mimic-fn + version: 4.0.0 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz} + name: mimic-response + version: 3.1.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==, tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-4.0.0.tgz} + name: mimic-response + version: 4.0.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + registry.npmmirror.com/minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.0.8.tgz} + name: minimatch + version: 3.0.8 + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 + dev: true + + registry.npmmirror.com/minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz} + name: minimatch + version: 3.1.2 + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 + dev: true + + registry.npmmirror.com/minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.0.1.tgz} + name: minimatch + version: 5.0.1 + engines: {node: '>=10'} + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 + dev: true + + registry.npmmirror.com/minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz} + name: minimatch + version: 5.1.6 + engines: {node: '>=10'} + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 + dev: true + + registry.npmmirror.com/minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz} + name: minimatch + version: 9.0.3 + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 + dev: true + + registry.npmmirror.com/minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, tarball: https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz} + name: minimist + version: 1.2.8 + dev: true + + registry.npmmirror.com/minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, tarball: https://registry.npmmirror.com/minipass/-/minipass-7.0.4.tgz} + name: minipass + version: 7.0.4 + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + registry.npmmirror.com/mitt@3.0.0: + resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==, tarball: https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz} + name: mitt + version: 3.0.0 + dev: true + + registry.npmmirror.com/mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, tarball: https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz} + name: mkdirp-classic + version: 0.5.3 + dev: true + + registry.npmmirror.com/mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, tarball: https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz} + name: mkdirp + version: 0.5.6 + hasBin: true + dependencies: + minimist: registry.npmmirror.com/minimist@1.2.8 + dev: true + + registry.npmmirror.com/mocha@10.2.0: + resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==, tarball: https://registry.npmmirror.com/mocha/-/mocha-10.2.0.tgz} + name: mocha + version: 10.2.0 + engines: {node: '>= 14.0.0'} + hasBin: true + dependencies: + ansi-colors: registry.npmmirror.com/ansi-colors@4.1.1 + browser-stdout: registry.npmmirror.com/browser-stdout@1.3.1 + chokidar: registry.npmmirror.com/chokidar@3.5.3 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + diff: registry.npmmirror.com/diff@5.0.0 + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 + find-up: registry.npmmirror.com/find-up@5.0.0 + glob: registry.npmmirror.com/glob@7.2.0 + he: registry.npmmirror.com/he@1.2.0 + js-yaml: registry.npmmirror.com/js-yaml@4.1.0 + log-symbols: registry.npmmirror.com/log-symbols@4.1.0 + minimatch: registry.npmmirror.com/minimatch@5.0.1 + ms: registry.npmmirror.com/ms@2.1.3 + nanoid: registry.npmmirror.com/nanoid@3.3.3 + serialize-javascript: registry.npmmirror.com/serialize-javascript@6.0.0 + strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 + supports-color: registry.npmmirror.com/supports-color@8.1.1 + workerpool: registry.npmmirror.com/workerpool@6.2.1 + yargs: registry.npmmirror.com/yargs@16.2.0 + yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 + yargs-unparser: registry.npmmirror.com/yargs-unparser@2.0.0 + dev: true + + registry.npmmirror.com/moment@2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==, tarball: https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz} + name: moment + version: 2.29.4 + dev: true + + registry.npmmirror.com/moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==, tarball: https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz} + name: moment + version: 2.30.1 + dev: true + + registry.npmmirror.com/ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz} + name: ms + version: 2.1.2 + dev: true + + registry.npmmirror.com/ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz} + name: ms + version: 2.1.3 + dev: true + + registry.npmmirror.com/mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, tarball: https://registry.npmmirror.com/mute-stream/-/mute-stream-1.0.0.tgz} + name: mute-stream + version: 1.0.0 + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + registry.npmmirror.com/n12@0.4.0: + resolution: {integrity: sha512-p/hj4zQ8d3pbbFLQuN1K9honUxiDDhueOWyFLw/XgBv+wZCE44bcLH4CIcsolOceJQduh4Jf7m/LfaTxyGmGtQ==, tarball: https://registry.npmmirror.com/n12/-/n12-0.4.0.tgz} + name: n12 + version: 0.4.0 + dev: true + + registry.npmmirror.com/nanoid@3.3.3: + resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==, tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.3.tgz} + name: nanoid + version: 3.3.3 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + registry.npmmirror.com/natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, tarball: https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz} + name: natural-compare + version: 1.4.0 + dev: true + + registry.npmmirror.com/netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==, tarball: https://registry.npmmirror.com/netmask/-/netmask-2.0.2.tgz} + name: netmask + version: 2.0.2 + engines: {node: '>= 0.4.0'} + dev: true + + registry.npmmirror.com/node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, tarball: https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz} + name: node-domexception + version: 1.0.0 + engines: {node: '>=10.5.0'} + dev: true + + registry.npmmirror.com/node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz} + name: node-fetch + version: 2.7.0 + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: optional: true - - registry.npmmirror.com/fsrs.js@1.1.0: - resolution: - { - integrity: sha512-DEihBx081nENpNjrSvCopPVi9Ilh+u+ELYOKQmshfSz+DgC/B0hxFFMQnqy2ibWAm9zjyR/bWvaz86xEA4MIcA==, - tarball: https://registry.npmmirror.com/fsrs.js/-/fsrs.js-1.1.0.tgz, - } - name: fsrs.js - version: 1.1.0 - engines: { node: ">=10" } - dependencies: - deepcopy: registry.npmmirror.com/deepcopy@2.1.0 - dev: true - - registry.npmmirror.com/fstream@1.0.12: - resolution: - { - integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==, - tarball: https://registry.npmmirror.com/fstream/-/fstream-1.0.12.tgz, - } - name: fstream - version: 1.0.12 - engines: { node: ">=0.6" } - dependencies: - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - inherits: registry.npmmirror.com/inherits@2.0.4 - mkdirp: registry.npmmirror.com/mkdirp@0.5.6 - rimraf: registry.npmmirror.com/rimraf@2.7.1 - dev: true - - registry.npmmirror.com/function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz, - } - name: function-bind - version: 1.1.2 - dev: true - - registry.npmmirror.com/functions-have-names@1.2.3: - resolution: - { - integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, - tarball: https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz, - } - name: functions-have-names - version: 1.2.3 - dev: true - - registry.npmmirror.com/gaze@1.1.3: - resolution: - { - integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==, - tarball: https://registry.npmmirror.com/gaze/-/gaze-1.1.3.tgz, - } - name: gaze - version: 1.1.3 - engines: { node: ">= 4.0.0" } - dependencies: - globule: registry.npmmirror.com/globule@1.3.4 - dev: true - - registry.npmmirror.com/geckodriver@4.2.1: - resolution: - { - integrity: sha512-4m/CRk0OI8MaANRuFIahvOxYTSjlNAO2p9JmE14zxueknq6cdtB5M9UGRQ8R9aMV0bLGNVHHDnDXmoXdOwJfWg==, - tarball: https://registry.npmmirror.com/geckodriver/-/geckodriver-4.2.1.tgz, - } - name: geckodriver - version: 4.2.1 - engines: { node: ^16.13 || >=18 || >=20 } - hasBin: true - requiresBuild: true - dependencies: - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - decamelize: registry.npmmirror.com/decamelize@6.0.0 - http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 - https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 - node-fetch: registry.npmmirror.com/node-fetch@3.3.2 - tar-fs: registry.npmmirror.com/tar-fs@3.0.4 - unzipper: registry.npmmirror.com/unzipper@0.10.14 - which: registry.npmmirror.com/which@4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - tarball: https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz, - } - name: gensync - version: 1.0.0-beta.2 - engines: { node: ">=6.9.0" } - dev: true - - registry.npmmirror.com/get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - tarball: https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz, - } - name: get-caller-file - version: 2.0.5 - engines: { node: 6.* || 8.* || >= 10.* } - dev: true - - registry.npmmirror.com/get-func-name@2.0.2: - resolution: - { - integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, - tarball: https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.2.tgz, - } - name: get-func-name - version: 2.0.2 - dev: true - - registry.npmmirror.com/get-intrinsic@1.2.2: - resolution: - { - integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==, - tarball: https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz, - } - name: get-intrinsic - version: 1.2.2 - dependencies: - function-bind: registry.npmmirror.com/function-bind@1.1.2 - has-proto: registry.npmmirror.com/has-proto@1.0.1 - has-symbols: registry.npmmirror.com/has-symbols@1.0.3 - hasown: registry.npmmirror.com/hasown@2.0.0 - dev: true - - registry.npmmirror.com/get-package-type@0.1.0: - resolution: - { - integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, - tarball: https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz, - } - name: get-package-type - version: 0.1.0 - engines: { node: ">=8.0.0" } - dev: true - - registry.npmmirror.com/get-port@7.0.0: - resolution: - { - integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==, - tarball: https://registry.npmmirror.com/get-port/-/get-port-7.0.0.tgz, - } - name: get-port - version: 7.0.0 - engines: { node: ">=16" } - dev: true - - registry.npmmirror.com/get-stream@5.2.0: - resolution: - { - integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, - tarball: https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz, - } - name: get-stream - version: 5.2.0 - engines: { node: ">=8" } - dependencies: - pump: registry.npmmirror.com/pump@3.0.0 - dev: true - - registry.npmmirror.com/get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - tarball: https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz, - } - name: get-stream - version: 6.0.1 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/get-stream@8.0.1: - resolution: - { - integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, - tarball: https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz, - } - name: get-stream - version: 8.0.1 - engines: { node: ">=16" } - dev: true - - registry.npmmirror.com/get-uri@6.0.2: - resolution: - { - integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==, - tarball: https://registry.npmmirror.com/get-uri/-/get-uri-6.0.2.tgz, - } - name: get-uri - version: 6.0.2 - engines: { node: ">= 14" } - dependencies: - basic-ftp: registry.npmmirror.com/basic-ftp@5.0.3 - data-uri-to-buffer: registry.npmmirror.com/data-uri-to-buffer@6.0.1 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - fs-extra: registry.npmmirror.com/fs-extra@8.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz, - } - name: glob-parent - version: 5.1.2 - engines: { node: ">= 6" } - dependencies: - is-glob: registry.npmmirror.com/is-glob@4.0.3 - dev: true - - registry.npmmirror.com/glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz, - } - name: glob-parent - version: 6.0.2 - engines: { node: ">=10.13.0" } - dependencies: - is-glob: registry.npmmirror.com/is-glob@4.0.3 - dev: true - - registry.npmmirror.com/glob@10.3.10: - resolution: - { - integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==, - tarball: https://registry.npmmirror.com/glob/-/glob-10.3.10.tgz, - } - name: glob - version: 10.3.10 - engines: { node: ">=16 || 14 >=14.17" } - hasBin: true - dependencies: - foreground-child: registry.npmmirror.com/foreground-child@3.1.1 - jackspeak: registry.npmmirror.com/jackspeak@2.3.6 - minimatch: registry.npmmirror.com/minimatch@9.0.3 - minipass: registry.npmmirror.com/minipass@7.0.4 - path-scurry: registry.npmmirror.com/path-scurry@1.10.1 - dev: true - - registry.npmmirror.com/glob@7.1.7: - resolution: - { - integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==, - tarball: https://registry.npmmirror.com/glob/-/glob-7.1.7.tgz, - } - name: glob - version: 7.1.7 - dependencies: - fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 - inflight: registry.npmmirror.com/inflight@1.0.6 - inherits: registry.npmmirror.com/inherits@2.0.4 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - once: registry.npmmirror.com/once@1.4.0 - path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 - dev: true - - registry.npmmirror.com/glob@7.2.0: - resolution: - { - integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, - tarball: https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz, - } - name: glob - version: 7.2.0 - dependencies: - fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 - inflight: registry.npmmirror.com/inflight@1.0.6 - inherits: registry.npmmirror.com/inherits@2.0.4 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - once: registry.npmmirror.com/once@1.4.0 - path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 - dev: true - - registry.npmmirror.com/glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - tarball: https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz, - } - name: glob - version: 7.2.3 - dependencies: - fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 - inflight: registry.npmmirror.com/inflight@1.0.6 - inherits: registry.npmmirror.com/inherits@2.0.4 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - once: registry.npmmirror.com/once@1.4.0 - path-is-absolute: registry.npmmirror.com/path-is-absolute@1.0.1 - dev: true - - registry.npmmirror.com/glob@8.1.0: - resolution: - { - integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, - tarball: https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz, - } - name: glob - version: 8.1.0 - engines: { node: ">=12" } - dependencies: - fs.realpath: registry.npmmirror.com/fs.realpath@1.0.0 - inflight: registry.npmmirror.com/inflight@1.0.6 - inherits: registry.npmmirror.com/inherits@2.0.4 - minimatch: registry.npmmirror.com/minimatch@5.1.6 - once: registry.npmmirror.com/once@1.4.0 - dev: true - - registry.npmmirror.com/globals@11.12.0: - resolution: - { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, - tarball: https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz, - } - name: globals - version: 11.12.0 - engines: { node: ">=4" } - dev: true - - registry.npmmirror.com/globals@13.23.0: - resolution: - { - integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, - tarball: https://registry.npmmirror.com/globals/-/globals-13.23.0.tgz, - } - name: globals - version: 13.23.0 - engines: { node: ">=8" } - dependencies: - type-fest: registry.npmmirror.com/type-fest@0.20.2 - dev: true - - registry.npmmirror.com/globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - tarball: https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz, - } - name: globby - version: 11.1.0 - engines: { node: ">=10" } - dependencies: - array-union: registry.npmmirror.com/array-union@2.1.0 - dir-glob: registry.npmmirror.com/dir-glob@3.0.1 - fast-glob: registry.npmmirror.com/fast-glob@3.3.2 - ignore: registry.npmmirror.com/ignore@5.2.4 - merge2: registry.npmmirror.com/merge2@1.4.1 - slash: registry.npmmirror.com/slash@3.0.0 - dev: true - - registry.npmmirror.com/globule@1.3.4: - resolution: - { - integrity: sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==, - tarball: https://registry.npmmirror.com/globule/-/globule-1.3.4.tgz, - } - name: globule - version: 1.3.4 - engines: { node: ">= 0.10" } - dependencies: - glob: registry.npmmirror.com/glob@7.1.7 - lodash: registry.npmmirror.com/lodash@4.17.21 - minimatch: registry.npmmirror.com/minimatch@3.0.8 - dev: true - - registry.npmmirror.com/gopd@1.0.1: - resolution: - { - integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, - tarball: https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz, - } - name: gopd - version: 1.0.1 - dependencies: - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - dev: true - - registry.npmmirror.com/got@12.6.1: - resolution: - { - integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==, - tarball: https://registry.npmmirror.com/got/-/got-12.6.1.tgz, - } - name: got - version: 12.6.1 - engines: { node: ">=14.16" } - dependencies: - "@sindresorhus/is": registry.npmmirror.com/@sindresorhus/is@5.3.0 - "@szmarczak/http-timer": registry.npmmirror.com/@szmarczak/http-timer@5.0.1 - cacheable-lookup: registry.npmmirror.com/cacheable-lookup@7.0.0 - cacheable-request: registry.npmmirror.com/cacheable-request@10.2.14 - decompress-response: registry.npmmirror.com/decompress-response@6.0.0 - form-data-encoder: registry.npmmirror.com/form-data-encoder@2.1.4 - get-stream: registry.npmmirror.com/get-stream@6.0.1 - http2-wrapper: registry.npmmirror.com/http2-wrapper@2.2.1 - lowercase-keys: registry.npmmirror.com/lowercase-keys@3.0.0 - p-cancelable: registry.npmmirror.com/p-cancelable@3.0.0 - responselike: registry.npmmirror.com/responselike@3.0.0 - dev: true - - registry.npmmirror.com/graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz, - } - name: graceful-fs - version: 4.2.11 - dev: true - - registry.npmmirror.com/grapheme-splitter@1.0.4: - resolution: - { - integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, - tarball: https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz, - } - name: grapheme-splitter - version: 1.0.4 - dev: true - - registry.npmmirror.com/graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - tarball: https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz, - } - name: graphemer - version: 1.4.0 - dev: true - - registry.npmmirror.com/has-bigints@1.0.2: - resolution: - { - integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, - tarball: https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz, - } - name: has-bigints - version: 1.0.2 - dev: true - - registry.npmmirror.com/has-flag@3.0.0: - resolution: - { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, - tarball: https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz, - } - name: has-flag - version: 3.0.0 - engines: { node: ">=4" } - dev: true - - registry.npmmirror.com/has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - tarball: https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz, - } - name: has-flag - version: 4.0.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/has-property-descriptors@1.0.1: - resolution: - { - integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==, - tarball: https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz, - } - name: has-property-descriptors - version: 1.0.1 - dependencies: - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - dev: true - - registry.npmmirror.com/has-proto@1.0.1: - resolution: - { - integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, - tarball: https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz, - } - name: has-proto - version: 1.0.1 - engines: { node: ">= 0.4" } - dev: true - - registry.npmmirror.com/has-symbols@1.0.3: - resolution: - { - integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, - tarball: https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz, - } - name: has-symbols - version: 1.0.3 - engines: { node: ">= 0.4" } - dev: true - - registry.npmmirror.com/has-tostringtag@1.0.0: - resolution: - { - integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, - tarball: https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz, - } - name: has-tostringtag - version: 1.0.0 - engines: { node: ">= 0.4" } - dependencies: - has-symbols: registry.npmmirror.com/has-symbols@1.0.3 - dev: true - - registry.npmmirror.com/has@1.0.4: - resolution: - { - integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==, - tarball: https://registry.npmmirror.com/has/-/has-1.0.4.tgz, - } - name: has - version: 1.0.4 - engines: { node: ">= 0.4.0" } - dev: true - - registry.npmmirror.com/hasown@2.0.0: - resolution: - { - integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, - tarball: https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz, - } - name: hasown - version: 2.0.0 - engines: { node: ">= 0.4" } - dependencies: - function-bind: registry.npmmirror.com/function-bind@1.1.2 - dev: true - - registry.npmmirror.com/he@1.2.0: - resolution: - { - integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, - tarball: https://registry.npmmirror.com/he/-/he-1.2.0.tgz, - } - name: he - version: 1.2.0 - hasBin: true - dev: true - - registry.npmmirror.com/hosted-git-info@7.0.1: - resolution: - { - integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==, - tarball: https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz, - } - name: hosted-git-info - version: 7.0.1 - engines: { node: ^16.14.0 || >=18.0.0 } - dependencies: - lru-cache: registry.npmmirror.com/lru-cache@10.0.2 - dev: true - - registry.npmmirror.com/html-encoding-sniffer@3.0.0: - resolution: - { - integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==, - tarball: https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz, - } - name: html-encoding-sniffer - version: 3.0.0 - engines: { node: ">=12" } - dependencies: - whatwg-encoding: registry.npmmirror.com/whatwg-encoding@2.0.0 - dev: true - - registry.npmmirror.com/html-escaper@2.0.2: - resolution: - { - integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, - tarball: https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz, - } - name: html-escaper - version: 2.0.2 - dev: true - - registry.npmmirror.com/http-cache-semantics@4.1.1: - resolution: - { - integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, - tarball: https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz, - } - name: http-cache-semantics - version: 4.1.1 - dev: true - - registry.npmmirror.com/http-proxy-agent@5.0.0: - resolution: - { - integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, - tarball: https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz, - } - name: http-proxy-agent - version: 5.0.0 - engines: { node: ">= 6" } - dependencies: - "@tootallnate/once": registry.npmmirror.com/@tootallnate/once@2.0.0 - agent-base: registry.npmmirror.com/agent-base@6.0.2 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/http-proxy-agent@7.0.0: - resolution: - { - integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==, - tarball: https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz, - } - name: http-proxy-agent - version: 7.0.0 - engines: { node: ">= 14" } - dependencies: - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/http2-wrapper@2.2.1: - resolution: - { - integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==, - tarball: https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz, - } - name: http2-wrapper - version: 2.2.1 - engines: { node: ">=10.19.0" } - dependencies: - quick-lru: registry.npmmirror.com/quick-lru@5.1.1 - resolve-alpn: registry.npmmirror.com/resolve-alpn@1.2.1 - dev: true - - registry.npmmirror.com/https-proxy-agent@5.0.1: - resolution: - { - integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, - tarball: https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz, - } - name: https-proxy-agent - version: 5.0.1 - engines: { node: ">= 6" } - dependencies: - agent-base: registry.npmmirror.com/agent-base@6.0.2 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/https-proxy-agent@7.0.2: - resolution: - { - integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, - tarball: https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz, - } - name: https-proxy-agent - version: 7.0.2 - engines: { node: ">= 14" } - dependencies: - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - tarball: https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz, - } - name: human-signals - version: 2.1.0 - engines: { node: ">=10.17.0" } - dev: true - - registry.npmmirror.com/human-signals@5.0.0: - resolution: - { - integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, - tarball: https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz, - } - name: human-signals - version: 5.0.0 - engines: { node: ">=16.17.0" } - dev: true - - registry.npmmirror.com/iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz, - } - name: iconv-lite - version: 0.4.24 - engines: { node: ">=0.10.0" } - dependencies: - safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 - dev: true - - registry.npmmirror.com/iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - tarball: https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz, - } - name: iconv-lite - version: 0.6.3 - engines: { node: ">=0.10.0" } - dependencies: - safer-buffer: registry.npmmirror.com/safer-buffer@2.1.2 - dev: true - - registry.npmmirror.com/ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - tarball: https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz, - } - name: ieee754 - version: 1.2.1 - dev: true - - registry.npmmirror.com/ignore@5.2.4: - resolution: - { - integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, - tarball: https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz, - } - name: ignore - version: 5.2.4 - engines: { node: ">= 4" } - dev: true - - registry.npmmirror.com/import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - tarball: https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz, - } - name: import-fresh - version: 3.3.0 - engines: { node: ">=6" } - dependencies: - parent-module: registry.npmmirror.com/parent-module@1.0.1 - resolve-from: registry.npmmirror.com/resolve-from@4.0.0 - dev: true - - registry.npmmirror.com/import-local@3.1.0: - resolution: - { - integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, - tarball: https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz, - } - name: import-local - version: 3.1.0 - engines: { node: ">=8" } - hasBin: true - dependencies: - pkg-dir: registry.npmmirror.com/pkg-dir@4.2.0 - resolve-cwd: registry.npmmirror.com/resolve-cwd@3.0.0 - dev: true - - registry.npmmirror.com/import-meta-resolve@4.0.0: - resolution: - { - integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==, - tarball: https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz, - } - name: import-meta-resolve - version: 4.0.0 - dev: true - - registry.npmmirror.com/imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - tarball: https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz, - } - name: imurmurhash - version: 0.1.4 - engines: { node: ">=0.8.19" } - dev: true - - registry.npmmirror.com/inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - tarball: https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz, - } - name: inflight - version: 1.0.6 - dependencies: - once: registry.npmmirror.com/once@1.4.0 - wrappy: registry.npmmirror.com/wrappy@1.0.2 - dev: true - - registry.npmmirror.com/inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz, - } - name: inherits - version: 2.0.4 - dev: true - - registry.npmmirror.com/inquirer@9.2.12: - resolution: - { - integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==, - tarball: https://registry.npmmirror.com/inquirer/-/inquirer-9.2.12.tgz, - } - name: inquirer - version: 9.2.12 - engines: { node: ">=14.18.0" } - dependencies: - "@ljharb/through": registry.npmmirror.com/@ljharb/through@2.3.11 - ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 - chalk: registry.npmmirror.com/chalk@5.3.0 - cli-cursor: registry.npmmirror.com/cli-cursor@3.1.0 - cli-width: registry.npmmirror.com/cli-width@4.1.0 - external-editor: registry.npmmirror.com/external-editor@3.1.0 - figures: registry.npmmirror.com/figures@5.0.0 - lodash: registry.npmmirror.com/lodash@4.17.21 - mute-stream: registry.npmmirror.com/mute-stream@1.0.0 - ora: registry.npmmirror.com/ora@5.4.1 - run-async: registry.npmmirror.com/run-async@3.0.0 - rxjs: registry.npmmirror.com/rxjs@7.8.1 - string-width: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - wrap-ansi: registry.npmmirror.com/wrap-ansi@6.2.0 - dev: true - - registry.npmmirror.com/internal-slot@1.0.5: - resolution: - { - integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==, - tarball: https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz, - } - name: internal-slot - version: 1.0.5 - engines: { node: ">= 0.4" } - dependencies: - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - has: registry.npmmirror.com/has@1.0.4 - side-channel: registry.npmmirror.com/side-channel@1.0.4 - dev: true - - registry.npmmirror.com/ip@1.1.8: - resolution: - { - integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==, - tarball: https://registry.npmmirror.com/ip/-/ip-1.1.8.tgz, - } - name: ip - version: 1.1.8 - dev: true - - registry.npmmirror.com/ip@2.0.0: - resolution: - { - integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==, - tarball: https://registry.npmmirror.com/ip/-/ip-2.0.0.tgz, - } - name: ip - version: 2.0.0 - dev: true - - registry.npmmirror.com/is-arguments@1.1.1: - resolution: - { - integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, - tarball: https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz, - } - name: is-arguments - version: 1.1.1 - engines: { node: ">= 0.4" } - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-array-buffer@3.0.2: - resolution: - { - integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==, - tarball: https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz, - } - name: is-array-buffer - version: 3.0.2 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - is-typed-array: registry.npmmirror.com/is-typed-array@1.1.10 - dev: true - - registry.npmmirror.com/is-arrayish@0.2.1: - resolution: - { - integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, - tarball: https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz, - } - name: is-arrayish - version: 0.2.1 - dev: true - - registry.npmmirror.com/is-bigint@1.0.4: - resolution: - { - integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, - tarball: https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz, - } - name: is-bigint - version: 1.0.4 - dependencies: - has-bigints: registry.npmmirror.com/has-bigints@1.0.2 - dev: true - - registry.npmmirror.com/is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - tarball: https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz, - } - name: is-binary-path - version: 2.1.0 - engines: { node: ">=8" } - dependencies: - binary-extensions: registry.npmmirror.com/binary-extensions@2.2.0 - dev: true - - registry.npmmirror.com/is-boolean-object@1.1.2: - resolution: - { - integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, - tarball: https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz, - } - name: is-boolean-object - version: 1.1.2 - engines: { node: ">= 0.4" } - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-callable@1.2.7: - resolution: - { - integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, - tarball: https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz, - } - name: is-callable - version: 1.2.7 - engines: { node: ">= 0.4" } - dev: true - - registry.npmmirror.com/is-core-module@2.13.1: - resolution: - { - integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, - tarball: https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz, - } - name: is-core-module - version: 2.13.1 - dependencies: - hasown: registry.npmmirror.com/hasown@2.0.0 - dev: true - - registry.npmmirror.com/is-date-object@1.0.5: - resolution: - { - integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, - tarball: https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz, - } - name: is-date-object - version: 1.0.5 - engines: { node: ">= 0.4" } - dependencies: - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - tarball: https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz, - } - name: is-extglob - version: 2.1.1 - engines: { node: ">=0.10.0" } - dev: true - - registry.npmmirror.com/is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - tarball: https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz, - } - name: is-fullwidth-code-point - version: 3.0.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/is-generator-fn@2.1.0: - resolution: - { - integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, - tarball: https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz, - } - name: is-generator-fn - version: 2.1.0 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - tarball: https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz, - } - name: is-glob - version: 4.0.3 - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: registry.npmmirror.com/is-extglob@2.1.1 - dev: true - - registry.npmmirror.com/is-interactive@1.0.0: - resolution: - { - integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, - tarball: https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz, - } - name: is-interactive - version: 1.0.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/is-map@2.0.2: - resolution: - { - integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==, - tarball: https://registry.npmmirror.com/is-map/-/is-map-2.0.2.tgz, - } - name: is-map - version: 2.0.2 - dev: true - - registry.npmmirror.com/is-number-object@1.0.7: - resolution: - { - integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, - tarball: https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz, - } - name: is-number-object - version: 1.0.7 - engines: { node: ">= 0.4" } - dependencies: - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - tarball: https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz, - } - name: is-number - version: 7.0.0 - engines: { node: ">=0.12.0" } - dev: true - - registry.npmmirror.com/is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - tarball: https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz, - } - name: is-path-inside - version: 3.0.3 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/is-plain-obj@2.1.0: - resolution: - { - integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, - tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz, - } - name: is-plain-obj - version: 2.1.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/is-plain-obj@4.1.0: - resolution: - { - integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, - tarball: https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz, - } - name: is-plain-obj - version: 4.1.0 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/is-potential-custom-element-name@1.0.1: - resolution: - { - integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, - tarball: https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz, - } - name: is-potential-custom-element-name - version: 1.0.1 - dev: true - - registry.npmmirror.com/is-regex@1.1.4: - resolution: - { - integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, - tarball: https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz, - } - name: is-regex - version: 1.1.4 - engines: { node: ">= 0.4" } - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-set@2.0.2: - resolution: - { - integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==, - tarball: https://registry.npmmirror.com/is-set/-/is-set-2.0.2.tgz, - } - name: is-set - version: 2.0.2 - dev: true - - registry.npmmirror.com/is-shared-array-buffer@1.0.2: - resolution: - { - integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, - tarball: https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz, - } - name: is-shared-array-buffer - version: 1.0.2 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - dev: true - - registry.npmmirror.com/is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - tarball: https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz, - } - name: is-stream - version: 2.0.1 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/is-stream@3.0.0: - resolution: - { - integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, - tarball: https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz, - } - name: is-stream - version: 3.0.0 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true - - registry.npmmirror.com/is-string@1.0.7: - resolution: - { - integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, - tarball: https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz, - } - name: is-string - version: 1.0.7 - engines: { node: ">= 0.4" } - dependencies: - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-symbol@1.0.4: - resolution: - { - integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, - tarball: https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz, - } - name: is-symbol - version: 1.0.4 - engines: { node: ">= 0.4" } - dependencies: - has-symbols: registry.npmmirror.com/has-symbols@1.0.3 - dev: true - - registry.npmmirror.com/is-typed-array@1.1.10: - resolution: - { - integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==, - tarball: https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz, - } - name: is-typed-array - version: 1.1.10 - engines: { node: ">= 0.4" } - dependencies: - available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 - call-bind: registry.npmmirror.com/call-bind@1.0.5 - for-each: registry.npmmirror.com/for-each@0.3.3 - gopd: registry.npmmirror.com/gopd@1.0.1 - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/is-unicode-supported@0.1.0: - resolution: - { - integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, - tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz, - } - name: is-unicode-supported - version: 0.1.0 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/is-unicode-supported@1.3.0: - resolution: - { - integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==, - tarball: https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz, - } - name: is-unicode-supported - version: 1.3.0 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/is-weakmap@2.0.1: - resolution: - { - integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==, - tarball: https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.1.tgz, - } - name: is-weakmap - version: 2.0.1 - dev: true - - registry.npmmirror.com/is-weakset@2.0.2: - resolution: - { - integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==, - tarball: https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.2.tgz, - } - name: is-weakset - version: 2.0.2 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - dev: true - - registry.npmmirror.com/isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - tarball: https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz, - } - name: isarray - version: 1.0.0 - dev: true - - registry.npmmirror.com/isarray@2.0.5: - resolution: - { - integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, - tarball: https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz, - } - name: isarray - version: 2.0.5 - dev: true - - registry.npmmirror.com/isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - tarball: https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz, - } - name: isexe - version: 2.0.0 - dev: true - - registry.npmmirror.com/isexe@3.1.1: - resolution: - { - integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, - tarball: https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz, - } - name: isexe - version: 3.1.1 - engines: { node: ">=16" } - dev: true - - registry.npmmirror.com/istanbul-lib-coverage@3.2.2: - resolution: - { - integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, - tarball: https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz, - } - name: istanbul-lib-coverage - version: 3.2.2 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/istanbul-lib-instrument@5.2.1: - resolution: - { - integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, - tarball: https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz, - } - name: istanbul-lib-instrument - version: 5.2.1 - engines: { node: ">=8" } - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 - "@istanbuljs/schema": registry.npmmirror.com/@istanbuljs/schema@0.1.3 - istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 - semver: registry.npmmirror.com/semver@6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/istanbul-lib-instrument@6.0.1: - resolution: - { - integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==, - tarball: https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz, - } - name: istanbul-lib-instrument - version: 6.0.1 - engines: { node: ">=10" } - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/parser": registry.npmmirror.com/@babel/parser@7.23.3 - "@istanbuljs/schema": registry.npmmirror.com/@istanbuljs/schema@0.1.3 - istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 - semver: registry.npmmirror.com/semver@7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/istanbul-lib-report@3.0.1: - resolution: - { - integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, - tarball: https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz, - } - name: istanbul-lib-report - version: 3.0.1 - engines: { node: ">=10" } - dependencies: - istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 - make-dir: registry.npmmirror.com/make-dir@4.0.0 - supports-color: registry.npmmirror.com/supports-color@7.2.0 - dev: true - - registry.npmmirror.com/istanbul-lib-source-maps@4.0.1: - resolution: - { - integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, - tarball: https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz, - } - name: istanbul-lib-source-maps - version: 4.0.1 - engines: { node: ">=10" } - dependencies: - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage@3.2.2 - source-map: registry.npmmirror.com/source-map@0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/istanbul-reports@3.1.5: - resolution: - { - integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==, - tarball: https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz, - } - name: istanbul-reports - version: 3.1.5 - engines: { node: ">=8" } - dependencies: - html-escaper: registry.npmmirror.com/html-escaper@2.0.2 - istanbul-lib-report: registry.npmmirror.com/istanbul-lib-report@3.0.1 - dev: true - - registry.npmmirror.com/jackspeak@2.3.6: - resolution: - { - integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, - tarball: https://registry.npmmirror.com/jackspeak/-/jackspeak-2.3.6.tgz, - } - name: jackspeak - version: 2.3.6 - engines: { node: ">=14" } - dependencies: - "@isaacs/cliui": registry.npmmirror.com/@isaacs/cliui@8.0.2 - optionalDependencies: - "@pkgjs/parseargs": registry.npmmirror.com/@pkgjs/parseargs@0.11.0 - dev: true - - registry.npmmirror.com/jake@10.8.5: - resolution: - { - integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==, - tarball: https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz, - } - name: jake - version: 10.8.5 - engines: { node: ">=10" } - hasBin: true - dependencies: - async: registry.npmmirror.com/async@3.2.5 - chalk: registry.npmmirror.com/chalk@4.1.2 - filelist: registry.npmmirror.com/filelist@1.0.4 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - dev: true - - registry.npmmirror.com/jest-changed-files@29.7.0: - resolution: - { - integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==, - tarball: https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz, - } - name: jest-changed-files - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - execa: registry.npmmirror.com/execa@5.1.1 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - p-limit: registry.npmmirror.com/p-limit@3.1.0 - dev: true - - registry.npmmirror.com/jest-circus@29.7.0: - resolution: - { - integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==, - tarball: https://registry.npmmirror.com/jest-circus/-/jest-circus-29.7.0.tgz, - } - name: jest-circus - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 - "@jest/expect": registry.npmmirror.com/@jest/expect@29.7.0 - "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - co: registry.npmmirror.com/co@4.6.0 - dedent: registry.npmmirror.com/dedent@1.5.1 - is-generator-fn: registry.npmmirror.com/is-generator-fn@2.1.0 - jest-each: registry.npmmirror.com/jest-each@29.7.0 - jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 - jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - p-limit: registry.npmmirror.com/p-limit@3.1.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - pure-rand: registry.npmmirror.com/pure-rand@6.0.4 - slash: registry.npmmirror.com/slash@3.0.0 - stack-utils: registry.npmmirror.com/stack-utils@2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - registry.npmmirror.com/jest-cli@29.7.0(@types/node@20.11.0): - resolution: - { - integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==, - tarball: https://registry.npmmirror.com/jest-cli/-/jest-cli-29.7.0.tgz, - } - id: registry.npmmirror.com/jest-cli/29.7.0 - name: jest-cli - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - "@jest/core": registry.npmmirror.com/@jest/core@29.7.0 - "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - chalk: registry.npmmirror.com/chalk@4.1.2 - create-jest: registry.npmmirror.com/create-jest@29.7.0(@types/node@20.11.0) - exit: registry.npmmirror.com/exit@0.1.2 - import-local: registry.npmmirror.com/import-local@3.1.0 - jest-config: registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0) - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-validate: registry.npmmirror.com/jest-validate@29.7.0 - yargs: registry.npmmirror.com/yargs@17.7.2 - transitivePeerDependencies: - - "@types/node" - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - registry.npmmirror.com/jest-config@29.7.0(@types/node@20.11.0): - resolution: - { - integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==, - tarball: https://registry.npmmirror.com/jest-config/-/jest-config-29.7.0.tgz, - } - id: registry.npmmirror.com/jest-config/29.7.0 - name: jest-config - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - "@types/node": "*" - ts-node: ">=9.0.0" - peerDependenciesMeta: - "@types/node": - optional: true - ts-node: - optional: true - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@jest/test-sequencer": registry.npmmirror.com/@jest/test-sequencer@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - babel-jest: registry.npmmirror.com/babel-jest@29.7.0(@babel/core@7.23.3) - chalk: registry.npmmirror.com/chalk@4.1.2 - ci-info: registry.npmmirror.com/ci-info@3.9.0 - deepmerge: registry.npmmirror.com/deepmerge@4.3.1 - glob: registry.npmmirror.com/glob@7.2.3 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-circus: registry.npmmirror.com/jest-circus@29.7.0 - jest-environment-node: registry.npmmirror.com/jest-environment-node@29.7.0 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 - jest-runner: registry.npmmirror.com/jest-runner@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-validate: registry.npmmirror.com/jest-validate@29.7.0 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - parse-json: registry.npmmirror.com/parse-json@5.2.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - registry.npmmirror.com/jest-diff@29.7.0: - resolution: - { - integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==, - tarball: https://registry.npmmirror.com/jest-diff/-/jest-diff-29.7.0.tgz, - } - name: jest-diff - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - chalk: registry.npmmirror.com/chalk@4.1.2 - diff-sequences: registry.npmmirror.com/diff-sequences@29.6.3 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/jest-docblock@29.7.0: - resolution: - { - integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==, - tarball: https://registry.npmmirror.com/jest-docblock/-/jest-docblock-29.7.0.tgz, - } - name: jest-docblock - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - detect-newline: registry.npmmirror.com/detect-newline@3.1.0 - dev: true - - registry.npmmirror.com/jest-each@29.7.0: - resolution: - { - integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==, - tarball: https://registry.npmmirror.com/jest-each/-/jest-each-29.7.0.tgz, - } - name: jest-each - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - chalk: registry.npmmirror.com/chalk@4.1.2 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/jest-environment-jsdom@29.7.0: - resolution: - { - integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==, - tarball: https://registry.npmmirror.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz, - } - name: jest-environment-jsdom - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 - "@jest/fake-timers": registry.npmmirror.com/@jest/fake-timers@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/jsdom": registry.npmmirror.com/@types/jsdom@20.0.1 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jsdom: registry.npmmirror.com/jsdom@20.0.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - registry.npmmirror.com/jest-environment-node@29.7.0: - resolution: - { - integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==, - tarball: https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz, - } - name: jest-environment-node - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 - "@jest/fake-timers": registry.npmmirror.com/@jest/fake-timers@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - dev: true - - registry.npmmirror.com/jest-get-type@29.6.3: - resolution: - { - integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, - tarball: https://registry.npmmirror.com/jest-get-type/-/jest-get-type-29.6.3.tgz, - } - name: jest-get-type - version: 29.6.3 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dev: true - - registry.npmmirror.com/jest-haste-map@29.7.0: - resolution: - { - integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==, - tarball: https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz, - } - name: jest-haste-map - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/graceful-fs": registry.npmmirror.com/@types/graceful-fs@4.1.9 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - anymatch: registry.npmmirror.com/anymatch@3.1.3 - fb-watchman: registry.npmmirror.com/fb-watchman@2.0.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-worker: registry.npmmirror.com/jest-worker@29.7.0 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - walker: registry.npmmirror.com/walker@1.0.8 - optionalDependencies: - fsevents: registry.npmmirror.com/fsevents@2.3.3 - dev: true - - registry.npmmirror.com/jest-leak-detector@29.7.0: - resolution: - { - integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==, - tarball: https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz, - } - name: jest-leak-detector - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/jest-matcher-utils@29.7.0: - resolution: - { - integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==, - tarball: https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz, - } - name: jest-matcher-utils - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - chalk: registry.npmmirror.com/chalk@4.1.2 - jest-diff: registry.npmmirror.com/jest-diff@29.7.0 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/jest-message-util@29.7.0: - resolution: - { - integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==, - tarball: https://registry.npmmirror.com/jest-message-util/-/jest-message-util-29.7.0.tgz, - } - name: jest-message-util - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/stack-utils": registry.npmmirror.com/@types/stack-utils@2.0.3 - chalk: registry.npmmirror.com/chalk@4.1.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - micromatch: registry.npmmirror.com/micromatch@4.0.5 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - stack-utils: registry.npmmirror.com/stack-utils@2.0.6 - dev: true - - registry.npmmirror.com/jest-mock@29.7.0: - resolution: - { - integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==, - tarball: https://registry.npmmirror.com/jest-mock/-/jest-mock-29.7.0.tgz, - } - name: jest-mock - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - dev: true - - registry.npmmirror.com/jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: - { - integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, - tarball: https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz, - } - id: registry.npmmirror.com/jest-pnp-resolver/1.2.3 - name: jest-pnp-resolver - version: 1.2.3 - engines: { node: ">=6" } - peerDependencies: - jest-resolve: "*" - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 - dev: true - - registry.npmmirror.com/jest-regex-util@29.6.3: - resolution: - { - integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==, - tarball: https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz, - } - name: jest-regex-util - version: 29.6.3 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dev: true - - registry.npmmirror.com/jest-resolve-dependencies@29.7.0: - resolution: - { - integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==, - tarball: https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz, - } - name: jest-resolve-dependencies - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/jest-resolve@29.7.0: - resolution: - { - integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==, - tarball: https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.7.0.tgz, - } - name: jest-resolve - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - chalk: registry.npmmirror.com/chalk@4.1.2 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - jest-pnp-resolver: registry.npmmirror.com/jest-pnp-resolver@1.2.3(jest-resolve@29.7.0) - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-validate: registry.npmmirror.com/jest-validate@29.7.0 - resolve: registry.npmmirror.com/resolve@1.22.8 - resolve.exports: registry.npmmirror.com/resolve.exports@2.0.2 - slash: registry.npmmirror.com/slash@3.0.0 - dev: true - - registry.npmmirror.com/jest-runner@29.7.0: - resolution: - { - integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==, - tarball: https://registry.npmmirror.com/jest-runner/-/jest-runner-29.7.0.tgz, - } - name: jest-runner - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/console": registry.npmmirror.com/@jest/console@29.7.0 - "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 - "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 - "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - emittery: registry.npmmirror.com/emittery@0.13.1 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-docblock: registry.npmmirror.com/jest-docblock@29.7.0 - jest-environment-node: registry.npmmirror.com/jest-environment-node@29.7.0 - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - jest-leak-detector: registry.npmmirror.com/jest-leak-detector@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 - jest-runtime: registry.npmmirror.com/jest-runtime@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - jest-watcher: registry.npmmirror.com/jest-watcher@29.7.0 - jest-worker: registry.npmmirror.com/jest-worker@29.7.0 - p-limit: registry.npmmirror.com/p-limit@3.1.0 - source-map-support: registry.npmmirror.com/source-map-support@0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/jest-runtime@29.7.0: - resolution: - { - integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==, - tarball: https://registry.npmmirror.com/jest-runtime/-/jest-runtime-29.7.0.tgz, - } - name: jest-runtime - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/environment": registry.npmmirror.com/@jest/environment@29.7.0 - "@jest/fake-timers": registry.npmmirror.com/@jest/fake-timers@29.7.0 - "@jest/globals": registry.npmmirror.com/@jest/globals@29.7.0 - "@jest/source-map": registry.npmmirror.com/@jest/source-map@29.6.3 - "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 - "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - cjs-module-lexer: registry.npmmirror.com/cjs-module-lexer@1.2.2 - collect-v8-coverage: registry.npmmirror.com/collect-v8-coverage@1.0.1 - glob: registry.npmmirror.com/glob@7.2.3 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-haste-map: registry.npmmirror.com/jest-haste-map@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-mock: registry.npmmirror.com/jest-mock@29.7.0 - jest-regex-util: registry.npmmirror.com/jest-regex-util@29.6.3 - jest-resolve: registry.npmmirror.com/jest-resolve@29.7.0 - jest-snapshot: registry.npmmirror.com/jest-snapshot@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - slash: registry.npmmirror.com/slash@3.0.0 - strip-bom: registry.npmmirror.com/strip-bom@4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/jest-snapshot@29.7.0: - resolution: - { - integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==, - tarball: https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz, - } - name: jest-snapshot - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@babel/core": registry.npmmirror.com/@babel/core@7.23.3 - "@babel/generator": registry.npmmirror.com/@babel/generator@7.23.3 - "@babel/plugin-syntax-jsx": registry.npmmirror.com/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3) - "@babel/plugin-syntax-typescript": registry.npmmirror.com/@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3) - "@babel/types": registry.npmmirror.com/@babel/types@7.23.3 - "@jest/expect-utils": registry.npmmirror.com/@jest/expect-utils@29.7.0 - "@jest/transform": registry.npmmirror.com/@jest/transform@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - babel-preset-current-node-syntax: registry.npmmirror.com/babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.3) - chalk: registry.npmmirror.com/chalk@4.1.2 - expect: registry.npmmirror.com/expect@29.7.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - jest-diff: registry.npmmirror.com/jest-diff@29.7.0 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils@29.7.0 - jest-message-util: registry.npmmirror.com/jest-message-util@29.7.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - natural-compare: registry.npmmirror.com/natural-compare@1.4.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - semver: registry.npmmirror.com/semver@7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/jest-util@29.7.0: - resolution: - { - integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, - tarball: https://registry.npmmirror.com/jest-util/-/jest-util-29.7.0.tgz, - } - name: jest-util - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - ci-info: registry.npmmirror.com/ci-info@3.9.0 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - picomatch: registry.npmmirror.com/picomatch@2.3.1 - dev: true - - registry.npmmirror.com/jest-validate@29.7.0: - resolution: - { - integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==, - tarball: https://registry.npmmirror.com/jest-validate/-/jest-validate-29.7.0.tgz, - } - name: jest-validate - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - camelcase: registry.npmmirror.com/camelcase@6.3.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - jest-get-type: registry.npmmirror.com/jest-get-type@29.6.3 - leven: registry.npmmirror.com/leven@3.1.0 - pretty-format: registry.npmmirror.com/pretty-format@29.7.0 - dev: true - - registry.npmmirror.com/jest-watcher@29.7.0: - resolution: - { - integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==, - tarball: https://registry.npmmirror.com/jest-watcher/-/jest-watcher-29.7.0.tgz, - } - name: jest-watcher - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/test-result": registry.npmmirror.com/@jest/test-result@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - ansi-escapes: registry.npmmirror.com/ansi-escapes@4.3.2 - chalk: registry.npmmirror.com/chalk@4.1.2 - emittery: registry.npmmirror.com/emittery@0.13.1 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - string-length: registry.npmmirror.com/string-length@4.0.2 - dev: true - - registry.npmmirror.com/jest-worker@29.7.0: - resolution: - { - integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==, - tarball: https://registry.npmmirror.com/jest-worker/-/jest-worker-29.7.0.tgz, - } - name: jest-worker - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - jest-util: registry.npmmirror.com/jest-util@29.7.0 - merge-stream: registry.npmmirror.com/merge-stream@2.0.0 - supports-color: registry.npmmirror.com/supports-color@8.1.1 - dev: true - - registry.npmmirror.com/jest@29.7.0(@types/node@20.11.0): - resolution: - { - integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==, - tarball: https://registry.npmmirror.com/jest/-/jest-29.7.0.tgz, - } - id: registry.npmmirror.com/jest/29.7.0 - name: jest - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - "@jest/core": registry.npmmirror.com/@jest/core@29.7.0 - "@jest/types": registry.npmmirror.com/@jest/types@29.6.3 - import-local: registry.npmmirror.com/import-local@3.1.0 - jest-cli: registry.npmmirror.com/jest-cli@29.7.0(@types/node@20.11.0) - transitivePeerDependencies: - - "@types/node" - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - registry.npmmirror.com/js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - tarball: https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz, - } - name: js-tokens - version: 4.0.0 - dev: true - - registry.npmmirror.com/js-yaml@3.14.1: - resolution: - { - integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, - tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz, - } - name: js-yaml - version: 3.14.1 - hasBin: true - dependencies: - argparse: registry.npmmirror.com/argparse@1.0.10 - esprima: registry.npmmirror.com/esprima@4.0.1 - dev: true - - registry.npmmirror.com/js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz, - } - name: js-yaml - version: 4.1.0 - hasBin: true - dependencies: - argparse: registry.npmmirror.com/argparse@2.0.1 - dev: true - - registry.npmmirror.com/jsdom@20.0.3: - resolution: - { - integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==, - tarball: https://registry.npmmirror.com/jsdom/-/jsdom-20.0.3.tgz, - } - name: jsdom - version: 20.0.3 - engines: { node: ">=14" } - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: registry.npmmirror.com/abab@2.0.6 - acorn: registry.npmmirror.com/acorn@8.11.2 - acorn-globals: registry.npmmirror.com/acorn-globals@7.0.1 - cssom: registry.npmmirror.com/cssom@0.5.0 - cssstyle: registry.npmmirror.com/cssstyle@2.3.0 - data-urls: registry.npmmirror.com/data-urls@3.0.2 - decimal.js: registry.npmmirror.com/decimal.js@10.4.3 - domexception: registry.npmmirror.com/domexception@4.0.0 - escodegen: registry.npmmirror.com/escodegen@2.1.0 - form-data: registry.npmmirror.com/form-data@4.0.0 - html-encoding-sniffer: registry.npmmirror.com/html-encoding-sniffer@3.0.0 - http-proxy-agent: registry.npmmirror.com/http-proxy-agent@5.0.0 - https-proxy-agent: registry.npmmirror.com/https-proxy-agent@5.0.1 - is-potential-custom-element-name: registry.npmmirror.com/is-potential-custom-element-name@1.0.1 - nwsapi: registry.npmmirror.com/nwsapi@2.2.4 - parse5: registry.npmmirror.com/parse5@7.1.2 - saxes: registry.npmmirror.com/saxes@6.0.0 - symbol-tree: registry.npmmirror.com/symbol-tree@3.2.4 - tough-cookie: registry.npmmirror.com/tough-cookie@4.1.2 - w3c-xmlserializer: registry.npmmirror.com/w3c-xmlserializer@4.0.0 - webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 - whatwg-encoding: registry.npmmirror.com/whatwg-encoding@2.0.0 - whatwg-mimetype: registry.npmmirror.com/whatwg-mimetype@3.0.0 - whatwg-url: registry.npmmirror.com/whatwg-url@11.0.0 - ws: registry.npmmirror.com/ws@8.14.2 - xml-name-validator: registry.npmmirror.com/xml-name-validator@4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - registry.npmmirror.com/jsesc@2.5.2: - resolution: - { - integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, - tarball: https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz, - } - name: jsesc - version: 2.5.2 - engines: { node: ">=4" } - hasBin: true - dev: true - - registry.npmmirror.com/json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - tarball: https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz, - } - name: json-buffer - version: 3.0.1 - dev: true - - registry.npmmirror.com/json-parse-even-better-errors@2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz, - } - name: json-parse-even-better-errors - version: 2.3.1 - dev: true - - registry.npmmirror.com/json-parse-even-better-errors@3.0.0: - resolution: - { - integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==, - tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz, - } - name: json-parse-even-better-errors - version: 3.0.0 - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - registry.npmmirror.com/json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - tarball: https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz, - } - name: json-schema-traverse - version: 0.4.1 - dev: true - - registry.npmmirror.com/json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - tarball: https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz, - } - name: json-stable-stringify-without-jsonify - version: 1.0.1 - dev: true - - registry.npmmirror.com/json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - tarball: https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz, - } - name: json5 - version: 2.2.3 - engines: { node: ">=6" } - hasBin: true - dev: true - - registry.npmmirror.com/jsonfile@4.0.0: - resolution: - { - integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, - tarball: https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz, - } - name: jsonfile - version: 4.0.0 - optionalDependencies: - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - dev: true - - registry.npmmirror.com/keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - tarball: https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz, - } - name: keyv - version: 4.5.4 - dependencies: - json-buffer: registry.npmmirror.com/json-buffer@3.0.1 - dev: true - - registry.npmmirror.com/kleur@3.0.3: - resolution: - { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, - tarball: https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz, - } - name: kleur - version: 3.0.3 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/ky@0.33.3: - resolution: - { - integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==, - tarball: https://registry.npmmirror.com/ky/-/ky-0.33.3.tgz, - } - name: ky - version: 0.33.3 - engines: { node: ">=14.16" } - dev: true - - registry.npmmirror.com/lazystream@1.0.1: - resolution: - { - integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==, - tarball: https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz, - } - name: lazystream - version: 1.0.1 - engines: { node: ">= 0.6.3" } - dependencies: - readable-stream: registry.npmmirror.com/readable-stream@2.3.8 - dev: true - - registry.npmmirror.com/leven@3.1.0: - resolution: - { - integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, - tarball: https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz, - } - name: leven - version: 3.1.0 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - tarball: https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz, - } - name: levn - version: 0.4.1 - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 - type-check: registry.npmmirror.com/type-check@0.4.0 - dev: true - - registry.npmmirror.com/lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - tarball: https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz, - } - name: lines-and-columns - version: 1.2.4 - dev: true - - registry.npmmirror.com/lines-and-columns@2.0.4: - resolution: - { - integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==, - tarball: https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz, - } - name: lines-and-columns - version: 2.0.4 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true - - registry.npmmirror.com/listenercount@1.0.1: - resolution: - { - integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==, - tarball: https://registry.npmmirror.com/listenercount/-/listenercount-1.0.1.tgz, - } - name: listenercount - version: 1.0.1 - dev: true - - registry.npmmirror.com/locate-app@2.1.0: - resolution: - { - integrity: sha512-rcVo/iLUxrd9d0lrmregK/Z5Y5NCpSwf9KlMbPpOHmKmdxdQY1Fj8NDQ5QymJTryCsBLqwmniFv2f3JKbk9Bvg==, - tarball: https://registry.npmmirror.com/locate-app/-/locate-app-2.1.0.tgz, - } - name: locate-app - version: 2.1.0 - dependencies: - n12: registry.npmmirror.com/n12@0.4.0 - type-fest: registry.npmmirror.com/type-fest@2.13.0 - userhome: registry.npmmirror.com/userhome@1.0.0 - dev: true - - registry.npmmirror.com/locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - tarball: https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz, - } - name: locate-path - version: 5.0.0 - engines: { node: ">=8" } - dependencies: - p-locate: registry.npmmirror.com/p-locate@4.1.0 - dev: true - - registry.npmmirror.com/locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - tarball: https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz, - } - name: locate-path - version: 6.0.0 - engines: { node: ">=10" } - dependencies: - p-locate: registry.npmmirror.com/p-locate@5.0.0 - dev: true - - registry.npmmirror.com/locate-path@7.2.0: - resolution: - { - integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, - tarball: https://registry.npmmirror.com/locate-path/-/locate-path-7.2.0.tgz, - } - name: locate-path - version: 7.2.0 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - p-locate: registry.npmmirror.com/p-locate@6.0.0 - dev: true - - registry.npmmirror.com/lodash.clonedeep@4.5.0: - resolution: - { - integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==, - tarball: https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz, - } - name: lodash.clonedeep - version: 4.5.0 - dev: true - - registry.npmmirror.com/lodash.flattendeep@4.4.0: - resolution: - { - integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==, - tarball: https://registry.npmmirror.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz, - } - name: lodash.flattendeep - version: 4.4.0 - dev: true - - registry.npmmirror.com/lodash.isequal@4.5.0: - resolution: - { - integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, - tarball: https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz, - } - name: lodash.isequal - version: 4.5.0 - dev: true - - registry.npmmirror.com/lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - tarball: https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz, - } - name: lodash.merge - version: 4.6.2 - dev: true - - registry.npmmirror.com/lodash.pickby@4.6.0: - resolution: - { - integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==, - tarball: https://registry.npmmirror.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz, - } - name: lodash.pickby - version: 4.6.0 - dev: true - - registry.npmmirror.com/lodash.union@4.6.0: - resolution: - { - integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==, - tarball: https://registry.npmmirror.com/lodash.union/-/lodash.union-4.6.0.tgz, - } - name: lodash.union - version: 4.6.0 - dev: true - - registry.npmmirror.com/lodash.zip@4.2.0: - resolution: - { - integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==, - tarball: https://registry.npmmirror.com/lodash.zip/-/lodash.zip-4.2.0.tgz, - } - name: lodash.zip - version: 4.2.0 - dev: true - - registry.npmmirror.com/lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz, - } - name: lodash - version: 4.17.21 - dev: true - - registry.npmmirror.com/log-symbols@4.1.0: - resolution: - { - integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, - tarball: https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz, - } - name: log-symbols - version: 4.1.0 - engines: { node: ">=10" } - dependencies: - chalk: registry.npmmirror.com/chalk@4.1.2 - is-unicode-supported: registry.npmmirror.com/is-unicode-supported@0.1.0 - dev: true - - registry.npmmirror.com/loglevel-plugin-prefix@0.8.4: - resolution: - { - integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==, - tarball: https://registry.npmmirror.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz, - } - name: loglevel-plugin-prefix - version: 0.8.4 - dev: true - - registry.npmmirror.com/loglevel@1.8.1: - resolution: - { - integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==, - tarball: https://registry.npmmirror.com/loglevel/-/loglevel-1.8.1.tgz, - } - name: loglevel - version: 1.8.1 - engines: { node: ">= 0.6.0" } - dev: true - - registry.npmmirror.com/loupe@2.3.7: - resolution: - { - integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, - tarball: https://registry.npmmirror.com/loupe/-/loupe-2.3.7.tgz, - } - name: loupe - version: 2.3.7 - dependencies: - get-func-name: registry.npmmirror.com/get-func-name@2.0.2 - dev: true - - registry.npmmirror.com/lowercase-keys@3.0.0: - resolution: - { - integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==, - tarball: https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz, - } - name: lowercase-keys - version: 3.0.0 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true - - registry.npmmirror.com/lru-cache@10.0.2: - resolution: - { - integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==, - tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-10.0.2.tgz, - } - name: lru-cache - version: 10.0.2 - engines: { node: 14 || >=16.14 } - dependencies: - semver: registry.npmmirror.com/semver@7.5.4 - dev: true - - registry.npmmirror.com/lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz, - } - name: lru-cache - version: 5.1.1 - dependencies: - yallist: registry.npmmirror.com/yallist@3.1.1 - dev: true - - registry.npmmirror.com/lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz, - } - name: lru-cache - version: 6.0.0 - engines: { node: ">=10" } - dependencies: - yallist: registry.npmmirror.com/yallist@4.0.0 - dev: true - - registry.npmmirror.com/lru-cache@7.18.3: - resolution: - { - integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, - tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz, - } - name: lru-cache - version: 7.18.3 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/make-dir@4.0.0: - resolution: - { - integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, - tarball: https://registry.npmmirror.com/make-dir/-/make-dir-4.0.0.tgz, - } - name: make-dir - version: 4.0.0 - engines: { node: ">=10" } - dependencies: - semver: registry.npmmirror.com/semver@7.5.4 - dev: true - - registry.npmmirror.com/makeerror@1.0.12: - resolution: - { - integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, - tarball: https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz, - } - name: makeerror - version: 1.0.12 - dependencies: - tmpl: registry.npmmirror.com/tmpl@1.0.5 - dev: true - - registry.npmmirror.com/merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - tarball: https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz, - } - name: merge-stream - version: 2.0.0 - dev: true - - registry.npmmirror.com/merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - tarball: https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz, - } - name: merge2 - version: 1.4.1 - engines: { node: ">= 8" } - dev: true - - registry.npmmirror.com/micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - tarball: https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz, - } - name: micromatch - version: 4.0.5 - engines: { node: ">=8.6" } - dependencies: - braces: registry.npmmirror.com/braces@3.0.2 - picomatch: registry.npmmirror.com/picomatch@2.3.1 - dev: true - - registry.npmmirror.com/mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - tarball: https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz, - } - name: mime-db - version: 1.52.0 - engines: { node: ">= 0.6" } - dev: true - - registry.npmmirror.com/mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - tarball: https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz, - } - name: mime-types - version: 2.1.35 - engines: { node: ">= 0.6" } - dependencies: - mime-db: registry.npmmirror.com/mime-db@1.52.0 - dev: true - - registry.npmmirror.com/mimic-fn@2.1.0: - resolution: - { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, - tarball: https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz, - } - name: mimic-fn - version: 2.1.0 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/mimic-fn@4.0.0: - resolution: - { - integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, - tarball: https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz, - } - name: mimic-fn - version: 4.0.0 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz, - } - name: mimic-response - version: 3.1.0 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/mimic-response@4.0.0: - resolution: - { - integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==, - tarball: https://registry.npmmirror.com/mimic-response/-/mimic-response-4.0.0.tgz, - } - name: mimic-response - version: 4.0.0 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true - - registry.npmmirror.com/minimatch@3.0.8: - resolution: - { - integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==, - tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.0.8.tgz, - } - name: minimatch - version: 3.0.8 - dependencies: - brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 - dev: true - - registry.npmmirror.com/minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz, - } - name: minimatch - version: 3.1.2 - dependencies: - brace-expansion: registry.npmmirror.com/brace-expansion@1.1.11 - dev: true - - registry.npmmirror.com/minimatch@5.0.1: - resolution: - { - integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==, - tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.0.1.tgz, - } - name: minimatch - version: 5.0.1 - engines: { node: ">=10" } - dependencies: - brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 - dev: true - - registry.npmmirror.com/minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - tarball: https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz, - } - name: minimatch - version: 5.1.6 - engines: { node: ">=10" } - dependencies: - brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 - dev: true - - registry.npmmirror.com/minimatch@9.0.3: - resolution: - { - integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, - tarball: https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz, - } - name: minimatch - version: 9.0.3 - engines: { node: ">=16 || 14 >=14.17" } - dependencies: - brace-expansion: registry.npmmirror.com/brace-expansion@2.0.1 - dev: true - - registry.npmmirror.com/minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - tarball: https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz, - } - name: minimist - version: 1.2.8 - dev: true - - registry.npmmirror.com/minipass@7.0.4: - resolution: - { - integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, - tarball: https://registry.npmmirror.com/minipass/-/minipass-7.0.4.tgz, - } - name: minipass - version: 7.0.4 - engines: { node: ">=16 || 14 >=14.17" } - dev: true - - registry.npmmirror.com/mitt@3.0.0: - resolution: - { - integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==, - tarball: https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz, - } - name: mitt - version: 3.0.0 - dev: true - - registry.npmmirror.com/mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - tarball: https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz, - } - name: mkdirp-classic - version: 0.5.3 - dev: true - - registry.npmmirror.com/mkdirp@0.5.6: - resolution: - { - integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, - tarball: https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz, - } - name: mkdirp - version: 0.5.6 - hasBin: true - dependencies: - minimist: registry.npmmirror.com/minimist@1.2.8 - dev: true - - registry.npmmirror.com/mocha@10.2.0: - resolution: - { - integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==, - tarball: https://registry.npmmirror.com/mocha/-/mocha-10.2.0.tgz, - } - name: mocha - version: 10.2.0 - engines: { node: ">= 14.0.0" } - hasBin: true - dependencies: - ansi-colors: registry.npmmirror.com/ansi-colors@4.1.1 - browser-stdout: registry.npmmirror.com/browser-stdout@1.3.1 - chokidar: registry.npmmirror.com/chokidar@3.5.3 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - diff: registry.npmmirror.com/diff@5.0.0 - escape-string-regexp: registry.npmmirror.com/escape-string-regexp@4.0.0 - find-up: registry.npmmirror.com/find-up@5.0.0 - glob: registry.npmmirror.com/glob@7.2.0 - he: registry.npmmirror.com/he@1.2.0 - js-yaml: registry.npmmirror.com/js-yaml@4.1.0 - log-symbols: registry.npmmirror.com/log-symbols@4.1.0 - minimatch: registry.npmmirror.com/minimatch@5.0.1 - ms: registry.npmmirror.com/ms@2.1.3 - nanoid: registry.npmmirror.com/nanoid@3.3.3 - serialize-javascript: registry.npmmirror.com/serialize-javascript@6.0.0 - strip-json-comments: registry.npmmirror.com/strip-json-comments@3.1.1 - supports-color: registry.npmmirror.com/supports-color@8.1.1 - workerpool: registry.npmmirror.com/workerpool@6.2.1 - yargs: registry.npmmirror.com/yargs@16.2.0 - yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 - yargs-unparser: registry.npmmirror.com/yargs-unparser@2.0.0 - dev: true - - registry.npmmirror.com/moment@2.29.4: - resolution: - { - integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==, - tarball: https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz, - } - name: moment - version: 2.29.4 - dev: true - - registry.npmmirror.com/moment@2.30.1: - resolution: - { - integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==, - tarball: https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz, - } - name: moment - version: 2.30.1 - dev: true - - registry.npmmirror.com/ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - tarball: https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz, - } - name: ms - version: 2.1.2 - dev: true - - registry.npmmirror.com/ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - tarball: https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz, - } - name: ms - version: 2.1.3 - dev: true - - registry.npmmirror.com/mute-stream@1.0.0: - resolution: - { - integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, - tarball: https://registry.npmmirror.com/mute-stream/-/mute-stream-1.0.0.tgz, - } - name: mute-stream - version: 1.0.0 - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - - registry.npmmirror.com/n12@0.4.0: - resolution: - { - integrity: sha512-p/hj4zQ8d3pbbFLQuN1K9honUxiDDhueOWyFLw/XgBv+wZCE44bcLH4CIcsolOceJQduh4Jf7m/LfaTxyGmGtQ==, - tarball: https://registry.npmmirror.com/n12/-/n12-0.4.0.tgz, - } - name: n12 - version: 0.4.0 - dev: true - - registry.npmmirror.com/nanoid@3.3.3: - resolution: - { - integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==, - tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.3.tgz, - } - name: nanoid - version: 3.3.3 - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } - hasBin: true - dev: true - - registry.npmmirror.com/natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - tarball: https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz, - } - name: natural-compare - version: 1.4.0 - dev: true - - registry.npmmirror.com/netmask@2.0.2: - resolution: - { - integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==, - tarball: https://registry.npmmirror.com/netmask/-/netmask-2.0.2.tgz, - } - name: netmask - version: 2.0.2 - engines: { node: ">= 0.4.0" } - dev: true - - registry.npmmirror.com/node-domexception@1.0.0: - resolution: - { - integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, - tarball: https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz, - } - name: node-domexception - version: 1.0.0 - engines: { node: ">=10.5.0" } - dev: true - - registry.npmmirror.com/node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz, - } - name: node-fetch - version: 2.7.0 - engines: { node: 4.x || >=6.0.0 } - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: registry.npmmirror.com/whatwg-url@5.0.0 - dev: true - - registry.npmmirror.com/node-fetch@3.3.2: - resolution: - { - integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, - tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-3.3.2.tgz, - } - name: node-fetch - version: 3.3.2 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - data-uri-to-buffer: registry.npmmirror.com/data-uri-to-buffer@4.0.1 - fetch-blob: registry.npmmirror.com/fetch-blob@3.2.0 - formdata-polyfill: registry.npmmirror.com/formdata-polyfill@4.0.10 - dev: true - - registry.npmmirror.com/node-int64@0.4.0: - resolution: - { - integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, - tarball: https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz, - } - name: node-int64 - version: 0.4.0 - dev: true - - registry.npmmirror.com/node-releases@2.0.14: - resolution: - { - integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, - tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz, - } - name: node-releases - version: 2.0.14 - dev: true - - registry.npmmirror.com/normalize-package-data@6.0.0: - resolution: - { - integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==, - tarball: https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz, - } - name: normalize-package-data - version: 6.0.0 - engines: { node: ^16.14.0 || >=18.0.0 } - dependencies: - hosted-git-info: registry.npmmirror.com/hosted-git-info@7.0.1 - is-core-module: registry.npmmirror.com/is-core-module@2.13.1 - semver: registry.npmmirror.com/semver@7.5.4 - validate-npm-package-license: registry.npmmirror.com/validate-npm-package-license@3.0.4 - dev: true - - registry.npmmirror.com/normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - tarball: https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz, - } - name: normalize-path - version: 3.0.0 - engines: { node: ">=0.10.0" } - dev: true - - registry.npmmirror.com/normalize-url@8.0.0: - resolution: - { - integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==, - tarball: https://registry.npmmirror.com/normalize-url/-/normalize-url-8.0.0.tgz, - } - name: normalize-url - version: 8.0.0 - engines: { node: ">=14.16" } - dev: true - - registry.npmmirror.com/npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz, - } - name: npm-run-path - version: 4.0.1 - engines: { node: ">=8" } - dependencies: - path-key: registry.npmmirror.com/path-key@3.1.1 - dev: true - - registry.npmmirror.com/npm-run-path@5.1.0: - resolution: - { - integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==, - tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz, - } - name: npm-run-path - version: 5.1.0 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - path-key: registry.npmmirror.com/path-key@4.0.0 - dev: true - - registry.npmmirror.com/nwsapi@2.2.4: - resolution: - { - integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==, - tarball: https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.4.tgz, - } - name: nwsapi - version: 2.2.4 - dev: true - - registry.npmmirror.com/object-inspect@1.13.1: - resolution: - { - integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, - tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz, - } - name: object-inspect - version: 1.13.1 - dev: true - - registry.npmmirror.com/object-is@1.1.5: - resolution: - { - integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, - tarball: https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz, - } - name: object-is - version: 1.1.5 - engines: { node: ">= 0.4" } - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - define-properties: registry.npmmirror.com/define-properties@1.2.1 - dev: true - - registry.npmmirror.com/object-keys@1.1.1: - resolution: - { - integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, - tarball: https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz, - } - name: object-keys - version: 1.1.1 - engines: { node: ">= 0.4" } - dev: true - - registry.npmmirror.com/object.assign@4.1.5: - resolution: - { - integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, - tarball: https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz, - } - name: object.assign - version: 4.1.5 - engines: { node: ">= 0.4" } - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - define-properties: registry.npmmirror.com/define-properties@1.2.1 - has-symbols: registry.npmmirror.com/has-symbols@1.0.3 - object-keys: registry.npmmirror.com/object-keys@1.1.1 - dev: true - - registry.npmmirror.com/obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0): - resolution: - { - integrity: sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==, - tarball: https://registry.npmmirror.com/obsidian/-/obsidian-1.4.11.tgz, - } - id: registry.npmmirror.com/obsidian/1.4.11 - name: obsidian - version: 1.4.11 - peerDependencies: - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - dependencies: - "@codemirror/state": registry.npmmirror.com/@codemirror/state@6.3.1 - "@codemirror/view": registry.npmmirror.com/@codemirror/view@6.22.0 - "@types/codemirror": registry.npmmirror.com/@types/codemirror@5.60.8 - moment: registry.npmmirror.com/moment@2.29.4 - dev: true - - registry.npmmirror.com/once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - tarball: https://registry.npmmirror.com/once/-/once-1.4.0.tgz, - } - name: once - version: 1.4.0 - dependencies: - wrappy: registry.npmmirror.com/wrappy@1.0.2 - dev: true - - registry.npmmirror.com/onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - tarball: https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz, - } - name: onetime - version: 5.1.2 - engines: { node: ">=6" } - dependencies: - mimic-fn: registry.npmmirror.com/mimic-fn@2.1.0 - dev: true - - registry.npmmirror.com/onetime@6.0.0: - resolution: - { - integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, - tarball: https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz, - } - name: onetime - version: 6.0.0 - engines: { node: ">=12" } - dependencies: - mimic-fn: registry.npmmirror.com/mimic-fn@4.0.0 - dev: true - - registry.npmmirror.com/optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - tarball: https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz, - } - name: optionator - version: 0.9.3 - engines: { node: ">= 0.8.0" } - dependencies: - "@aashutoshrathi/word-wrap": registry.npmmirror.com/@aashutoshrathi/word-wrap@1.2.6 - deep-is: registry.npmmirror.com/deep-is@0.1.4 - fast-levenshtein: registry.npmmirror.com/fast-levenshtein@2.0.6 - levn: registry.npmmirror.com/levn@0.4.1 - prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 - type-check: registry.npmmirror.com/type-check@0.4.0 - dev: true - - registry.npmmirror.com/ora@5.4.1: - resolution: - { - integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, - tarball: https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz, - } - name: ora - version: 5.4.1 - engines: { node: ">=10" } - dependencies: - bl: registry.npmmirror.com/bl@4.1.0 - chalk: registry.npmmirror.com/chalk@4.1.2 - cli-cursor: registry.npmmirror.com/cli-cursor@3.1.0 - cli-spinners: registry.npmmirror.com/cli-spinners@2.9.1 - is-interactive: registry.npmmirror.com/is-interactive@1.0.0 - is-unicode-supported: registry.npmmirror.com/is-unicode-supported@0.1.0 - log-symbols: registry.npmmirror.com/log-symbols@4.1.0 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - wcwidth: registry.npmmirror.com/wcwidth@1.0.1 - dev: true - - registry.npmmirror.com/os-tmpdir@1.0.2: - resolution: - { - integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, - tarball: https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz, - } - name: os-tmpdir - version: 1.0.2 - engines: { node: ">=0.10.0" } - dev: true - - registry.npmmirror.com/p-cancelable@3.0.0: - resolution: - { - integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==, - tarball: https://registry.npmmirror.com/p-cancelable/-/p-cancelable-3.0.0.tgz, - } - name: p-cancelable - version: 3.0.0 - engines: { node: ">=12.20" } - dev: true - - registry.npmmirror.com/p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - tarball: https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz, - } - name: p-limit - version: 2.3.0 - engines: { node: ">=6" } - dependencies: - p-try: registry.npmmirror.com/p-try@2.2.0 - dev: true - - registry.npmmirror.com/p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - tarball: https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz, - } - name: p-limit - version: 3.1.0 - engines: { node: ">=10" } - dependencies: - yocto-queue: registry.npmmirror.com/yocto-queue@0.1.0 - dev: true - - registry.npmmirror.com/p-limit@4.0.0: - resolution: - { - integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, - tarball: https://registry.npmmirror.com/p-limit/-/p-limit-4.0.0.tgz, - } - name: p-limit - version: 4.0.0 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - yocto-queue: registry.npmmirror.com/yocto-queue@1.0.0 - dev: true - - registry.npmmirror.com/p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - tarball: https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz, - } - name: p-locate - version: 4.1.0 - engines: { node: ">=8" } - dependencies: - p-limit: registry.npmmirror.com/p-limit@2.3.0 - dev: true - - registry.npmmirror.com/p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - tarball: https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz, - } - name: p-locate - version: 5.0.0 - engines: { node: ">=10" } - dependencies: - p-limit: registry.npmmirror.com/p-limit@3.1.0 - dev: true - - registry.npmmirror.com/p-locate@6.0.0: - resolution: - { - integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, - tarball: https://registry.npmmirror.com/p-locate/-/p-locate-6.0.0.tgz, - } - name: p-locate - version: 6.0.0 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - p-limit: registry.npmmirror.com/p-limit@4.0.0 - dev: true - - registry.npmmirror.com/p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - tarball: https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz, - } - name: p-try - version: 2.2.0 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/pac-proxy-agent@7.0.1: - resolution: - { - integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==, - tarball: https://registry.npmmirror.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz, - } - name: pac-proxy-agent - version: 7.0.1 - engines: { node: ">= 14" } - dependencies: - "@tootallnate/quickjs-emscripten": registry.npmmirror.com/@tootallnate/quickjs-emscripten@0.23.0 - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - get-uri: registry.npmmirror.com/get-uri@6.0.2 - http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 - https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 - pac-resolver: registry.npmmirror.com/pac-resolver@7.0.0 - socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/pac-resolver@7.0.0: - resolution: - { - integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==, - tarball: https://registry.npmmirror.com/pac-resolver/-/pac-resolver-7.0.0.tgz, - } - name: pac-resolver - version: 7.0.0 - engines: { node: ">= 14" } - dependencies: - degenerator: registry.npmmirror.com/degenerator@5.0.1 - ip: registry.npmmirror.com/ip@1.1.8 - netmask: registry.npmmirror.com/netmask@2.0.2 - dev: true - - registry.npmmirror.com/parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - tarball: https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz, - } - name: parent-module - version: 1.0.1 - engines: { node: ">=6" } - dependencies: - callsites: registry.npmmirror.com/callsites@3.1.0 - dev: true - - registry.npmmirror.com/parse-json@5.2.0: - resolution: - { - integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, - tarball: https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz, - } - name: parse-json - version: 5.2.0 - engines: { node: ">=8" } - dependencies: - "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 - error-ex: registry.npmmirror.com/error-ex@1.3.2 - json-parse-even-better-errors: registry.npmmirror.com/json-parse-even-better-errors@2.3.1 - lines-and-columns: registry.npmmirror.com/lines-and-columns@1.2.4 - dev: true - - registry.npmmirror.com/parse-json@7.1.1: - resolution: - { - integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==, - tarball: https://registry.npmmirror.com/parse-json/-/parse-json-7.1.1.tgz, - } - name: parse-json - version: 7.1.1 - engines: { node: ">=16" } - dependencies: - "@babel/code-frame": registry.npmmirror.com/@babel/code-frame@7.22.13 - error-ex: registry.npmmirror.com/error-ex@1.3.2 - json-parse-even-better-errors: registry.npmmirror.com/json-parse-even-better-errors@3.0.0 - lines-and-columns: registry.npmmirror.com/lines-and-columns@2.0.4 - type-fest: registry.npmmirror.com/type-fest@3.13.1 - dev: true - - registry.npmmirror.com/parse-ms@2.1.0: - resolution: - { - integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==, - tarball: https://registry.npmmirror.com/parse-ms/-/parse-ms-2.1.0.tgz, - } - name: parse-ms - version: 2.1.0 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/parse5@7.1.2: - resolution: - { - integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, - tarball: https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz, - } - name: parse5 - version: 7.1.2 - dependencies: - entities: registry.npmmirror.com/entities@4.5.0 - dev: true - - registry.npmmirror.com/path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - tarball: https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz, - } - name: path-exists - version: 4.0.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/path-exists@5.0.0: - resolution: - { - integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, - tarball: https://registry.npmmirror.com/path-exists/-/path-exists-5.0.0.tgz, - } - name: path-exists - version: 5.0.0 - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true - - registry.npmmirror.com/path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - tarball: https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz, - } - name: path-is-absolute - version: 1.0.1 - engines: { node: ">=0.10.0" } - dev: true - - registry.npmmirror.com/path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - tarball: https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz, - } - name: path-key - version: 3.1.1 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/path-key@4.0.0: - resolution: - { - integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, - tarball: https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz, - } - name: path-key - version: 4.0.0 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - tarball: https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz, - } - name: path-parse - version: 1.0.7 - dev: true - - registry.npmmirror.com/path-scurry@1.10.1: - resolution: - { - integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, - tarball: https://registry.npmmirror.com/path-scurry/-/path-scurry-1.10.1.tgz, - } - name: path-scurry - version: 1.10.1 - engines: { node: ">=16 || 14 >=14.17" } - dependencies: - lru-cache: registry.npmmirror.com/lru-cache@10.0.2 - minipass: registry.npmmirror.com/minipass@7.0.4 - dev: true - - registry.npmmirror.com/path-type@4.0.0: - resolution: - { - integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, - tarball: https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz, - } - name: path-type - version: 4.0.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/pathval@1.1.1: - resolution: - { - integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, - tarball: https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz, - } - name: pathval - version: 1.1.1 - dev: true - - registry.npmmirror.com/pend@1.2.0: - resolution: - { - integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==, - tarball: https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz, - } - name: pend - version: 1.2.0 - dev: true - - registry.npmmirror.com/picocolors@1.0.0: - resolution: - { - integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, - tarball: https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz, - } - name: picocolors - version: 1.0.0 - dev: true - - registry.npmmirror.com/picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - tarball: https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz, - } - name: picomatch - version: 2.3.1 - engines: { node: ">=8.6" } - dev: true - - registry.npmmirror.com/pirates@4.0.5: - resolution: - { - integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==, - tarball: https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz, - } - name: pirates - version: 4.0.5 - engines: { node: ">= 6" } - dev: true - - registry.npmmirror.com/pkg-dir@4.2.0: - resolution: - { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, - tarball: https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz, - } - name: pkg-dir - version: 4.2.0 - engines: { node: ">=8" } - dependencies: - find-up: registry.npmmirror.com/find-up@4.1.0 - dev: true - - registry.npmmirror.com/prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - tarball: https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz, - } - name: prelude-ls - version: 1.2.1 - engines: { node: ">= 0.8.0" } - dev: true - - registry.npmmirror.com/prettier@3.2.2: - resolution: - { - integrity: sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==, - tarball: https://registry.npmmirror.com/prettier/-/prettier-3.2.2.tgz, - } - name: prettier - version: 3.2.2 - engines: { node: ">=14" } - hasBin: true - dev: true - - registry.npmmirror.com/pretty-format@29.7.0: - resolution: - { - integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, - tarball: https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz, - } - name: pretty-format - version: 29.7.0 - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - dependencies: - "@jest/schemas": registry.npmmirror.com/@jest/schemas@29.6.3 - ansi-styles: registry.npmmirror.com/ansi-styles@5.2.0 - react-is: registry.npmmirror.com/react-is@18.2.0 - dev: true - - registry.npmmirror.com/pretty-ms@7.0.1: - resolution: - { - integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==, - tarball: https://registry.npmmirror.com/pretty-ms/-/pretty-ms-7.0.1.tgz, - } - name: pretty-ms - version: 7.0.1 - engines: { node: ">=10" } - dependencies: - parse-ms: registry.npmmirror.com/parse-ms@2.1.0 - dev: true - - registry.npmmirror.com/process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - tarball: https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz, - } - name: process-nextick-args - version: 2.0.1 - dev: true - - registry.npmmirror.com/progress@2.0.3: - resolution: - { - integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==, - tarball: https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz, - } - name: progress - version: 2.0.3 - engines: { node: ">=0.4.0" } - dev: true - - registry.npmmirror.com/prompts@2.4.2: - resolution: - { - integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, - tarball: https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz, - } - name: prompts - version: 2.4.2 - engines: { node: ">= 6" } - dependencies: - kleur: registry.npmmirror.com/kleur@3.0.3 - sisteransi: registry.npmmirror.com/sisteransi@1.0.5 - dev: true - - registry.npmmirror.com/proxy-agent@6.3.0: - resolution: - { - integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==, - tarball: https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.3.0.tgz, - } - name: proxy-agent - version: 6.3.0 - engines: { node: ">= 14" } - dependencies: - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 - https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 - lru-cache: registry.npmmirror.com/lru-cache@7.18.3 - pac-proxy-agent: registry.npmmirror.com/pac-proxy-agent@7.0.1 - proxy-from-env: registry.npmmirror.com/proxy-from-env@1.1.0 - socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/proxy-agent@6.3.1: - resolution: - { - integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==, - tarball: https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.3.1.tgz, - } - name: proxy-agent - version: 6.3.1 - engines: { node: ">= 14" } - dependencies: - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 - https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 - lru-cache: registry.npmmirror.com/lru-cache@7.18.3 - pac-proxy-agent: registry.npmmirror.com/pac-proxy-agent@7.0.1 - proxy-from-env: registry.npmmirror.com/proxy-from-env@1.1.0 - socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - tarball: https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz, - } - name: proxy-from-env - version: 1.1.0 - dev: true - - registry.npmmirror.com/psl@1.9.0: - resolution: - { - integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, - tarball: https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz, - } - name: psl - version: 1.9.0 - dev: true - - registry.npmmirror.com/pump@3.0.0: - resolution: - { - integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, - tarball: https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz, - } - name: pump - version: 3.0.0 - dependencies: - end-of-stream: registry.npmmirror.com/end-of-stream@1.4.4 - once: registry.npmmirror.com/once@1.4.0 - dev: true - - registry.npmmirror.com/punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - tarball: https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz, - } - name: punycode - version: 2.3.1 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/puppeteer-core@20.9.0(typescript@5.1.6): - resolution: - { - integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==, - tarball: https://registry.npmmirror.com/puppeteer-core/-/puppeteer-core-20.9.0.tgz, - } - id: registry.npmmirror.com/puppeteer-core/20.9.0 - name: puppeteer-core - version: 20.9.0 - engines: { node: ">=16.3.0" } - peerDependencies: - typescript: ">= 4.7.4" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@puppeteer/browsers": registry.npmmirror.com/@puppeteer/browsers@1.4.6(typescript@5.1.6) - chromium-bidi: registry.npmmirror.com/chromium-bidi@0.4.16(devtools-protocol@0.0.1147663) - cross-fetch: registry.npmmirror.com/cross-fetch@4.0.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1147663 - typescript: 5.1.6 - ws: registry.npmmirror.com/ws@8.13.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - registry.npmmirror.com/pure-rand@6.0.4: - resolution: - { - integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==, - tarball: https://registry.npmmirror.com/pure-rand/-/pure-rand-6.0.4.tgz, - } - name: pure-rand - version: 6.0.4 - dev: true - - registry.npmmirror.com/query-selector-shadow-dom@1.0.1: - resolution: - { - integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==, - tarball: https://registry.npmmirror.com/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz, - } - name: query-selector-shadow-dom - version: 1.0.1 - dev: true - - registry.npmmirror.com/querystringify@2.2.0: - resolution: - { - integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, - tarball: https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz, - } - name: querystringify - version: 2.2.0 - dev: true - - registry.npmmirror.com/queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - tarball: https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz, - } - name: queue-microtask - version: 1.2.3 - dev: true - - registry.npmmirror.com/queue-tick@1.0.1: - resolution: - { - integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==, - tarball: https://registry.npmmirror.com/queue-tick/-/queue-tick-1.0.1.tgz, - } - name: queue-tick - version: 1.0.1 - dev: true - - registry.npmmirror.com/quick-lru@5.1.1: - resolution: - { - integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, - tarball: https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz, - } - name: quick-lru - version: 5.1.1 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/randombytes@2.1.0: - resolution: - { - integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, - tarball: https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz, - } - name: randombytes - version: 2.1.0 - dependencies: - safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 - dev: true - - registry.npmmirror.com/react-is@18.2.0: - resolution: - { - integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, - tarball: https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz, - } - name: react-is - version: 18.2.0 - dev: true - - registry.npmmirror.com/read-pkg-up@10.1.0: - resolution: - { - integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==, - tarball: https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-10.1.0.tgz, - } - name: read-pkg-up - version: 10.1.0 - engines: { node: ">=16" } - dependencies: - find-up: registry.npmmirror.com/find-up@6.3.0 - read-pkg: registry.npmmirror.com/read-pkg@8.1.0 - type-fest: registry.npmmirror.com/type-fest@4.7.1 - dev: true - - registry.npmmirror.com/read-pkg@8.1.0: - resolution: - { - integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==, - tarball: https://registry.npmmirror.com/read-pkg/-/read-pkg-8.1.0.tgz, - } - name: read-pkg - version: 8.1.0 - engines: { node: ">=16" } - dependencies: - "@types/normalize-package-data": registry.npmmirror.com/@types/normalize-package-data@2.4.4 - normalize-package-data: registry.npmmirror.com/normalize-package-data@6.0.0 - parse-json: registry.npmmirror.com/parse-json@7.1.1 - type-fest: registry.npmmirror.com/type-fest@4.7.1 - dev: true - - registry.npmmirror.com/readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz, - } - name: readable-stream - version: 2.3.8 - dependencies: - core-util-is: registry.npmmirror.com/core-util-is@1.0.3 - inherits: registry.npmmirror.com/inherits@2.0.4 - isarray: registry.npmmirror.com/isarray@1.0.0 - process-nextick-args: registry.npmmirror.com/process-nextick-args@2.0.1 - safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 - string_decoder: registry.npmmirror.com/string_decoder@1.1.1 - util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 - dev: true - - registry.npmmirror.com/readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz, - } - name: readable-stream - version: 3.6.2 - engines: { node: ">= 6" } - dependencies: - inherits: registry.npmmirror.com/inherits@2.0.4 - string_decoder: registry.npmmirror.com/string_decoder@1.3.0 - util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 - dev: true - - registry.npmmirror.com/readdir-glob@1.1.3: - resolution: - { - integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==, - tarball: https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz, - } - name: readdir-glob - version: 1.1.3 - dependencies: - minimatch: registry.npmmirror.com/minimatch@5.1.6 - dev: true - - registry.npmmirror.com/readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - tarball: https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz, - } - name: readdirp - version: 3.6.0 - engines: { node: ">=8.10.0" } - dependencies: - picomatch: registry.npmmirror.com/picomatch@2.3.1 - dev: true - - registry.npmmirror.com/recursive-readdir@2.2.3: - resolution: - { - integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==, - tarball: https://registry.npmmirror.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz, - } - name: recursive-readdir - version: 2.2.3 - engines: { node: ">=6.0.0" } - dependencies: - minimatch: registry.npmmirror.com/minimatch@3.1.2 - dev: true - - registry.npmmirror.com/regexp.prototype.flags@1.5.0: - resolution: - { - integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==, - tarball: https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz, - } - name: regexp.prototype.flags - version: 1.5.0 - engines: { node: ">= 0.4" } - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - define-properties: registry.npmmirror.com/define-properties@1.2.1 - functions-have-names: registry.npmmirror.com/functions-have-names@1.2.3 - dev: true - - registry.npmmirror.com/require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - tarball: https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz, - } - name: require-directory - version: 2.1.1 - engines: { node: ">=0.10.0" } - dev: true - - registry.npmmirror.com/requires-port@1.0.0: - resolution: - { - integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, - tarball: https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz, - } - name: requires-port - version: 1.0.0 - dev: true - - registry.npmmirror.com/resolve-alpn@1.2.1: - resolution: - { - integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, - tarball: https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz, - } - name: resolve-alpn - version: 1.2.1 - dev: true - - registry.npmmirror.com/resolve-cwd@3.0.0: - resolution: - { - integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, - tarball: https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz, - } - name: resolve-cwd - version: 3.0.0 - engines: { node: ">=8" } - dependencies: - resolve-from: registry.npmmirror.com/resolve-from@5.0.0 - dev: true - - registry.npmmirror.com/resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz, - } - name: resolve-from - version: 4.0.0 - engines: { node: ">=4" } - dev: true - - registry.npmmirror.com/resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz, - } - name: resolve-from - version: 5.0.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/resolve.exports@2.0.2: - resolution: - { - integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==, - tarball: https://registry.npmmirror.com/resolve.exports/-/resolve.exports-2.0.2.tgz, - } - name: resolve.exports - version: 2.0.2 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/resolve@1.22.8: - resolution: - { - integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, - tarball: https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz, - } - name: resolve - version: 1.22.8 - hasBin: true - dependencies: - is-core-module: registry.npmmirror.com/is-core-module@2.13.1 - path-parse: registry.npmmirror.com/path-parse@1.0.7 - supports-preserve-symlinks-flag: registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0 - dev: true - - registry.npmmirror.com/responselike@3.0.0: - resolution: - { - integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==, - tarball: https://registry.npmmirror.com/responselike/-/responselike-3.0.0.tgz, - } - name: responselike - version: 3.0.0 - engines: { node: ">=14.16" } - dependencies: - lowercase-keys: registry.npmmirror.com/lowercase-keys@3.0.0 - dev: true - - registry.npmmirror.com/resq@1.11.0: - resolution: - { - integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==, - tarball: https://registry.npmmirror.com/resq/-/resq-1.11.0.tgz, - } - name: resq - version: 1.11.0 - dependencies: - fast-deep-equal: registry.npmmirror.com/fast-deep-equal@2.0.1 - dev: true - - registry.npmmirror.com/restore-cursor@3.1.0: - resolution: - { - integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, - tarball: https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz, - } - name: restore-cursor - version: 3.1.0 - engines: { node: ">=8" } - dependencies: - onetime: registry.npmmirror.com/onetime@5.1.2 - signal-exit: registry.npmmirror.com/signal-exit@3.0.7 - dev: true - - registry.npmmirror.com/reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - tarball: https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz, - } - name: reusify - version: 1.0.4 - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - dev: true - - registry.npmmirror.com/rgb2hex@0.2.5: - resolution: - { - integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==, - tarball: https://registry.npmmirror.com/rgb2hex/-/rgb2hex-0.2.5.tgz, - } - name: rgb2hex - version: 0.2.5 - dev: true - - registry.npmmirror.com/rimraf@2.7.1: - resolution: - { - integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, - tarball: https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz, - } - name: rimraf - version: 2.7.1 - hasBin: true - dependencies: - glob: registry.npmmirror.com/glob@7.2.3 - dev: true - - registry.npmmirror.com/rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - tarball: https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz, - } - name: rimraf - version: 3.0.2 - hasBin: true - dependencies: - glob: registry.npmmirror.com/glob@7.2.3 - dev: true - - registry.npmmirror.com/run-async@3.0.0: - resolution: - { - integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==, - tarball: https://registry.npmmirror.com/run-async/-/run-async-3.0.0.tgz, - } - name: run-async - version: 3.0.0 - engines: { node: ">=0.12.0" } - dev: true - - registry.npmmirror.com/run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - tarball: https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz, - } - name: run-parallel - version: 1.2.0 - dependencies: - queue-microtask: registry.npmmirror.com/queue-microtask@1.2.3 - dev: true - - registry.npmmirror.com/rxjs@7.8.1: - resolution: - { - integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, - tarball: https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz, - } - name: rxjs - version: 7.8.1 - dependencies: - tslib: registry.npmmirror.com/tslib@2.6.1 - dev: true - - registry.npmmirror.com/safaridriver@0.1.0: - resolution: - { - integrity: sha512-azzzIP3gR1TB9bVPv7QO4Zjw0rR1BWEU/s2aFdUMN48gxDjxEB13grAEuXDmkKPgE74cObymDxmAmZnL3clj4w==, - tarball: https://registry.npmmirror.com/safaridriver/-/safaridriver-0.1.0.tgz, - } - name: safaridriver - version: 0.1.0 - dev: true - - registry.npmmirror.com/safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz, - } - name: safe-buffer - version: 5.1.2 - dev: true - - registry.npmmirror.com/safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz, - } - name: safe-buffer - version: 5.2.1 - dev: true - - registry.npmmirror.com/safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - tarball: https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz, - } - name: safer-buffer - version: 2.1.2 - dev: true - - registry.npmmirror.com/saxes@6.0.0: - resolution: - { - integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, - tarball: https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz, - } - name: saxes - version: 6.0.0 - engines: { node: ">=v12.22.7" } - dependencies: - xmlchars: registry.npmmirror.com/xmlchars@2.2.0 - dev: true - - registry.npmmirror.com/semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - tarball: https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz, - } - name: semver - version: 6.3.1 - hasBin: true - dev: true - - registry.npmmirror.com/semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - tarball: https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz, - } - name: semver - version: 7.5.4 - engines: { node: ">=10" } - hasBin: true - dependencies: - lru-cache: registry.npmmirror.com/lru-cache@6.0.0 - dev: true - - registry.npmmirror.com/serialize-error@11.0.3: - resolution: - { - integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==, - tarball: https://registry.npmmirror.com/serialize-error/-/serialize-error-11.0.3.tgz, - } - name: serialize-error - version: 11.0.3 - engines: { node: ">=14.16" } - dependencies: - type-fest: registry.npmmirror.com/type-fest@2.19.0 - dev: true - - registry.npmmirror.com/serialize-javascript@6.0.0: - resolution: - { - integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==, - tarball: https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz, - } - name: serialize-javascript - version: 6.0.0 - dependencies: - randombytes: registry.npmmirror.com/randombytes@2.1.0 - dev: true - - registry.npmmirror.com/set-function-length@1.1.1: - resolution: - { - integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==, - tarball: https://registry.npmmirror.com/set-function-length/-/set-function-length-1.1.1.tgz, - } - name: set-function-length - version: 1.1.1 - engines: { node: ">= 0.4" } - dependencies: - define-data-property: registry.npmmirror.com/define-data-property@1.1.1 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - gopd: registry.npmmirror.com/gopd@1.0.1 - has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 - dev: true - - registry.npmmirror.com/setimmediate@1.0.5: - resolution: - { - integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, - tarball: https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz, - } - name: setimmediate - version: 1.0.5 - dev: true - - registry.npmmirror.com/shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - tarball: https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz, - } - name: shebang-command - version: 2.0.0 - engines: { node: ">=8" } - dependencies: - shebang-regex: registry.npmmirror.com/shebang-regex@3.0.0 - dev: true - - registry.npmmirror.com/shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - tarball: https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz, - } - name: shebang-regex - version: 3.0.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/side-channel@1.0.4: - resolution: - { - integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, - tarball: https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz, - } - name: side-channel - version: 1.0.4 - dependencies: - call-bind: registry.npmmirror.com/call-bind@1.0.5 - get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 - object-inspect: registry.npmmirror.com/object-inspect@1.13.1 - dev: true - - registry.npmmirror.com/signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz, - } - name: signal-exit - version: 3.0.7 - dev: true - - registry.npmmirror.com/signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz, - } - name: signal-exit - version: 4.1.0 - engines: { node: ">=14" } - dev: true - - registry.npmmirror.com/sisteransi@1.0.5: - resolution: - { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, - tarball: https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz, - } - name: sisteransi - version: 1.0.5 - dev: true - - registry.npmmirror.com/slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - tarball: https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz, - } - name: slash - version: 3.0.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/smart-buffer@4.2.0: - resolution: - { - integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, - tarball: https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz, - } - name: smart-buffer - version: 4.2.0 - engines: { node: ">= 6.0.0", npm: ">= 3.0.0" } - dev: true - - registry.npmmirror.com/socks-proxy-agent@8.0.2: - resolution: - { - integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==, - tarball: https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz, - } - name: socks-proxy-agent - version: 8.0.2 - engines: { node: ">= 14" } - dependencies: - agent-base: registry.npmmirror.com/agent-base@7.1.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - socks: registry.npmmirror.com/socks@2.7.1 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/socks@2.7.1: - resolution: - { - integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==, - tarball: https://registry.npmmirror.com/socks/-/socks-2.7.1.tgz, - } - name: socks - version: 2.7.1 - engines: { node: ">= 10.13.0", npm: ">= 3.0.0" } - dependencies: - ip: registry.npmmirror.com/ip@2.0.0 - smart-buffer: registry.npmmirror.com/smart-buffer@4.2.0 - dev: true - - registry.npmmirror.com/source-map-support@0.5.13: - resolution: - { - integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, - tarball: https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz, - } - name: source-map-support - version: 0.5.13 - dependencies: - buffer-from: registry.npmmirror.com/buffer-from@1.1.2 - source-map: registry.npmmirror.com/source-map@0.6.1 - dev: true - - registry.npmmirror.com/source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - tarball: https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz, - } - name: source-map - version: 0.6.1 - engines: { node: ">=0.10.0" } - dev: true - - registry.npmmirror.com/spdx-correct@3.2.0: - resolution: - { - integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, - tarball: https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz, - } - name: spdx-correct - version: 3.2.0 - dependencies: - spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 - spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.16 - dev: true - - registry.npmmirror.com/spdx-exceptions@2.3.0: - resolution: - { - integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, - tarball: https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz, - } - name: spdx-exceptions - version: 2.3.0 - dev: true - - registry.npmmirror.com/spdx-expression-parse@3.0.1: - resolution: - { - integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, - tarball: https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz, - } - name: spdx-expression-parse - version: 3.0.1 - dependencies: - spdx-exceptions: registry.npmmirror.com/spdx-exceptions@2.3.0 - spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.16 - dev: true - - registry.npmmirror.com/spdx-license-ids@3.0.16: - resolution: - { - integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==, - tarball: https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz, - } - name: spdx-license-ids - version: 3.0.16 - dev: true - - registry.npmmirror.com/split2@4.2.0: - resolution: - { - integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, - tarball: https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz, - } - name: split2 - version: 4.2.0 - engines: { node: ">= 10.x" } - dev: true - - registry.npmmirror.com/sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - tarball: https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz, - } - name: sprintf-js - version: 1.0.3 - dev: true - - registry.npmmirror.com/stack-utils@2.0.6: - resolution: - { - integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, - tarball: https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz, - } - name: stack-utils - version: 2.0.6 - engines: { node: ">=10" } - dependencies: - escape-string-regexp: registry.npmmirror.com/escape-string-regexp@2.0.0 - dev: true - - registry.npmmirror.com/stop-iteration-iterator@1.0.0: - resolution: - { - integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==, - tarball: https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz, - } - name: stop-iteration-iterator - version: 1.0.0 - engines: { node: ">= 0.4" } - dependencies: - internal-slot: registry.npmmirror.com/internal-slot@1.0.5 - dev: true - - registry.npmmirror.com/stream-buffers@3.0.2: - resolution: - { - integrity: sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==, - tarball: https://registry.npmmirror.com/stream-buffers/-/stream-buffers-3.0.2.tgz, - } - name: stream-buffers - version: 3.0.2 - engines: { node: ">= 0.10.0" } - dev: true - - registry.npmmirror.com/streamx@2.15.4: - resolution: - { - integrity: sha512-uSXKl88bibiUCQ1eMpItRljCzDENcDx18rsfDmV79r0e/ThfrAwxG4Y2FarQZ2G4/21xcOKmFFd1Hue+ZIDwHw==, - tarball: https://registry.npmmirror.com/streamx/-/streamx-2.15.4.tgz, - } - name: streamx - version: 2.15.4 - dependencies: - fast-fifo: registry.npmmirror.com/fast-fifo@1.3.2 - queue-tick: registry.npmmirror.com/queue-tick@1.0.1 - dev: true - - registry.npmmirror.com/string-length@4.0.2: - resolution: - { - integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, - tarball: https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz, - } - name: string-length - version: 4.0.2 - engines: { node: ">=10" } - dependencies: - char-regex: registry.npmmirror.com/char-regex@1.0.2 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - dev: true - - registry.npmmirror.com/string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - tarball: https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz, - } - name: string-width - version: 4.2.3 - engines: { node: ">=8" } - dependencies: - emoji-regex: registry.npmmirror.com/emoji-regex@8.0.0 - is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point@3.0.0 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - dev: true - - registry.npmmirror.com/string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - tarball: https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz, - } - name: string-width - version: 5.1.2 - engines: { node: ">=12" } - dependencies: - eastasianwidth: registry.npmmirror.com/eastasianwidth@0.2.0 - emoji-regex: registry.npmmirror.com/emoji-regex@9.2.2 - strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 - dev: true - - registry.npmmirror.com/string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz, - } - name: string_decoder - version: 1.1.1 - dependencies: - safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 - dev: true - - registry.npmmirror.com/string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz, - } - name: string_decoder - version: 1.3.0 - dependencies: - safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 - dev: true - - registry.npmmirror.com/strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz, - } - name: strip-ansi - version: 6.0.1 - engines: { node: ">=8" } - dependencies: - ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 - dev: true - - registry.npmmirror.com/strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz, - } - name: strip-ansi - version: 7.1.0 - engines: { node: ">=12" } - dependencies: - ansi-regex: registry.npmmirror.com/ansi-regex@6.0.1 - dev: true - - registry.npmmirror.com/strip-bom@4.0.0: - resolution: - { - integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, - tarball: https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz, - } - name: strip-bom - version: 4.0.0 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - tarball: https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz, - } - name: strip-final-newline - version: 2.0.0 - engines: { node: ">=6" } - dev: true - - registry.npmmirror.com/strip-final-newline@3.0.0: - resolution: - { - integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, - tarball: https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz, - } - name: strip-final-newline - version: 3.0.0 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - tarball: https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz, - } - name: strip-json-comments - version: 3.1.1 - engines: { node: ">=8" } - dev: true - - registry.npmmirror.com/style-mod@4.1.0: - resolution: - { - integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==, - tarball: https://registry.npmmirror.com/style-mod/-/style-mod-4.1.0.tgz, - } - name: style-mod - version: 4.1.0 - dev: true - - registry.npmmirror.com/supports-color@5.5.0: - resolution: - { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, - tarball: https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz, - } - name: supports-color - version: 5.5.0 - engines: { node: ">=4" } - dependencies: - has-flag: registry.npmmirror.com/has-flag@3.0.0 - dev: true - - registry.npmmirror.com/supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - tarball: https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz, - } - name: supports-color - version: 7.2.0 - engines: { node: ">=8" } - dependencies: - has-flag: registry.npmmirror.com/has-flag@4.0.0 - dev: true - - registry.npmmirror.com/supports-color@8.1.1: - resolution: - { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, - tarball: https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz, - } - name: supports-color - version: 8.1.1 - engines: { node: ">=10" } - dependencies: - has-flag: registry.npmmirror.com/has-flag@4.0.0 - dev: true - - registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - tarball: https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz, - } - name: supports-preserve-symlinks-flag - version: 1.0.0 - engines: { node: ">= 0.4" } - dev: true - - registry.npmmirror.com/symbol-tree@3.2.4: - resolution: - { - integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, - tarball: https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz, - } - name: symbol-tree - version: 3.2.4 - dev: true - - registry.npmmirror.com/tar-fs@3.0.4: - resolution: - { - integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==, - tarball: https://registry.npmmirror.com/tar-fs/-/tar-fs-3.0.4.tgz, - } - name: tar-fs - version: 3.0.4 - dependencies: - mkdirp-classic: registry.npmmirror.com/mkdirp-classic@0.5.3 - pump: registry.npmmirror.com/pump@3.0.0 - tar-stream: registry.npmmirror.com/tar-stream@3.1.6 - dev: true - - registry.npmmirror.com/tar-stream@3.1.6: - resolution: - { - integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==, - tarball: https://registry.npmmirror.com/tar-stream/-/tar-stream-3.1.6.tgz, - } - name: tar-stream - version: 3.1.6 - dependencies: - b4a: registry.npmmirror.com/b4a@1.6.4 - fast-fifo: registry.npmmirror.com/fast-fifo@1.3.2 - streamx: registry.npmmirror.com/streamx@2.15.4 - dev: true - - registry.npmmirror.com/test-exclude@6.0.0: - resolution: - { - integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, - tarball: https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz, - } - name: test-exclude - version: 6.0.0 - engines: { node: ">=8" } - dependencies: - "@istanbuljs/schema": registry.npmmirror.com/@istanbuljs/schema@0.1.3 - glob: registry.npmmirror.com/glob@7.2.3 - minimatch: registry.npmmirror.com/minimatch@3.1.2 - dev: true - - registry.npmmirror.com/text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - tarball: https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz, - } - name: text-table - version: 0.2.0 - dev: true - - registry.npmmirror.com/through@2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - tarball: https://registry.npmmirror.com/through/-/through-2.3.8.tgz, - } - name: through - version: 2.3.8 - dev: true - - registry.npmmirror.com/tmp@0.0.33: - resolution: - { - integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, - tarball: https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz, - } - name: tmp - version: 0.0.33 - engines: { node: ">=0.6.0" } - dependencies: - os-tmpdir: registry.npmmirror.com/os-tmpdir@1.0.2 - dev: true - - registry.npmmirror.com/tmpl@1.0.5: - resolution: - { - integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, - tarball: https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz, - } - name: tmpl - version: 1.0.5 - dev: true - - registry.npmmirror.com/to-fast-properties@2.0.0: - resolution: - { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, - tarball: https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz, - } - name: to-fast-properties - version: 2.0.0 - engines: { node: ">=4" } - dev: true - - registry.npmmirror.com/to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - tarball: https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz, - } - name: to-regex-range - version: 5.0.1 - engines: { node: ">=8.0" } - dependencies: - is-number: registry.npmmirror.com/is-number@7.0.0 - dev: true - - registry.npmmirror.com/tough-cookie@4.1.2: - resolution: - { - integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==, - tarball: https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.2.tgz, - } - name: tough-cookie - version: 4.1.2 - engines: { node: ">=6" } - dependencies: - psl: registry.npmmirror.com/psl@1.9.0 - punycode: registry.npmmirror.com/punycode@2.3.1 - universalify: registry.npmmirror.com/universalify@0.2.0 - url-parse: registry.npmmirror.com/url-parse@1.5.10 - dev: true - - registry.npmmirror.com/tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - tarball: https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz, - } - name: tr46 - version: 0.0.3 - dev: true - - registry.npmmirror.com/tr46@3.0.0: - resolution: - { - integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==, - tarball: https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz, - } - name: tr46 - version: 3.0.0 - engines: { node: ">=12" } - dependencies: - punycode: registry.npmmirror.com/punycode@2.3.1 - dev: true - - registry.npmmirror.com/traverse@0.3.9: - resolution: - { - integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==, - tarball: https://registry.npmmirror.com/traverse/-/traverse-0.3.9.tgz, - } - name: traverse - version: 0.3.9 - dev: true - - registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6): - resolution: - { - integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, - tarball: https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz, - } - id: registry.npmmirror.com/ts-api-utils/1.0.3 - name: ts-api-utils - version: 1.0.3 - engines: { node: ">=16.13.0" } - peerDependencies: - typescript: ">=4.2.0" - dependencies: - typescript: 5.1.6 - dev: true - - registry.npmmirror.com/tslib@2.6.1: - resolution: - { - integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==, - tarball: https://registry.npmmirror.com/tslib/-/tslib-2.6.1.tgz, - } - name: tslib - version: 2.6.1 - dev: true - - registry.npmmirror.com/type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - tarball: https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz, - } - name: type-check - version: 0.4.0 - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 - dev: true - - registry.npmmirror.com/type-detect@4.0.8: - resolution: - { - integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, - tarball: https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz, - } - name: type-detect - version: 4.0.8 - engines: { node: ">=4" } - dev: true - - registry.npmmirror.com/type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz, - } - name: type-fest - version: 0.20.2 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/type-fest@0.21.3: - resolution: - { - integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, - tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz, - } - name: type-fest - version: 0.21.3 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/type-fest@2.13.0: - resolution: - { - integrity: sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==, - tarball: https://registry.npmmirror.com/type-fest/-/type-fest-2.13.0.tgz, - } - name: type-fest - version: 2.13.0 - engines: { node: ">=12.20" } - dev: true - - registry.npmmirror.com/type-fest@2.19.0: - resolution: - { - integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, - tarball: https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz, - } - name: type-fest - version: 2.19.0 - engines: { node: ">=12.20" } - dev: true - - registry.npmmirror.com/type-fest@3.13.1: - resolution: - { - integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==, - tarball: https://registry.npmmirror.com/type-fest/-/type-fest-3.13.1.tgz, - } - name: type-fest - version: 3.13.1 - engines: { node: ">=14.16" } - dev: true - - registry.npmmirror.com/type-fest@4.7.1: - resolution: - { - integrity: sha512-iWr8RUmzAJRfhZugX9O7nZE6pCxDU8CZ3QxsLuTnGcBLJpCaP2ll3s4eMTBoFnU/CeXY/5rfQSuAEsTGJO4y8A==, - tarball: https://registry.npmmirror.com/type-fest/-/type-fest-4.7.1.tgz, - } - name: type-fest - version: 4.7.1 - engines: { node: ">=16" } - dev: true - - registry.npmmirror.com/uglify-js@3.17.4: - resolution: - { - integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, - tarball: https://registry.npmmirror.com/uglify-js/-/uglify-js-3.17.4.tgz, - } - name: uglify-js - version: 3.17.4 - engines: { node: ">=0.8.0" } - hasBin: true - requiresBuild: true - dev: true + dependencies: + whatwg-url: registry.npmmirror.com/whatwg-url@5.0.0 + dev: true + + registry.npmmirror.com/node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-3.3.2.tgz} + name: node-fetch + version: 3.3.2 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: registry.npmmirror.com/data-uri-to-buffer@4.0.1 + fetch-blob: registry.npmmirror.com/fetch-blob@3.2.0 + formdata-polyfill: registry.npmmirror.com/formdata-polyfill@4.0.10 + dev: true + + registry.npmmirror.com/node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, tarball: https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz} + name: node-int64 + version: 0.4.0 + dev: true + + registry.npmmirror.com/node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz} + name: node-releases + version: 2.0.14 + dev: true + + registry.npmmirror.com/normalize-package-data@6.0.0: + resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==, tarball: https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz} + name: normalize-package-data + version: 6.0.0 + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: registry.npmmirror.com/hosted-git-info@7.0.1 + is-core-module: registry.npmmirror.com/is-core-module@2.13.1 + semver: registry.npmmirror.com/semver@7.5.4 + validate-npm-package-license: registry.npmmirror.com/validate-npm-package-license@3.0.4 + dev: true + + registry.npmmirror.com/normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, tarball: https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz} + name: normalize-path + version: 3.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==, tarball: https://registry.npmmirror.com/normalize-url/-/normalize-url-8.0.0.tgz} + name: normalize-url + version: 8.0.0 + engines: {node: '>=14.16'} + dev: true + + registry.npmmirror.com/npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz} + name: npm-run-path + version: 4.0.1 + engines: {node: '>=8'} + dependencies: + path-key: registry.npmmirror.com/path-key@3.1.1 + dev: true + + registry.npmmirror.com/npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==, tarball: https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz} + name: npm-run-path + version: 5.1.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: registry.npmmirror.com/path-key@4.0.0 + dev: true + + registry.npmmirror.com/nwsapi@2.2.4: + resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==, tarball: https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.4.tgz} + name: nwsapi + version: 2.2.4 + dev: true + + registry.npmmirror.com/object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz} + name: object-inspect + version: 1.13.1 + dev: true + + registry.npmmirror.com/object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, tarball: https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz} + name: object-is + version: 1.1.5 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + define-properties: registry.npmmirror.com/define-properties@1.2.1 + dev: true + + registry.npmmirror.com/object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, tarball: https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz} + name: object-keys + version: 1.1.1 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, tarball: https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz} + name: object.assign + version: 4.1.5 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + define-properties: registry.npmmirror.com/define-properties@1.2.1 + has-symbols: registry.npmmirror.com/has-symbols@1.0.3 + object-keys: registry.npmmirror.com/object-keys@1.1.1 + dev: true + + registry.npmmirror.com/obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0): + resolution: {integrity: sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==, tarball: https://registry.npmmirror.com/obsidian/-/obsidian-1.4.11.tgz} + id: registry.npmmirror.com/obsidian/1.4.11 + name: obsidian + version: 1.4.11 + peerDependencies: + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + dependencies: + '@codemirror/state': registry.npmmirror.com/@codemirror/state@6.3.1 + '@codemirror/view': registry.npmmirror.com/@codemirror/view@6.22.0 + '@types/codemirror': registry.npmmirror.com/@types/codemirror@5.60.8 + moment: registry.npmmirror.com/moment@2.29.4 + dev: true + + registry.npmmirror.com/once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, tarball: https://registry.npmmirror.com/once/-/once-1.4.0.tgz} + name: once + version: 1.4.0 + dependencies: + wrappy: registry.npmmirror.com/wrappy@1.0.2 + dev: true + + registry.npmmirror.com/onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, tarball: https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz} + name: onetime + version: 5.1.2 + engines: {node: '>=6'} + dependencies: + mimic-fn: registry.npmmirror.com/mimic-fn@2.1.0 + dev: true + + registry.npmmirror.com/onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, tarball: https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz} + name: onetime + version: 6.0.0 + engines: {node: '>=12'} + dependencies: + mimic-fn: registry.npmmirror.com/mimic-fn@4.0.0 + dev: true + + registry.npmmirror.com/optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, tarball: https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz} + name: optionator + version: 0.9.3 + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': registry.npmmirror.com/@aashutoshrathi/word-wrap@1.2.6 + deep-is: registry.npmmirror.com/deep-is@0.1.4 + fast-levenshtein: registry.npmmirror.com/fast-levenshtein@2.0.6 + levn: registry.npmmirror.com/levn@0.4.1 + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 + type-check: registry.npmmirror.com/type-check@0.4.0 + dev: true + + registry.npmmirror.com/ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, tarball: https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz} + name: ora + version: 5.4.1 + engines: {node: '>=10'} + dependencies: + bl: registry.npmmirror.com/bl@4.1.0 + chalk: registry.npmmirror.com/chalk@4.1.2 + cli-cursor: registry.npmmirror.com/cli-cursor@3.1.0 + cli-spinners: registry.npmmirror.com/cli-spinners@2.9.1 + is-interactive: registry.npmmirror.com/is-interactive@1.0.0 + is-unicode-supported: registry.npmmirror.com/is-unicode-supported@0.1.0 + log-symbols: registry.npmmirror.com/log-symbols@4.1.0 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + wcwidth: registry.npmmirror.com/wcwidth@1.0.1 + dev: true + + registry.npmmirror.com/os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, tarball: https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz} + name: os-tmpdir + version: 1.0.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==, tarball: https://registry.npmmirror.com/p-cancelable/-/p-cancelable-3.0.0.tgz} + name: p-cancelable + version: 3.0.0 + engines: {node: '>=12.20'} + dev: true + + registry.npmmirror.com/p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz} + name: p-limit + version: 2.3.0 + engines: {node: '>=6'} + dependencies: + p-try: registry.npmmirror.com/p-try@2.2.0 + dev: true + + registry.npmmirror.com/p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz} + name: p-limit + version: 3.1.0 + engines: {node: '>=10'} + dependencies: + yocto-queue: registry.npmmirror.com/yocto-queue@0.1.0 + dev: true + + registry.npmmirror.com/p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, tarball: https://registry.npmmirror.com/p-limit/-/p-limit-4.0.0.tgz} + name: p-limit + version: 4.0.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: registry.npmmirror.com/yocto-queue@1.0.0 + dev: true + + registry.npmmirror.com/p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz} + name: p-locate + version: 4.1.0 + engines: {node: '>=8'} + dependencies: + p-limit: registry.npmmirror.com/p-limit@2.3.0 + dev: true + + registry.npmmirror.com/p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz} + name: p-locate + version: 5.0.0 + engines: {node: '>=10'} + dependencies: + p-limit: registry.npmmirror.com/p-limit@3.1.0 + dev: true + + registry.npmmirror.com/p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, tarball: https://registry.npmmirror.com/p-locate/-/p-locate-6.0.0.tgz} + name: p-locate + version: 6.0.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: registry.npmmirror.com/p-limit@4.0.0 + dev: true + + registry.npmmirror.com/p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, tarball: https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz} + name: p-try + version: 2.2.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/pac-proxy-agent@7.0.1: + resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==, tarball: https://registry.npmmirror.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz} + name: pac-proxy-agent + version: 7.0.1 + engines: {node: '>= 14'} + dependencies: + '@tootallnate/quickjs-emscripten': registry.npmmirror.com/@tootallnate/quickjs-emscripten@0.23.0 + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + get-uri: registry.npmmirror.com/get-uri@6.0.2 + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + pac-resolver: registry.npmmirror.com/pac-resolver@7.0.0 + socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/pac-resolver@7.0.0: + resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==, tarball: https://registry.npmmirror.com/pac-resolver/-/pac-resolver-7.0.0.tgz} + name: pac-resolver + version: 7.0.0 + engines: {node: '>= 14'} + dependencies: + degenerator: registry.npmmirror.com/degenerator@5.0.1 + ip: registry.npmmirror.com/ip@1.1.8 + netmask: registry.npmmirror.com/netmask@2.0.2 + dev: true + + registry.npmmirror.com/parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, tarball: https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz} + name: parent-module + version: 1.0.1 + engines: {node: '>=6'} + dependencies: + callsites: registry.npmmirror.com/callsites@3.1.0 + dev: true + + registry.npmmirror.com/parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, tarball: https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz} + name: parse-json + version: 5.2.0 + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + error-ex: registry.npmmirror.com/error-ex@1.3.2 + json-parse-even-better-errors: registry.npmmirror.com/json-parse-even-better-errors@2.3.1 + lines-and-columns: registry.npmmirror.com/lines-and-columns@1.2.4 + dev: true + + registry.npmmirror.com/parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==, tarball: https://registry.npmmirror.com/parse-json/-/parse-json-7.1.1.tgz} + name: parse-json + version: 7.1.1 + engines: {node: '>=16'} + dependencies: + '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.13 + error-ex: registry.npmmirror.com/error-ex@1.3.2 + json-parse-even-better-errors: registry.npmmirror.com/json-parse-even-better-errors@3.0.0 + lines-and-columns: registry.npmmirror.com/lines-and-columns@2.0.4 + type-fest: registry.npmmirror.com/type-fest@3.13.1 + dev: true + + registry.npmmirror.com/parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==, tarball: https://registry.npmmirror.com/parse-ms/-/parse-ms-2.1.0.tgz} + name: parse-ms + version: 2.1.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, tarball: https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz} + name: parse5 + version: 7.1.2 + dependencies: + entities: registry.npmmirror.com/entities@4.5.0 + dev: true + + registry.npmmirror.com/path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz} + name: path-exists + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, tarball: https://registry.npmmirror.com/path-exists/-/path-exists-5.0.0.tgz} + name: path-exists + version: 5.0.0 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + registry.npmmirror.com/path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, tarball: https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz} + name: path-is-absolute + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, tarball: https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz} + name: path-key + version: 3.1.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, tarball: https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz} + name: path-key + version: 4.0.0 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, tarball: https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz} + name: path-parse + version: 1.0.7 + dev: true + + registry.npmmirror.com/path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, tarball: https://registry.npmmirror.com/path-scurry/-/path-scurry-1.10.1.tgz} + name: path-scurry + version: 1.10.1 + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: registry.npmmirror.com/lru-cache@10.0.2 + minipass: registry.npmmirror.com/minipass@7.0.4 + dev: true + + registry.npmmirror.com/path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, tarball: https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz} + name: path-type + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, tarball: https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz} + name: pathval + version: 1.1.1 + dev: true + + registry.npmmirror.com/pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==, tarball: https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz} + name: pend + version: 1.2.0 + dev: true + + registry.npmmirror.com/picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, tarball: https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz} + name: picocolors + version: 1.0.0 + dev: true + + registry.npmmirror.com/picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, tarball: https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz} + name: picomatch + version: 2.3.1 + engines: {node: '>=8.6'} + dev: true + + registry.npmmirror.com/pirates@4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==, tarball: https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz} + name: pirates + version: 4.0.5 + engines: {node: '>= 6'} + dev: true + + registry.npmmirror.com/pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, tarball: https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz} + name: pkg-dir + version: 4.2.0 + engines: {node: '>=8'} + dependencies: + find-up: registry.npmmirror.com/find-up@4.1.0 + dev: true + + registry.npmmirror.com/prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, tarball: https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz} + name: prelude-ls + version: 1.2.1 + engines: {node: '>= 0.8.0'} + dev: true + + registry.npmmirror.com/prettier@3.2.2: + resolution: {integrity: sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==, tarball: https://registry.npmmirror.com/prettier/-/prettier-3.2.2.tgz} + name: prettier + version: 3.2.2 + engines: {node: '>=14'} + hasBin: true + dev: true + + registry.npmmirror.com/pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, tarball: https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz} + name: pretty-format + version: 29.7.0 + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': registry.npmmirror.com/@jest/schemas@29.6.3 + ansi-styles: registry.npmmirror.com/ansi-styles@5.2.0 + react-is: registry.npmmirror.com/react-is@18.2.0 + dev: true + + registry.npmmirror.com/pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==, tarball: https://registry.npmmirror.com/pretty-ms/-/pretty-ms-7.0.1.tgz} + name: pretty-ms + version: 7.0.1 + engines: {node: '>=10'} + dependencies: + parse-ms: registry.npmmirror.com/parse-ms@2.1.0 + dev: true + + registry.npmmirror.com/process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, tarball: https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz} + name: process-nextick-args + version: 2.0.1 + dev: true + + registry.npmmirror.com/progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==, tarball: https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz} + name: progress + version: 2.0.3 + engines: {node: '>=0.4.0'} + dev: true + + registry.npmmirror.com/prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, tarball: https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz} + name: prompts + version: 2.4.2 + engines: {node: '>= 6'} + dependencies: + kleur: registry.npmmirror.com/kleur@3.0.3 + sisteransi: registry.npmmirror.com/sisteransi@1.0.5 + dev: true + + registry.npmmirror.com/proxy-agent@6.3.0: + resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==, tarball: https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.3.0.tgz} + name: proxy-agent + version: 6.3.0 + engines: {node: '>= 14'} + dependencies: + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + lru-cache: registry.npmmirror.com/lru-cache@7.18.3 + pac-proxy-agent: registry.npmmirror.com/pac-proxy-agent@7.0.1 + proxy-from-env: registry.npmmirror.com/proxy-from-env@1.1.0 + socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/proxy-agent@6.3.1: + resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==, tarball: https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.3.1.tgz} + name: proxy-agent + version: 6.3.1 + engines: {node: '>= 14'} + dependencies: + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + http-proxy-agent: registry.npmmirror.com/http-proxy-agent@7.0.0 + https-proxy-agent: registry.npmmirror.com/https-proxy-agent@7.0.2 + lru-cache: registry.npmmirror.com/lru-cache@7.18.3 + pac-proxy-agent: registry.npmmirror.com/pac-proxy-agent@7.0.1 + proxy-from-env: registry.npmmirror.com/proxy-from-env@1.1.0 + socks-proxy-agent: registry.npmmirror.com/socks-proxy-agent@8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, tarball: https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz} + name: proxy-from-env + version: 1.1.0 + dev: true + + registry.npmmirror.com/psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, tarball: https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz} + name: psl + version: 1.9.0 + dev: true + + registry.npmmirror.com/pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, tarball: https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz} + name: pump + version: 3.0.0 + dependencies: + end-of-stream: registry.npmmirror.com/end-of-stream@1.4.4 + once: registry.npmmirror.com/once@1.4.0 + dev: true + + registry.npmmirror.com/punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, tarball: https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz} + name: punycode + version: 2.3.1 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/puppeteer-core@20.9.0(typescript@5.1.6): + resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==, tarball: https://registry.npmmirror.com/puppeteer-core/-/puppeteer-core-20.9.0.tgz} + id: registry.npmmirror.com/puppeteer-core/20.9.0 + name: puppeteer-core + version: 20.9.0 + engines: {node: '>=16.3.0'} + peerDependencies: + typescript: '>= 4.7.4' + peerDependenciesMeta: + typescript: optional: true - - registry.npmmirror.com/unbzip2-stream@1.4.3: - resolution: - { - integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==, - tarball: https://registry.npmmirror.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz, - } - name: unbzip2-stream - version: 1.4.3 - dependencies: - buffer: registry.npmmirror.com/buffer@5.7.1 - through: registry.npmmirror.com/through@2.3.8 - dev: true - - registry.npmmirror.com/undici-types@5.26.5: - resolution: - { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, - tarball: https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz, - } - name: undici-types - version: 5.26.5 - dev: true - - registry.npmmirror.com/universalify@0.1.2: - resolution: - { - integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, - tarball: https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz, - } - name: universalify - version: 0.1.2 - engines: { node: ">= 4.0.0" } - dev: true - - registry.npmmirror.com/universalify@0.2.0: - resolution: - { - integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, - tarball: https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz, - } - name: universalify - version: 0.2.0 - engines: { node: ">= 4.0.0" } - dev: true - - registry.npmmirror.com/unzipper@0.10.14: - resolution: - { - integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==, - tarball: https://registry.npmmirror.com/unzipper/-/unzipper-0.10.14.tgz, - } - name: unzipper - version: 0.10.14 - dependencies: - big-integer: registry.npmmirror.com/big-integer@1.6.51 - binary: registry.npmmirror.com/binary@0.3.0 - bluebird: registry.npmmirror.com/bluebird@3.4.7 - buffer-indexof-polyfill: registry.npmmirror.com/buffer-indexof-polyfill@1.0.2 - duplexer2: registry.npmmirror.com/duplexer2@0.1.4 - fstream: registry.npmmirror.com/fstream@1.0.12 - graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 - listenercount: registry.npmmirror.com/listenercount@1.0.1 - readable-stream: registry.npmmirror.com/readable-stream@2.3.8 - setimmediate: registry.npmmirror.com/setimmediate@1.0.5 - dev: true - - registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: - { - integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, - tarball: https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz, - } - id: registry.npmmirror.com/update-browserslist-db/1.0.13 - name: update-browserslist-db - version: 1.0.13 - hasBin: true - peerDependencies: - browserslist: ">= 4.21.0" - dependencies: - browserslist: registry.npmmirror.com/browserslist@4.22.1 - escalade: registry.npmmirror.com/escalade@3.1.1 - picocolors: registry.npmmirror.com/picocolors@1.0.0 - dev: true - - registry.npmmirror.com/uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - tarball: https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz, - } - name: uri-js - version: 4.4.1 - dependencies: - punycode: registry.npmmirror.com/punycode@2.3.1 - dev: true - - registry.npmmirror.com/url-parse@1.5.10: - resolution: - { - integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, - tarball: https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz, - } - name: url-parse - version: 1.5.10 - dependencies: - querystringify: registry.npmmirror.com/querystringify@2.2.0 - requires-port: registry.npmmirror.com/requires-port@1.0.0 - dev: true - - registry.npmmirror.com/userhome@1.0.0: - resolution: - { - integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==, - tarball: https://registry.npmmirror.com/userhome/-/userhome-1.0.0.tgz, - } - name: userhome - version: 1.0.0 - engines: { node: ">= 0.8.0" } - dev: true - - registry.npmmirror.com/util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - tarball: https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz, - } - name: util-deprecate - version: 1.0.2 - dev: true - - registry.npmmirror.com/v8-to-istanbul@9.1.3: - resolution: - { - integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==, - tarball: https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz, - } - name: v8-to-istanbul - version: 9.1.3 - engines: { node: ">=10.12.0" } - dependencies: - "@jridgewell/trace-mapping": registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 - "@types/istanbul-lib-coverage": registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 - convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 - dev: true - - registry.npmmirror.com/validate-npm-package-license@3.0.4: - resolution: - { - integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, - tarball: https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz, - } - name: validate-npm-package-license - version: 3.0.4 - dependencies: - spdx-correct: registry.npmmirror.com/spdx-correct@3.2.0 - spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 - dev: true - - registry.npmmirror.com/w3c-keyname@2.2.6: - resolution: - { - integrity: sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==, - tarball: https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz, - } - name: w3c-keyname - version: 2.2.6 - dev: true - - registry.npmmirror.com/w3c-xmlserializer@4.0.0: - resolution: - { - integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==, - tarball: https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz, - } - name: w3c-xmlserializer - version: 4.0.0 - engines: { node: ">=14" } - dependencies: - xml-name-validator: registry.npmmirror.com/xml-name-validator@4.0.0 - dev: true - - registry.npmmirror.com/wait-port@1.1.0: - resolution: - { - integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==, - tarball: https://registry.npmmirror.com/wait-port/-/wait-port-1.1.0.tgz, - } - name: wait-port - version: 1.1.0 - engines: { node: ">=10" } - hasBin: true - dependencies: - chalk: registry.npmmirror.com/chalk@4.1.2 - commander: registry.npmmirror.com/commander@9.5.0 - debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/walker@1.0.8: - resolution: - { - integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, - tarball: https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz, - } - name: walker - version: 1.0.8 - dependencies: - makeerror: registry.npmmirror.com/makeerror@1.0.12 - dev: true - - registry.npmmirror.com/wcwidth@1.0.1: - resolution: - { - integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, - tarball: https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz, - } - name: wcwidth - version: 1.0.1 - dependencies: - defaults: registry.npmmirror.com/defaults@1.0.4 - dev: true - - registry.npmmirror.com/web-streams-polyfill@3.2.1: - resolution: - { - integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, - tarball: https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz, - } - name: web-streams-polyfill - version: 3.2.1 - engines: { node: ">= 8" } - dev: true - - registry.npmmirror.com/webdriver@8.27.2: - resolution: - { - integrity: sha512-vY2Lr0ZNr83n0v8PjLCXtJwR9E7QGycJVS+ev2G72gI54/rFwLv58HMSbJNn8CtE27VkhtewMUPlDpSkj5wGPQ==, - tarball: https://registry.npmmirror.com/webdriver/-/webdriver-8.27.2.tgz, - } - name: webdriver - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - "@types/ws": registry.npmmirror.com/@types/ws@8.5.9 - "@wdio/config": registry.npmmirror.com/@wdio/config@8.27.2 - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - "@wdio/protocols": registry.npmmirror.com/@wdio/protocols@8.24.12 - "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 - "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 - deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 - got: registry.npmmirror.com/got@12.6.1 - ky: registry.npmmirror.com/ky@0.33.3 - ws: registry.npmmirror.com/ws@8.14.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6): - resolution: - { - integrity: sha512-X6PhKE8e8XsB33Q/KSS1zYKP2Rqkq2Nef0YKOhQO+5OTlTkeqMCjnEtyRcfmdtfAwT0DEFqMnGnUKEbTajFC4Q==, - tarball: https://registry.npmmirror.com/webdriverio/-/webdriverio-8.27.2.tgz, - } - id: registry.npmmirror.com/webdriverio/8.27.2 - name: webdriverio - version: 8.27.2 - engines: { node: ^16.13 || >=18 } - peerDependencies: - devtools: ^8.14.0 - peerDependenciesMeta: - devtools: - optional: true - dependencies: - "@types/node": registry.npmmirror.com/@types/node@20.11.0 - "@wdio/config": registry.npmmirror.com/@wdio/config@8.27.2 - "@wdio/logger": registry.npmmirror.com/@wdio/logger@8.24.12 - "@wdio/protocols": registry.npmmirror.com/@wdio/protocols@8.24.12 - "@wdio/repl": registry.npmmirror.com/@wdio/repl@8.24.12 - "@wdio/types": registry.npmmirror.com/@wdio/types@8.27.2 - "@wdio/utils": registry.npmmirror.com/@wdio/utils@8.27.2 - archiver: registry.npmmirror.com/archiver@6.0.1 - aria-query: registry.npmmirror.com/aria-query@5.1.3 - css-shorthand-properties: registry.npmmirror.com/css-shorthand-properties@1.1.1 - css-value: registry.npmmirror.com/css-value@0.0.1 - devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1239539 - grapheme-splitter: registry.npmmirror.com/grapheme-splitter@1.0.4 - import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 - is-plain-obj: registry.npmmirror.com/is-plain-obj@4.1.0 - lodash.clonedeep: registry.npmmirror.com/lodash.clonedeep@4.5.0 - lodash.zip: registry.npmmirror.com/lodash.zip@4.2.0 - minimatch: registry.npmmirror.com/minimatch@9.0.3 - puppeteer-core: registry.npmmirror.com/puppeteer-core@20.9.0(typescript@5.1.6) - query-selector-shadow-dom: registry.npmmirror.com/query-selector-shadow-dom@1.0.1 - resq: registry.npmmirror.com/resq@1.11.0 - rgb2hex: registry.npmmirror.com/rgb2hex@0.2.5 - serialize-error: registry.npmmirror.com/serialize-error@11.0.3 - webdriver: registry.npmmirror.com/webdriver@8.27.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - dev: true - - registry.npmmirror.com/webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz, - } - name: webidl-conversions - version: 3.0.1 - dev: true - - registry.npmmirror.com/webidl-conversions@7.0.0: - resolution: - { - integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, - tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz, - } - name: webidl-conversions - version: 7.0.0 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/whatwg-encoding@2.0.0: - resolution: - { - integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==, - tarball: https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz, - } - name: whatwg-encoding - version: 2.0.0 - engines: { node: ">=12" } - dependencies: - iconv-lite: registry.npmmirror.com/iconv-lite@0.6.3 - dev: true - - registry.npmmirror.com/whatwg-mimetype@3.0.0: - resolution: - { - integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, - tarball: https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz, - } - name: whatwg-mimetype - version: 3.0.0 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/whatwg-url@11.0.0: - resolution: - { - integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==, - tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz, - } - name: whatwg-url - version: 11.0.0 - engines: { node: ">=12" } - dependencies: - tr46: registry.npmmirror.com/tr46@3.0.0 - webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 - dev: true - - registry.npmmirror.com/whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz, - } - name: whatwg-url - version: 5.0.0 - dependencies: - tr46: registry.npmmirror.com/tr46@0.0.3 - webidl-conversions: registry.npmmirror.com/webidl-conversions@3.0.1 - dev: true - - registry.npmmirror.com/which-boxed-primitive@1.0.2: - resolution: - { - integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, - tarball: https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz, - } - name: which-boxed-primitive - version: 1.0.2 - dependencies: - is-bigint: registry.npmmirror.com/is-bigint@1.0.4 - is-boolean-object: registry.npmmirror.com/is-boolean-object@1.1.2 - is-number-object: registry.npmmirror.com/is-number-object@1.0.7 - is-string: registry.npmmirror.com/is-string@1.0.7 - is-symbol: registry.npmmirror.com/is-symbol@1.0.4 - dev: true - - registry.npmmirror.com/which-collection@1.0.1: - resolution: - { - integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==, - tarball: https://registry.npmmirror.com/which-collection/-/which-collection-1.0.1.tgz, - } - name: which-collection - version: 1.0.1 - dependencies: - is-map: registry.npmmirror.com/is-map@2.0.2 - is-set: registry.npmmirror.com/is-set@2.0.2 - is-weakmap: registry.npmmirror.com/is-weakmap@2.0.1 - is-weakset: registry.npmmirror.com/is-weakset@2.0.2 - dev: true - - registry.npmmirror.com/which-typed-array@1.1.13: - resolution: - { - integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==, - tarball: https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.13.tgz, - } - name: which-typed-array - version: 1.1.13 - engines: { node: ">= 0.4" } - dependencies: - available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 - call-bind: registry.npmmirror.com/call-bind@1.0.5 - for-each: registry.npmmirror.com/for-each@0.3.3 - gopd: registry.npmmirror.com/gopd@1.0.1 - has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 - dev: true - - registry.npmmirror.com/which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - tarball: https://registry.npmmirror.com/which/-/which-2.0.2.tgz, - } - name: which - version: 2.0.2 - engines: { node: ">= 8" } - hasBin: true - dependencies: - isexe: registry.npmmirror.com/isexe@2.0.0 - dev: true - - registry.npmmirror.com/which@4.0.0: - resolution: - { - integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, - tarball: https://registry.npmmirror.com/which/-/which-4.0.0.tgz, - } - name: which - version: 4.0.0 - engines: { node: ^16.13.0 || >=18.0.0 } - hasBin: true - dependencies: - isexe: registry.npmmirror.com/isexe@3.1.1 - dev: true - - registry.npmmirror.com/workerpool@6.2.1: - resolution: - { - integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==, - tarball: https://registry.npmmirror.com/workerpool/-/workerpool-6.2.1.tgz, - } - name: workerpool - version: 6.2.1 - dev: true - - registry.npmmirror.com/wrap-ansi@6.2.0: - resolution: - { - integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, - tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz, - } - name: wrap-ansi - version: 6.2.0 - engines: { node: ">=8" } - dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 - string-width: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - dev: true - - registry.npmmirror.com/wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz, - } - name: wrap-ansi - version: 7.0.0 - engines: { node: ">=10" } - dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 - string-width: registry.npmmirror.com/string-width@4.2.3 - strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 - dev: true - - registry.npmmirror.com/wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz, - } - name: wrap-ansi - version: 8.1.0 - engines: { node: ">=12" } - dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles@6.2.1 - string-width: registry.npmmirror.com/string-width@5.1.2 - strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 - dev: true - - registry.npmmirror.com/wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - tarball: https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz, - } - name: wrappy - version: 1.0.2 - dev: true - - registry.npmmirror.com/write-file-atomic@4.0.2: - resolution: - { - integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, - tarball: https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz, - } - name: write-file-atomic - version: 4.0.2 - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - dependencies: - imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 - signal-exit: registry.npmmirror.com/signal-exit@3.0.7 - dev: true - - registry.npmmirror.com/ws@8.13.0: - resolution: - { - integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==, - tarball: https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz, - } - name: ws - version: 8.13.0 - engines: { node: ">=10.0.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - registry.npmmirror.com/ws@8.14.2: - resolution: - { - integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, - tarball: https://registry.npmmirror.com/ws/-/ws-8.14.2.tgz, - } - name: ws - version: 8.14.2 - engines: { node: ">=10.0.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - registry.npmmirror.com/xml-name-validator@4.0.0: - resolution: - { - integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==, - tarball: https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz, - } - name: xml-name-validator - version: 4.0.0 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/xmlchars@2.2.0: - resolution: - { - integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, - tarball: https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz, - } - name: xmlchars - version: 2.2.0 - dev: true - - registry.npmmirror.com/y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - tarball: https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz, - } - name: y18n - version: 5.0.8 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - tarball: https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz, - } - name: yallist - version: 3.1.1 - dev: true - - registry.npmmirror.com/yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - tarball: https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz, - } - name: yallist - version: 4.0.0 - dev: true - - registry.npmmirror.com/yargs-parser@20.2.4: - resolution: - { - integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, - tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz, - } - name: yargs-parser - version: 20.2.4 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/yargs-parser@21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, - tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz, - } - name: yargs-parser - version: 21.1.1 - engines: { node: ">=12" } - dev: true - - registry.npmmirror.com/yargs-unparser@2.0.0: - resolution: - { - integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==, - tarball: https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz, - } - name: yargs-unparser - version: 2.0.0 - engines: { node: ">=10" } - dependencies: - camelcase: registry.npmmirror.com/camelcase@6.3.0 - decamelize: registry.npmmirror.com/decamelize@4.0.0 - flat: registry.npmmirror.com/flat@5.0.2 - is-plain-obj: registry.npmmirror.com/is-plain-obj@2.1.0 - dev: true - - registry.npmmirror.com/yargs@16.2.0: - resolution: - { - integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, - tarball: https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz, - } - name: yargs - version: 16.2.0 - engines: { node: ">=10" } - dependencies: - cliui: registry.npmmirror.com/cliui@7.0.4 - escalade: registry.npmmirror.com/escalade@3.1.1 - get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 - require-directory: registry.npmmirror.com/require-directory@2.1.1 - string-width: registry.npmmirror.com/string-width@4.2.3 - y18n: registry.npmmirror.com/y18n@5.0.8 - yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 - dev: true - - registry.npmmirror.com/yargs@17.7.1: - resolution: - { - integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==, - tarball: https://registry.npmmirror.com/yargs/-/yargs-17.7.1.tgz, - } - name: yargs - version: 17.7.1 - engines: { node: ">=12" } - dependencies: - cliui: registry.npmmirror.com/cliui@8.0.1 - escalade: registry.npmmirror.com/escalade@3.1.1 - get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 - require-directory: registry.npmmirror.com/require-directory@2.1.1 - string-width: registry.npmmirror.com/string-width@4.2.3 - y18n: registry.npmmirror.com/y18n@5.0.8 - yargs-parser: registry.npmmirror.com/yargs-parser@21.1.1 - dev: true - - registry.npmmirror.com/yargs@17.7.2: - resolution: - { - integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, - tarball: https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz, - } - name: yargs - version: 17.7.2 - engines: { node: ">=12" } - dependencies: - cliui: registry.npmmirror.com/cliui@8.0.1 - escalade: registry.npmmirror.com/escalade@3.1.1 - get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 - require-directory: registry.npmmirror.com/require-directory@2.1.1 - string-width: registry.npmmirror.com/string-width@4.2.3 - y18n: registry.npmmirror.com/y18n@5.0.8 - yargs-parser: registry.npmmirror.com/yargs-parser@21.1.1 - dev: true - - registry.npmmirror.com/yauzl@2.10.0: - resolution: - { - integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==, - tarball: https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz, - } - name: yauzl - version: 2.10.0 - dependencies: - buffer-crc32: registry.npmmirror.com/buffer-crc32@0.2.13 - fd-slicer: registry.npmmirror.com/fd-slicer@1.1.0 - dev: true - - registry.npmmirror.com/yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz, - } - name: yocto-queue - version: 0.1.0 - engines: { node: ">=10" } - dev: true - - registry.npmmirror.com/yocto-queue@1.0.0: - resolution: - { - integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, - tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.0.0.tgz, - } - name: yocto-queue - version: 1.0.0 - engines: { node: ">=12.20" } - dev: true - - registry.npmmirror.com/zip-stream@5.0.1: - resolution: - { - integrity: sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==, - tarball: https://registry.npmmirror.com/zip-stream/-/zip-stream-5.0.1.tgz, - } - name: zip-stream - version: 5.0.1 - engines: { node: ">= 12.0.0" } - dependencies: - archiver-utils: registry.npmmirror.com/archiver-utils@4.0.1 - compress-commons: registry.npmmirror.com/compress-commons@5.0.1 - readable-stream: registry.npmmirror.com/readable-stream@3.6.2 - dev: true + dependencies: + '@puppeteer/browsers': registry.npmmirror.com/@puppeteer/browsers@1.4.6(typescript@5.1.6) + chromium-bidi: registry.npmmirror.com/chromium-bidi@0.4.16(devtools-protocol@0.0.1147663) + cross-fetch: registry.npmmirror.com/cross-fetch@4.0.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1147663 + typescript: 5.1.6 + ws: registry.npmmirror.com/ws@8.13.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==, tarball: https://registry.npmmirror.com/pure-rand/-/pure-rand-6.0.4.tgz} + name: pure-rand + version: 6.0.4 + dev: true + + registry.npmmirror.com/query-selector-shadow-dom@1.0.1: + resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==, tarball: https://registry.npmmirror.com/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz} + name: query-selector-shadow-dom + version: 1.0.1 + dev: true + + registry.npmmirror.com/querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, tarball: https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz} + name: querystringify + version: 2.2.0 + dev: true + + registry.npmmirror.com/queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, tarball: https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz} + name: queue-microtask + version: 1.2.3 + dev: true + + registry.npmmirror.com/queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==, tarball: https://registry.npmmirror.com/queue-tick/-/queue-tick-1.0.1.tgz} + name: queue-tick + version: 1.0.1 + dev: true + + registry.npmmirror.com/quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, tarball: https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz} + name: quick-lru + version: 5.1.1 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, tarball: https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz} + name: randombytes + version: 2.1.0 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, tarball: https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz} + name: react-is + version: 18.2.0 + dev: true + + registry.npmmirror.com/read-pkg-up@10.1.0: + resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==, tarball: https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-10.1.0.tgz} + name: read-pkg-up + version: 10.1.0 + engines: {node: '>=16'} + dependencies: + find-up: registry.npmmirror.com/find-up@6.3.0 + read-pkg: registry.npmmirror.com/read-pkg@8.1.0 + type-fest: registry.npmmirror.com/type-fest@4.7.1 + dev: true + + registry.npmmirror.com/read-pkg@8.1.0: + resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==, tarball: https://registry.npmmirror.com/read-pkg/-/read-pkg-8.1.0.tgz} + name: read-pkg + version: 8.1.0 + engines: {node: '>=16'} + dependencies: + '@types/normalize-package-data': registry.npmmirror.com/@types/normalize-package-data@2.4.4 + normalize-package-data: registry.npmmirror.com/normalize-package-data@6.0.0 + parse-json: registry.npmmirror.com/parse-json@7.1.1 + type-fest: registry.npmmirror.com/type-fest@4.7.1 + dev: true + + registry.npmmirror.com/readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz} + name: readable-stream + version: 2.3.8 + dependencies: + core-util-is: registry.npmmirror.com/core-util-is@1.0.3 + inherits: registry.npmmirror.com/inherits@2.0.4 + isarray: registry.npmmirror.com/isarray@1.0.0 + process-nextick-args: registry.npmmirror.com/process-nextick-args@2.0.1 + safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 + string_decoder: registry.npmmirror.com/string_decoder@1.1.1 + util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 + dev: true + + registry.npmmirror.com/readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz} + name: readable-stream + version: 3.6.2 + engines: {node: '>= 6'} + dependencies: + inherits: registry.npmmirror.com/inherits@2.0.4 + string_decoder: registry.npmmirror.com/string_decoder@1.3.0 + util-deprecate: registry.npmmirror.com/util-deprecate@1.0.2 + dev: true + + registry.npmmirror.com/readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==, tarball: https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz} + name: readdir-glob + version: 1.1.3 + dependencies: + minimatch: registry.npmmirror.com/minimatch@5.1.6 + dev: true + + registry.npmmirror.com/readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, tarball: https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz} + name: readdirp + version: 3.6.0 + engines: {node: '>=8.10.0'} + dependencies: + picomatch: registry.npmmirror.com/picomatch@2.3.1 + dev: true + + registry.npmmirror.com/recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==, tarball: https://registry.npmmirror.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz} + name: recursive-readdir + version: 2.2.3 + engines: {node: '>=6.0.0'} + dependencies: + minimatch: registry.npmmirror.com/minimatch@3.1.2 + dev: true + + registry.npmmirror.com/regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==, tarball: https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz} + name: regexp.prototype.flags + version: 1.5.0 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + define-properties: registry.npmmirror.com/define-properties@1.2.1 + functions-have-names: registry.npmmirror.com/functions-have-names@1.2.3 + dev: true + + registry.npmmirror.com/require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, tarball: https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz} + name: require-directory + version: 2.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, tarball: https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz} + name: requires-port + version: 1.0.0 + dev: true + + registry.npmmirror.com/resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, tarball: https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz} + name: resolve-alpn + version: 1.2.1 + dev: true + + registry.npmmirror.com/resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, tarball: https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz} + name: resolve-cwd + version: 3.0.0 + engines: {node: '>=8'} + dependencies: + resolve-from: registry.npmmirror.com/resolve-from@5.0.0 + dev: true + + registry.npmmirror.com/resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz} + name: resolve-from + version: 4.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, tarball: https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz} + name: resolve-from + version: 5.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==, tarball: https://registry.npmmirror.com/resolve.exports/-/resolve.exports-2.0.2.tgz} + name: resolve.exports + version: 2.0.2 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, tarball: https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz} + name: resolve + version: 1.22.8 + hasBin: true + dependencies: + is-core-module: registry.npmmirror.com/is-core-module@2.13.1 + path-parse: registry.npmmirror.com/path-parse@1.0.7 + supports-preserve-symlinks-flag: registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0 + dev: true + + registry.npmmirror.com/responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==, tarball: https://registry.npmmirror.com/responselike/-/responselike-3.0.0.tgz} + name: responselike + version: 3.0.0 + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: registry.npmmirror.com/lowercase-keys@3.0.0 + dev: true + + registry.npmmirror.com/resq@1.11.0: + resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==, tarball: https://registry.npmmirror.com/resq/-/resq-1.11.0.tgz} + name: resq + version: 1.11.0 + dependencies: + fast-deep-equal: registry.npmmirror.com/fast-deep-equal@2.0.1 + dev: true + + registry.npmmirror.com/restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, tarball: https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz} + name: restore-cursor + version: 3.1.0 + engines: {node: '>=8'} + dependencies: + onetime: registry.npmmirror.com/onetime@5.1.2 + signal-exit: registry.npmmirror.com/signal-exit@3.0.7 + dev: true + + registry.npmmirror.com/reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, tarball: https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz} + name: reusify + version: 1.0.4 + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/rgb2hex@0.2.5: + resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==, tarball: https://registry.npmmirror.com/rgb2hex/-/rgb2hex-0.2.5.tgz} + name: rgb2hex + version: 0.2.5 + dev: true + + registry.npmmirror.com/rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, tarball: https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz} + name: rimraf + version: 2.7.1 + hasBin: true + dependencies: + glob: registry.npmmirror.com/glob@7.2.3 + dev: true + + registry.npmmirror.com/rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, tarball: https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz} + name: rimraf + version: 3.0.2 + hasBin: true + dependencies: + glob: registry.npmmirror.com/glob@7.2.3 + dev: true + + registry.npmmirror.com/run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==, tarball: https://registry.npmmirror.com/run-async/-/run-async-3.0.0.tgz} + name: run-async + version: 3.0.0 + engines: {node: '>=0.12.0'} + dev: true + + registry.npmmirror.com/run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, tarball: https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz} + name: run-parallel + version: 1.2.0 + dependencies: + queue-microtask: registry.npmmirror.com/queue-microtask@1.2.3 + dev: true + + registry.npmmirror.com/rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, tarball: https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz} + name: rxjs + version: 7.8.1 + dependencies: + tslib: registry.npmmirror.com/tslib@2.6.1 + dev: true + + registry.npmmirror.com/safaridriver@0.1.0: + resolution: {integrity: sha512-azzzIP3gR1TB9bVPv7QO4Zjw0rR1BWEU/s2aFdUMN48gxDjxEB13grAEuXDmkKPgE74cObymDxmAmZnL3clj4w==, tarball: https://registry.npmmirror.com/safaridriver/-/safaridriver-0.1.0.tgz} + name: safaridriver + version: 0.1.0 + dev: true + + registry.npmmirror.com/safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz} + name: safe-buffer + version: 5.1.2 + dev: true + + registry.npmmirror.com/safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz} + name: safe-buffer + version: 5.2.1 + dev: true + + registry.npmmirror.com/safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, tarball: https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz} + name: safer-buffer + version: 2.1.2 + dev: true + + registry.npmmirror.com/saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, tarball: https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz} + name: saxes + version: 6.0.0 + engines: {node: '>=v12.22.7'} + dependencies: + xmlchars: registry.npmmirror.com/xmlchars@2.2.0 + dev: true + + registry.npmmirror.com/semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, tarball: https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz} + name: semver + version: 6.3.1 + hasBin: true + dev: true + + registry.npmmirror.com/semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, tarball: https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz} + name: semver + version: 7.5.4 + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: registry.npmmirror.com/lru-cache@6.0.0 + dev: true + + registry.npmmirror.com/serialize-error@11.0.3: + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==, tarball: https://registry.npmmirror.com/serialize-error/-/serialize-error-11.0.3.tgz} + name: serialize-error + version: 11.0.3 + engines: {node: '>=14.16'} + dependencies: + type-fest: registry.npmmirror.com/type-fest@2.19.0 + dev: true + + registry.npmmirror.com/serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==, tarball: https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz} + name: serialize-javascript + version: 6.0.0 + dependencies: + randombytes: registry.npmmirror.com/randombytes@2.1.0 + dev: true + + registry.npmmirror.com/set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==, tarball: https://registry.npmmirror.com/set-function-length/-/set-function-length-1.1.1.tgz} + name: set-function-length + version: 1.1.1 + engines: {node: '>= 0.4'} + dependencies: + define-data-property: registry.npmmirror.com/define-data-property@1.1.1 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-property-descriptors: registry.npmmirror.com/has-property-descriptors@1.0.1 + dev: true + + registry.npmmirror.com/setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, tarball: https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz} + name: setimmediate + version: 1.0.5 + dev: true + + registry.npmmirror.com/shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, tarball: https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz} + name: shebang-command + version: 2.0.0 + engines: {node: '>=8'} + dependencies: + shebang-regex: registry.npmmirror.com/shebang-regex@3.0.0 + dev: true + + registry.npmmirror.com/shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, tarball: https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz} + name: shebang-regex + version: 3.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, tarball: https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz} + name: side-channel + version: 1.0.4 + dependencies: + call-bind: registry.npmmirror.com/call-bind@1.0.5 + get-intrinsic: registry.npmmirror.com/get-intrinsic@1.2.2 + object-inspect: registry.npmmirror.com/object-inspect@1.13.1 + dev: true + + registry.npmmirror.com/signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz} + name: signal-exit + version: 3.0.7 + dev: true + + registry.npmmirror.com/signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, tarball: https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz} + name: signal-exit + version: 4.1.0 + engines: {node: '>=14'} + dev: true + + registry.npmmirror.com/sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, tarball: https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz} + name: sisteransi + version: 1.0.5 + dev: true + + registry.npmmirror.com/slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, tarball: https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz} + name: slash + version: 3.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, tarball: https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz} + name: smart-buffer + version: 4.2.0 + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: true + + registry.npmmirror.com/socks-proxy-agent@8.0.2: + resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==, tarball: https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz} + name: socks-proxy-agent + version: 8.0.2 + engines: {node: '>= 14'} + dependencies: + agent-base: registry.npmmirror.com/agent-base@7.1.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + socks: registry.npmmirror.com/socks@2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==, tarball: https://registry.npmmirror.com/socks/-/socks-2.7.1.tgz} + name: socks + version: 2.7.1 + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: registry.npmmirror.com/ip@2.0.0 + smart-buffer: registry.npmmirror.com/smart-buffer@4.2.0 + dev: true + + registry.npmmirror.com/source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, tarball: https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz} + name: source-map-support + version: 0.5.13 + dependencies: + buffer-from: registry.npmmirror.com/buffer-from@1.1.2 + source-map: registry.npmmirror.com/source-map@0.6.1 + dev: true + + registry.npmmirror.com/source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz} + name: source-map + version: 0.6.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmmirror.com/spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, tarball: https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz} + name: spdx-correct + version: 3.2.0 + dependencies: + spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 + spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.16 + dev: true + + registry.npmmirror.com/spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, tarball: https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz} + name: spdx-exceptions + version: 2.3.0 + dev: true + + registry.npmmirror.com/spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, tarball: https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz} + name: spdx-expression-parse + version: 3.0.1 + dependencies: + spdx-exceptions: registry.npmmirror.com/spdx-exceptions@2.3.0 + spdx-license-ids: registry.npmmirror.com/spdx-license-ids@3.0.16 + dev: true + + registry.npmmirror.com/spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==, tarball: https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz} + name: spdx-license-ids + version: 3.0.16 + dev: true + + registry.npmmirror.com/split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, tarball: https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz} + name: split2 + version: 4.2.0 + engines: {node: '>= 10.x'} + dev: true + + registry.npmmirror.com/sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, tarball: https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz} + name: sprintf-js + version: 1.0.3 + dev: true + + registry.npmmirror.com/stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, tarball: https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.6.tgz} + name: stack-utils + version: 2.0.6 + engines: {node: '>=10'} + dependencies: + escape-string-regexp: registry.npmmirror.com/escape-string-regexp@2.0.0 + dev: true + + registry.npmmirror.com/stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==, tarball: https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz} + name: stop-iteration-iterator + version: 1.0.0 + engines: {node: '>= 0.4'} + dependencies: + internal-slot: registry.npmmirror.com/internal-slot@1.0.5 + dev: true + + registry.npmmirror.com/stream-buffers@3.0.2: + resolution: {integrity: sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==, tarball: https://registry.npmmirror.com/stream-buffers/-/stream-buffers-3.0.2.tgz} + name: stream-buffers + version: 3.0.2 + engines: {node: '>= 0.10.0'} + dev: true + + registry.npmmirror.com/streamx@2.15.4: + resolution: {integrity: sha512-uSXKl88bibiUCQ1eMpItRljCzDENcDx18rsfDmV79r0e/ThfrAwxG4Y2FarQZ2G4/21xcOKmFFd1Hue+ZIDwHw==, tarball: https://registry.npmmirror.com/streamx/-/streamx-2.15.4.tgz} + name: streamx + version: 2.15.4 + dependencies: + fast-fifo: registry.npmmirror.com/fast-fifo@1.3.2 + queue-tick: registry.npmmirror.com/queue-tick@1.0.1 + dev: true + + registry.npmmirror.com/string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, tarball: https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz} + name: string-length + version: 4.0.2 + engines: {node: '>=10'} + dependencies: + char-regex: registry.npmmirror.com/char-regex@1.0.2 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + dev: true + + registry.npmmirror.com/string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, tarball: https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz} + name: string-width + version: 4.2.3 + engines: {node: '>=8'} + dependencies: + emoji-regex: registry.npmmirror.com/emoji-regex@8.0.0 + is-fullwidth-code-point: registry.npmmirror.com/is-fullwidth-code-point@3.0.0 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + dev: true + + registry.npmmirror.com/string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, tarball: https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz} + name: string-width + version: 5.1.2 + engines: {node: '>=12'} + dependencies: + eastasianwidth: registry.npmmirror.com/eastasianwidth@0.2.0 + emoji-regex: registry.npmmirror.com/emoji-regex@9.2.2 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 + dev: true + + registry.npmmirror.com/string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz} + name: string_decoder + version: 1.1.1 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.1.2 + dev: true + + registry.npmmirror.com/string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz} + name: string_decoder + version: 1.3.0 + dependencies: + safe-buffer: registry.npmmirror.com/safe-buffer@5.2.1 + dev: true + + registry.npmmirror.com/strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz} + name: strip-ansi + version: 6.0.1 + engines: {node: '>=8'} + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex@5.0.1 + dev: true + + registry.npmmirror.com/strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, tarball: https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz} + name: strip-ansi + version: 7.1.0 + engines: {node: '>=12'} + dependencies: + ansi-regex: registry.npmmirror.com/ansi-regex@6.0.1 + dev: true + + registry.npmmirror.com/strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, tarball: https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz} + name: strip-bom + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, tarball: https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz} + name: strip-final-newline + version: 2.0.0 + engines: {node: '>=6'} + dev: true + + registry.npmmirror.com/strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, tarball: https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz} + name: strip-final-newline + version: 3.0.0 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, tarball: https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz} + name: strip-json-comments + version: 3.1.1 + engines: {node: '>=8'} + dev: true + + registry.npmmirror.com/style-mod@4.1.0: + resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==, tarball: https://registry.npmmirror.com/style-mod/-/style-mod-4.1.0.tgz} + name: style-mod + version: 4.1.0 + dev: true + + registry.npmmirror.com/supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz} + name: supports-color + version: 5.5.0 + engines: {node: '>=4'} + dependencies: + has-flag: registry.npmmirror.com/has-flag@3.0.0 + dev: true + + registry.npmmirror.com/supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz} + name: supports-color + version: 7.2.0 + engines: {node: '>=8'} + dependencies: + has-flag: registry.npmmirror.com/has-flag@4.0.0 + dev: true + + registry.npmmirror.com/supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz} + name: supports-color + version: 8.1.1 + engines: {node: '>=10'} + dependencies: + has-flag: registry.npmmirror.com/has-flag@4.0.0 + dev: true + + registry.npmmirror.com/supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, tarball: https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz} + name: supports-preserve-symlinks-flag + version: 1.0.0 + engines: {node: '>= 0.4'} + dev: true + + registry.npmmirror.com/symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, tarball: https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz} + name: symbol-tree + version: 3.2.4 + dev: true + + registry.npmmirror.com/tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==, tarball: https://registry.npmmirror.com/tar-fs/-/tar-fs-3.0.4.tgz} + name: tar-fs + version: 3.0.4 + dependencies: + mkdirp-classic: registry.npmmirror.com/mkdirp-classic@0.5.3 + pump: registry.npmmirror.com/pump@3.0.0 + tar-stream: registry.npmmirror.com/tar-stream@3.1.6 + dev: true + + registry.npmmirror.com/tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==, tarball: https://registry.npmmirror.com/tar-stream/-/tar-stream-3.1.6.tgz} + name: tar-stream + version: 3.1.6 + dependencies: + b4a: registry.npmmirror.com/b4a@1.6.4 + fast-fifo: registry.npmmirror.com/fast-fifo@1.3.2 + streamx: registry.npmmirror.com/streamx@2.15.4 + dev: true + + registry.npmmirror.com/test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, tarball: https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz} + name: test-exclude + version: 6.0.0 + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema@0.1.3 + glob: registry.npmmirror.com/glob@7.2.3 + minimatch: registry.npmmirror.com/minimatch@3.1.2 + dev: true + + registry.npmmirror.com/text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, tarball: https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz} + name: text-table + version: 0.2.0 + dev: true + + registry.npmmirror.com/through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, tarball: https://registry.npmmirror.com/through/-/through-2.3.8.tgz} + name: through + version: 2.3.8 + dev: true + + registry.npmmirror.com/tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, tarball: https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz} + name: tmp + version: 0.0.33 + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: registry.npmmirror.com/os-tmpdir@1.0.2 + dev: true + + registry.npmmirror.com/tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, tarball: https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz} + name: tmpl + version: 1.0.5 + dev: true + + registry.npmmirror.com/to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, tarball: https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz} + name: to-fast-properties + version: 2.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, tarball: https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz} + name: to-regex-range + version: 5.0.1 + engines: {node: '>=8.0'} + dependencies: + is-number: registry.npmmirror.com/is-number@7.0.0 + dev: true + + registry.npmmirror.com/tough-cookie@4.1.2: + resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==, tarball: https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.2.tgz} + name: tough-cookie + version: 4.1.2 + engines: {node: '>=6'} + dependencies: + psl: registry.npmmirror.com/psl@1.9.0 + punycode: registry.npmmirror.com/punycode@2.3.1 + universalify: registry.npmmirror.com/universalify@0.2.0 + url-parse: registry.npmmirror.com/url-parse@1.5.10 + dev: true + + registry.npmmirror.com/tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, tarball: https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz} + name: tr46 + version: 0.0.3 + dev: true + + registry.npmmirror.com/tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==, tarball: https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz} + name: tr46 + version: 3.0.0 + engines: {node: '>=12'} + dependencies: + punycode: registry.npmmirror.com/punycode@2.3.1 + dev: true + + registry.npmmirror.com/traverse@0.3.9: + resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==, tarball: https://registry.npmmirror.com/traverse/-/traverse-0.3.9.tgz} + name: traverse + version: 0.3.9 + dev: true + + registry.npmmirror.com/ts-api-utils@1.0.3(typescript@5.1.6): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, tarball: https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz} + id: registry.npmmirror.com/ts-api-utils/1.0.3 + name: ts-api-utils + version: 1.0.3 + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.1.6 + dev: true + + registry.npmmirror.com/tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==, tarball: https://registry.npmmirror.com/tslib/-/tslib-2.6.1.tgz} + name: tslib + version: 2.6.1 + dev: true + + registry.npmmirror.com/type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, tarball: https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz} + name: type-check + version: 0.4.0 + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: registry.npmmirror.com/prelude-ls@1.2.1 + dev: true + + registry.npmmirror.com/type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, tarball: https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz} + name: type-detect + version: 4.0.8 + engines: {node: '>=4'} + dev: true + + registry.npmmirror.com/type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz} + name: type-fest + version: 0.20.2 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz} + name: type-fest + version: 0.21.3 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/type-fest@2.13.0: + resolution: {integrity: sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-2.13.0.tgz} + name: type-fest + version: 2.13.0 + engines: {node: '>=12.20'} + dev: true + + registry.npmmirror.com/type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz} + name: type-fest + version: 2.19.0 + engines: {node: '>=12.20'} + dev: true + + registry.npmmirror.com/type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-3.13.1.tgz} + name: type-fest + version: 3.13.1 + engines: {node: '>=14.16'} + dev: true + + registry.npmmirror.com/type-fest@4.7.1: + resolution: {integrity: sha512-iWr8RUmzAJRfhZugX9O7nZE6pCxDU8CZ3QxsLuTnGcBLJpCaP2ll3s4eMTBoFnU/CeXY/5rfQSuAEsTGJO4y8A==, tarball: https://registry.npmmirror.com/type-fest/-/type-fest-4.7.1.tgz} + name: type-fest + version: 4.7.1 + engines: {node: '>=16'} + dev: true + + registry.npmmirror.com/uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, tarball: https://registry.npmmirror.com/uglify-js/-/uglify-js-3.17.4.tgz} + name: uglify-js + version: 3.17.4 + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + registry.npmmirror.com/unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==, tarball: https://registry.npmmirror.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz} + name: unbzip2-stream + version: 1.4.3 + dependencies: + buffer: registry.npmmirror.com/buffer@5.7.1 + through: registry.npmmirror.com/through@2.3.8 + dev: true + + registry.npmmirror.com/undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, tarball: https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz} + name: undici-types + version: 5.26.5 + dev: true + + registry.npmmirror.com/universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, tarball: https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz} + name: universalify + version: 0.1.2 + engines: {node: '>= 4.0.0'} + dev: true + + registry.npmmirror.com/universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, tarball: https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz} + name: universalify + version: 0.2.0 + engines: {node: '>= 4.0.0'} + dev: true + + registry.npmmirror.com/unzipper@0.10.14: + resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==, tarball: https://registry.npmmirror.com/unzipper/-/unzipper-0.10.14.tgz} + name: unzipper + version: 0.10.14 + dependencies: + big-integer: registry.npmmirror.com/big-integer@1.6.51 + binary: registry.npmmirror.com/binary@0.3.0 + bluebird: registry.npmmirror.com/bluebird@3.4.7 + buffer-indexof-polyfill: registry.npmmirror.com/buffer-indexof-polyfill@1.0.2 + duplexer2: registry.npmmirror.com/duplexer2@0.1.4 + fstream: registry.npmmirror.com/fstream@1.0.12 + graceful-fs: registry.npmmirror.com/graceful-fs@4.2.11 + listenercount: registry.npmmirror.com/listenercount@1.0.1 + readable-stream: registry.npmmirror.com/readable-stream@2.3.8 + setimmediate: registry.npmmirror.com/setimmediate@1.0.5 + dev: true + + registry.npmmirror.com/update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, tarball: https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz} + id: registry.npmmirror.com/update-browserslist-db/1.0.13 + name: update-browserslist-db + version: 1.0.13 + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: registry.npmmirror.com/browserslist@4.22.1 + escalade: registry.npmmirror.com/escalade@3.1.1 + picocolors: registry.npmmirror.com/picocolors@1.0.0 + dev: true + + registry.npmmirror.com/uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, tarball: https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz} + name: uri-js + version: 4.4.1 + dependencies: + punycode: registry.npmmirror.com/punycode@2.3.1 + dev: true + + registry.npmmirror.com/url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, tarball: https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz} + name: url-parse + version: 1.5.10 + dependencies: + querystringify: registry.npmmirror.com/querystringify@2.2.0 + requires-port: registry.npmmirror.com/requires-port@1.0.0 + dev: true + + registry.npmmirror.com/userhome@1.0.0: + resolution: {integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==, tarball: https://registry.npmmirror.com/userhome/-/userhome-1.0.0.tgz} + name: userhome + version: 1.0.0 + engines: {node: '>= 0.8.0'} + dev: true + + registry.npmmirror.com/util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, tarball: https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz} + name: util-deprecate + version: 1.0.2 + dev: true + + registry.npmmirror.com/v8-to-istanbul@9.1.3: + resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==, tarball: https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz} + name: v8-to-istanbul + version: 9.1.3 + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.20 + '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage@2.0.6 + convert-source-map: registry.npmmirror.com/convert-source-map@2.0.0 + dev: true + + registry.npmmirror.com/validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, tarball: https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz} + name: validate-npm-package-license + version: 3.0.4 + dependencies: + spdx-correct: registry.npmmirror.com/spdx-correct@3.2.0 + spdx-expression-parse: registry.npmmirror.com/spdx-expression-parse@3.0.1 + dev: true + + registry.npmmirror.com/w3c-keyname@2.2.6: + resolution: {integrity: sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==, tarball: https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz} + name: w3c-keyname + version: 2.2.6 + dev: true + + registry.npmmirror.com/w3c-xmlserializer@4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==, tarball: https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz} + name: w3c-xmlserializer + version: 4.0.0 + engines: {node: '>=14'} + dependencies: + xml-name-validator: registry.npmmirror.com/xml-name-validator@4.0.0 + dev: true + + registry.npmmirror.com/wait-port@1.1.0: + resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==, tarball: https://registry.npmmirror.com/wait-port/-/wait-port-1.1.0.tgz} + name: wait-port + version: 1.1.0 + engines: {node: '>=10'} + hasBin: true + dependencies: + chalk: registry.npmmirror.com/chalk@4.1.2 + commander: registry.npmmirror.com/commander@9.5.0 + debug: registry.npmmirror.com/debug@4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmmirror.com/walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, tarball: https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz} + name: walker + version: 1.0.8 + dependencies: + makeerror: registry.npmmirror.com/makeerror@1.0.12 + dev: true + + registry.npmmirror.com/wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, tarball: https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz} + name: wcwidth + version: 1.0.1 + dependencies: + defaults: registry.npmmirror.com/defaults@1.0.4 + dev: true + + registry.npmmirror.com/web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, tarball: https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz} + name: web-streams-polyfill + version: 3.2.1 + engines: {node: '>= 8'} + dev: true + + registry.npmmirror.com/webdriver@8.27.2: + resolution: {integrity: sha512-vY2Lr0ZNr83n0v8PjLCXtJwR9E7QGycJVS+ev2G72gI54/rFwLv58HMSbJNn8CtE27VkhtewMUPlDpSkj5wGPQ==, tarball: https://registry.npmmirror.com/webdriver/-/webdriver-8.27.2.tgz} + name: webdriver + version: 8.27.2 + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@types/ws': registry.npmmirror.com/@types/ws@8.5.9 + '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/protocols': registry.npmmirror.com/@wdio/protocols@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + deepmerge-ts: registry.npmmirror.com/deepmerge-ts@5.1.0 + got: registry.npmmirror.com/got@12.6.1 + ky: registry.npmmirror.com/ky@0.33.3 + ws: registry.npmmirror.com/ws@8.14.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + registry.npmmirror.com/webdriverio@8.27.2(typescript@5.1.6): + resolution: {integrity: sha512-X6PhKE8e8XsB33Q/KSS1zYKP2Rqkq2Nef0YKOhQO+5OTlTkeqMCjnEtyRcfmdtfAwT0DEFqMnGnUKEbTajFC4Q==, tarball: https://registry.npmmirror.com/webdriverio/-/webdriverio-8.27.2.tgz} + id: registry.npmmirror.com/webdriverio/8.27.2 + name: webdriverio + version: 8.27.2 + engines: {node: ^16.13 || >=18} + peerDependencies: + devtools: ^8.14.0 + peerDependenciesMeta: + devtools: + optional: true + dependencies: + '@types/node': registry.npmmirror.com/@types/node@20.11.0 + '@wdio/config': registry.npmmirror.com/@wdio/config@8.27.2 + '@wdio/logger': registry.npmmirror.com/@wdio/logger@8.24.12 + '@wdio/protocols': registry.npmmirror.com/@wdio/protocols@8.24.12 + '@wdio/repl': registry.npmmirror.com/@wdio/repl@8.24.12 + '@wdio/types': registry.npmmirror.com/@wdio/types@8.27.2 + '@wdio/utils': registry.npmmirror.com/@wdio/utils@8.27.2 + archiver: registry.npmmirror.com/archiver@6.0.1 + aria-query: registry.npmmirror.com/aria-query@5.1.3 + css-shorthand-properties: registry.npmmirror.com/css-shorthand-properties@1.1.1 + css-value: registry.npmmirror.com/css-value@0.0.1 + devtools-protocol: registry.npmmirror.com/devtools-protocol@0.0.1239539 + grapheme-splitter: registry.npmmirror.com/grapheme-splitter@1.0.4 + import-meta-resolve: registry.npmmirror.com/import-meta-resolve@4.0.0 + is-plain-obj: registry.npmmirror.com/is-plain-obj@4.1.0 + lodash.clonedeep: registry.npmmirror.com/lodash.clonedeep@4.5.0 + lodash.zip: registry.npmmirror.com/lodash.zip@4.2.0 + minimatch: registry.npmmirror.com/minimatch@9.0.3 + puppeteer-core: registry.npmmirror.com/puppeteer-core@20.9.0(typescript@5.1.6) + query-selector-shadow-dom: registry.npmmirror.com/query-selector-shadow-dom@1.0.1 + resq: registry.npmmirror.com/resq@1.11.0 + rgb2hex: registry.npmmirror.com/rgb2hex@0.2.5 + serialize-error: registry.npmmirror.com/serialize-error@11.0.3 + webdriver: registry.npmmirror.com/webdriver@8.27.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + + registry.npmmirror.com/webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz} + name: webidl-conversions + version: 3.0.1 + dev: true + + registry.npmmirror.com/webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz} + name: webidl-conversions + version: 7.0.0 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==, tarball: https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz} + name: whatwg-encoding + version: 2.0.0 + engines: {node: '>=12'} + dependencies: + iconv-lite: registry.npmmirror.com/iconv-lite@0.6.3 + dev: true + + registry.npmmirror.com/whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, tarball: https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz} + name: whatwg-mimetype + version: 3.0.0 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz} + name: whatwg-url + version: 11.0.0 + engines: {node: '>=12'} + dependencies: + tr46: registry.npmmirror.com/tr46@3.0.0 + webidl-conversions: registry.npmmirror.com/webidl-conversions@7.0.0 + dev: true + + registry.npmmirror.com/whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz} + name: whatwg-url + version: 5.0.0 + dependencies: + tr46: registry.npmmirror.com/tr46@0.0.3 + webidl-conversions: registry.npmmirror.com/webidl-conversions@3.0.1 + dev: true + + registry.npmmirror.com/which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, tarball: https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz} + name: which-boxed-primitive + version: 1.0.2 + dependencies: + is-bigint: registry.npmmirror.com/is-bigint@1.0.4 + is-boolean-object: registry.npmmirror.com/is-boolean-object@1.1.2 + is-number-object: registry.npmmirror.com/is-number-object@1.0.7 + is-string: registry.npmmirror.com/is-string@1.0.7 + is-symbol: registry.npmmirror.com/is-symbol@1.0.4 + dev: true + + registry.npmmirror.com/which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==, tarball: https://registry.npmmirror.com/which-collection/-/which-collection-1.0.1.tgz} + name: which-collection + version: 1.0.1 + dependencies: + is-map: registry.npmmirror.com/is-map@2.0.2 + is-set: registry.npmmirror.com/is-set@2.0.2 + is-weakmap: registry.npmmirror.com/is-weakmap@2.0.1 + is-weakset: registry.npmmirror.com/is-weakset@2.0.2 + dev: true + + registry.npmmirror.com/which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==, tarball: https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.13.tgz} + name: which-typed-array + version: 1.1.13 + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: registry.npmmirror.com/available-typed-arrays@1.0.5 + call-bind: registry.npmmirror.com/call-bind@1.0.5 + for-each: registry.npmmirror.com/for-each@0.3.3 + gopd: registry.npmmirror.com/gopd@1.0.1 + has-tostringtag: registry.npmmirror.com/has-tostringtag@1.0.0 + dev: true + + registry.npmmirror.com/which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, tarball: https://registry.npmmirror.com/which/-/which-2.0.2.tgz} + name: which + version: 2.0.2 + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: registry.npmmirror.com/isexe@2.0.0 + dev: true + + registry.npmmirror.com/which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, tarball: https://registry.npmmirror.com/which/-/which-4.0.0.tgz} + name: which + version: 4.0.0 + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: registry.npmmirror.com/isexe@3.1.1 + dev: true + + registry.npmmirror.com/workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==, tarball: https://registry.npmmirror.com/workerpool/-/workerpool-6.2.1.tgz} + name: workerpool + version: 6.2.1 + dev: true + + registry.npmmirror.com/wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz} + name: wrap-ansi + version: 6.2.0 + engines: {node: '>=8'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + dev: true + + registry.npmmirror.com/wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz} + name: wrap-ansi + version: 7.0.0 + engines: {node: '>=10'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@4.3.0 + string-width: registry.npmmirror.com/string-width@4.2.3 + strip-ansi: registry.npmmirror.com/strip-ansi@6.0.1 + dev: true + + registry.npmmirror.com/wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, tarball: https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz} + name: wrap-ansi + version: 8.1.0 + engines: {node: '>=12'} + dependencies: + ansi-styles: registry.npmmirror.com/ansi-styles@6.2.1 + string-width: registry.npmmirror.com/string-width@5.1.2 + strip-ansi: registry.npmmirror.com/strip-ansi@7.1.0 + dev: true + + registry.npmmirror.com/wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, tarball: https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz} + name: wrappy + version: 1.0.2 + dev: true + + registry.npmmirror.com/write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, tarball: https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz} + name: write-file-atomic + version: 4.0.2 + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: registry.npmmirror.com/imurmurhash@0.1.4 + signal-exit: registry.npmmirror.com/signal-exit@3.0.7 + dev: true + + registry.npmmirror.com/ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==, tarball: https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz} + name: ws + version: 8.13.0 + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + registry.npmmirror.com/ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, tarball: https://registry.npmmirror.com/ws/-/ws-8.14.2.tgz} + name: ws + version: 8.14.2 + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + registry.npmmirror.com/xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==, tarball: https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz} + name: xml-name-validator + version: 4.0.0 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, tarball: https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz} + name: xmlchars + version: 2.2.0 + dev: true + + registry.npmmirror.com/y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, tarball: https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz} + name: y18n + version: 5.0.8 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, tarball: https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz} + name: yallist + version: 3.1.1 + dev: true + + registry.npmmirror.com/yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, tarball: https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz} + name: yallist + version: 4.0.0 + dev: true + + registry.npmmirror.com/yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz} + name: yargs-parser + version: 20.2.4 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, tarball: https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz} + name: yargs-parser + version: 21.1.1 + engines: {node: '>=12'} + dev: true + + registry.npmmirror.com/yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==, tarball: https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz} + name: yargs-unparser + version: 2.0.0 + engines: {node: '>=10'} + dependencies: + camelcase: registry.npmmirror.com/camelcase@6.3.0 + decamelize: registry.npmmirror.com/decamelize@4.0.0 + flat: registry.npmmirror.com/flat@5.0.2 + is-plain-obj: registry.npmmirror.com/is-plain-obj@2.1.0 + dev: true + + registry.npmmirror.com/yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, tarball: https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz} + name: yargs + version: 16.2.0 + engines: {node: '>=10'} + dependencies: + cliui: registry.npmmirror.com/cliui@7.0.4 + escalade: registry.npmmirror.com/escalade@3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 + require-directory: registry.npmmirror.com/require-directory@2.1.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + y18n: registry.npmmirror.com/y18n@5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser@20.2.4 + dev: true + + registry.npmmirror.com/yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==, tarball: https://registry.npmmirror.com/yargs/-/yargs-17.7.1.tgz} + name: yargs + version: 17.7.1 + engines: {node: '>=12'} + dependencies: + cliui: registry.npmmirror.com/cliui@8.0.1 + escalade: registry.npmmirror.com/escalade@3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 + require-directory: registry.npmmirror.com/require-directory@2.1.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + y18n: registry.npmmirror.com/y18n@5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser@21.1.1 + dev: true + + registry.npmmirror.com/yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, tarball: https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz} + name: yargs + version: 17.7.2 + engines: {node: '>=12'} + dependencies: + cliui: registry.npmmirror.com/cliui@8.0.1 + escalade: registry.npmmirror.com/escalade@3.1.1 + get-caller-file: registry.npmmirror.com/get-caller-file@2.0.5 + require-directory: registry.npmmirror.com/require-directory@2.1.1 + string-width: registry.npmmirror.com/string-width@4.2.3 + y18n: registry.npmmirror.com/y18n@5.0.8 + yargs-parser: registry.npmmirror.com/yargs-parser@21.1.1 + dev: true + + registry.npmmirror.com/yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==, tarball: https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz} + name: yauzl + version: 2.10.0 + dependencies: + buffer-crc32: registry.npmmirror.com/buffer-crc32@0.2.13 + fd-slicer: registry.npmmirror.com/fd-slicer@1.1.0 + dev: true + + registry.npmmirror.com/yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz} + name: yocto-queue + version: 0.1.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, tarball: https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.0.0.tgz} + name: yocto-queue + version: 1.0.0 + engines: {node: '>=12.20'} + dev: true + + registry.npmmirror.com/zip-stream@5.0.1: + resolution: {integrity: sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==, tarball: https://registry.npmmirror.com/zip-stream/-/zip-stream-5.0.1.tgz} + name: zip-stream + version: 5.0.1 + engines: {node: '>= 12.0.0'} + dependencies: + archiver-utils: registry.npmmirror.com/archiver-utils@4.0.1 + compress-commons: registry.npmmirror.com/compress-commons@5.0.1 + readable-stream: registry.npmmirror.com/readable-stream@3.6.2 + dev: true From 911fc2a10b84821f42644b731cf233f244d00243 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 14 Jan 2024 17:45:22 +0800 Subject: [PATCH 098/155] update lang --- src/lang/locale/ar.ts | 3 ++- src/lang/locale/cz.ts | 3 ++- src/lang/locale/de.ts | 3 ++- src/lang/locale/en.ts | 1 + src/lang/locale/es.ts | 3 ++- src/lang/locale/ja.ts | 3 ++- src/lang/locale/ko.ts | 3 ++- src/lang/locale/pt-br.ts | 3 ++- src/lang/locale/ru.ts | 3 ++- src/lang/locale/zh-cn.ts | 1 + src/lang/locale/zh-tw.ts | 1 + 11 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/lang/locale/ar.ts b/src/lang/locale/ar.ts index 8a4bdcbc..34a6d033 100644 --- a/src/lang/locale/ar.ts +++ b/src/lang/locale/ar.ts @@ -187,7 +187,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - + UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "ملاحظات قائمة المراجعة", CLOSE: "أغلق", diff --git a/src/lang/locale/cz.ts b/src/lang/locale/cz.ts index d0d21130..5b144875 100644 --- a/src/lang/locale/cz.ts +++ b/src/lang/locale/cz.ts @@ -191,7 +191,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - + UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "Fronta poznámek k revizi", CLOSE: "Uzavřené", diff --git a/src/lang/locale/de.ts b/src/lang/locale/de.ts index 05243bbd..9b5c08ee 100644 --- a/src/lang/locale/de.ts +++ b/src/lang/locale/de.ts @@ -202,7 +202,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - + UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "Anstehende Notizen zur Wiederholung", CLOSE: "Schliessen", diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 2c989ce4..2a9902c6 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -191,6 +191,7 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", // sidebar.ts NOTES_REVIEW_QUEUE: "Notes Review Queue", diff --git a/src/lang/locale/es.ts b/src/lang/locale/es.ts index 989f9c2a..cdb5de96 100644 --- a/src/lang/locale/es.ts +++ b/src/lang/locale/es.ts @@ -196,7 +196,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - + UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "Cola de notas a revisar", CLOSE: "Cerrar", diff --git a/src/lang/locale/ja.ts b/src/lang/locale/ja.ts index feae344d..77c2a130 100644 --- a/src/lang/locale/ja.ts +++ b/src/lang/locale/ja.ts @@ -195,7 +195,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - + UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "ノートレビューのキュー", CLOSE: "閉じる", diff --git a/src/lang/locale/ko.ts b/src/lang/locale/ko.ts index aee53068..bb99c72e 100644 --- a/src/lang/locale/ko.ts +++ b/src/lang/locale/ko.ts @@ -192,7 +192,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - + UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "리뷰할 노트 대기열", CLOSE: "닫기", diff --git a/src/lang/locale/pt-br.ts b/src/lang/locale/pt-br.ts index 5aab1956..90454d65 100644 --- a/src/lang/locale/pt-br.ts +++ b/src/lang/locale/pt-br.ts @@ -198,7 +198,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - + UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "Fila de Notas para Revisar", CLOSE: "Fechar", diff --git a/src/lang/locale/ru.ts b/src/lang/locale/ru.ts index fa105709..194cb967 100644 --- a/src/lang/locale/ru.ts +++ b/src/lang/locale/ru.ts @@ -202,7 +202,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - + UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "Очередь заметок на повторение", CLOSE: "Закрыть", diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index e75538d0..c81113e7 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -176,6 +176,7 @@ export default { FLASHCARD_BLACKOUT_DESC: "自定义“忘记”按钮的标签", FLASHCARD_INCORRECT_DESC: "自定义“猜错”按钮的标签", "FLASHCARD_INCORRECT (EASY)_DESC": "自定义“猜错(简单)”按钮的标签", + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", // sidebar.ts NOTES_REVIEW_QUEUE: "笔记复习序列", diff --git a/src/lang/locale/zh-tw.ts b/src/lang/locale/zh-tw.ts index cf8de7f4..966a1e68 100644 --- a/src/lang/locale/zh-tw.ts +++ b/src/lang/locale/zh-tw.ts @@ -175,6 +175,7 @@ export default { FLASHCARD_BLACKOUT_DESC: "自定義“忘記”按鈕的標籤", FLASHCARD_INCORRECT_DESC: "自定義“猜錯”按鈕的標籤", "FLASHCARD_INCORRECT (EASY)_DESC": "自定義“猜錯(簡單)”按鈕的標籤", + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", // sidebar.ts NOTES_REVIEW_QUEUE: "筆記復習序列", From ce3249b1faee7380ea4c10f640d4bb112a2c91b1 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 14 Jan 2024 18:08:40 +0800 Subject: [PATCH 099/155] fix undefind --- src/lang/helpers.ts | 2 +- src/settings/trackSetting.ts | 4 +--- tests/unit/lang/helpers.test.ts | 12 ++++++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/lang/helpers.ts b/src/lang/helpers.ts index 02e7b43d..5076117f 100644 --- a/src/lang/helpers.ts +++ b/src/lang/helpers.ts @@ -83,7 +83,7 @@ export function t(str: keyof typeof en, params?: Record): strin console.error(`SRS error: Locale ${moment.locale()} not found.`); } - const result = (locale && locale[str]) || en[str]; + const result = (locale && locale[str]) || en[str] || str; if (params) { return interpolate(result, params); diff --git a/src/settings/trackSetting.ts b/src/settings/trackSetting.ts index 45830d88..38c3d3ea 100644 --- a/src/settings/trackSetting.ts +++ b/src/settings/trackSetting.ts @@ -26,9 +26,7 @@ export function addUntrackSetting(containerEl: HTMLElement, plugin: SRPlugin) { false:删除复习标签后,需再次untrack,才不再复习该笔记。(同之前版本)"; }); new Setting(containerEl) - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - .setName(t("UntrackWithReviewTag")) + .setName(t("UNTRACK_WITH_REVIEWTAG")) .setDesc(desc) .addToggle((toggle) => toggle.setValue(settings.untrackWithReviewTag).onChange(async (value) => { diff --git a/tests/unit/lang/helpers.test.ts b/tests/unit/lang/helpers.test.ts index 3673eeb1..489b8c52 100644 --- a/tests/unit/lang/helpers.test.ts +++ b/tests/unit/lang/helpers.test.ts @@ -87,3 +87,15 @@ test("Test translation with interpolation in German", () => { ); }); }); + +test("Test translation not in enum", () => { + jest.isolateModules(() => { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { moment } = require("obsidian"); + const mockLocale = moment.locale as jest.MockedFunction<() => string>; + mockLocale.mockImplementation(() => "en"); + // eslint-disable-next-line @typescript-eslint/no-var-requires + const { t } = require("src/lang/helpers"); + expect(t("notInEnum")).toEqual("notInEnum"); + }); +}); From 1ac57eee2a139ac42409e70b6df2471e6eff7f48 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 6 Feb 2024 11:20:58 +0800 Subject: [PATCH 100/155] fix conflict --- src/main.ts | 39 ++++++++++++++++++++++------------- src/reviewNote/review-note.ts | 6 +++--- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/main.ts b/src/main.ts index 316b87ef..237c0fbe 100644 --- a/src/main.ts +++ b/src/main.ts @@ -7,7 +7,7 @@ import { StatsModal } from "src/gui/stats-modal"; import { ReviewQueueListView, REVIEW_QUEUE_VIEW_TYPE } from "src/gui/sidebar"; import { ReviewResponse, schedule } from "src/scheduling"; import { YAML_FRONT_MATTER_REGEX, SCHEDULING_INFO_REGEX } from "src/constants"; -import { ReviewDeck } from "src/ReviewDeck"; +import { ReviewDeck, SchedNote } from "src/ReviewDeck"; import { t } from "src/lang/helpers"; import { appIcon } from "src/icons/appicon"; import { TopicPath } from "./TopicPath"; @@ -77,6 +77,16 @@ const DEFAULT_DATA: PluginData = { historyDeck: null, }; +// export interface SchedNote { +// note: TFile; +// dueUnix: number; +// } + +// export interface LinkStat { +// sourcePath: string; +// linkCount: number; +// } + export default class SRPlugin extends Plugin { private statusBar: HTMLElement; private reviewQueueView: ReviewQueueListView; @@ -180,9 +190,11 @@ export default class SRPlugin extends Plugin { for (let i = 1; i < options.length; i++) { menu.addItem((item) => { // item.setTitle(t("REVIEW_EASY_FILE_MENU")) - item.setTitle(t("REVIEW_DIFFICULTY_FILE_MENU", { - difficulty: showtext[algo][i], - }),) + item.setTitle( + t("REVIEW_DIFFICULTY_FILE_MENU", { + difficulty: showtext[algo][i], + }), + ) .setIcon("SpacedRepIcon") .onClick(() => { this.saveReviewResponse(fileish, i); @@ -468,7 +480,7 @@ export default class SRPlugin extends Plugin { this.easeByPath.setEaseForPath(noteFile.path, ease); const nDays: number = Math.ceil((dueUnix - now.valueOf()) / (24 * 3600 * 1000)); - + const interval = Number(frontmatter["sr-interval"]); this.noteStats.update(nDays, interval, ease); } @@ -700,12 +712,8 @@ export default class SRPlugin extends Plugin { this.data.buryList.push(...result.buryList); await this.savePluginData(); } - this.reviewDecks[deckName].sortNotes(this.linkRank.pageranks); - // this.dueNotesCount = this. ... - this.updateStatusBar(); - if (settings.autoNextNote) { - this.reviewNextNote(deckName); - } + + this.postResponse(note, result.dueNum); return; } const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; @@ -804,12 +812,15 @@ export default class SRPlugin extends Plugin { // Update note's properties to update our due notes. this.easeByPath.setEaseForPath(note.path, ease); + this.postResponse(note, due.valueOf()); + } + private postResponse(note: TFile, dueNum: number) { Object.values(this.reviewDecks).forEach((reviewDeck: ReviewDeck) => { let wasDueInDeck = false; for (const scheduledNote of reviewDeck.scheduledNotes) { if (scheduledNote.note.path === note.path) { - scheduledNote.dueUnix = due.valueOf(); + scheduledNote.dueUnix = dueNum; wasDueInDeck = true; break; } @@ -818,10 +829,10 @@ export default class SRPlugin extends Plugin { // It was a new note, remove it from the new notes and schedule it. if (!wasDueInDeck) { reviewDeck.newNotes.splice( - reviewDeck.newNotes.findIndex((newNote: TFile) => newNote.path === note.path), + reviewDeck.newNotes.findIndex((newNote) => newNote.note.path === note.path), 1, ); - reviewDeck.scheduledNotes.push({ note, dueUnix: due.valueOf() }); + reviewDeck.scheduledNotes.push({ note, dueUnix: dueNum }); } }); diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index b4dcd870..da89266d 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -67,9 +67,9 @@ export class ReviewNote { ReviewNote.recallReviewResponse(fileId, option); - preUpdateDeck(deck, note); - ItemToDecks.toRevDeck(deck, note, now); - return { buryList }; + // preUpdateDeck(deck, note); + // ItemToDecks.toRevDeck(deck, note, now); + return { buryList, dueNum: item.nextReview }; } static recallReviewNote(settings: SRSettings) { From 65e3160b0ced7e9a1b502da9b3328458df241d4d Mon Sep 17 00:00:00 2001 From: Newdea Date: Wed, 7 Feb 2024 15:23:43 +0000 Subject: [PATCH 101/155] Prettified Code! --- src/algorithms/anki.ts | 4 ++-- src/gui/reviewresponse-modal.tsx | 4 ++-- src/lang/locale/ar.ts | 4 ++-- src/lang/locale/cz.ts | 4 ++-- src/lang/locale/de.ts | 4 ++-- src/lang/locale/es.ts | 4 ++-- src/lang/locale/ja.ts | 4 ++-- src/lang/locale/ko.ts | 4 ++-- src/lang/locale/pt-br.ts | 4 ++-- src/lang/locale/ru.ts | 4 ++-- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/algorithms/anki.ts b/src/algorithms/anki.ts index 588530d0..f044d74b 100644 --- a/src/algorithms/anki.ts +++ b/src/algorithms/anki.ts @@ -160,8 +160,8 @@ export class AnkiAlgorithm extends SrsAlgorithm { lastitval > newdata.lastInterval ? lastitval : iter > 1 - ? this.settings.graduatingInterval - : newdata.lastInterval; + ? this.settings.graduatingInterval + : newdata.lastInterval; newdata.iteration = iter; item.data = deepcopy(newdata); } diff --git a/src/gui/reviewresponse-modal.tsx b/src/gui/reviewresponse-modal.tsx index c2548403..f597f06a 100644 --- a/src/gui/reviewresponse-modal.tsx +++ b/src/gui/reviewresponse-modal.tsx @@ -273,8 +273,8 @@ export class reviewResponseModal { this.responseInterval == null ? `${text}` : Platform.isMobile - ? textInterval(this.responseInterval[index], true) - : `${text} - ${textInterval(this.responseInterval[index], false)}`; + ? textInterval(this.responseInterval[index], true) + : `${text} - ${textInterval(this.responseInterval[index], false)}`; } return text; } diff --git a/src/lang/locale/ar.ts b/src/lang/locale/ar.ts index 15c359ee..cb19ae18 100644 --- a/src/lang/locale/ar.ts +++ b/src/lang/locale/ar.ts @@ -183,8 +183,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", - + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "ملاحظات قائمة المراجعة", CLOSE: "أغلق", diff --git a/src/lang/locale/cz.ts b/src/lang/locale/cz.ts index cf46433f..c1cde3ac 100644 --- a/src/lang/locale/cz.ts +++ b/src/lang/locale/cz.ts @@ -187,8 +187,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", - + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "Fronta poznámek k revizi", CLOSE: "Uzavřené", diff --git a/src/lang/locale/de.ts b/src/lang/locale/de.ts index 73a432bd..0b6f2b46 100644 --- a/src/lang/locale/de.ts +++ b/src/lang/locale/de.ts @@ -198,8 +198,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", - + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "Anstehende Notizen zur Wiederholung", CLOSE: "Schliessen", diff --git a/src/lang/locale/es.ts b/src/lang/locale/es.ts index 9030a92a..2ef87512 100644 --- a/src/lang/locale/es.ts +++ b/src/lang/locale/es.ts @@ -192,8 +192,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", - + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "Cola de notas a revisar", CLOSE: "Cerrar", diff --git a/src/lang/locale/ja.ts b/src/lang/locale/ja.ts index e7b3dfbb..9844dc78 100644 --- a/src/lang/locale/ja.ts +++ b/src/lang/locale/ja.ts @@ -191,8 +191,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", - + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "ノートレビューのキュー", CLOSE: "閉じる", diff --git a/src/lang/locale/ko.ts b/src/lang/locale/ko.ts index 26767410..5b02a8a9 100644 --- a/src/lang/locale/ko.ts +++ b/src/lang/locale/ko.ts @@ -188,8 +188,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", - + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "리뷰할 노트 대기열", CLOSE: "닫기", diff --git a/src/lang/locale/pt-br.ts b/src/lang/locale/pt-br.ts index f9caaf82..8c0b7d7e 100644 --- a/src/lang/locale/pt-br.ts +++ b/src/lang/locale/pt-br.ts @@ -194,8 +194,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", - + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "Fila de Notas para Revisar", CLOSE: "Fechar", diff --git a/src/lang/locale/ru.ts b/src/lang/locale/ru.ts index 9962a1bb..94a88702 100644 --- a/src/lang/locale/ru.ts +++ b/src/lang/locale/ru.ts @@ -201,8 +201,8 @@ export default { FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', - UNTRACK_WITH_REVIEWTAG:"UntrackWithReviewTag", - + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "Очередь заметок на повторение", CLOSE: "Закрыть", From 388b1ec13b247a7b6c80925ee2fca636dc6e37bb Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Wed, 7 Feb 2024 23:40:36 +0800 Subject: [PATCH 102/155] =?UTF-8?q?-=20=20fix:=20=E5=BD=93=E5=A4=A9?= =?UTF-8?q?=E6=96=B0=E5=8D=A1=E7=89=87=E5=A4=8D=E4=B9=A0=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E5=BD=93=E5=A4=A9=E6=97=A0=E6=B3=95=E5=86=8D=E6=AC=A1=E5=A4=8D?= =?UTF-8?q?=E4=B9=A0=20=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B=20-=20=20fix:?= =?UTF-8?q?=20=E5=8D=A1=E7=89=87=E7=BB=9F=E8=AE=A1=E8=A1=A8=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E5=BD=93=E5=A4=A9=E5=A4=8D=E4=B9=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=9B=B4=E6=96=B0=20=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/CardSchedule.ts | 42 ++-- src/Question.ts | 2 +- src/ReviewDeck.ts | 2 + src/algorithms/balance/balance.ts | 2 +- src/dataStore/data.ts | 2 +- src/dataStore/itemToDecks.ts | 17 +- src/dataStore/location_switch.ts | 17 +- src/dataStore/repetitionItem.ts | 40 +++- src/gui/flashcard-modal.tsx | 8 +- src/gui/info.ts | 14 +- src/lang/locale/zh-cn.ts | 22 +- src/lang/locale/zh-tw.ts | 22 +- src/main.ts | 320 +++++++++++------------------- src/reviewNote/review-note.ts | 36 +++- src/stats.ts | 4 +- src/util/DateProvider.ts | 10 +- tests/unit/data.test.ts | 6 +- 17 files changed, 292 insertions(+), 274 deletions(-) diff --git a/src/CardSchedule.ts b/src/CardSchedule.ts index 3da99a77..54dae2e4 100644 --- a/src/CardSchedule.ts +++ b/src/CardSchedule.ts @@ -9,6 +9,7 @@ import { ReviewResponse, schedule } from "./scheduling"; import { SRSettings } from "./settings"; import { formatDate_YYYY_MM_DD } from "./util/utils"; import { DateUtil, globalDateProvider } from "./util/DateProvider"; +import { DateUtils } from "./util/utils_recall"; export class CardScheduleInfo { dueDate: Moment; @@ -37,18 +38,22 @@ export class CardScheduleInfo { } isDue(): boolean { - return this.dueDate.isSameOrBefore(globalDateProvider.today); + // return this.dueDate.isSameOrBefore(globalDateProvider.today); + return ( + this.dueDate.isSameOrBefore(globalDateProvider.today) || + (this.dueDate.isSameOrBefore(globalDateProvider.endofToday) && this.interval >= 1) + ); } isDummyScheduleForNewCard(): boolean { return this.formatDueDate() == CardScheduleInfo.dummyDueDateForNewCard; } - static getDummyScheduleForNewCard(settings: SRSettings): CardScheduleInfo { + static getDummyScheduleForNewCard(baseEase: number): CardScheduleInfo { return CardScheduleInfo.fromDueDateStr( CardScheduleInfo.dummyDueDateForNewCard, CardScheduleInfo.initialInterval, - settings.baseEase, + baseEase, 0, ); } @@ -186,19 +191,24 @@ export class NoteCardScheduleParser { const result: CardScheduleInfo[] = []; for (let i = 0; i < scheduling.length; i++) { const match: RegExpMatchArray = scheduling[i]; - const dueDateNum = parseInt(match[1]); - const interval = parseInt(match[2]); - const ease = parseInt(match[3]); - const dueDate: Moment = window.moment(dueDateNum); - const delayBeforeReviewTicks: number = dueDateNum - globalDateProvider.today.valueOf(); - - const info: CardScheduleInfo = new CardScheduleInfo( - dueDate, - interval, - ease, - delayBeforeReviewTicks, - ); - result.push(info); + if (match == null) { + result.push(CardScheduleInfo.getDummyScheduleForNewCard(0)); + } else { + const dueDateNum = parseInt(match[1]); + const interval = parseInt(match[2]); + const ease = parseInt(match[3]); + const dueDate: Moment = window.moment(dueDateNum); + const delayBeforeReviewTicks: number = + dueDateNum - globalDateProvider.today.valueOf(); + + const info: CardScheduleInfo = new CardScheduleInfo( + dueDate, + interval, + ease, + delayBeforeReviewTicks, + ); + result.push(info); + } } return result; } diff --git a/src/Question.ts b/src/Question.ts index d13be0ad..cee21ee9 100644 --- a/src/Question.ts +++ b/src/Question.ts @@ -174,7 +174,7 @@ export class Question { const card: Card = this.cards[i]; const schedule: CardScheduleInfo = card.hasSchedule ? card.scheduleInfo - : CardScheduleInfo.getDummyScheduleForNewCard(settings); + : CardScheduleInfo.getDummyScheduleForNewCard(settings.baseEase); result += schedule.formatSchedule(); } result += SR_HTML_COMMENT_END; diff --git a/src/ReviewDeck.ts b/src/ReviewDeck.ts index 1b1c290e..dc4cff06 100644 --- a/src/ReviewDeck.ts +++ b/src/ReviewDeck.ts @@ -7,6 +7,8 @@ export interface SchedNote { note: TFile; item?: RepetitionItem; dueUnix?: number; + interval?: number; + ease?: number; } export class ReviewDeck { diff --git a/src/algorithms/balance/balance.ts b/src/algorithms/balance/balance.ts index 856fe34f..18b1abfe 100644 --- a/src/algorithms/balance/balance.ts +++ b/src/algorithms/balance/balance.ts @@ -56,7 +56,7 @@ export function balance( if (isChange) { const msg = `balance: interval from ${beforeIntvl} balance to ${interval} days.`; console.debug(msg); - new Notice(msg); + // new Notice(msg); } else { interval = beforeIntvl; } diff --git a/src/dataStore/data.ts b/src/dataStore/data.ts index a6f02a7c..92ecec61 100644 --- a/src/dataStore/data.ts +++ b/src/dataStore/data.ts @@ -744,7 +744,7 @@ export class DataStore { if (item.isDue) { if (this.settings.algorithm === algorithmNames.Fsrs) { const data: FsrsData = item.data as FsrsData; - if (data.last_review < new Date(date)) { + if (new Date(data.last_review) < new Date(date)) { rc[date].due++; } } else { diff --git a/src/dataStore/itemToDecks.ts b/src/dataStore/itemToDecks.ts index b72ae9e1..92818c5d 100644 --- a/src/dataStore/itemToDecks.ts +++ b/src/dataStore/itemToDecks.ts @@ -19,6 +19,9 @@ import { algorithmNames } from "src/algorithms/algorithms"; export class ItemToDecks { settings: SRSettings; + static create(settings: SRSettings) { + return new ItemToDecks(settings); + } constructor(settings: SRSettings) { this.settings = settings; } @@ -155,8 +158,14 @@ export class ItemToDecks { latterQue[fileid] = rdeck.deckName; } - if (item.isDue) { - rdeck.scheduledNotes.push({ note, item, dueUnix: item.nextReview }); + if (item.hasDue) { + rdeck.scheduledNotes.push({ + note, + item, + dueUnix: item.nextReview, + interval: item.interval, + ease: item.ease, + }); if (item.nextReview <= now_number) { rdeck.dueNotesCount++; // console.debug(`${rdeck.deckName} isDue dueCnt: ${rdeck.dueNotesCount}`, item); @@ -202,8 +211,8 @@ export class ItemToDecks { carditem.itemIds .map((id: number) => store.getItembyID(id).getSched()) .filter((sched) => { - // ignore new add card - if (sched != null && scheduling.length <= count) { + // ignore new add card sched != null && + if (scheduling.length <= count) { scheduling.push(sched); return true; } diff --git a/src/dataStore/location_switch.ts b/src/dataStore/location_switch.ts index adaa6c0e..b3e27d8b 100644 --- a/src/dataStore/location_switch.ts +++ b/src/dataStore/location_switch.ts @@ -30,7 +30,7 @@ export class LocationSwitch { public afternoteStats: Stats; public beforecardStats: Stats; public aftercardStats: Stats; - revTag: string; + private revTag: string; constructor(plugin: SRPlugin, settings: SRSettings) { this.plugin = plugin; @@ -136,6 +136,15 @@ export class LocationSwitch { topicPath = new TopicPath([deckname]); fileText = delDefaultTag(fileText, this.revTag); fileChanged = true; + } else if ( + topicPath.path.length === 2 && + settings.tagsToReview.includes(topicPath.path[1]) + ) { + deckname = topicPath.path[1]; + topicPath = new TopicPath([deckname]); + const revtag = this.converteTag(deckname); + fileText = delDefaultTag(fileText, revtag); + fileChanged = true; } } @@ -309,7 +318,7 @@ export class LocationSwitch { // const citem = store.getItembyID(id); // if (citem.isTracked) { const sched = citem.getSchedDurAsStr(); - if (citem.isDue && sched != null) { + if (citem.hasDue && sched != null) { scheduling.push(sched); dueIds.push(citem.ID); } @@ -332,7 +341,7 @@ export class LocationSwitch { item?.isTracked && (tkfile.isDefault || Tags.isTagedNoteDeckName(item.deckName, this.settings)) ) { - if (item?.isDue) { + if (item?.hasDue) { // let due: str, ease: number, interval: number; const ret = item.getSchedDurAsStr(); if (ret != null) { @@ -353,7 +362,7 @@ export class LocationSwitch { noteTag == null && this.settings.tagsToReview.includes(item.deckName) ) { - const tag = this.converteTag(item.deckName.substring(1)); + const tag = this.converteTag(item.deckName); fileText = addDefaultTagtoNote(fileText, tag); fileChanged = true; } diff --git a/src/dataStore/repetitionItem.ts b/src/dataStore/repetitionItem.ts index db9791a3..37ee6a69 100644 --- a/src/dataStore/repetitionItem.ts +++ b/src/dataStore/repetitionItem.ts @@ -114,8 +114,7 @@ export class RepetitionItem { let ease: number; let interval: number; - const isFsrs: boolean = Object.prototype.hasOwnProperty.call(this.data, "state"); - if (isFsrs) { + if (this.isFsrs) { const data = this.data as FsrsData; interval = data.scheduled_days; // ease just used for StatsChart, not review scheduling. @@ -131,6 +130,10 @@ export class RepetitionItem { return sched; } + private isFsrs(): boolean { + return Object.prototype.hasOwnProperty.call(this.data, "state"); + } + getSchedDurAsStr() { const sched = this.getSched(); if (sched == null) return null; @@ -163,6 +166,13 @@ export class RepetitionItem { } } + get interval(): number { + return Number(this.getSched()[2]); + } + get ease(): number { + return Number(this.getSched()[3]); + } + /** * check if file id is just new add. * @returns boolean @@ -182,7 +192,33 @@ export class RepetitionItem { } } + /** + * check if item should be reviewed rightnow. + */ get isDue() { + const now_number = Date.now(); + if (this.hasDue) { + if (this.nextReview < now_number) { + return true; + } + if (this.nextReview < DateUtils.EndofToday) { + if (this.isFsrs) { + const data: FsrsData = this.data as FsrsData; + if (data.scheduled_days >= 1) { + return true; + } + } else { + const data: AnkiData = this.data as AnkiData; + if (data.lastInterval >= 1) { + return true; + } + } + } + } + return false; + } + + get hasDue() { try { if (this.nextReview > 0 || this.timesReviewed > 0) { return true; diff --git a/src/gui/flashcard-modal.tsx b/src/gui/flashcard-modal.tsx index 323a4ce0..e52d919a 100644 --- a/src/gui/flashcard-modal.tsx +++ b/src/gui/flashcard-modal.tsx @@ -1,4 +1,4 @@ -import { Modal, App, Notice, Platform, setIcon, MarkdownView } from "obsidian"; +import { Modal, App, Notice, Platform, setIcon, MarkdownView, TFile } from "obsidian"; // eslint-disable-next-line @typescript-eslint/no-unused-vars import h from "vhtml"; @@ -24,6 +24,7 @@ import { DataLocation } from "src/dataStore/dataLocation"; import { SrTFile } from "src/SRFile"; import { RepetitionItem, RPITEMTYPE } from "src/dataStore/repetitionItem"; import { debug } from "src/util/utils_recall"; +import { ItemInfoModal } from "./info"; export enum FlashcardModalMode { DecksList, @@ -369,6 +370,11 @@ export class FlashcardModal extends Modal { notePath: this.currentQuestion.note.filePath, }); new Notice(currentEaseStr + "\n" + currentIntervalStr + "\n" + generatedFromStr); + const srfile = this.currentNote.file as SrTFile; + const store = this.plugin.store; + const id = this.currentCard.Id; + const infoM = new ItemInfoModal(this.settings, srfile.file, store.getItembyID(id)); + infoM.open(); } createBackButton() { diff --git a/src/gui/info.ts b/src/gui/info.ts index 25d324f2..1fb6f9f9 100644 --- a/src/gui/info.ts +++ b/src/gui/info.ts @@ -11,27 +11,33 @@ export class ItemInfoModal extends Modal { store: DataStore; settings: SRSettings; file: TFile; + item: RepetitionItem; nextReview: number; lastInterval: number; - constructor(settings: SRSettings, file: TFile) { + constructor(settings: SRSettings, file: TFile, item: RepetitionItem = null) { super(app); // this.plugin = plugin; this.store = DataStore.getInstance(); this.settings = settings; this.file = file; + if (item == null) { + this.item = this.store.getItemsOfFile(this.file.path)[0]; + } else { + this.item = item; + } } onOpen() { const { contentEl } = this; //TODO: Implement Item info. - const item = this.store.getItemsOfFile(this.file.path)[0]; + // const item = this.store.getItemsOfFile(this.file.path)[0]; // const path = this.store.getFilePath(item); // contentEl.createEl("p").setText("Item info of " + this.file.path); const buttonDivAll = contentEl.createDiv("srs-flex-row"); const contentdiv = contentEl.createEl("div"); - this.displayitem(contentdiv, item); + this.displayitem(contentdiv, this.item); // new ButtonComponent(buttonDivAll).setButtonText("Current").onClick(() => { // this.displayitem(contentdiv, item); @@ -126,7 +132,7 @@ export class ItemInfoModal extends Modal { } submit() { - const item = this.store.getItemsOfFile(this.file.path)[0]; + const item = this.item; console.debug(this); const algo = this.settings.algorithm; if (this.nextReview) { diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 00ed7ecd..5ac32584 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -81,18 +81,16 @@ export default { RESET_DEFAULT: "重置为默认", CARD_MODAL_WIDTH_PERCENT: "卡片宽度百分比", RANDOMIZE_CARD_ORDER: "复习时随机显示卡片?", - REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review", - REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)", - REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)", - REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)", - REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)", - REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", - REVIEW_DECK_ORDER: "Order decks are displayed during review", - REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: - "Sequentially (once all cards in previous deck reviewed)", - REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: - "Randomly (once all cards in previous deck reviewed)", - REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + REVIEW_CARD_ORDER_WITHIN_DECK: "复习时卡片组内的卡片排序", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "卡片组内顺序 (全部新卡片优先)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "卡片组内顺序 (全部到期卡片优先)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "卡片组内乱序 (全部新卡片优先)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "卡片组内乱序 (全部到期卡片优先)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "卡片组及卡片都乱序", + REVIEW_DECK_ORDER: "复习时卡片组的排序", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "顺序 (在前一卡片组内卡片都复习完后)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "乱序 (在前一卡片组内卡片都复习完后)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "卡片组及卡片都乱序", DISABLE_CLOZE_CARDS: "不进行完形填空?", CONVERT_HIGHLIGHTS_TO_CLOZES: "将 ==高亮== 转换为完形填空?", CONVERT_BOLD_TEXT_TO_CLOZES: "将 **粗体** 转换为完形填空?", diff --git a/src/lang/locale/zh-tw.ts b/src/lang/locale/zh-tw.ts index 6bf5114f..3ebc5133 100644 --- a/src/lang/locale/zh-tw.ts +++ b/src/lang/locale/zh-tw.ts @@ -81,18 +81,16 @@ export default { RESET_DEFAULT: "重置為預設值", CARD_MODAL_WIDTH_PERCENT: "卡片寬度百分比", RANDOMIZE_CARD_ORDER: "復習時隨機顯示卡片?", - REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review", - REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)", - REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)", - REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)", - REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)", - REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", - REVIEW_DECK_ORDER: "Order decks are displayed during review", - REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: - "Sequentially (once all cards in previous deck reviewed)", - REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: - "Randomly (once all cards in previous deck reviewed)", - REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + REVIEW_CARD_ORDER_WITHIN_DECK: "復習時牌組內的卡片排序", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "牌組內順序 (全部新卡片優先)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "牌組內順序 (全部到期卡片優先)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "牌組內亂序 (全部新卡片優先)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "牌組內亂序 (全部到期卡片優先)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "牌組及卡片都亂序", + REVIEW_DECK_ORDER: "復習時牌組的排序", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "順序 (在前一牌組內卡片都復習完後)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "亂序 (在前一牌組內卡片都復習完後)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "牌組及卡片都亂序", DISABLE_CLOZE_CARDS: "停用填空克漏字卡片?", CONVERT_HIGHLIGHTS_TO_CLOZES: "將 ==高亮== 轉換為填空克漏字?", CONVERT_BOLD_TEXT_TO_CLOZES: "將 **粗體** 轉換為填空克漏字?", diff --git a/src/main.ts b/src/main.ts index 237c0fbe..bcd14c79 100644 --- a/src/main.ts +++ b/src/main.ts @@ -368,11 +368,7 @@ export default class SRPlugin extends Plugin { async sync(): Promise { // this.clock_start = Date.now(); - if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { - await this.sync_Algo(); - // this.getTimeDuration(this.sync.name); - return; - } + const settings = this.data.settings; if (this.syncLock) { return; @@ -387,8 +383,6 @@ export default class SRPlugin extends Plugin { this.linkRank = new LinkRank(this.data.settings, this.app.metadataCache); this.reviewDecks = {}; - this.noteStats = new Stats(); - // reset flashcards stuff const fullDeckTree = new Deck("root", null); @@ -403,33 +397,71 @@ export default class SRPlugin extends Plugin { await this.savePluginData(); } - const notes: TFile[] = this.app.vault.getMarkdownFiles(); - for (const noteFile of notes) { - if ( - this.data.settings.noteFoldersToIgnore.some((folder) => - // note.path.startsWith(folder) - noteFile.path.includes(folder), - ) - ) { - continue; - } + let notes: TFile[] = this.app.vault.getMarkdownFiles(); + notes = notes.filter( + (noteFile) => !isIgnoredPath(this.data.settings.noteFoldersToIgnore, noteFile.path), + ); + this.linkRank.readLinks(notes); + await Promise.all( + notes.map(async (noteFile) => { + const topicPath: TopicPath = this.findTopicPath(this.createSrTFile(noteFile)); + if (topicPath.hasPath) { + const note: Note = await this.loadNote(noteFile, topicPath); + const flashcardsInNoteAvgEase: number = NoteEaseCalculator.Calculate( + note, + this.data.settings, + ); + note.appendCardsToDeck(fullDeckTree); + + if (flashcardsInNoteAvgEase > 0) { + this.easeByPath.setEaseForPath(note.filePath, flashcardsInNoteAvgEase); + } + } + }), + ); + if (settings.dataLocation != DataLocation.SaveOnNoteFile) { + await this.sync_trackfiles(notes); + // this.getTimeDuration(this.sync.name); + } else { + this.sync_onNote(notes); + } - this.linkRank._readLink(noteFile); + // Reviewable cards are all except those with the "edit later" tag + this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); - const topicPath: TopicPath = this.findTopicPath(this.createSrTFile(noteFile)); - if (topicPath.hasPath) { - const note: Note = await this.loadNote(noteFile, topicPath); - const flashcardsInNoteAvgEase: number = NoteEaseCalculator.Calculate( - note, - this.data.settings, - ); - note.appendCardsToDeck(fullDeckTree); + // Reviewable cards are all except those with the "edit later" tag + this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); - if (flashcardsInNoteAvgEase > 0) { - this.easeByPath.setEaseForPath(note.filePath, flashcardsInNoteAvgEase); - } - } + // sort the deck names + this.deckTree.sortSubdecksList(); + this.remainingDeckTree = DeckTreeFilter.filterForRemainingCards( + this.questionPostponementList, + this.deckTree, + FlashcardReviewMode.Review, + ); + const calc: DeckTreeStatsCalculator = new DeckTreeStatsCalculator(); + this.cardStats = calc.calculate(this.deckTree); + + if (this.data.settings.showDebugMessages) { + this.showSyncInfo(); + } + if (this.data.settings.showDebugMessages) { + console.log( + "SR: " + + t("SYNC_TIME_TAKEN", { + t: Date.now() - now.valueOf(), + }), + ); + } + + this.updateAndSortDueNotes(); + + this.syncLock = false; + } + + private sync_onNote(notes: TFile[]) { + notes.map((noteFile) => { const fileCachedData = this.app.metadataCache.getFileCache(noteFile) || {}; const frontmatter: FrontMatterCache | Record = @@ -450,7 +482,7 @@ export default class SRPlugin extends Plugin { } } if (shouldIgnore) { - continue; + return; } // file has no scheduling information @@ -464,66 +496,33 @@ export default class SRPlugin extends Plugin { for (const matchedNoteTag of matchedNoteTags) { this.reviewDecks[matchedNoteTag].newNotes.push({ note: noteFile }); } - this.noteStats.incrementNew(); - continue; + return; } const dueUnix: number = window .moment(frontmatter["sr-due"], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) .valueOf(); - for (const matchedNoteTag of matchedNoteTags) { - this.reviewDecks[matchedNoteTag].scheduledNotes.push({ note: noteFile, dueUnix }); - } - const ease: number = frontmatter["sr-ease"]; this.easeByPath.setEaseForPath(noteFile.path, ease); - const nDays: number = Math.ceil((dueUnix - now.valueOf()) / (24 * 3600 * 1000)); - const interval = Number(frontmatter["sr-interval"]); - this.noteStats.update(nDays, interval, ease); - } - - this.linkRank.calcPageRanks(); - - // Reviewable cards are all except those with the "edit later" tag - this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); - - // Reviewable cards are all except those with the "edit later" tag - this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); - - // sort the deck names - this.deckTree.sortSubdecksList(); - this.remainingDeckTree = DeckTreeFilter.filterForRemainingCards( - this.questionPostponementList, - this.deckTree, - FlashcardReviewMode.Review, - ); - const calc: DeckTreeStatsCalculator = new DeckTreeStatsCalculator(); - this.cardStats = calc.calculate(this.deckTree); - - if (this.data.settings.showDebugMessages) { - this.showSyncInfo(); - } - - if (this.data.settings.showDebugMessages) { - console.log( - "SR: " + - t("SYNC_TIME_TAKEN", { - t: Date.now() - now.valueOf(), - }), - ); - } - - this.updateAndSortDueNotes(); - this.syncLock = false; + for (const matchedNoteTag of matchedNoteTags) { + this.reviewDecks[matchedNoteTag].scheduledNotes.push({ + note: noteFile, + dueUnix, + interval, + ease, + }); + } + }); } private updateAndSortDueNotes() { this.dueNotesCount = 0; this.dueDatesNotes = {}; + this.noteStats = new Stats(); const now = window.moment(Date.now()); Object.values(this.reviewDecks).forEach((reviewDeck: ReviewDeck) => { @@ -541,11 +540,18 @@ export default class SRPlugin extends Plugin { this.dueDatesNotes[nDays] = 0; } this.dueDatesNotes[nDays]++; + this.noteStats.update(nDays, scheduledNote.interval, scheduledNote.ease); }); + this.noteStats.newCount += reviewDeck.newNotes.length; reviewDeck.sortNotes(this.linkRank.pageranks); }); + this.algorithm.setDueDates( + this.noteStats.delayedDays.dict, + this.cardStats.delayedDays.dict, + ); + this.updateStatusBar(); if (this.data.settings.enableNoteReviewPaneOnStartup) this.reviewQueueView.redraw(); @@ -558,115 +564,19 @@ export default class SRPlugin extends Plugin { } // @logExecutionTime() - async sync_Algo(): Promise { - if (this.syncLock) { - return; - } - this.syncLock = true; - const settings = this.data.settings; + async sync_trackfiles(notes: TFile[]): Promise { + // const settings = this.data.settings; const store = this.store; store.data.queues.buildQueue(); - // reset notes stuff - this.easeByPath = new NoteEaseList(this.data.settings); - this.linkRank = new LinkRank(settings, this.app.metadataCache); - this.reviewDecks = {}; - - this.noteStats = new Stats(); - - // reset flashcards stuff - const fullDeckTree = new Deck("root", null); - this.deckTree = new Deck("root", null); - // this.cardStats = {}; - // check trackfile await store.reLoad(); - let now_number = Date.now(); - const now = window.moment(now_number); - const todayDate: string = now.format("YYYY-MM-DD"); - // clear bury list if we've changed dates - if (todayDate !== this.data.buryDate) { - now_number = null; - this.data.buryDate = todayDate; - this.questionPostponementList.clear(); - - // The following isn't needed for plug-in functionality; but can aid during debugging - await this.savePluginData(); - } - - let notes: TFile[] = this.app.vault.getMarkdownFiles(); - notes = notes.filter( - (noteFile) => !isIgnoredPath(settings.noteFoldersToIgnore, noteFile.path), - ); - this.linkRank.readLinks(notes); - const itdecks = new ItemToDecks(this.data.settings); - await Promise.all( - notes.map(async (noteFile) => { - const topicPath: TopicPath = this.findTopicPath(this.createSrTFile(noteFile)); - if (topicPath.hasPath) { - const note: Note = await this.loadNote(noteFile, topicPath); - const flashcardsInNoteAvgEase: number = NoteEaseCalculator.Calculate( - note, - this.data.settings, - ); - note.appendCardsToDeck(fullDeckTree); - - if (flashcardsInNoteAvgEase > 0) { - this.easeByPath.setEaseForPath(note.filePath, flashcardsInNoteAvgEase); - } - } - }), - ); - itdecks.itemToReviewDecks(this.reviewDecks, notes, this.easeByPath); - Object.values(this.reviewDecks).forEach((deck) => { - deck.newNotes.forEach(() => this.noteStats.incrementNew()); - deck.scheduledNotes.forEach((snote) => this.noteStats.updateStats(snote.item)); - }); - this.dueNotesCount = Object.values(this.reviewDecks) - .map((deck) => { - return deck.scheduledNotes - .map((sNote) => sNote.dueUnix) - .filter((due) => due < now.valueOf()); - }) - .flat().length; - - // Reviewable cards are all except those with the "edit later" tag - this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); - - // sort the deck names - this.deckTree.sortSubdecksList(); - this.remainingDeckTree = DeckTreeFilter.filterForRemainingCards( - this.questionPostponementList, - this.deckTree, - FlashcardReviewMode.Review, - ); - const calc: DeckTreeStatsCalculator = new DeckTreeStatsCalculator(); - this.cardStats = calc.calculate(this.deckTree); - // this.noteStats = calc.calculate(this.deckTree); - this.algorithm.setDueDates( - this.noteStats.delayedDays.dict, - this.cardStats.delayedDays.dict, + ItemToDecks.create(this.data.settings).itemToReviewDecks( + this.reviewDecks, + notes, + this.easeByPath, ); - - if (this.data.settings.showDebugMessages) { - this.showSyncInfo(); - } - - for (const deckKey in this.reviewDecks) { - this.reviewDecks[deckKey].sortNotes(this.linkRank.pageranks); - } - - if (this.data.settings.showDebugMessages) { - console.log( - "SR: " + - t("SYNC_TIME_TAKEN", { - t: Date.now() - now.valueOf(), - }), - ); - } - this.updateAndSortDueNotes(); - this.syncLock = false; } async loadNote(noteFile: TFile, topicPath: TopicPath): Promise { @@ -683,8 +593,10 @@ export default class SRPlugin extends Plugin { new Notice(t("NOTE_IN_IGNORED_FOLDER")); return; } + let result: { sNote: SchedNote; buryList?: string[] }; + let ease = this.getLinkedEase(note); - if (this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile) { + if (settings.dataLocation !== DataLocation.SaveOnNoteFile) { let deckName = Tags.getNoteDeckName(note, settings); if (deckName == null && !this.store.getTrackedFile(note.path)?.isTrackedNote) { new Notice(t("PLEASE_TAG_NOTE")); @@ -695,27 +607,28 @@ export default class SRPlugin extends Plugin { } if (deckName == null) return; const opt = this.algorithm.srsOptions()[response]; - const ease = this.getLinkedEase(note); - const store = this.store; - const fileId = store.getTrackedFile(note.path).noteID; - const item = store.getItembyID(fileId); - this.noteStats.decrementStats(item); - const result = ReviewNote.saveReviewResponsebyAlgo( - this.reviewDecks[deckName], + + result = ReviewNote.saveReviewResponse_trackfiles( note, opt, settings.burySiblingCards, ease, ); - this.noteStats.updateStats(item); if (settings.burySiblingCards) { this.data.buryList.push(...result.buryList); await this.savePluginData(); } - - this.postResponse(note, result.dueNum); - return; + } else { + // let ease = this.linkRank.getContribution(note, this.easeByPath).ease; + ease = Math.round(ease); + result = await this.saveReviewResponse_onNote(note, response, ease); + this.easeByPath.setEaseForPath(note.path, ease); } + // Update note's properties to update our due notes. + this.postponeResponse(note, result.sNote); + } + + async saveReviewResponse_onNote(note: TFile, response: ReviewResponse, ease: number) { const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; const frontmatter: FrontMatterCache | Record = fileCachedData.frontmatter || {}; @@ -739,7 +652,7 @@ export default class SRPlugin extends Plugin { } let fileText: string = await this.app.vault.read(note); - let ease: number, interval: number, delayBeforeReview: number; + let interval: number, delayBeforeReview: number; const now: number = Date.now(); // new note if ( @@ -749,7 +662,7 @@ export default class SRPlugin extends Plugin { Object.prototype.hasOwnProperty.call(frontmatter, "sr-ease") ) ) { - ease = this.linkRank.getContribution(note, this.easeByPath).ease; + // ease = this.linkRank.getContribution(note, this.easeByPath).ease; ease = Math.round(ease); interval = 1.0; delayBeforeReview = 0; @@ -800,6 +713,8 @@ export default class SRPlugin extends Plugin { `sr-ease: ${ease}\n---\n\n${fileText}`; } + await this.app.vault.modify(note, fileText); + if (this.data.settings.burySiblingCards) { const topicPath: TopicPath = this.findTopicPath(this.createSrTFile(note)); const noteX: Note = await this.loadNote(note, topicPath); @@ -808,22 +723,21 @@ export default class SRPlugin extends Plugin { } await this.savePluginData(); } - await this.app.vault.modify(note, fileText); - // Update note's properties to update our due notes. - this.easeByPath.setEaseForPath(note.path, ease); - this.postResponse(note, due.valueOf()); + return { sNote: { note, dueUnix: due.valueOf() } }; } - private postResponse(note: TFile, dueNum: number) { + private postponeResponse(note: TFile, sNote: SchedNote) { Object.values(this.reviewDecks).forEach((reviewDeck: ReviewDeck) => { let wasDueInDeck = false; - for (const scheduledNote of reviewDeck.scheduledNotes) { - if (scheduledNote.note.path === note.path) { - scheduledNote.dueUnix = dueNum; - wasDueInDeck = true; - break; - } + const result = reviewDeck.scheduledNotes.splice( + reviewDeck.scheduledNotes.findIndex((newNote) => newNote.note.path === note.path), + 1, + sNote, + ); + if (result.length > 0) { + return; + wasDueInDeck = true; } // It was a new note, remove it from the new notes and schedule it. @@ -832,7 +746,7 @@ export default class SRPlugin extends Plugin { reviewDeck.newNotes.findIndex((newNote) => newNote.note.path === note.path), 1, ); - reviewDeck.scheduledNotes.push({ note, dueUnix: dueNum }); + reviewDeck.scheduledNotes.push(sNote); } }); diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index da89266d..ac0ace12 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -1,5 +1,6 @@ import { Notice, TFile } from "obsidian"; import { DataStore } from "src/dataStore/data"; +import { DataLocation } from "src/dataStore/dataLocation"; import { ItemToDecks } from "src/dataStore/itemToDecks"; import { reviewResponseModal } from "src/gui/reviewresponse-modal"; import { t } from "src/lang/helpers"; @@ -12,6 +13,16 @@ export class ReviewNote { static itemId: number; static minNextView: number; + settings: SRSettings; + + static create(settings: SRSettings, location: DataLocation) { + return new ReviewNote(settings); + } + + constructor(settings: SRSettings) { + this.settings = settings; + } + /** * 231215-not used yet. * after checking ignored folder, get note deckname from review tag and trackedfile. @@ -30,7 +41,10 @@ export class ReviewNote { let deckName = Tags.getNoteDeckName(note, settings); - if (deckName == null && !store.getTrackedFile(note.path)?.isTrackedNote) { + if ( + deckName == null || + (!settings.untrackWithReviewTag && !store.getTrackedFile(note.path)?.isTrackedNote) + ) { new Notice(t("PLEASE_TAG_NOTE")); return; } else if (deckName == null) { @@ -39,8 +53,7 @@ export class ReviewNote { return deckName; } - static saveReviewResponsebyAlgo( - deck: ReviewDeck, + static saveReviewResponse_trackfiles( note: TFile, option: string, burySiblingCards: boolean, @@ -49,8 +62,8 @@ export class ReviewNote { const store = DataStore.getInstance(); const now = Date.now(); - const fileId = store.getTrackedFile(note.path).noteID; - const item = store.getItembyID(fileId); + const itemId = store.getTrackedFile(note.path).noteID; + const item = store.getItembyID(itemId); if (item.isNew && ease != null) { // new note item.updateAlgorithmData("ease", ease); @@ -65,11 +78,20 @@ export class ReviewNote { } } - ReviewNote.recallReviewResponse(fileId, option); + ReviewNote.recallReviewResponse(itemId, option); // preUpdateDeck(deck, note); // ItemToDecks.toRevDeck(deck, note, now); - return { buryList, dueNum: item.nextReview }; + return { + buryList, + sNote: { + note, + item, + dueUnix: item.nextReview, + interval: item.interval, + ease: item.ease, + }, + }; } static recallReviewNote(settings: SRSettings) { diff --git a/src/stats.ts b/src/stats.ts index 814dced0..8e1bb719 100644 --- a/src/stats.ts +++ b/src/stats.ts @@ -62,7 +62,7 @@ export class Stats { updateStats(item: RepetitionItem, now?: number) { const scheduling = item?.getSched(); - if (item == null || !item.isDue || scheduling == null) { + if (item == null || !item.hasDue || scheduling == null) { this.incrementNew(); return; } @@ -102,7 +102,7 @@ export class Stats { if (now == undefined) { now = Date.now(); } - if (item.isDue && item.nextReview - now < 0) { + if (item.hasDue && item.nextReview - now < 0) { this.decrementOnDue(); } else if (item.isNew) { this.decrementNew(); diff --git a/src/util/DateProvider.ts b/src/util/DateProvider.ts index b995818d..5df68e9f 100644 --- a/src/util/DateProvider.ts +++ b/src/util/DateProvider.ts @@ -4,11 +4,16 @@ import { ALLOWED_DATE_FORMATS } from "src/constants"; export interface IDateProvider { get today(): Moment; + get endofToday(): Moment; } export class LiveDateProvider implements IDateProvider { get today(): Moment { - return moment().startOf("day"); + // return moment().startOf("day"); + return moment(); + } + get endofToday(): Moment { + return moment().endOf("day"); } } @@ -22,6 +27,9 @@ export class StaticDateProvider implements IDateProvider { get today(): Moment { return this.moment.clone(); } + get endofToday(): Moment { + return this.moment.clone().endOf("day"); + } static fromDateStr(str: string): StaticDateProvider { return new StaticDateProvider(DateUtil.dateStrToMoment(str)); diff --git a/tests/unit/data.test.ts b/tests/unit/data.test.ts index f29dcf69..0dfe7e2e 100644 --- a/tests/unit/data.test.ts +++ b/tests/unit/data.test.ts @@ -27,18 +27,18 @@ export class SampleDataStore { algo.updateSettings(settings.algorithmSettings[algorithmNames.Default]); const opts = algo.srsOptions(); // eslint-disable-next-line prefer-const - arr = Array.from(new Array(50)).map((_v, _idx) => { + arr = Array.from(new Array(30)).map((_v, _idx) => { const type = this.roundInt(1) > 0 ? RPITEMTYPE.CARD : RPITEMTYPE.NOTE; store.trackFile("testPath" + _idx, type, true); if (type === RPITEMTYPE.CARD) { const tkfile = store.data.trackedFiles[_idx]; - Array.from(Array(this.roundInt(20))).map((_v, _idx) => { + Array.from(Array(this.roundInt(10))).map((_v, _idx) => { const carditem = tkfile.trackCard(_idx * 3, "chash" + _idx); store.updateCardItems(tkfile, carditem, this.roundInt(10), "fcard", false); }); } - return this.roundInt(100); + return this.roundInt(50); }); const noteStats = new Stats(); const cardStats = new Stats(); From e54b300560e9edc870c06c12000db44134a4e059 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Wed, 7 Feb 2024 23:42:55 +0800 Subject: [PATCH 103/155] bump version to v1.11.1.2 --- docs/changelog.md | 9 +++++++++ manifest.json | 2 +- package.json | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index a8634cba..a49f77d4 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). + + +## [1.11.1.2] + +- merge master branch; +- fix: 当天新卡片复习后,当天无法再次复习 的问题; +- fix: 卡片统计表中,当天复习数据没有更新 的问题; + + ## [1.11.0.1] - fix #34, untrack error; diff --git a/manifest.json b/manifest.json index 2430a4f5..91e9557c 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.11.0.1", + "version": "1.11.1.2", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index d32d6bb7..d56ad3a2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.11.0.1", + "version": "1.11.1.2", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { From c2ed1eb8f29bf23ad7933eff7289d7739af8200c Mon Sep 17 00:00:00 2001 From: Newdea Date: Wed, 7 Feb 2024 15:44:53 +0000 Subject: [PATCH 104/155] Prettified Code! --- docs/changelog.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index a49f77d4..a972ff91 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,14 +4,11 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - - ## [1.11.1.2] -- merge master branch; -- fix: 当天新卡片复习后,当天无法再次复习 的问题; -- fix: 卡片统计表中,当天复习数据没有更新 的问题; - +- merge master branch; +- fix: 当天新卡片复习后,当天无法再次复习 的问题; +- fix: 卡片统计表中,当天复习数据没有更新 的问题; ## [1.11.0.1] From f77e834c662c7ad7d6d9fdaef529507c38a9e62b Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 17 Feb 2024 20:30:45 +0800 Subject: [PATCH 105/155] add reschedule and postpone (#43) Co-authored-by: Newdea --- README.md | 5 +- docs/README_ZH.md | 5 +- docs/usage.md | 16 ++++ ...77\347\224\250\346\225\231\347\250\213.md" | 17 ++++ src/algorithms/algorithms.ts | 9 -- src/algorithms/algorithms_switch.ts | 2 +- src/algorithms/anki.ts | 2 +- src/algorithms/balance/balance.ts | 36 ++++++-- src/algorithms/balance/postpone.ts | 59 +++++++++++++ src/algorithms/balance/reschedule.ts | 54 ++++++++++++ src/algorithms/fsrs.ts | 16 ---- src/algorithms/scheduling_default.ts | 10 +-- src/algorithms/supermemo.ts | 1 - src/commands.ts | 88 +++++++++++++++++++ src/dataStore/repetitionItem.ts | 58 +++++++++++- src/gui/flashcard-modal.tsx | 6 +- src/gui/getInputModal.ts | 40 +++++++++ src/main.ts | 9 +- tests/unit/data.test.ts | 3 +- 19 files changed, 378 insertions(+), 58 deletions(-) create mode 100644 src/algorithms/balance/postpone.ts create mode 100644 src/algorithms/balance/reschedule.ts create mode 100644 src/gui/getInputModal.ts diff --git a/README.md b/README.md index f7e767eb..40fd0024 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,10 @@ This is a modified version of [obsidian-spaced-repetition](https://github.com/st - show floatbar for reviewing response when reviewing note by click statusbar or review command or sidebar, and can set whether showing the interval or not; - Reviewing a Notes directly [#635]; - when using fsrs, output `ob-revlog.csv`, to optimize the algorithm parameters using [optimizer](https://github.com/open-spaced-repetition/fsrs-optimizer) for better review; -- Statistics: add note view statistics,and today review statistics. +- Statistics: add note view statistics,and today review statistics; +- Postpone notes/cards; +- postpone to review after x days; +- reschedule all scheduled items; ## Maintainers Wanted diff --git a/docs/README_ZH.md b/docs/README_ZH.md index 5c580934..3930bd0f 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -13,7 +13,10 @@ 5. 算法可以切换:默认的 Anki 优化算法、Anki 算法、[Fsrs 算法](https://github.com/open-spaced-repetition/fsrs.js); 6. 使用 Fsrs 算法时,可根据标签输出重复日志文件 `ob_revlog.csv`,以使用[optimizer](https://github.com/open-spaced-repetition/fsrs-optimizer) 优化算法参数,达到更好的复习效果; 7. 数据表中新增笔记复习情况、当天复习情况; -8. 其他待发现的小改动; +8. 延后笔记/卡片; +9. 修改笔记/卡片在x天后复习; +10. 重排所有已排程的复习项; +11. 其他待发现的小改动; **注意** 没有使用过 obsidian-spaced-repetition 插件的可以直接用,正在使用 obsidian-spaced-repetition 插件的话,建议试用前先备份 :yum: diff --git a/docs/usage.md b/docs/usage.md index f5fda5b2..8ee71da2 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -70,6 +70,22 @@ Centralized (CRAM) review/normal review of cards within the current/all notes (i Centralized Review (CRAM) mode, no review data is updated. +#### Postpone + +Postpone notes/cards (with current retention greater than 65%) from before today(excluded) + +_If you are not satisfied with the new schedule, simply restart Obsidian to restore the previous schedule. The new schedule is not saved until after reviewing a note/card._ + +#### Postpone after x days + +Review the specified notes/cards after x days without judging their current review time and retention rate. +_It is recommended that you only modify individual notes or cards within notes, not a large number of them, to avoid reviewing too much content on that day._ + +#### Reschedule + +Recalculates the next review time for all **already scheduled** notes/cards based on the parameters in the settings and before the notes/cards. +_If you are not satisfied with the new schedule, simply restart Obsidian to restore the previous schedule. The new schedule is not saved until after reviewing a note/card._ + #### View data statistics Via command line, `SR view statistics` diff --git "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" index 8675fe56..7c850fe4 100644 --- "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" +++ "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" @@ -70,6 +70,23 @@ 集中复习(CRAM)模式,不更新复习数据。 +#### 延后Postpone + +对今天之前(不包含今天)的笔记/卡片(当前保留率大于65%)进行延后 +_明日复明日,明日何其多_ +_如果对新排程不满意,直接重启Obsidian即可恢复之前的排程。在复习个笔记/卡片后新排程才会保存_ + +#### 改到x天后复习 + +对指定的笔记/卡片修改到x天后进行复习,不判断其当前复习时间及保留率。 +_建议只是修改个别的笔记或笔记内卡片,不要做大批量修改,避免那天复习内容过多_ + +#### 重排Reschedule + +根据设置中及笔记/卡片前的参数,重新计算所有**已经有排程**的笔记/卡片 的下次复习时间。 +_这个基本用不到_ +_如果对新排程不满意,直接重启Obsidian即可恢复之前的排程。在复习个笔记/卡片后新排程才会保存_ + #### 查看数据统计 通过命令行,`SR 查看数据` diff --git a/src/algorithms/algorithms.ts b/src/algorithms/algorithms.ts index 8f83597b..ba7d1a67 100644 --- a/src/algorithms/algorithms.ts +++ b/src/algorithms/algorithms.ts @@ -11,7 +11,6 @@ export enum algorithmNames { export abstract class SrsAlgorithm { settings: unknown; // plugin: SRPlugin; - private dueDates: { [type: string]: Record }; public static instance: SrsAlgorithm; public static getInstance(): SrsAlgorithm { @@ -27,14 +26,6 @@ export abstract class SrsAlgorithm { // this.plugin = plugin; SrsAlgorithm.instance = this; } - setDueDates(notedueDates: Record, carddueDates: Record) { - this.dueDates = {}; - this.dueDates[RPITEMTYPE.NOTE] = notedueDates; - this.dueDates[RPITEMTYPE.CARD] = carddueDates; - } - getDueDates(itemType: string) { - return this.dueDates && itemType in this.dueDates ? this.dueDates[itemType] : undefined; - } abstract defaultSettings(): unknown; abstract defaultData(): unknown; diff --git a/src/algorithms/algorithms_switch.ts b/src/algorithms/algorithms_switch.ts index 829cb5a4..1631e095 100644 --- a/src/algorithms/algorithms_switch.ts +++ b/src/algorithms/algorithms_switch.ts @@ -38,7 +38,7 @@ export async function algorithmSwitchData( try { const algo = algorithms[toAlgo]; algo.updateSettings(plugin.data.settings.algorithmSettings[toAlgo]); - algo.setDueDates(plugin.noteStats.delayedDays.dict, plugin.cardStats.delayedDays.dict); + // algo.setDueDates(plugin.noteStats.delayedDays.dict, plugin.cardStats.delayedDays.dict); algo.importer(fromAlgo, items); if (toAlgo === algorithmNames.Fsrs) { store.data.items.find((item) => { diff --git a/src/algorithms/anki.ts b/src/algorithms/anki.ts index f044d74b..6d513b29 100644 --- a/src/algorithms/anki.ts +++ b/src/algorithms/anki.ts @@ -114,7 +114,7 @@ export class AnkiAlgorithm extends SrsAlgorithm { data.ease = MiscUtils.fixed(data.ease, 3); data.iteration += 1; - nextInterval = balance(nextInterval, this.getDueDates(item.itemType)); + // nextInterval = balance(nextInterval, item.itemType); data.lastInterval = nextInterval; return { diff --git a/src/algorithms/balance/balance.ts b/src/algorithms/balance/balance.ts index 18b1abfe..f88ad3c0 100644 --- a/src/algorithms/balance/balance.ts +++ b/src/algorithms/balance/balance.ts @@ -1,15 +1,31 @@ import { Notice } from "obsidian"; +import { RPITEMTYPE } from "src/dataStore/repetitionItem"; + +let dueDatesDict: { [type: string]: Record }; + +export function setDueDates( + notedueDates: Record, + carddueDates: Record, +) { + dueDatesDict = {}; + dueDatesDict[RPITEMTYPE.NOTE] = notedueDates; + dueDatesDict[RPITEMTYPE.CARD] = carddueDates; +} + +function getDueDates(itemType: string) { + return dueDatesDict && itemType in dueDatesDict ? dueDatesDict[itemType] : undefined; +} /** * balance review counts in a day, return new interval day. * @param interval days till next review - * @param dueDates + * @param type: RPITEMTYPE, * @param maximumInterval default = 36525 * @returns */ export function balance( interval: number, - dueDates: Record, + type: RPITEMTYPE, maximumInterval: number = 36525, lowestCount: number = 10, tolerance: number = 5, @@ -17,6 +33,7 @@ export function balance( // replaces random fuzz with load balancing over the fuzz interval const beforeIntvl = interval; let isChange = false; + let dueDates = dueDatesDict[type]; if (dueDates !== undefined) { interval = Math.round(interval); // const due = window.moment().add(interval,"days"); @@ -26,11 +43,8 @@ export function balance( dueDates[interval] = 0; } else if (dueDates[interval] >= lowestCount) { // disable fuzzing for small intervals - if (interval > 4) { - let fuzz = 0; - if (interval < 7) fuzz = 1; - else if (interval < 30) fuzz = Math.max(2, Math.floor(interval * 0.15)); - else fuzz = Math.max(4, Math.floor(interval * 0.05)); + if (interval >= 1) { + let fuzz = getFuzz(interval); const originalInterval = interval; outer: for (let i = 1; i <= fuzz; i++) { @@ -62,3 +76,11 @@ export function balance( } return interval; } + +function getFuzz(interval: number) { + let fuzz = 0; + if (interval < 7) fuzz = 1; + else if (interval < 30) fuzz = Math.max(2, Math.floor(interval * 0.15)); + else fuzz = Math.max(4, Math.floor(interval * 0.05)); + return fuzz; +} diff --git a/src/algorithms/balance/postpone.ts b/src/algorithms/balance/postpone.ts new file mode 100644 index 00000000..3abac7df --- /dev/null +++ b/src/algorithms/balance/postpone.ts @@ -0,0 +1,59 @@ +import { RepetitionItem } from "src/dataStore/repetitionItem"; +import { DateUtils, debug } from "src/util/utils_recall"; + +export function postponeItems(items: RepetitionItem[], days?: number): RepetitionItem[] { + const now = Date.now(); + const newdue: number = days ? now + days * DateUtils.DAYS_TO_MILLIS : undefined; + let fltItems = items.filter((item) => item.isTracked); + let safe_fltItems = fltItems + .filter((item) => item.nextReview < DateUtils.StartofToday) + .sort((a, b) => currentRetention(a) - currentRetention(b)) + // https://github.com/open-spaced-repetition/fsrs4anki-helper/blob/58bcfcf8b5eeb60835c5cbde1d0d0ef769af62b0/schedule/postpone.py#L73 + .filter((item) => { + // currentR>0.65 + console.debug("current R:", currentRetention(item), 1 / currentRetention(item) - 1); + return currentRetention(item) > 0.65; + }); + const safe_cnt = safe_fltItems.length; + fltItems = days > 0 ? fltItems : safe_fltItems; + debug("postpone", 0, { safe_cnt, days }); + postpone(fltItems, newdue); + return items; +} + +function elapsed_days(item: RepetitionItem) { + const delay = (Date.now() - item.nextReview) / DateUtils.DAYS_TO_MILLIS; + return item.interval + delay; +} +function currentRetention(item: RepetitionItem) { + // from fsrs.js repeat retrievability + return Math.pow(1 + elapsed_days(item) / (9 * item.interval), -1); +} + +function postpone(items: RepetitionItem[], newdue?: number): RepetitionItem[] { + let cnt = 0; + items.map((item) => { + let newitvl: number, + olastview = item.hasDue + ? item.nextReview - item.interval * DateUtils.DAYS_TO_MILLIS + : Date.now(); + + if (newdue) { + newitvl = newdue - olastview; + } else { + const delay = (Date.now() - olastview) / DateUtils.DAYS_TO_MILLIS - item.interval; + newitvl = Math.min( + Math.max(1, Math.ceil(item.interval * (1.05 + 0.05 * Math.random())) + delay), + 36500, + ); + } + // newdue = newdue ? newdue : Date.now() + newitvl * DateUtils.DAYS_TO_MILLIS; + if (newdue || newitvl !== item.interval) { + cnt++; + item.updateDueByInterval(newitvl, newdue); + } + console.debug(newdue, newitvl, item.interval); + }); + debug("postpone", 0, { cnt }); + return items; +} diff --git a/src/algorithms/balance/reschedule.ts b/src/algorithms/balance/reschedule.ts new file mode 100644 index 00000000..444c4e67 --- /dev/null +++ b/src/algorithms/balance/reschedule.ts @@ -0,0 +1,54 @@ +import { RepetitionItem } from "src/dataStore/repetitionItem"; +import { DateUtils, debug } from "src/util/utils_recall"; +import { SrsAlgorithm } from "../algorithms"; +import { FsrsAlgorithm, FsrsData } from "../fsrs"; + +export function reschedule(items: RepetitionItem[]): RepetitionItem[] { + let reCnt = 0; + console.group(`reschedule`); + if (items[0].isFsrs) { + const result = reschedule_fsrs(items); + reCnt = result.reCnt; + } else { + reCnt = reschedule_default(items).reCnt; + } + console.groupEnd(); + debug("reschedule", 0, { items, reCnt }); + return items; +} + +function reschedule_default(items: RepetitionItem[]) { + let reCnt = 0; + + items.map((item) => { + let newitvl: number; + + let interval = item.interval * 9 * (1 / 0.9 - 1); + newitvl = Math.min(Math.max(Math.round(interval), 1), 3650); + if (newitvl !== item.interval) { + reCnt++; + item.updateDueByInterval(newitvl); + } + }); + + // debug("reschedule", 0, { items, reCnt }); + return { items, reCnt }; +} + +function reschedule_fsrs(items: RepetitionItem[]) { + let reCnt = 0; + let fsrs = (SrsAlgorithm.getInstance() as FsrsAlgorithm).fsrs; + + items.map((item) => { + let newitvl: number; + if (!item.isTracked) return; + const data = item.data as FsrsData; + newitvl = fsrs.next_interval(data.stability); + if (newitvl !== data.scheduled_days) { + reCnt++; + item.updateDueByInterval(newitvl); + } + }); + + return { items, reCnt }; +} diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index 37ec67a8..15dbde5d 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -8,7 +8,6 @@ import { t } from "src/lang/helpers"; import deepcopy from "deepcopy"; import { AnkiData } from "./anki"; import { Rating, ReviewLog } from "fsrs.js"; -import { balance } from "./balance/balance"; import { RepetitionItem, ReviewResult } from "src/dataStore/repetitionItem"; // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/Settings.ts @@ -120,8 +119,6 @@ export class FsrsAlgorithm extends SrsAlgorithm { calcAllOptsIntervals(item: RepetitionItem) { const data = item.data as FsrsData; - data.due = new Date(data.due); - data.last_review = new Date(data.last_review); const card = deepcopy(data); const now = new Date(); const scheduling_cards = this.fsrs.repeat(card, now); @@ -143,8 +140,6 @@ export class FsrsAlgorithm extends SrsAlgorithm { log: boolean = true, ): ReviewResult { let data = item.data as FsrsData; - data.due = new Date(data.due); - data.last_review = new Date(data.last_review); const response = FsrsOptions.indexOf(optionStr) + 1; let correct = true; @@ -169,12 +164,6 @@ export class FsrsAlgorithm extends SrsAlgorithm { data.difficulty = MiscUtils.fixed(data.difficulty, 5); data.elapsed_days = MiscUtils.fixed(data.elapsed_days, 3); - //Get the due date for card: - // const due = card.due; - - //Get the state for card: - // state = card.state; - // Get the review log after rating : if (log) { const review_log = scheduling_cards[response].review_log; @@ -182,11 +171,6 @@ export class FsrsAlgorithm extends SrsAlgorithm { } let nextInterval = data.due.valueOf() - data.last_review.valueOf(); - // not sure should use balance or not. - let days = nextInterval / DateUtils.DAYS_TO_MILLIS; - days = balance(days, this.getDueDates(item.itemType), this.settings.maximum_interval); - nextInterval = days * DateUtils.DAYS_TO_MILLIS; - data.due = new Date(nextInterval + now.getTime()); return { correct, diff --git a/src/algorithms/scheduling_default.ts b/src/algorithms/scheduling_default.ts index 458f1ebf..3c14a0b7 100644 --- a/src/algorithms/scheduling_default.ts +++ b/src/algorithms/scheduling_default.ts @@ -66,7 +66,7 @@ export function schedule( // replaces random fuzz with load balancing over the fuzz interval - interval = balance(interval, dueDates, settingsObj.maximumInterval); + // interval = balance(interval, dueDates, settingsObj.maximumInterval); return { interval: Math.round(interval * 10) / 10, ease }; } @@ -102,12 +102,12 @@ export class DefaultAlgorithm extends SrsAlgorithm { const now: number = Date.now(); const delayBeforeReview = due === 0 ? 0 : now - due; //just in case. // console.log("item.data:", item.data); - const dueDatesNotesorCards = this.getDueDates(item.itemType); + // const dueDatesNotesorCards = this.getDueDates(item.itemType); const intvls: number[] = []; this.srsOptions().forEach((opt, ind) => { const dataCopy = deepcopy(data); - const dueDates = deepcopy(dueDatesNotesorCards); + // const dueDates = deepcopy(dueDatesNotesorCards); const schedObj: Record = schedule( ind, @@ -115,7 +115,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { dataCopy.ease, delayBeforeReview, this.settings, - dueDates, + // dueDates, ); const nextInterval = schedObj.interval; intvls.push(nextInterval); @@ -148,7 +148,7 @@ export class DefaultAlgorithm extends SrsAlgorithm { data.ease, delayBeforeReview, this.settings, - this.getDueDates(item.itemType), + // this.getDueDates(item.itemType), ); const nextReview = schedObj.interval; diff --git a/src/algorithms/supermemo.ts b/src/algorithms/supermemo.ts index f6639739..1ba2f4dd 100644 --- a/src/algorithms/supermemo.ts +++ b/src/algorithms/supermemo.ts @@ -86,7 +86,6 @@ export class Sm2Algorithm extends SrsAlgorithm { } data.ease = MiscUtils.fixed(data.ease, 3); - nextReview = balance(nextReview, this.getDueDates(item.itemType)); data.lastInterval = nextReview; // console.log("item.data:", item.data); // console.log("smdata:", data); diff --git a/src/commands.ts b/src/commands.ts index f490ffd5..878cd04d 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -4,6 +4,10 @@ import { ReviewNote } from "src/reviewNote/review-note"; import { ItemInfoModal } from "src/gui/info"; import { Queue } from "./dataStore/queue"; import { debug } from "./util/utils_recall"; +import { postponeItems } from "./algorithms/balance/postpone"; +import { ReviewDeckSelectionModal } from "./gui/reviewDeckSelectionModal"; +import { reschedule } from "./algorithms/balance/reschedule"; +import { GetInputModal } from "./gui/getInputModal"; export default class Commands { plugin: ObsidianSrsPlugin; @@ -209,5 +213,89 @@ export default class Commands { plugin.store.verifyItems(); }, }); + + plugin.addCommand({ + id: "reschedule", + name: "Reschedule", + callback: () => { + reschedule(plugin.store.items.filter((item) => item.hasDue && item.isTracked)); + }, + }); + + plugin.addCommand({ + id: "postpone-cards", + name: "Postpone cards", + callback: () => { + postponeItems(plugin.store.items.filter((item) => item.isCard && item.isTracked)); + }, + }); + plugin.addCommand({ + id: "postpone-notes", + name: "Postpone notes", + callback: () => { + postponeItems(plugin.store.items.filter((item) => !item.isCard && item.isTracked)); + }, + }); + plugin.addCommand({ + id: "postpone-all", + name: "Postpone All", + callback: () => { + postponeItems(plugin.store.items.filter((item) => item.isTracked)); + }, + }); + + plugin.addCommand({ + id: "postpone-note-manual", + name: "Postpone this note after x days", + checkCallback: (checking: boolean) => { + const file = plugin.app.workspace.getActiveFile(); + if (file != null) { + if (plugin.store.getTrackedFile(file.path)?.isTrackedNote) { + if (!checking) { + const tkfile = plugin.store.getTrackedFile(file.path); + const input = new GetInputModal( + plugin.app, + "please input positive number", + ); + input.submitCallback = (days: number) => { + postponeItems([plugin.store.getItembyID(tkfile.noteID)], days); + plugin.store.save(); + plugin.sync(); + }; + input.open(); + } + return true; + } + } + return false; + }, + }); + + plugin.addCommand({ + id: "postpone-cards-manual", + name: "Postpone cards in this note after x days", + checkCallback: (checking: boolean) => { + const file = plugin.app.workspace.getActiveFile(); + if (file != null) { + if (plugin.store.getTrackedFile(file.path)?.isTracked) { + if (!checking) { + const tkfile = plugin.store.getTrackedFile(file.path); + const input = new GetInputModal( + plugin.app, + "please input positive number", + ); + input.submitCallback = (days: number) => + postponeItems(tkfile.cardIDs.map(plugin.store.getItembyID), days); + input.open(); + + // plugin.store.save(); + plugin.sync(); + } + return true; + } + } + return false; + }, + }); } } diff --git a/src/dataStore/repetitionItem.ts b/src/dataStore/repetitionItem.ts index 37ee6a69..1252ec61 100644 --- a/src/dataStore/repetitionItem.ts +++ b/src/dataStore/repetitionItem.ts @@ -1,4 +1,5 @@ import { AnkiData } from "src/algorithms/anki"; +import { balance } from "src/algorithms/balance/balance"; import { FsrsData } from "src/algorithms/fsrs"; import { DateUtils } from "src/util/utils_recall"; @@ -66,6 +67,11 @@ export class RepetitionItem { static create(item: RepetitionItem) { const newItem = new RepetitionItem(); Object.assign(newItem, item); + if (newItem.isFsrs) { + let data = item.data as FsrsData; + data.due = new Date(data.due); + data.last_review = new Date(data.last_review); + } return newItem; } @@ -92,7 +98,8 @@ export class RepetitionItem { * @return {*} */ reviewUpdate(result: ReviewResult) { - this.nextReview = DateUtils.fromNow(result.nextReview).getTime(); + let newitvl = balance(result.nextReview / DateUtils.DAYS_TO_MILLIS, this.itemType); + this.nextReview = DateUtils.fromNow(newitvl * DateUtils.DAYS_TO_MILLIS).getTime(); this.timesReviewed += 1; if (result.correct) { this.timesCorrect += 1; @@ -130,7 +137,7 @@ export class RepetitionItem { return sched; } - private isFsrs(): boolean { + get isFsrs(): boolean { return Object.prototype.hasOwnProperty.call(this.data, "state"); } @@ -140,6 +147,7 @@ export class RepetitionItem { const due = window.moment(this.nextReview); sched[1] = due.format("YYYY-MM-DD"); + sched[2] = parseFloat(sched[2]).toFixed(0); return sched; } @@ -167,10 +175,52 @@ export class RepetitionItem { } get interval(): number { - return Number(this.getSched()[2]); + const sched = this.getSched(); + return sched ? Number(sched[2]) : 0; } + + updateDueByInterval(newitvl: number, newdue?: number) { + // 240212-interval will be used to calc current retention, shoudn't update. + const now = Date.now(); + const enableBalance = newdue == undefined; + let oitvl = this.interval, + odue = this.hasDue ? this.nextReview : now; + + if (this.isFsrs) { + const data = this.data as FsrsData; + + newdue = newdue + ? newdue + : // : odue - (data.scheduled_days - newitvl) * DateUtils.DAYS_TO_MILLIS; + data.last_review.getTime() + newitvl * DateUtils.DAYS_TO_MILLIS; + // data.scheduled_days = newitvl; + data.due = new Date(newdue); + } else { + newdue = newdue ? newdue : odue - (this.interval - newitvl) * DateUtils.DAYS_TO_MILLIS; + // (this.data as AnkiData).lastInterval = newitvl; + } + + if (enableBalance) { + let days = Math.max(0, newdue - now) / DateUtils.DAYS_TO_MILLIS; + days = balance(days, this.itemType); + console.debug("days:", days); + let nextInterval = days * DateUtils.DAYS_TO_MILLIS; + newdue = nextInterval + now; + } + + console.debug({ + oitvl, + newitvl, + odue: new Date(this.nextReview).toISOString(), + ndue: new Date(newdue).toISOString(), + }); + this.isFsrs ? ((this.data as FsrsData).due = new Date(newdue)) : null; + this.nextReview = newdue; + } + get ease(): number { - return Number(this.getSched()[3]); + const sched = this.getSched(); + return sched ? Number(sched[3]) : 0; } /** diff --git a/src/gui/flashcard-modal.tsx b/src/gui/flashcard-modal.tsx index e52d919a..9551fbf4 100644 --- a/src/gui/flashcard-modal.tsx +++ b/src/gui/flashcard-modal.tsx @@ -25,6 +25,7 @@ import { SrTFile } from "src/SRFile"; import { RepetitionItem, RPITEMTYPE } from "src/dataStore/repetitionItem"; import { debug } from "src/util/utils_recall"; import { ItemInfoModal } from "./info"; +import { setDueDates } from "src/algorithms/balance/balance"; export enum FlashcardModalMode { DecksList, @@ -494,10 +495,7 @@ export class FlashcardModal extends Modal { private processReviewbyAlgo(response: ReviewResponse) { const algo = this.plugin.algorithm; - algo.setDueDates( - this.plugin.noteStats.delayedDays.dict, - this.plugin.noteStats.delayedDays.dict, - ); + setDueDates(this.plugin.noteStats.delayedDays.dict, this.plugin.noteStats.delayedDays.dict); const opt = algo.srsOptions()[response]; const store = this.plugin.store; const id = this.currentCard.Id; diff --git a/src/gui/getInputModal.ts b/src/gui/getInputModal.ts new file mode 100644 index 00000000..5513fe7c --- /dev/null +++ b/src/gui/getInputModal.ts @@ -0,0 +1,40 @@ +import { App, ButtonComponent, Modal, Setting } from "obsidian"; + +export class GetInputModal extends Modal { + private promptText: string = ""; + private days: number; + public submitCallback: (days: number) => void; + + constructor(app: App, promptText: string) { + super(app); + this.promptText = promptText; + } + + onOpen(): void { + const { contentEl } = this; + // contentEl.createEl("p").setText(this.promptText); + new Setting(contentEl.createDiv()).setDesc(this.promptText).addText((text) => { + text.setValue("").onChange((value) => { + const day = Number(value); + day > 0 ? (this.days = day) : text.setValue(""); + }); + }); + + const buttonDiv = contentEl.createDiv("srs-flex-row"); + // buttonDiv.setAttribute("align", "center"); + + new ButtonComponent(buttonDiv) + .setButtonText("Do it") + .onClick(() => { + if (this.days > 0) { + this.submitCallback(this.days); + this.close(); + } + }) + .setCta(); + + new ButtonComponent(buttonDiv).setButtonText("Cancel").onClick(() => { + this.close(); + }); + } +} diff --git a/src/main.ts b/src/main.ts index bcd14c79..49f2cc01 100644 --- a/src/main.ts +++ b/src/main.ts @@ -59,6 +59,7 @@ import { ItemToDecks } from "./dataStore/itemToDecks"; import { LinkRank } from "src/algorithms/priorities/linkPageranks"; import { Queue } from "./dataStore/queue"; import { ReviewDeckSelectionModal } from "./gui/reviewDeckSelectionModal"; +import { setDueDates } from "./algorithms/balance/balance"; interface PluginData { settings: SRSettings; @@ -429,9 +430,6 @@ export default class SRPlugin extends Plugin { // Reviewable cards are all except those with the "edit later" tag this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); - // Reviewable cards are all except those with the "edit later" tag - this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); - // sort the deck names this.deckTree.sortSubdecksList(); this.remainingDeckTree = DeckTreeFilter.filterForRemainingCards( @@ -547,10 +545,7 @@ export default class SRPlugin extends Plugin { reviewDeck.sortNotes(this.linkRank.pageranks); }); - this.algorithm.setDueDates( - this.noteStats.delayedDays.dict, - this.cardStats.delayedDays.dict, - ); + setDueDates(this.noteStats.delayedDays.dict, this.cardStats.delayedDays.dict); this.updateStatusBar(); diff --git a/tests/unit/data.test.ts b/tests/unit/data.test.ts index 0dfe7e2e..5efabe4d 100644 --- a/tests/unit/data.test.ts +++ b/tests/unit/data.test.ts @@ -1,4 +1,5 @@ import { SrsAlgorithm, algorithmNames } from "src/algorithms/algorithms"; +import { setDueDates } from "src/algorithms/balance/balance"; import { DefaultAlgorithm } from "src/algorithms/scheduling_default"; import { DataStore } from "src/dataStore/data"; import { DataLocation } from "src/dataStore/dataLocation"; @@ -51,7 +52,7 @@ export class SampleDataStore { noteStats.updateStats(item); } }); - algo.setDueDates(noteStats.delayedDays.dict, cardStats.delayedDays.dict); + setDueDates(noteStats.delayedDays.dict, cardStats.delayedDays.dict); const size = store.itemSize; arr.map((_v) => { store.reviewId( From 4b835ea6fbffee571eff6228203c4975cc5295d4 Mon Sep 17 00:00:00 2001 From: Newdea Date: Sun, 18 Feb 2024 12:44:36 +0000 Subject: [PATCH 106/155] Prettified Code! --- docs/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.md b/docs/changelog.md index 08cc1526..af4fee49 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -146,6 +146,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fixed open the next note automatically after reviewing another [#582](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/582) - fixed sidebar doesn't show/update some files. [#393](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/393) + #### [Unreleased] - Fixes [BUG] Malformed card text during review, when multi-line card has space on Q/A separator line https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/853 From 1e50c53716ed21f3f6fff04b7f1478653b32870f Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 18 Feb 2024 20:47:40 +0800 Subject: [PATCH 107/155] - fix review new note; - update debug msg; --- src/gui/flashcard-modal.tsx | 6 +++++- src/main.ts | 16 +++++++--------- src/util/utils_recall.ts | 7 ++++++- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/gui/flashcard-modal.tsx b/src/gui/flashcard-modal.tsx index 9551fbf4..42d75631 100644 --- a/src/gui/flashcard-modal.tsx +++ b/src/gui/flashcard-modal.tsx @@ -551,7 +551,11 @@ export class FlashcardModal extends Modal { } else if (settings.dataLocation !== DataLocation.SaveOnNoteFile) { this.setupResponseBtns(btnTexts); const item = this.plugin.store.getItembyID(this.currentCard.Id); - if (item.nextReview > Date.now()) { + if ( + item.nextReview > Date.now() && + this.currentCard.hasSchedule && + !this.currentCard.scheduleInfo.isDue() + ) { debug("复习了还没到期的卡片" + item); } } else { diff --git a/src/main.ts b/src/main.ts index 49f2cc01..f726e576 100644 --- a/src/main.ts +++ b/src/main.ts @@ -725,15 +725,13 @@ export default class SRPlugin extends Plugin { private postponeResponse(note: TFile, sNote: SchedNote) { Object.values(this.reviewDecks).forEach((reviewDeck: ReviewDeck) => { let wasDueInDeck = false; - const result = reviewDeck.scheduledNotes.splice( - reviewDeck.scheduledNotes.findIndex((newNote) => newNote.note.path === note.path), - 1, - sNote, - ); - if (result.length > 0) { - return; - wasDueInDeck = true; - } + reviewDeck.scheduledNotes.findIndex((newNote, ind) => { + if (newNote.note.path === note.path) { + reviewDeck.scheduledNotes[ind] = sNote; + wasDueInDeck = true; + return true; + } + }); // It was a new note, remove it from the new notes and schedule it. if (!wasDueInDeck) { diff --git a/src/util/utils_recall.ts b/src/util/utils_recall.ts index 687fc337..e75fba3f 100644 --- a/src/util/utils_recall.ts +++ b/src/util/utils_recall.ts @@ -173,7 +173,12 @@ export const errorlog = (data: {}) => { console.error({ plugin: "Spaced-rep-recall:", ...data }); }; -export const debug = (functionname: string, duration?: number, ...data: unknown[]) => { +export const debug = (functionname: string, ...data: unknown[]) => { + let duration: number; + if (Number(data[0]) >= 0) { + duration = Number(data[0]); + data = data.slice(1); + } const msg = { plugin: "SRR", func: functionname, ...data }; console.debug(msg); if (Platform.isMobile) { From d1ce86fce12dff9ea6ff8ff861c7763236e8b9d5 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 18 Feb 2024 20:49:58 +0800 Subject: [PATCH 108/155] chore: update docs --- docs/changelog.md | 7 +++++++ manifest.json | 2 +- package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index af4fee49..bc3e94d6 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.11.1.3] + +- merge master branch; +- feat: support postpone and reschedule; +- docs: update docs about postpone and reschedule; +- fix bug after reviewing new note popup item info; + ## [1.11.1.2] - merge master branch; diff --git a/manifest.json b/manifest.json index 91e9557c..9c204582 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.11.1.2", + "version": "1.11.1.3", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index d56ad3a2..03b8dd2b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.11.1.2", + "version": "1.11.1.3", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { From e8bf3f322b5d0c2b4214ee455f7956821c483d2c Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 18 Feb 2024 21:43:04 +0800 Subject: [PATCH 109/155] fix lint error --- src/algorithms/balance/balance.ts | 4 ++-- src/algorithms/balance/postpone.ts | 10 +++++----- src/algorithms/balance/reschedule.ts | 11 ++++------- src/algorithms/fsrs.ts | 2 +- src/dataStore/repetitionItem.ts | 8 ++++---- src/reviewNote/review-note.ts | 9 ++++++--- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/algorithms/balance/balance.ts b/src/algorithms/balance/balance.ts index f88ad3c0..671cb303 100644 --- a/src/algorithms/balance/balance.ts +++ b/src/algorithms/balance/balance.ts @@ -33,7 +33,7 @@ export function balance( // replaces random fuzz with load balancing over the fuzz interval const beforeIntvl = interval; let isChange = false; - let dueDates = dueDatesDict[type]; + const dueDates = dueDatesDict[type]; if (dueDates !== undefined) { interval = Math.round(interval); // const due = window.moment().add(interval,"days"); @@ -44,7 +44,7 @@ export function balance( } else if (dueDates[interval] >= lowestCount) { // disable fuzzing for small intervals if (interval >= 1) { - let fuzz = getFuzz(interval); + const fuzz = getFuzz(interval); const originalInterval = interval; outer: for (let i = 1; i <= fuzz; i++) { diff --git a/src/algorithms/balance/postpone.ts b/src/algorithms/balance/postpone.ts index 3abac7df..467f8ccf 100644 --- a/src/algorithms/balance/postpone.ts +++ b/src/algorithms/balance/postpone.ts @@ -5,7 +5,7 @@ export function postponeItems(items: RepetitionItem[], days?: number): Repetitio const now = Date.now(); const newdue: number = days ? now + days * DateUtils.DAYS_TO_MILLIS : undefined; let fltItems = items.filter((item) => item.isTracked); - let safe_fltItems = fltItems + const safe_fltItems = fltItems .filter((item) => item.nextReview < DateUtils.StartofToday) .sort((a, b) => currentRetention(a) - currentRetention(b)) // https://github.com/open-spaced-repetition/fsrs4anki-helper/blob/58bcfcf8b5eeb60835c5cbde1d0d0ef769af62b0/schedule/postpone.py#L73 @@ -33,10 +33,10 @@ function currentRetention(item: RepetitionItem) { function postpone(items: RepetitionItem[], newdue?: number): RepetitionItem[] { let cnt = 0; items.map((item) => { - let newitvl: number, - olastview = item.hasDue - ? item.nextReview - item.interval * DateUtils.DAYS_TO_MILLIS - : Date.now(); + let newitvl: number; + const olastview = item.hasDue + ? item.nextReview - item.interval * DateUtils.DAYS_TO_MILLIS + : Date.now(); if (newdue) { newitvl = newdue - olastview; diff --git a/src/algorithms/balance/reschedule.ts b/src/algorithms/balance/reschedule.ts index 444c4e67..0d432ebb 100644 --- a/src/algorithms/balance/reschedule.ts +++ b/src/algorithms/balance/reschedule.ts @@ -21,10 +21,8 @@ function reschedule_default(items: RepetitionItem[]) { let reCnt = 0; items.map((item) => { - let newitvl: number; - - let interval = item.interval * 9 * (1 / 0.9 - 1); - newitvl = Math.min(Math.max(Math.round(interval), 1), 3650); + const interval = item.interval * 9 * (1 / 0.9 - 1); + const newitvl = Math.min(Math.max(Math.round(interval), 1), 3650); if (newitvl !== item.interval) { reCnt++; item.updateDueByInterval(newitvl); @@ -37,13 +35,12 @@ function reschedule_default(items: RepetitionItem[]) { function reschedule_fsrs(items: RepetitionItem[]) { let reCnt = 0; - let fsrs = (SrsAlgorithm.getInstance() as FsrsAlgorithm).fsrs; + const fsrs = (SrsAlgorithm.getInstance() as FsrsAlgorithm).fsrs; items.map((item) => { - let newitvl: number; if (!item.isTracked) return; const data = item.data as FsrsData; - newitvl = fsrs.next_interval(data.stability); + const newitvl = fsrs.next_interval(data.stability); if (newitvl !== data.scheduled_days) { reCnt++; item.updateDueByInterval(newitvl); diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index 15dbde5d..b6fd023d 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -170,7 +170,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { this.appendRevlog(item, review_log); } - let nextInterval = data.due.valueOf() - data.last_review.valueOf(); + const nextInterval = data.due.valueOf() - data.last_review.valueOf(); return { correct, diff --git a/src/dataStore/repetitionItem.ts b/src/dataStore/repetitionItem.ts index 1252ec61..2296993e 100644 --- a/src/dataStore/repetitionItem.ts +++ b/src/dataStore/repetitionItem.ts @@ -68,7 +68,7 @@ export class RepetitionItem { const newItem = new RepetitionItem(); Object.assign(newItem, item); if (newItem.isFsrs) { - let data = item.data as FsrsData; + const data = item.data as FsrsData; data.due = new Date(data.due); data.last_review = new Date(data.last_review); } @@ -98,7 +98,7 @@ export class RepetitionItem { * @return {*} */ reviewUpdate(result: ReviewResult) { - let newitvl = balance(result.nextReview / DateUtils.DAYS_TO_MILLIS, this.itemType); + const newitvl = balance(result.nextReview / DateUtils.DAYS_TO_MILLIS, this.itemType); this.nextReview = DateUtils.fromNow(newitvl * DateUtils.DAYS_TO_MILLIS).getTime(); this.timesReviewed += 1; if (result.correct) { @@ -183,7 +183,7 @@ export class RepetitionItem { // 240212-interval will be used to calc current retention, shoudn't update. const now = Date.now(); const enableBalance = newdue == undefined; - let oitvl = this.interval, + const oitvl = this.interval, odue = this.hasDue ? this.nextReview : now; if (this.isFsrs) { @@ -204,7 +204,7 @@ export class RepetitionItem { let days = Math.max(0, newdue - now) / DateUtils.DAYS_TO_MILLIS; days = balance(days, this.itemType); console.debug("days:", days); - let nextInterval = days * DateUtils.DAYS_TO_MILLIS; + const nextInterval = days * DateUtils.DAYS_TO_MILLIS; newdue = nextInterval + now; } diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index ac0ace12..9b40e6f6 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -42,12 +42,15 @@ export class ReviewNote { let deckName = Tags.getNoteDeckName(note, settings); if ( - deckName == null || - (!settings.untrackWithReviewTag && !store.getTrackedFile(note.path)?.isTrackedNote) + (settings.untrackWithReviewTag && deckName == null) || + (!settings.untrackWithReviewTag && + deckName == null && + !store.getTrackedFile(note.path)?.isTrackedNote) ) { new Notice(t("PLEASE_TAG_NOTE")); return; - } else if (deckName == null) { + } + if (deckName == null) { deckName = store.getTrackedFile(note.path)?.lastTag ?? null; } return deckName; From 5ab2b856e552fb513b349fe65b835bb0116e4916 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:35:55 +0800 Subject: [PATCH 110/155] fix lint error fix #47 ; fix view error --- src/algorithms/balance/reschedule.ts | 2 +- src/algorithms/supermemo.ts | 3 +-- src/dataStore/itemToDecks.ts | 6 +++--- src/main.ts | 5 +++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/algorithms/balance/reschedule.ts b/src/algorithms/balance/reschedule.ts index 0d432ebb..7bb56f13 100644 --- a/src/algorithms/balance/reschedule.ts +++ b/src/algorithms/balance/reschedule.ts @@ -5,7 +5,7 @@ import { FsrsAlgorithm, FsrsData } from "../fsrs"; export function reschedule(items: RepetitionItem[]): RepetitionItem[] { let reCnt = 0; - console.group(`reschedule`); + console.group("reschedule"); if (items[0].isFsrs) { const result = reschedule_fsrs(items); reCnt = result.reCnt; diff --git a/src/algorithms/supermemo.ts b/src/algorithms/supermemo.ts index 1ba2f4dd..e640b3f5 100644 --- a/src/algorithms/supermemo.ts +++ b/src/algorithms/supermemo.ts @@ -2,7 +2,6 @@ import { DateUtils, MiscUtils } from "src/util/utils_recall"; import { SrsAlgorithm, algorithmNames } from "./algorithms"; import deepcopy from "deepcopy"; import { AnkiAlgorithm, AnkiSettings } from "./anki"; -import { balance } from "./balance/balance"; import { RepetitionItem, ReviewResult } from "src/dataStore/repetitionItem"; interface Sm2Data { @@ -78,7 +77,7 @@ export class Sm2Algorithm extends SrsAlgorithm { nextReview: nextReview * DateUtils.DAYS_TO_MILLIS, }; } else { - let nextReview = interval(data.iteration); + const nextReview = interval(data.iteration); data.iteration += 1; data.ease = data.ease + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02)); if (data.ease < 1.3) { diff --git a/src/dataStore/itemToDecks.ts b/src/dataStore/itemToDecks.ts index 92818c5d..ed8dbcbf 100644 --- a/src/dataStore/itemToDecks.ts +++ b/src/dataStore/itemToDecks.ts @@ -118,15 +118,15 @@ export class ItemToDecks { let now_number: number = now; const nowToday: number = DateUtils.EndofToday; - if (!trackedFile.isDefault && (item == null || !item.isTracked)) { - item.setTracked(ind); - } if (item == null) { // store._updateItem(fileid, ind, RPITEMTYPE.NOTE, rdeck.deckName); // item = store.getItembyID(fileid); console.debug("syncRCDataToSRrevDeck update null item:", item, trackedFile); return; } + if (!trackedFile.isDefault && !item.isTracked) { + item.setTracked(ind); + } const latterQue = store.data.queues.toDayLatterQueue; delete latterQue[fileid]; if (now == null) { diff --git a/src/main.ts b/src/main.ts index f726e576..304bf5b2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -892,7 +892,7 @@ export default class SRPlugin extends Plugin { await this.saveData(this.data); } - initView(): void { + async initView(): Promise { this.registerView( REVIEW_QUEUE_VIEW_TYPE, (leaf) => (this.reviewQueueView = new ReviewQueueListView(leaf, this)), @@ -902,10 +902,11 @@ export default class SRPlugin extends Plugin { this.data.settings.enableNoteReviewPaneOnStartup && this.app.workspace.getLeavesOfType(REVIEW_QUEUE_VIEW_TYPE).length == 0 ) { - this.app.workspace.getRightLeaf(false).setViewState({ + await this.app.workspace.getRightLeaf(false).setViewState({ type: REVIEW_QUEUE_VIEW_TYPE, active: true, }); + this.reviewQueueView = this.app.workspace.getActiveViewOfType(ReviewQueueListView); } } From 296097eff3c29711b6e8de9e0d3463107429b3c4 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:43:30 +0800 Subject: [PATCH 111/155] chore: update version --- docs/changelog.md | 6 ++++++ manifest.json | 2 +- package.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index bc3e94d6..001bddb3 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.11.1.4] + +- fix #47 null error; +- fix occasionally can't open flashcard modal; +- fix lint errors; + ## [1.11.1.3] - merge master branch; diff --git a/manifest.json b/manifest.json index 9c204582..9e0b1bbd 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.11.1.3", + "version": "1.11.1.4", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index 03b8dd2b..da21596a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.11.1.3", + "version": "1.11.1.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { From 0223b2369bb352dfb54ea2e72da8278920436852 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:07:33 +0800 Subject: [PATCH 112/155] refactor review --- src/QuestionType.ts | 2 +- src/ReviewDeck.ts | 2 + src/TopicPath.ts | 20 ++-- src/commands.ts | 1 - src/dataStore/location_switch.ts | 39 +++++-- src/main.ts | 91 ++++++--------- src/reviewNote/review-note.ts | 170 ++++++++++++++++++++++------- tests/unit/QuestionType.test.ts | 6 +- tests/unit/location_switch.test.ts | 13 +++ 9 files changed, 219 insertions(+), 125 deletions(-) diff --git a/src/QuestionType.ts b/src/QuestionType.ts index 38782a0f..712edf99 100644 --- a/src/QuestionType.ts +++ b/src/QuestionType.ts @@ -139,7 +139,7 @@ class QuestionType_Cloze implements IQuestionTypeHandler { export class QuestionType_ClozeUtil { static renderClozeFront(len: number = 3): string { - const rpt = Math.round(len / 3); + const rpt = Math.max(1, Math.round(len / 6)); return "[" + "...".repeat(rpt) + "]"; } diff --git a/src/ReviewDeck.ts b/src/ReviewDeck.ts index dc4cff06..bb56801d 100644 --- a/src/ReviewDeck.ts +++ b/src/ReviewDeck.ts @@ -11,6 +11,8 @@ export interface SchedNote { ease?: number; } +export type Decks = { [deckKey: string]: ReviewDeck }; + export class ReviewDeck { public deckName: string; public newNotes: SchedNote[] = []; diff --git a/src/TopicPath.ts b/src/TopicPath.ts index 4309fd2b..c4cc7af4 100644 --- a/src/TopicPath.ts +++ b/src/TopicPath.ts @@ -40,11 +40,7 @@ export class TopicPath { return result; } - static getTopicPathOfFile( - noteFile: ISRFile, - settings: SRSettings, - store?: DataStore, - ): TopicPath { + static getTopicPathOfFile(noteFile: ISRFile, settings: SRSettings): TopicPath { let deckPath: string[] = []; let result: TopicPath = TopicPath.emptyPath; @@ -67,9 +63,16 @@ export class TopicPath { } } } + result = getTopicPathTrackedfile(result); + } + return result; + function getTopicPathTrackedfile(result: TopicPath) { if (result.isEmptyPath && settings.trackedNoteToDecks) { - outer: for (const tagToReview of this.getTopicPathsFromTagList( + const tagList: TopicPath[] = TopicPath.getTopicPathsFromTagList( + noteFile.getAllTags(), + ); + outer: for (const tagToReview of TopicPath.getTopicPathsFromTagList( settings.tagsToReview, )) { for (const tag of tagList) { @@ -79,7 +82,8 @@ export class TopicPath { } } } - if (settings.dataLocation !== DataLocation.SaveOnNoteFile && store != undefined) { + if (settings.dataLocation !== DataLocation.SaveOnNoteFile) { + const store = DataStore.getInstance(); if (result.isEmptyPath) { if (store.isInTrackedFiles(noteFile.path)) { let deckName = store.getTrackedFile(noteFile.path).lastTag; @@ -94,8 +98,8 @@ export class TopicPath { } } } + return result; } - return result; } isSameOrAncestorOf(topicPath: TopicPath): boolean { diff --git a/src/commands.ts b/src/commands.ts index 878cd04d..3df62cfe 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -5,7 +5,6 @@ import { ItemInfoModal } from "src/gui/info"; import { Queue } from "./dataStore/queue"; import { debug } from "./util/utils_recall"; import { postponeItems } from "./algorithms/balance/postpone"; -import { ReviewDeckSelectionModal } from "./gui/reviewDeckSelectionModal"; import { reschedule } from "./algorithms/balance/reschedule"; import { GetInputModal } from "./gui/getInputModal"; diff --git a/src/dataStore/location_switch.ts b/src/dataStore/location_switch.ts index b3e27d8b..ec3a8c33 100644 --- a/src/dataStore/location_switch.ts +++ b/src/dataStore/location_switch.ts @@ -116,27 +116,29 @@ export class LocationSwitch { settings.dataLocation = newLocation; } } + settings.tagsToReview.push(this.revTag); + await store.save(); // await plugin.sync_Algo(); let notes: TFile[] = app.vault.getMarkdownFiles(); notes = notes.filter( - (noteFile) => !isIgnoredPath(settings.noteFoldersToIgnore, noteFile.path), + (noteFile) => + !isIgnoredPath(settings.noteFoldersToIgnore, noteFile.path) && + plugin.createSrTFile(noteFile).getAllTags().length > 0, ); for (const noteFile of notes) { let deckname = Tags.getNoteDeckName(noteFile, this.settings); - let topicPath: TopicPath = plugin.findTopicPath(plugin.createSrTFile(noteFile)); - let fileText: string = ""; + const srfile = plugin.createSrTFile(noteFile); + let topicPath: TopicPath = plugin.findTopicPath(srfile); + let fileText: string = await noteFile.vault.read(noteFile); let fileChanged = false; + + // delet removed tag if (topicPath.hasPath) { - fileText = await noteFile.vault.read(noteFile); - if (topicPath.formatAsTag().includes(this.revTag)) { - deckname = DEFAULT_DECKNAME; - topicPath = new TopicPath([deckname]); - fileText = delDefaultTag(fileText, this.revTag); - fileChanged = true; - } else if ( + // fileText = await noteFile.vault.read(noteFile); + if ( topicPath.path.length === 2 && settings.tagsToReview.includes(topicPath.path[1]) ) { @@ -148,6 +150,17 @@ export class LocationSwitch { } } + // delete review/default tag + if ( + (topicPath.hasPath && topicPath.formatAsTag().includes(this.revTag)) || + srfile.getAllTags().includes("#" + this.revTag) + ) { + deckname = DEFAULT_DECKNAME; + topicPath = new TopicPath([deckname]); + fileText = delDefaultTag(fileText, this.revTag); + fileChanged = true; + } + if (deckname !== null) { const fileCachedData = app.metadataCache.getFileCache(noteFile) || {}; fileText = await _convertFrontMatter(noteFile, fileCachedData, deckname, fileText); @@ -192,6 +205,8 @@ export class LocationSwitch { } } + settings.tagsToReview.pop(); + const msg = "converteNoteSchedToTrackfile success!"; if (dryrun) { await plugin.sync(); @@ -563,7 +578,9 @@ export function updateCardSchedXml( if (newCardText.endsWith("```") && sep !== "\n") { sep = "\n"; } - + if (scheduling != null && scheduling.every((sched) => sched == null)) { + return newCardText; + } if (scheduling != null && scheduling.length > 0) { schedString = sep + SR_HTML_COMMENT_BEGIN; diff --git a/src/main.ts b/src/main.ts index 304bf5b2..8bf571bc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -142,6 +142,12 @@ export default class SRPlugin extends Plugin { settings.algorithmSettings[settings.algorithm] = this.algorithm.settings; this.savePluginData(); + ReviewNote.create( + settings, + this.sync_onNote.bind(this), + this.tagCheck.bind(this), + this.saveReviewResponse_onNote.bind(this), + ); this.commands = new Commands(this); this.commands.addCommands(); if (this.data.settings.showDebugMessages) { @@ -420,15 +426,7 @@ export default class SRPlugin extends Plugin { } }), ); - if (settings.dataLocation != DataLocation.SaveOnNoteFile) { - await this.sync_trackfiles(notes); - // this.getTimeDuration(this.sync.name); - } else { - this.sync_onNote(notes); - } - - // Reviewable cards are all except those with the "edit later" tag - this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); + await ReviewNote.getInstance().sync(notes, this.reviewDecks, this.easeByPath); // sort the deck names this.deckTree.sortSubdecksList(); @@ -558,22 +556,6 @@ export default class SRPlugin extends Plugin { debug(fname, undefined, { msg }); } - // @logExecutionTime() - async sync_trackfiles(notes: TFile[]): Promise { - // const settings = this.data.settings; - const store = this.store; - store.data.queues.buildQueue(); - - // check trackfile - await store.reLoad(); - - ItemToDecks.create(this.data.settings).itemToReviewDecks( - this.reviewDecks, - notes, - this.easeByPath, - ); - } - async loadNote(noteFile: TFile, topicPath: TopicPath): Promise { const loader: NoteFileLoader = new NoteFileLoader(this.data.settings); const note: Note = await loader.load(this.createSrTFile(noteFile), topicPath); @@ -590,43 +572,23 @@ export default class SRPlugin extends Plugin { } let result: { sNote: SchedNote; buryList?: string[] }; let ease = this.getLinkedEase(note); + const revnote = ReviewNote.getInstance(); + if (!revnote.tagCheck(note)) { + return; + } - if (settings.dataLocation !== DataLocation.SaveOnNoteFile) { - let deckName = Tags.getNoteDeckName(note, settings); - if (deckName == null && !this.store.getTrackedFile(note.path)?.isTrackedNote) { - new Notice(t("PLEASE_TAG_NOTE")); - return; - } - if (deckName == null) { - deckName = this.store.getTrackedFile(note.path).lastTag; - } - if (deckName == null) return; - const opt = this.algorithm.srsOptions()[response]; - - result = ReviewNote.saveReviewResponse_trackfiles( - note, - opt, - settings.burySiblingCards, - ease, - ); - if (settings.burySiblingCards) { - this.data.buryList.push(...result.buryList); - await this.savePluginData(); - } - } else { - // let ease = this.linkRank.getContribution(note, this.easeByPath).ease; - ease = Math.round(ease); - result = await this.saveReviewResponse_onNote(note, response, ease); - this.easeByPath.setEaseForPath(note.path, ease); + result = revnote.responseProcess(note, response, ease); + if (settings.burySiblingCards) { + this.data.buryList.push(...result.buryList); + await this.savePluginData(); } + // Update note's properties to update our due notes. this.postponeResponse(note, result.sNote); } - async saveReviewResponse_onNote(note: TFile, response: ReviewResponse, ease: number) { + tagCheck(note: TFile) { const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; - const frontmatter: FrontMatterCache | Record = - fileCachedData.frontmatter || {}; const tags = getAllTags(fileCachedData) || []; let shouldIgnore = true; @@ -643,8 +605,15 @@ export default class SRPlugin extends Plugin { if (shouldIgnore) { new Notice(t("PLEASE_TAG_NOTE")); - return; + return false; } + return true; + } + + async saveReviewResponse_onNote(note: TFile, response: ReviewResponse, ease: number) { + const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; + const frontmatter: FrontMatterCache | Record = + fileCachedData.frontmatter || {}; let fileText: string = await this.app.vault.read(note); let interval: number, delayBeforeReview: number; @@ -681,6 +650,7 @@ export default class SRPlugin extends Plugin { ); interval = schedObj.interval; ease = schedObj.ease; + this.easeByPath.setEaseForPath(note.path, ease); const due = window.moment(now + interval * 24 * 3600 * 1000); const dueString: string = due.format("YYYY-MM-DD"); @@ -710,16 +680,17 @@ export default class SRPlugin extends Plugin { await this.app.vault.modify(note, fileText); + const buryList: string[] = []; if (this.data.settings.burySiblingCards) { const topicPath: TopicPath = this.findTopicPath(this.createSrTFile(note)); const noteX: Note = await this.loadNote(note, topicPath); for (const question of noteX.questionList) { - this.data.buryList.push(question.questionText.textHash); + buryList.push(question.questionText.textHash); } await this.savePluginData(); } - - return { sNote: { note, dueUnix: due.valueOf() } }; + const snote: SchedNote = { note, dueUnix: due.valueOf() }; + return { sNote: snote, buryList }; } private postponeResponse(note: TFile, sNote: SchedNote) { @@ -876,7 +847,7 @@ export default class SRPlugin extends Plugin { } findTopicPath(note: ISRFile): TopicPath { - return TopicPath.getTopicPathOfFile(note, this.data.settings, this.store); + return TopicPath.getTopicPathOfFile(note, this.data.settings); } async loadPluginData(): Promise { diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index 9b40e6f6..a03ef6f4 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -1,26 +1,59 @@ import { Notice, TFile } from "obsidian"; +import { SrsAlgorithm } from "src/algorithms/algorithms"; import { DataStore } from "src/dataStore/data"; import { DataLocation } from "src/dataStore/dataLocation"; import { ItemToDecks } from "src/dataStore/itemToDecks"; import { reviewResponseModal } from "src/gui/reviewresponse-modal"; import { t } from "src/lang/helpers"; -import { ReviewDeck } from "src/ReviewDeck"; +import SRPlugin from "src/main"; +import { NoteEaseList } from "src/NoteEaseList"; +import { Decks, ReviewDeck, SchedNote } from "src/ReviewDeck"; +import { ReviewResponse } from "src/scheduling"; import { SRSettings } from "src/settings"; import { Tags } from "src/tags"; import { DateUtils, isIgnoredPath } from "src/util/utils_recall"; +type Tsync = (notes: TFile[], reviewDecks?: Decks, easeByPath?: NoteEaseList) => Promise; +export type TrespResult = { sNote: SchedNote; buryList?: string[] }; +type TsaveResponse = (note: TFile, response: ReviewResponse, ease: number) => any; + export class ReviewNote { + private static _instance: ReviewNote; static itemId: number; static minNextView: number; settings: SRSettings; + // public reviewDecks: Decks = {}; + // public easeByPath: NoteEaseList; + + static create( + // plugin: SRPlugin, + settings: SRSettings, + sync: Tsync, + tagCheck: (note: TFile) => boolean, + saveResponse: TsaveResponse, + ) { + switch (settings.dataLocation) { + case DataLocation.SaveOnNoteFile: + return new RNonNote(settings, sync, tagCheck, saveResponse); + break; - static create(settings: SRSettings, location: DataLocation) { - return new ReviewNote(settings); + default: + return new RNonTrackfiles(settings); + break; + } + } + + static getInstance() { + if (!ReviewNote._instance) { + throw Error("there is not ReviewNote instance."); + } + return ReviewNote._instance; } constructor(settings: SRSettings) { this.settings = settings; + ReviewNote._instance = this; } /** @@ -56,45 +89,15 @@ export class ReviewNote { return deckName; } - static saveReviewResponse_trackfiles( - note: TFile, - option: string, - burySiblingCards: boolean, - ease?: number, - ) { - const store = DataStore.getInstance(); - const now = Date.now(); - - const itemId = store.getTrackedFile(note.path).noteID; - const item = store.getItembyID(itemId); - if (item.isNew && ease != null) { - // new note - item.updateAlgorithmData("ease", ease); - } - const buryList: string[] = []; - if (burySiblingCards) { - const trackFile = store.getTrackedFile(note.path); - if (trackFile.hasCards) { - for (const cardinfo of trackFile.cardItems) { - buryList.push(cardinfo.cardTextHash); - } - } - } - - ReviewNote.recallReviewResponse(itemId, option); + tagCheck(note: TFile): boolean { + throw new Error("not implemented"); + } - // preUpdateDeck(deck, note); - // ItemToDecks.toRevDeck(deck, note, now); - return { - buryList, - sNote: { - note, - item, - dueUnix: item.nextReview, - interval: item.interval, - ease: item.ease, - }, - }; + async sync(notes: TFile[], reviewDecks?: Decks, easeByPath?: NoteEaseList): Promise { + throw new Error("not implemented"); + } + responseProcess(note: TFile, response: ReviewResponse, ease: number): TrespResult { + throw new Error("not implemented"); } static recallReviewNote(settings: SRSettings) { @@ -223,6 +226,91 @@ export class ReviewNote { } } +class RNonNote extends ReviewNote { + constructor( + settings: SRSettings, + sync: Tsync, + tagCheck: (note: TFile) => boolean, + saveResponse: TsaveResponse, + ) { + super(settings); + this.sync = sync; + this.tagCheck = tagCheck; + this.responseProcess = saveResponse; + } +} + +class RNonTrackfiles extends ReviewNote { + // @logExecutionTime() + async sync(notes: TFile[], reviewDecks: Decks, easeByPath: NoteEaseList): Promise { + // const settings = this.data.settings; + const store = DataStore.getInstance(); + store.data.queues.buildQueue(); + + // check trackfile + await store.reLoad(); + + ItemToDecks.create(this.settings).itemToReviewDecks(reviewDecks, notes, easeByPath); + } + + tagCheck(note: TFile): boolean { + const store = DataStore.getInstance(); + + let deckName = Tags.getNoteDeckName(note, this.settings); + if ( + (this.settings.untrackWithReviewTag && deckName == null) || + (!this.settings.untrackWithReviewTag && + deckName == null && + !store.getTrackedFile(note.path)?.isTrackedNote) + ) { + new Notice(t("PLEASE_TAG_NOTE")); + return false; + } + if (deckName == null) { + deckName = store.getTrackedFile(note.path).lastTag; + } + if (deckName == null) return false; + return true; + } + responseProcess(note: TFile, response: ReviewResponse, ease?: number) { + const store = DataStore.getInstance(); + + const option = SrsAlgorithm.getInstance().srsOptions()[response]; + const now = Date.now(); + + const itemId = store.getTrackedFile(note.path).noteID; + const item = store.getItembyID(itemId); + if (item.isNew && ease != null) { + // new note + item.updateAlgorithmData("ease", ease); + } + const buryList: string[] = []; + if (this.settings.burySiblingCards) { + const trackFile = store.getTrackedFile(note.path); + if (trackFile.hasCards) { + for (const cardinfo of trackFile.cardItems) { + buryList.push(cardinfo.cardTextHash); + } + } + } + + ReviewNote.recallReviewResponse(itemId, option); + + // preUpdateDeck(deck, note); + // ItemToDecks.toRevDeck(deck, note, now); + return { + buryList, + sNote: { + note, + item, + dueUnix: item.nextReview, + interval: item.interval, + ease: item.ease, + }, + }; + } +} + function preUpdateDeck(deck: ReviewDeck, note: TFile) { const newindex = deck.newNotes.findIndex((sNote, _index) => { return sNote.note === note; diff --git a/tests/unit/QuestionType.test.ts b/tests/unit/QuestionType.test.ts index 6829a9b2..08e382dc 100644 --- a/tests/unit/QuestionType.test.ts +++ b/tests/unit/QuestionType.test.ts @@ -83,15 +83,15 @@ test("CardType.Cloze", () => { ), ).toEqual([ new CardFrontBack( - "This is a really very [...............] and fascinating and great test", + "This is a really very [.........] and fascinating and great test", "This is a really very interesting and fascinating and great test", ), new CardFrontBack( - "This is a really very interesting and [...............] and great test", + "This is a really very interesting and [.........] and great test", "This is a really very interesting and fascinating and great test", ), new CardFrontBack( - "This is a really very interesting and fascinating and [.........] test", + "This is a really very interesting and fascinating and [......] test", "This is a really very interesting and fascinating and great test", ), ]); diff --git a/tests/unit/location_switch.test.ts b/tests/unit/location_switch.test.ts index 65af7503..7aad9c98 100644 --- a/tests/unit/location_switch.test.ts +++ b/tests/unit/location_switch.test.ts @@ -118,6 +118,19 @@ Obsidian`; const result = delDefaultTag(fileText, "review/default"); expect(result).toEqual(expectedText); }); + + test("delDefaultTag(no frontmatter) : \n review/default", () => { + const fileText = `--- +tags: + - review/default +--- +Obsidian`; + const expectedText = ` +Obsidian`; + const result = delDefaultTag(fileText, "review/default"); + expect(result).toEqual(expectedText); + }); + test("delDefaultTag : \n review/default", () => { const fileText = `--- tags: From eaf4cdeb0d29336cb221ce18176cb356be8f9ee3 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:09:17 +0800 Subject: [PATCH 113/155] add multi cloze support --- src/Card.ts | 14 +++++ src/DeckTreeIterator.ts | 47 ++++++++++++++++ src/Note.ts | 12 +++++ src/QuestionType.ts | 104 ++++++++++++++++++++++++++++++------ src/gui/flashcard-modal.tsx | 15 ++++-- src/main.ts | 1 + tests/unit/Note.test.ts | 44 +++++++++++++++ 7 files changed, 217 insertions(+), 20 deletions(-) diff --git a/src/Card.ts b/src/Card.ts index 9dc53678..69d4ba07 100644 --- a/src/Card.ts +++ b/src/Card.ts @@ -6,6 +6,8 @@ export class Card { question: Question; cardIdx: number; Id?: number; + multiClozeIndex?: number; + multiCloze?: number[]; // scheduling get hasSchedule(): boolean { return this.scheduleInfo != null; @@ -32,6 +34,18 @@ export class Card { return this.hasSchedule && this.scheduleInfo.isDue(); } + get isMultiCloze(): boolean { + return this?.multiClozeIndex >= 0; + } + + get hasNextMultiCloze(): boolean { + return this.isMultiCloze && this?.multiClozeIndex + 1 < this?.multiCloze.length; + } + + getNextMultiClozeIndex(): number { + return this.hasNextMultiCloze ? this.multiClozeIndex + 1 : -1; + } + formatSchedule(): string { let result: string = ""; if (this.hasSchedule) result = this.scheduleInfo.formatSchedule(); diff --git a/src/DeckTreeIterator.ts b/src/DeckTreeIterator.ts index 4aef6f0a..f4583fb3 100644 --- a/src/DeckTreeIterator.ts +++ b/src/DeckTreeIterator.ts @@ -48,6 +48,8 @@ class SingleDeckIterator { cardListType?: CardListType; weightedRandomNumber: WeightedRandomNumber; + previousCard?: Card; + get hasCurrentCard(): boolean { return this.cardIdx != null; } @@ -114,6 +116,38 @@ class SingleDeckIterator { return this.cardIdx != null; } + private setMultiCloze(card: Card): boolean { + let idx = -1; + if (card?.multiClozeIndex >= 0) { + const cardList = this.deck.getCardListForCardType(card.cardListType); + idx = cardList.findIndex((v) => v === card); + } + if (idx >= 0) { + this.setCardListType(card.cardListType, idx); + } else { + this.setCardListType(this.preferredCardListType); + } + // console.debug("this.idx: ", this.cardIdx); + return idx >= 0; + } + + firstMultiCloze(card: Card): void { + if (card.hasNextMultiCloze) { + const fCard = card.question.cards[card.multiCloze[0]]; + this.setMultiCloze(fCard); + } + } + + nextMultiClozeCard(card: Card): boolean { + // console.debug("nextMultiCloze: prev card: ", card, card?.multiClozeIndex); + let nCard: Card; + if (card.hasNextMultiCloze) { + nCard = this.previousCard.question.cards[card.getNextMultiClozeIndex()]; + } + // console.debug(this.nextMultiClozeCard.name + " next card: ", nCard, nCard?.multiClozeIndex); + return this.setMultiCloze(nCard); + } + private nextRandomCard(): void { const newCount: number = this.deck.newFlashcards.length; const dueCount: number = this.deck.dueFlashcards.length; @@ -173,6 +207,7 @@ class SingleDeckIterator { deleteCurrentCard(): void { this.ensureCurrentCard(); + this.previousCard = this.currentCard?.multiClozeIndex >= 0 ? this.currentCard : undefined; this.deck.deleteCardAtIndex(this.cardIdx, this.cardListType); this.setNoCurrentCard(); } @@ -277,6 +312,13 @@ export class DeckTreeIterator implements IDeckTreeIterator { this.singleDeckIterator.deleteCurrentCard(); } + if (this.singleDeckIterator?.previousCard) { + result = this.singleDeckIterator.nextMultiClozeCard( + this.singleDeckIterator.previousCard, + ); + if (result) return result; + } + if (this.iteratorOrder.cardOrder == CardOrder.EveryCardRandomDeckAndCard) { result = this.nextCard_EveryCardRandomDeck(); } else { @@ -293,7 +335,12 @@ export class DeckTreeIterator implements IDeckTreeIterator { this.chooseNextDeck(false); } } + // console.debug("before ", result, this?.deckIdx, "currCard:", this.currentCard); + if (result && this.currentCard.isMultiCloze) { + this.singleDeckIterator.firstMultiCloze(this.currentCard); + } if (!result) this.deckIdx = null; + // console.debug(result, this?.deckIdx, "currCard:", this.currentCard); return result; } diff --git a/src/Note.ts b/src/Note.ts index 46ae5cb8..a88f1429 100644 --- a/src/Note.ts +++ b/src/Note.ts @@ -2,6 +2,7 @@ import { SRSettings } from "./settings"; import { Deck } from "./Deck"; import { Question } from "./Question"; import { ISRFile } from "./SRFile"; +import { QuestionType_ClozeUtil } from "./QuestionType"; export class Note { file: ISRFile; @@ -29,6 +30,17 @@ export class Note { } } + createMultiCloze(settings: SRSettings): void { + if (settings.burySiblingCards) return; + this.questionList.filter((question) => { + QuestionType_ClozeUtil.convMultiCloze( + question.cards, + question.questionText.actualQuestion, + settings, + ); + }); + } + debugLogToConsole(desc: string = "") { let str: string = `Note: ${desc}: ${this.questionList.length} questions\r\n`; for (let i = 0; i < this.questionList.length; i++) { diff --git a/src/QuestionType.ts b/src/QuestionType.ts index 712edf99..c0402837 100644 --- a/src/QuestionType.ts +++ b/src/QuestionType.ts @@ -1,3 +1,4 @@ +import { Card } from "./Card"; import { CardType } from "./Question"; import { SRSettings } from "./settings"; import { findLineIndexOfSearchStringIgnoringWs } from "./util/utils"; @@ -92,6 +93,37 @@ class QuestionType_MultiLineReversed implements IQuestionTypeHandler { class QuestionType_Cloze implements IQuestionTypeHandler { expand(questionText: string, settings: SRSettings): CardFrontBack[] { + const siblings: RegExpMatchArray[] = QuestionType_ClozeUtil.getSiblings( + questionText, + settings, + ); + + let front: string, back: string; + const result: CardFrontBack[] = []; + for (const m of siblings) { + const deletionStart: number = m.index, + deletionEnd: number = deletionStart + m[0].length; + front = + questionText.substring(0, deletionStart) + + QuestionType_ClozeUtil.renderClozeFront(m[0].length) + + questionText.substring(deletionEnd); + front = QuestionType_ClozeUtil.removeClozeTokens(front, settings); + back = + questionText.substring(0, deletionStart) + + QuestionType_ClozeUtil.renderClozeBack( + questionText.substring(deletionStart, deletionEnd), + ) + + questionText.substring(deletionEnd); + back = QuestionType_ClozeUtil.removeClozeTokens(back, settings); + result.push(new CardFrontBack(front, back)); + } + + return result; + } +} + +export class QuestionType_ClozeUtil { + static getSiblings(questionText: string, settings: SRSettings) { const siblings: RegExpMatchArray[] = []; if (settings.convertHighlightsToClozes) { siblings.push(...questionText.matchAll(/==(.*?)==/gm)); @@ -112,32 +144,70 @@ class QuestionType_Cloze implements IQuestionTypeHandler { // What is unit test to cover following statement; otherwise jest please ignore return 0; }); + return siblings; + } - let front: string, back: string; - const result: CardFrontBack[] = []; - for (const m of siblings) { - const deletionStart: number = m.index, - deletionEnd: number = deletionStart + m[0].length; + static convMultiCloze(siblings: Card[], questionText: string, settings: SRSettings): Card[] { + const newsiblings = siblings.filter((card) => !card.isNew && !card.isDue); + const idxs = siblings + .map((card) => { + if (card.isNew || card.isDue) { + return card.cardIdx; + } + }) + .filter((idx) => idx != undefined); + if (idxs.length <= 1) return siblings; + const textsibls = QuestionType_ClozeUtil.getSiblings(questionText, settings); + let front: string = "", + back: string; + const ftsibls = textsibls.filter((v, idx) => idxs.includes(idx)); + // .sort((a, b) => b.index - a.index); + let startIdx: number; + ftsibls.filter((m0, sibIdx) => { + // if (sibIdx === idxs.length - 1) { + // return; + // } + const deletionStart: number = m0.index, + deletionEnd: number = deletionStart + m0[0].length; + startIdx = deletionEnd; front = - questionText.substring(0, deletionStart) + - QuestionType_ClozeUtil.renderClozeFront(m[0].length) + - questionText.substring(deletionEnd); - front = QuestionType_ClozeUtil.removeClozeTokens(front, settings); + questionText.substring(0, m0.index) + + QuestionType_ClozeUtil.renderClozeFront(m0[0].length); + back = questionText.substring(0, deletionStart) + QuestionType_ClozeUtil.renderClozeBack( questionText.substring(deletionStart, deletionEnd), - ) + - questionText.substring(deletionEnd); + ); + ftsibls.filter((m) => { + if (m.index <= startIdx) { + return true; + } + const deletionStart: number = m.index, + deletionEnd: number = deletionStart + m[0].length; + front = + front + + questionText.substring(startIdx, deletionStart) + + QuestionType_ClozeUtil.renderClozeFront(m[0].length); + back = + back + + questionText.substring(startIdx, deletionStart) + + QuestionType_ClozeUtil.renderClozeFront(m[0].length); + startIdx = deletionEnd; + return true; + }); + front = front + questionText.substring(startIdx); + front = QuestionType_ClozeUtil.removeClozeTokens(front, settings); + back = back + questionText.substring(startIdx); back = QuestionType_ClozeUtil.removeClozeTokens(back, settings); - result.push(new CardFrontBack(front, back)); - } - - return result; + siblings[idxs[sibIdx]].front = front; + siblings[idxs[sibIdx]].back = back; + siblings[idxs[sibIdx]].multiClozeIndex = sibIdx; + siblings[idxs[sibIdx]].multiCloze = idxs; + }); + return siblings; } -} -export class QuestionType_ClozeUtil { static renderClozeFront(len: number = 3): string { const rpt = Math.max(1, Math.round(len / 6)); return "[" + "...".repeat(rpt) + "]"; diff --git a/src/gui/flashcard-modal.tsx b/src/gui/flashcard-modal.tsx index 42d75631..aa92c380 100644 --- a/src/gui/flashcard-modal.tsx +++ b/src/gui/flashcard-modal.tsx @@ -56,6 +56,7 @@ export class FlashcardModal extends Modal { public cardItem: RepetitionItem; public options: string[]; + private previousCard: Card; private get currentCard(): Card { return this.reviewSequencer.currentCard; @@ -459,7 +460,7 @@ export class FlashcardModal extends Modal { private showAnswer(): void { this.mode = FlashcardModalMode.Back; - + this.previousCard = this.currentCard?.multiClozeIndex >= 0 ? this.currentCard : undefined; this.answerBtn.style.display = "none"; this.responseDiv.style.display = "grid"; @@ -512,8 +513,16 @@ export class FlashcardModal extends Modal { } private async handleNextCard(): Promise { - if (this.currentCard != null) await this.showCurrentCard(); - else this.renderDecksList(); + if (this.currentCard != null) { + await this.showCurrentCard(); + if ( + this?.previousCard && + this.previousCard.question === this.currentCard.question && + this.currentCard?.multiClozeIndex > 0 + ) { + this.showAnswer(); + } + } else this.renderDecksList(); } private async showCurrentCard(): Promise { diff --git a/src/main.ts b/src/main.ts index 8bf571bc..cbd70577 100644 --- a/src/main.ts +++ b/src/main.ts @@ -560,6 +560,7 @@ export default class SRPlugin extends Plugin { const loader: NoteFileLoader = new NoteFileLoader(this.data.settings); const note: Note = await loader.load(this.createSrTFile(noteFile), topicPath); ItemToDecks.updateCardsSchedbyItems(note, topicPath); + note.createMultiCloze(this.data.settings); if (note.hasChanged) note.writeNoteFile(this.data.settings); return note; } diff --git a/tests/unit/Note.test.ts b/tests/unit/Note.test.ts index 96b59024..89f78247 100644 --- a/tests/unit/Note.test.ts +++ b/tests/unit/Note.test.ts @@ -49,6 +49,50 @@ Q3:::A3 }); }); +describe("create Multiple Cloze", () => { + test("Multiple cloze, some with schedule details", async () => { + let originalText: string = `#flashcards/test +Q1::A1 +#flashcards "This is a really very {{interesting}} and ==fascinating== and **great** test" + +`; + let settings2 = DEFAULT_SETTINGS; + settings2.convertBoldTextToClozes = true; + settings2.convertHighlightsToClozes = true; + settings2.convertCurlyBracketsToClozes = true; + // let parser: NoteParser = new NoteParser(settings2); + var noteFileLoader: NoteFileLoader = new NoteFileLoader(settings2); + + let file: UnitTestSRFile = new UnitTestSRFile(originalText); + let note: Note = await noteFileLoader.load(file, TopicPath.emptyPath); + + note.createMultiCloze(settings2); + + let deck: Deck = Deck.emptyDeck; + note.appendCardsToDeck(deck); + let subdeck: Deck = deck.getDeck(new TopicPath(["flashcards"])); + expect(subdeck.newFlashcards[0].front).toEqual( + `"This is a really very interesting and fascinating and [......] test"\n`, + ); + expect(subdeck.newFlashcards[0].back).toEqual( + `"This is a really very interesting and fascinating and great test"\n`, + ); + + expect(subdeck.dueFlashcards[0].front).toEqual( + `"This is a really very [.........] and [.........] and [......] test"\n`, + ); + expect(subdeck.dueFlashcards[0].back).toEqual( + `"This is a really very interesting and [.........] and [......] test"\n`, + ); + expect(subdeck.dueFlashcards[1].front).toEqual( + `"This is a really very interesting and [.........] and [......] test"\n`, + ); + expect(subdeck.dueFlashcards[1].back).toEqual( + `"This is a really very interesting and fascinating and [......] test"\n`, + ); + }); +}); + describe("writeNoteFile", () => { test("Multiple questions, some with too many schedule details", async () => { let originalText: string = `#flashcards/test From 14d963daeba14b51cf01d6b52ec1736eee7a5757 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:09:17 +0800 Subject: [PATCH 114/155] limit clozes to 4 --- src/Card.ts | 39 +++++++++++++++++++++++++++++++++++-- src/DeckTreeIterator.ts | 18 +++++++++-------- src/QuestionType.ts | 2 +- src/gui/flashcard-modal.tsx | 4 ++-- 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/Card.ts b/src/Card.ts index 69d4ba07..bc18ec40 100644 --- a/src/Card.ts +++ b/src/Card.ts @@ -38,14 +38,49 @@ export class Card { return this?.multiClozeIndex >= 0; } + /** + * 3 cloze in a group, but last group could have 4 cloze. + */ get hasNextMultiCloze(): boolean { - return this.isMultiCloze && this?.multiClozeIndex + 1 < this?.multiCloze.length; + if (this.isMultiCloze && this.multiClozeIndex + 1 < this.multiCloze.length) { + const len = this.multiCloze.length; + if (len % 3 === 1 && len - this.multiClozeIndex <= 4) { + return true; + } else if (this.multiClozeIndex % 3 < 2) { + return true; + } + } + return false; } - getNextMultiClozeIndex(): number { + private getFirstMultiClozeIndex(): number { + let result = -1; + if (this.isMultiCloze) { + const len = this.multiCloze.length; + if (this.multiCloze.length <= 4) { + result = 0; + } else if (len % 3 === 1 && len - this.multiClozeIndex <= 4) { + result = len - 4; + } else { + result = Math.floor(this.multiClozeIndex / 3) * 3; + } + } + console.debug(this.getFirstMultiClozeIndex.name, result); + return result; + } + + private getNextMultiClozeIndex(): number { return this.hasNextMultiCloze ? this.multiClozeIndex + 1 : -1; } + getFirstClozeCard(): Card { + return this.question.cards[this.multiCloze[this.getFirstMultiClozeIndex()]]; + } + + getNextClozeCard(): Card { + return this.question.cards[this.multiCloze[this.getNextMultiClozeIndex()]]; + } + formatSchedule(): string { let result: string = ""; if (this.hasSchedule) result = this.scheduleInfo.formatSchedule(); diff --git a/src/DeckTreeIterator.ts b/src/DeckTreeIterator.ts index f4583fb3..3d21ad74 100644 --- a/src/DeckTreeIterator.ts +++ b/src/DeckTreeIterator.ts @@ -117,9 +117,10 @@ class SingleDeckIterator { } private setMultiCloze(card: Card): boolean { - let idx = -1; - if (card?.multiClozeIndex >= 0) { + let idx = -2; + if (card.isMultiCloze) { const cardList = this.deck.getCardListForCardType(card.cardListType); + // console.debug("cardList: ", cardList, this.deck); idx = cardList.findIndex((v) => v === card); } if (idx >= 0) { @@ -127,13 +128,13 @@ class SingleDeckIterator { } else { this.setCardListType(this.preferredCardListType); } - // console.debug("this.idx: ", this.cardIdx); + // console.debug("this.idx: ", this.cardIdx, idx, card); return idx >= 0; } firstMultiCloze(card: Card): void { - if (card.hasNextMultiCloze) { - const fCard = card.question.cards[card.multiCloze[0]]; + if (card.isMultiCloze) { + const fCard = card.getFirstClozeCard(); this.setMultiCloze(fCard); } } @@ -142,10 +143,11 @@ class SingleDeckIterator { // console.debug("nextMultiCloze: prev card: ", card, card?.multiClozeIndex); let nCard: Card; if (card.hasNextMultiCloze) { - nCard = this.previousCard.question.cards[card.getNextMultiClozeIndex()]; + nCard = this.previousCard.getNextClozeCard(); + // console.debug(" next Nulti card: ", nCard, nCard?.multiClozeIndex); + return this.setMultiCloze(nCard); } - // console.debug(this.nextMultiClozeCard.name + " next card: ", nCard, nCard?.multiClozeIndex); - return this.setMultiCloze(nCard); + return false; } private nextRandomCard(): void { diff --git a/src/QuestionType.ts b/src/QuestionType.ts index c0402837..39f8d5ca 100644 --- a/src/QuestionType.ts +++ b/src/QuestionType.ts @@ -197,7 +197,7 @@ export class QuestionType_ClozeUtil { return true; }); front = front + questionText.substring(startIdx); - front = QuestionType_ClozeUtil.removeClozeTokens(front, settings); + // front = QuestionType_ClozeUtil.removeClozeTokens(front, settings); back = back + questionText.substring(startIdx); back = QuestionType_ClozeUtil.removeClozeTokens(back, settings); siblings[idxs[sibIdx]].front = front; diff --git a/src/gui/flashcard-modal.tsx b/src/gui/flashcard-modal.tsx index aa92c380..1c470d28 100644 --- a/src/gui/flashcard-modal.tsx +++ b/src/gui/flashcard-modal.tsx @@ -517,8 +517,8 @@ export class FlashcardModal extends Modal { await this.showCurrentCard(); if ( this?.previousCard && - this.previousCard.question === this.currentCard.question && - this.currentCard?.multiClozeIndex > 0 + this.previousCard.isMultiCloze && + this.currentCard !== this.currentCard.getFirstClozeCard() ) { this.showAnswer(); } From d943d2e00e61911dd2938c573294d12624717187 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:09:17 +0800 Subject: [PATCH 115/155] del debug msg --- src/Card.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Card.ts b/src/Card.ts index bc18ec40..da02701a 100644 --- a/src/Card.ts +++ b/src/Card.ts @@ -65,7 +65,6 @@ export class Card { result = Math.floor(this.multiClozeIndex / 3) * 3; } } - console.debug(this.getFirstMultiClozeIndex.name, result); return result; } From a36b8f11aa7bc9c947818e3ccc7a892400eb742b Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:09:18 +0800 Subject: [PATCH 116/155] refactor --- src/Card.ts | 35 +++++------------------------------ src/DeckTreeIterator.ts | 4 ++-- src/QuestionType.ts | 30 ++++++++++++++++++++++++------ src/gui/flashcard-modal.tsx | 1 + 4 files changed, 32 insertions(+), 38 deletions(-) diff --git a/src/Card.ts b/src/Card.ts index da02701a..c290ceb4 100644 --- a/src/Card.ts +++ b/src/Card.ts @@ -42,42 +42,17 @@ export class Card { * 3 cloze in a group, but last group could have 4 cloze. */ get hasNextMultiCloze(): boolean { - if (this.isMultiCloze && this.multiClozeIndex + 1 < this.multiCloze.length) { - const len = this.multiCloze.length; - if (len % 3 === 1 && len - this.multiClozeIndex <= 4) { - return true; - } else if (this.multiClozeIndex % 3 < 2) { - return true; - } - } - return false; - } - - private getFirstMultiClozeIndex(): number { - let result = -1; - if (this.isMultiCloze) { - const len = this.multiCloze.length; - if (this.multiCloze.length <= 4) { - result = 0; - } else if (len % 3 === 1 && len - this.multiClozeIndex <= 4) { - result = len - 4; - } else { - result = Math.floor(this.multiClozeIndex / 3) * 3; - } - } - return result; - } - - private getNextMultiClozeIndex(): number { - return this.hasNextMultiCloze ? this.multiClozeIndex + 1 : -1; + return this.isMultiCloze && this.multiClozeIndex + 1 < this.multiCloze.length; } getFirstClozeCard(): Card { - return this.question.cards[this.multiCloze[this.getFirstMultiClozeIndex()]]; + return this.isMultiCloze ? this.question.cards[this.multiCloze[0]] : undefined; } getNextClozeCard(): Card { - return this.question.cards[this.multiCloze[this.getNextMultiClozeIndex()]]; + return this.hasNextMultiCloze + ? this.question.cards[this.multiCloze[this.multiClozeIndex + 1]] + : undefined; } formatSchedule(): string { diff --git a/src/DeckTreeIterator.ts b/src/DeckTreeIterator.ts index 3d21ad74..41d9ef7c 100644 --- a/src/DeckTreeIterator.ts +++ b/src/DeckTreeIterator.ts @@ -125,8 +125,6 @@ class SingleDeckIterator { } if (idx >= 0) { this.setCardListType(card.cardListType, idx); - } else { - this.setCardListType(this.preferredCardListType); } // console.debug("this.idx: ", this.cardIdx, idx, card); return idx >= 0; @@ -146,6 +144,8 @@ class SingleDeckIterator { nCard = this.previousCard.getNextClozeCard(); // console.debug(" next Nulti card: ", nCard, nCard?.multiClozeIndex); return this.setMultiCloze(nCard); + } else { + this.setCardListType(this.preferredCardListType); } return false; } diff --git a/src/QuestionType.ts b/src/QuestionType.ts index 39f8d5ca..d10542af 100644 --- a/src/QuestionType.ts +++ b/src/QuestionType.ts @@ -163,10 +163,7 @@ export class QuestionType_ClozeUtil { const ftsibls = textsibls.filter((v, idx) => idxs.includes(idx)); // .sort((a, b) => b.index - a.index); let startIdx: number; - ftsibls.filter((m0, sibIdx) => { - // if (sibIdx === idxs.length - 1) { - // return; - // } + ftsibls.forEach((m0, sibIdx) => { const deletionStart: number = m0.index, deletionEnd: number = deletionStart + m0[0].length; startIdx = deletionEnd; @@ -179,7 +176,8 @@ export class QuestionType_ClozeUtil { QuestionType_ClozeUtil.renderClozeBack( questionText.substring(deletionStart, deletionEnd), ); - ftsibls.filter((m) => { + let sibStartEndIdx = getStartEndIndex(sibIdx); + ftsibls.slice(sibIdx, sibStartEndIdx.end).forEach((m) => { if (m.index <= startIdx) { return true; } @@ -203,9 +201,29 @@ export class QuestionType_ClozeUtil { siblings[idxs[sibIdx]].front = front; siblings[idxs[sibIdx]].back = back; siblings[idxs[sibIdx]].multiClozeIndex = sibIdx; - siblings[idxs[sibIdx]].multiCloze = idxs; + siblings[idxs[sibIdx]].multiCloze = idxs.slice( + sibStartEndIdx.start, + sibStartEndIdx.end, + ); }); return siblings; + + function getStartEndIndex(sibIdx: number, cnt = 3, lastcnt = 4) { + let start = 0, + end = 0; + const len = idxs.length; + if (len <= lastcnt) { + start = 0; + end = len; + } else if (len % cnt === 1 && len - sibIdx <= lastcnt) { + start = len - lastcnt; + end = len; + } else { + start = Math.floor(sibIdx / cnt) * cnt; + end = start + cnt; + } + return { start, end }; + } } static renderClozeFront(len: number = 3): string { diff --git a/src/gui/flashcard-modal.tsx b/src/gui/flashcard-modal.tsx index 1c470d28..4215922b 100644 --- a/src/gui/flashcard-modal.tsx +++ b/src/gui/flashcard-modal.tsx @@ -518,6 +518,7 @@ export class FlashcardModal extends Modal { if ( this?.previousCard && this.previousCard.isMultiCloze && + this.currentCard.isMultiCloze && this.currentCard !== this.currentCard.getFirstClozeCard() ) { this.showAnswer(); From 5a74d342848ce96a1cce59d17908f91576339a4e Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:09:18 +0800 Subject: [PATCH 117/155] add setting --- src/FlashcardReviewSequencer.ts | 2 +- src/Note.ts | 2 +- src/lang/locale/ar.ts | 2 ++ src/lang/locale/de.ts | 2 ++ src/lang/locale/en.ts | 2 ++ src/lang/locale/es.ts | 2 ++ src/lang/locale/ja.ts | 2 ++ src/lang/locale/ko.ts | 2 ++ src/lang/locale/pt-br.ts | 2 ++ src/lang/locale/ru.ts | 2 ++ src/lang/locale/zh-cn.ts | 2 ++ src/lang/locale/zh-tw.ts | 2 ++ src/settings.ts | 4 ++++ src/settings/multiClozeSetting.ts | 15 +++++++++++++++ 14 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/settings/multiClozeSetting.ts diff --git a/src/FlashcardReviewSequencer.ts b/src/FlashcardReviewSequencer.ts index 2d4b03e2..cdb0de09 100644 --- a/src/FlashcardReviewSequencer.ts +++ b/src/FlashcardReviewSequencer.ts @@ -146,7 +146,7 @@ export class FlashcardReviewSequencer implements IFlashcardReviewSequencer { this.cardSequencer.moveCurrentCardToEndOfList(); this.cardSequencer.nextCard(); } else { - if (this.settings.burySiblingCards) { + if (this.settings.burySiblingCards && !this.currentCard.isMultiCloze) { await this.burySiblingCards(); this.cardSequencer.deleteCurrentQuestion(); } else { diff --git a/src/Note.ts b/src/Note.ts index a88f1429..01a0959b 100644 --- a/src/Note.ts +++ b/src/Note.ts @@ -31,7 +31,7 @@ export class Note { } createMultiCloze(settings: SRSettings): void { - if (settings.burySiblingCards) return; + if (!settings.multiClozeCard) return; this.questionList.filter((question) => { QuestionType_ClozeUtil.convMultiCloze( question.cards, diff --git a/src/lang/locale/ar.ts b/src/lang/locale/ar.ts index cb19ae18..af008161 100644 --- a/src/lang/locale/ar.ts +++ b/src/lang/locale/ar.ts @@ -76,6 +76,8 @@ export default { BURY_SIBLINGS_TILL_NEXT_DAY: "أخفي البطاقات الشقيقة حتى اليوم التالي", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "cloze deletions : البطاقات الشقيقة هي بطاقات تم إنشاؤها من نفس نص البطاقة كـ", + MULTI_CLOZE: "enable multi-cloze card?", + MULTI_CLOZE_DESC: "Combine new/ondue sibling clozes into one card.", SHOW_CARD_CONTEXT: "إظهار السياق في البطاقات؟", SHOW_CARD_CONTEXT_DESC: "i.e. Title > Heading 1 > Subheading > ... > Subheading", CARD_MODAL_HEIGHT_PERCENT: "نسبة ارتفاع البطاقة", diff --git a/src/lang/locale/de.ts b/src/lang/locale/de.ts index 0b6f2b46..a97dda6c 100644 --- a/src/lang/locale/de.ts +++ b/src/lang/locale/de.ts @@ -85,6 +85,8 @@ export default { BURY_SIBLINGS_TILL_NEXT_DAY: "Verwandte Karten auf den nächsten Tag verlegen?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Verwandte Karten sind aus der gleichen Karte generiert worden (z.B. Lückentextkarten oder beidseitige Karten).", + MULTI_CLOZE: "enable multi-cloze card?", + MULTI_CLOZE_DESC: "Combine new/ondue sibling clozes into one card.", SHOW_CARD_CONTEXT: "Kontext in den Karten anzeigen?", SHOW_CARD_CONTEXT_DESC: "Bsp. Titel > Überschrift 1 > Sektion > ... > Untersektion", CARD_MODAL_HEIGHT_PERCENT: "Höhe der Lernkartei in Prozent", diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 867be581..42c5b1ca 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -78,6 +78,8 @@ export default { BURY_SIBLINGS_TILL_NEXT_DAY: "Bury sibling cards until the next day?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Siblings are cards generated from the same card text i.e. cloze deletions", + MULTI_CLOZE: "enable multi-cloze card?", + MULTI_CLOZE_DESC: "Combine new/ondue sibling clozes into one card.", SHOW_CARD_CONTEXT: "Show context in cards?", SHOW_CARD_CONTEXT_DESC: "i.e. Title > Heading 1 > Subheading > ... > Subheading", CARD_MODAL_HEIGHT_PERCENT: "Flashcard Height Percentage", diff --git a/src/lang/locale/es.ts b/src/lang/locale/es.ts index 2ef87512..f9da5979 100644 --- a/src/lang/locale/es.ts +++ b/src/lang/locale/es.ts @@ -80,6 +80,8 @@ export default { BURY_SIBLINGS_TILL_NEXT_DAY: "¿Enterrar tarjetas hermanas hasta el siguiente día?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Los hermanos son tarjetas generadas del mismo texto de la tarjeta, por ejemplo, deletreos de huecos (cloze deletions en inglés)", + MULTI_CLOZE: "enable multi-cloze card?", + MULTI_CLOZE_DESC: "Combine new/ondue sibling clozes into one card.", SHOW_CARD_CONTEXT: "¿Mostrar contexto en las tarjetas?", SHOW_CARD_CONTEXT_DESC: "Por Ejemplo: Título > Cabecera > Sub-Cabecera > ... > Sub-Cabecera", CARD_MODAL_HEIGHT_PERCENT: "Porcentaje de la altura de las tarjetas de memoria", diff --git a/src/lang/locale/ja.ts b/src/lang/locale/ja.ts index 9844dc78..282d8e0b 100644 --- a/src/lang/locale/ja.ts +++ b/src/lang/locale/ja.ts @@ -81,6 +81,8 @@ export default { BURY_SIBLINGS_TILL_NEXT_DAY: "次のレビューまでシブリングを延期しますか?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "シブリングは同一のカードテキストから生成されたカード、つまり穴埋め問題の派生カードです。", + MULTI_CLOZE: "enable multi-cloze card?", + MULTI_CLOZE_DESC: "Combine new/ondue sibling clozes into one card.", SHOW_CARD_CONTEXT: "カードにコンテキストを表示しますか?", SHOW_CARD_CONTEXT_DESC: "「タイトル > 見出し 1 > 副見出し > ... > 副見出し」の表示を行うかどうかを決めます。", diff --git a/src/lang/locale/ko.ts b/src/lang/locale/ko.ts index 5b02a8a9..2ae985d6 100644 --- a/src/lang/locale/ko.ts +++ b/src/lang/locale/ko.ts @@ -79,6 +79,8 @@ export default { BURY_SIBLINGS_TILL_NEXT_DAY: "Sibling 카드를 다음날까지 묻어두시겠습니까?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Sibling 카드는 동일한 카드 텍스트에서 생성된 카드입니다. i.e. cloze deletions", + MULTI_CLOZE: "enable multi-cloze card?", + MULTI_CLOZE_DESC: "Combine new/ondue sibling clozes into one card.", SHOW_CARD_CONTEXT: "카드의 문맥(context)을 표시하시겠습니까?", SHOW_CARD_CONTEXT_DESC: "카드에서 'Title > Heading 1 > Subheading > ... > Subheading' 의 표시를 할지 설정합니다.", diff --git a/src/lang/locale/pt-br.ts b/src/lang/locale/pt-br.ts index 8c0b7d7e..3c34f489 100644 --- a/src/lang/locale/pt-br.ts +++ b/src/lang/locale/pt-br.ts @@ -82,6 +82,8 @@ export default { BURY_SIBLINGS_TILL_NEXT_DAY: "Enterrar cartas irmãs até o próximo dia?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Cartas irmãs são geradas pelo texto da mesma carta ex: omissão de palavras", + MULTI_CLOZE: "enable multi-cloze card?", + MULTI_CLOZE_DESC: "Combine new/ondue sibling clozes into one card.", SHOW_CARD_CONTEXT: "Mostrar contexto nas cartas?", SHOW_CARD_CONTEXT_DESC: "ex: Título > Cabeçalho 1 > Subcabeçalho > ... > Subcabeçalho", CARD_MODAL_HEIGHT_PERCENT: "Porcentagem da Altura do Flashcard", diff --git a/src/lang/locale/ru.ts b/src/lang/locale/ru.ts index 94a88702..5f3eb242 100644 --- a/src/lang/locale/ru.ts +++ b/src/lang/locale/ru.ts @@ -87,6 +87,8 @@ export default { BURY_SIBLINGS_TILL_NEXT_DAY: "Прятать родственные карточки до следующего дня?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Родственные карточки - те, которые образованы из одного текста, пример: карточки с пропусками ([...])", + MULTI_CLOZE: "enable multi-cloze card?", + MULTI_CLOZE_DESC: "Combine new/ondue sibling clozes into one card.", SHOW_CARD_CONTEXT: "Показывать контекст (уровень) в карточках (во время повторения)?", SHOW_CARD_CONTEXT_DESC: "пример: Title > Heading 1 > Subheading > ... > Subheading", CARD_MODAL_HEIGHT_PERCENT: "Высота карточки в процентах", diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 5ac32584..578a6ae4 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -74,6 +74,8 @@ export default { INLINE_SCHEDULING_COMMENTS_DESC: "HTML注释不再破坏列表格式", BURY_SIBLINGS_TILL_NEXT_DAY: "将关联卡片隐藏至下一天?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "关联卡片是来自同一卡片的不同形式, 例如:完形填空卡片", + MULTI_CLOZE: "允许多个完形填空?", + MULTI_CLOZE_DESC: "将新/到期的关联卡片组合到一个卡片中.", SHOW_CARD_CONTEXT: "在卡片中显示上下文?", SHOW_CARD_CONTEXT_DESC: "例如:标题 > 副标题 > 小标题 > ... > 小标题", CARD_MODAL_HEIGHT_PERCENT: "卡片高度百分比", diff --git a/src/lang/locale/zh-tw.ts b/src/lang/locale/zh-tw.ts index 3ebc5133..c429d861 100644 --- a/src/lang/locale/zh-tw.ts +++ b/src/lang/locale/zh-tw.ts @@ -74,6 +74,8 @@ export default { INLINE_SCHEDULING_COMMENTS_DESC: "勾選後HTML註解不會破壞列表格式問題。", BURY_SIBLINGS_TILL_NEXT_DAY: "將反轉卡片隱藏至下一天?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "反轉卡片由同一卡片文字產生,例如:填空克漏字", + MULTI_CLOZE: "允許多個完形填空?", + MULTI_CLOZE_DESC: "將新/到期的關聯卡片組合到一個卡片中.", SHOW_CARD_CONTEXT: "在卡片中顯示上下文?", SHOW_CARD_CONTEXT_DESC: "例如:標題 > 副標題 > 小標題 > ... > 小標題", CARD_MODAL_HEIGHT_PERCENT: "卡片高度百分比", diff --git a/src/settings.ts b/src/settings.ts index a19beb99..d16a0896 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,6 +1,7 @@ import { Notice, PluginSettingTab, Setting, App, Platform } from "obsidian"; import type SRPlugin from "src/main"; import { t } from "src/lang/helpers"; +import { addMultiClozeSetting } from "./settings/multiClozeSetting"; // https://github.com/martin-jw/obsidian-recall/blob/main/src/settings.ts @@ -27,6 +28,7 @@ export interface SRSettings { convertFoldersToDecks: boolean; cardCommentOnSameLine: boolean; burySiblingCards: boolean; + multiClozeCard: boolean; showContextInCards: boolean; flashcardHeightPercentage: number; flashcardWidthPercentage: number; @@ -88,6 +90,7 @@ export const DEFAULT_SETTINGS: SRSettings = { convertFoldersToDecks: false, cardCommentOnSameLine: false, burySiblingCards: false, + multiClozeCard: false, showContextInCards: true, flashcardHeightPercentage: Platform.isMobile ? 100 : 80, flashcardWidthPercentage: Platform.isMobile ? 100 : 40, @@ -262,6 +265,7 @@ export class SRSettingTab extends PluginSettingTab { }), ); + addMultiClozeSetting(containerEl, this.plugin); new Setting(containerEl) .setName(t("SHOW_CARD_CONTEXT")) .setDesc(t("SHOW_CARD_CONTEXT_DESC")) diff --git a/src/settings/multiClozeSetting.ts b/src/settings/multiClozeSetting.ts new file mode 100644 index 00000000..06468bb0 --- /dev/null +++ b/src/settings/multiClozeSetting.ts @@ -0,0 +1,15 @@ +import { Setting } from "obsidian"; +import { t } from "src/lang/helpers"; +import SRPlugin from "src/main"; + +export function addMultiClozeSetting(containerEl: HTMLElement, plugin: SRPlugin) { + new Setting(containerEl) + .setName(t("MULTI_CLOZE")) + .setDesc(t("MULTI_CLOZE_DESC")) + .addToggle((toggle) => { + toggle.setValue(plugin.data.settings.multiClozeCard).onChange((newValue) => { + plugin.data.settings.multiClozeCard = newValue; + plugin.savePluginData(); + }); + }); +} From 31d6dbf250119bae2a38bdd1cb988678f9ef0582 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:09:18 +0800 Subject: [PATCH 118/155] fix error --- src/main.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main.ts b/src/main.ts index cbd70577..f6d3352d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -428,6 +428,9 @@ export default class SRPlugin extends Plugin { ); await ReviewNote.getInstance().sync(notes, this.reviewDecks, this.easeByPath); + // Reviewable cards are all except those with the "edit later" tag + this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); + // sort the deck names this.deckTree.sortSubdecksList(); this.remainingDeckTree = DeckTreeFilter.filterForRemainingCards( @@ -571,14 +574,13 @@ export default class SRPlugin extends Plugin { new Notice(t("NOTE_IN_IGNORED_FOLDER")); return; } - let result: { sNote: SchedNote; buryList?: string[] }; - let ease = this.getLinkedEase(note); + const ease = this.getLinkedEase(note); const revnote = ReviewNote.getInstance(); if (!revnote.tagCheck(note)) { return; } - result = revnote.responseProcess(note, response, ease); + const result = revnote.responseProcess(note, response, ease); if (settings.burySiblingCards) { this.data.buryList.push(...result.buryList); await this.savePluginData(); From 352ccc751dbfe22058c340f7bf4ca2eb02c4848e Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Thu, 22 Feb 2024 11:51:40 +0800 Subject: [PATCH 119/155] fix update reviewDecks --- src/main.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main.ts b/src/main.ts index 1a46390e..fabeba15 100644 --- a/src/main.ts +++ b/src/main.ts @@ -689,11 +689,13 @@ export default class SRPlugin extends Plugin { // It was a new note, remove it from the new notes and schedule it. if (!wasDueInDeck) { - reviewDeck.newNotes.splice( - reviewDeck.newNotes.findIndex((newNote: TFile) => newNote.path === note.path), - 1, + const newidx = reviewDeck.newNotes.findIndex( + (newNote: TFile) => newNote.path === note.path, ); - reviewDeck.scheduledNotes.push({ note, dueUnix: due.valueOf() }); + if (newidx >= 0) { + reviewDeck.newNotes.splice(newidx, 1); + reviewDeck.scheduledNotes.push({ note, dueUnix: due.valueOf() }); + } } }); From 609c06a56ff2a401dfffe4f961e2752df32979bd Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 18 Jun 2024 21:58:42 +0800 Subject: [PATCH 120/155] fix merge error --- docs/changelog.md | 1 + src/DeckTreeIterator.ts | 7 +- src/NoteQuestionParser.ts | 2 +- src/QuestionType.ts | 4 +- src/dataStore/location_switch.ts | 9 +- src/dataStore/queue.ts | 1 + src/gui/FlashcardReviewView.tsx | 14 +- src/gui/confirm.tsx | 2 +- src/gui/reviewresponse-modal.tsx | 18 ++- src/lang/locale/cz.ts | 2 + src/lang/locale/it.ts | 56 ++++++++ src/lang/locale/pl.ts | 56 ++++++++ src/main.ts | 10 +- src/reviewNote/review-note.ts | 6 +- styles.css | 233 ++----------------------------- tests/unit/Note.test.ts | 5 +- 16 files changed, 162 insertions(+), 264 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 3b66b5b3..38e478b3 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -161,6 +161,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fixed sidebar doesn't show/update some files. [#393](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/393) #### [Unreleased] + #### [1.12.4](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.12.3...1.12.4) - chore: fix package manager issue in CI [`#939`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/939) diff --git a/src/DeckTreeIterator.ts b/src/DeckTreeIterator.ts index 3124d54b..1fe31918 100644 --- a/src/DeckTreeIterator.ts +++ b/src/DeckTreeIterator.ts @@ -119,6 +119,7 @@ class SingleDeckIterator { const cardList = this.deck.getCardListForCardType(card.cardListType); // console.debug("cardList: ", cardList, this.deck); idx = cardList.findIndex((v) => v === card); + this.previousCard = card; } if (idx >= 0) { this.setCardListType(card.cardListType, idx); @@ -319,7 +320,11 @@ export class DeckTreeIterator implements IDeckTreeIterator { result = this.singleDeckIterator.nextMultiClozeCard( this.singleDeckIterator.previousCard, ); - if (result) return result; + if (result) { + return result; + } else { + this.singleDeckIterator.previousCard = undefined; + } } if (this.iteratorOrder.cardOrder == CardOrder.EveryCardRandomDeckAndCard) { diff --git a/src/NoteQuestionParser.ts b/src/NoteQuestionParser.ts index 0b8a4301..c6c74ec9 100644 --- a/src/NoteQuestionParser.ts +++ b/src/NoteQuestionParser.ts @@ -317,7 +317,7 @@ export class NoteQuestionParser { // private determineQuestionTopicPathList(question: Question): TopicPathList { let result: TopicPathList; - if (this.settings.convertFoldersToDecks) { + if (this.settings.convertFoldersToDecks || this.settings.trackedNoteToDecks) { result = new TopicPathList([this.folderTopicPath]); } else { // If present, the question specific TopicPath takes precedence over everything else diff --git a/src/QuestionType.ts b/src/QuestionType.ts index d10542af..f29085b5 100644 --- a/src/QuestionType.ts +++ b/src/QuestionType.ts @@ -148,7 +148,7 @@ export class QuestionType_ClozeUtil { } static convMultiCloze(siblings: Card[], questionText: string, settings: SRSettings): Card[] { - const newsiblings = siblings.filter((card) => !card.isNew && !card.isDue); + // const newsiblings = siblings.filter((card) => !card.isNew && !card.isDue); const idxs = siblings .map((card) => { if (card.isNew || card.isDue) { @@ -176,7 +176,7 @@ export class QuestionType_ClozeUtil { QuestionType_ClozeUtil.renderClozeBack( questionText.substring(deletionStart, deletionEnd), ); - let sibStartEndIdx = getStartEndIndex(sibIdx); + const sibStartEndIdx = getStartEndIndex(sibIdx); ftsibls.slice(sibIdx, sibStartEndIdx.end).forEach((m) => { if (m.index <= startIdx) { return true; diff --git a/src/dataStore/location_switch.ts b/src/dataStore/location_switch.ts index ec3a8c33..3e84f2a3 100644 --- a/src/dataStore/location_switch.ts +++ b/src/dataStore/location_switch.ts @@ -126,12 +126,12 @@ export class LocationSwitch { notes = notes.filter( (noteFile) => !isIgnoredPath(settings.noteFoldersToIgnore, noteFile.path) && - plugin.createSrTFile(noteFile).getAllTags().length > 0, + plugin.createSrTFile(noteFile).getAllTagsFromCache().length > 0, ); for (const noteFile of notes) { let deckname = Tags.getNoteDeckName(noteFile, this.settings); const srfile = plugin.createSrTFile(noteFile); - let topicPath: TopicPath = plugin.findTopicPath(srfile); + let topicPath: TopicPath = TopicPath.getFolderPathFromFilename(srfile, settings); let fileText: string = await noteFile.vault.read(noteFile); let fileChanged = false; @@ -153,7 +153,7 @@ export class LocationSwitch { // delete review/default tag if ( (topicPath.hasPath && topicPath.formatAsTag().includes(this.revTag)) || - srfile.getAllTags().includes("#" + this.revTag) + srfile.getAllTagsFromCache().includes("#" + this.revTag) ) { deckname = DEFAULT_DECKNAME; topicPath = new TopicPath([deckname]); @@ -315,8 +315,9 @@ export class LocationSwitch { if (!(note instanceof TFile)) { return; } - const deckPath: string[] = plugin.findTopicPath( + const deckPath: string[] = TopicPath.getFolderPathFromFilename( plugin.createSrTFile(note), + this.settings, ).path; let fileText: string = await note.vault.read(note); let fileChanged = false; diff --git a/src/dataStore/queue.ts b/src/dataStore/queue.ts index 8163b1c5..e90dfc4a 100644 --- a/src/dataStore/queue.ts +++ b/src/dataStore/queue.ts @@ -150,6 +150,7 @@ export class Queue implements IQueue { * @returns {number | null} */ getNextId(key?: string): number | null { + key = key ? key : KEY_ALL; if (this.queueSize(key) > 0) { return this.queue[key][0]; } else if (this.repeatQueue.length > 0) { diff --git a/src/gui/FlashcardReviewView.tsx b/src/gui/FlashcardReviewView.tsx index be1b23ae..5e33fbf4 100644 --- a/src/gui/FlashcardReviewView.tsx +++ b/src/gui/FlashcardReviewView.tsx @@ -46,7 +46,6 @@ export class FlashcardReviewView { public context: HTMLElement; public response: HTMLDivElement; - public responseDiv: HTMLElement; public responseBtns: HTMLButtonElement[]; public hardButton: HTMLButtonElement; public goodButton: HTMLButtonElement; @@ -525,33 +524,24 @@ export class FlashcardReviewView { // -> Response private _createResponseBtns() { - this.responseDiv = this.response.createDiv("sr-flashcard-response"); const optBtnCounts = this.plugin.algorithm.srsOptions().length; let btnCols = 4; if (!Platform.isMobile && optBtnCounts > btnCols) { btnCols = optBtnCounts; } - this.responseDiv.setAttribute( - "style", - `grid-template-columns: ${"1fr ".repeat(btnCols - 1)}`, - ); - for (let i = 1; i < this.options.length; i++) { this.responseBtns.push(document.createElement("button")); this.responseBtns[i].setAttribute("id", "sr-" + this.options[i].toLowerCase() + "-btn"); - this.responseBtns[i].setAttribute("class", "ResponseFloatBarCommandItem"); - this.responseBtns[i].addClass("sr-is-hidden"); + this.responseBtns[i].addClasses(["sr-response-button", "sr-is-hidden"]); this.responseBtns[i].setText(this.plugin.data.settings.flashcardHardText); this.responseBtns[i].addEventListener("click", () => { this._processReview(i); }); - this.responseDiv.appendChild(this.responseBtns[i]); + this.response.appendChild(this.responseBtns[i]); } this.hardButton = this.responseBtns[1]; this.goodButton = this.responseBtns.at(-2); this.easyButton = this.responseBtns.last(); - - // this.responseDiv.style.display = "none"; } private _setupResponseBtns(btnTexts: string[]) { diff --git a/src/gui/confirm.tsx b/src/gui/confirm.tsx index 7d203da4..70a6d5bc 100644 --- a/src/gui/confirm.tsx +++ b/src/gui/confirm.tsx @@ -22,7 +22,7 @@ export default class ConfirmModal { // contentEl.createEl("p").setText(this.message); const buttonDiv = contentEl.createDiv("srs-flex-row"); - // buttonDiv.setAttribute("align", "center"); + // buttonDiv.setAttribute("justify-content", "space-evenly"); new ButtonComponent(buttonDiv) .setButtonText("Confirm") diff --git a/src/gui/reviewresponse-modal.tsx b/src/gui/reviewresponse-modal.tsx index f597f06a..4cedc9c6 100644 --- a/src/gui/reviewresponse-modal.tsx +++ b/src/gui/reviewresponse-modal.tsx @@ -23,7 +23,7 @@ export class reviewResponseModal { // mode: FlashcardModalMode; private answerBtn: HTMLElement; private buttons: HTMLButtonElement[]; - private responseDiv: HTMLElement; + private response: HTMLElement; private responseInterval: number[]; private showInterval = true; private buttonTexts: string[]; @@ -82,17 +82,16 @@ export class reviewResponseModal { } this.containerEl = createEl("div"); this.containerEl.setAttribute("id", this.barId); - this.containerEl.addClass("ResponseFloatBarDefaultAesthetic"); // this.containerEl.setAttribute("style", `grid-template-columns: ${"1fr ".repeat(btnCols)}`); - this.containerEl.setAttribute("style", `grid-template-rows: ${"1fr ".repeat(1)}`); + // this.containerEl.setAttribute("style", `grid-template-rows: ${"1fr ".repeat(1)}`); this.containerEl.style.visibility = "visible"; // : "hidden" document.body .querySelector(".mod-vertical.mod-root") .insertAdjacentElement("afterbegin", this.containerEl); this.contentEl = this.containerEl.createDiv("sr-show-response"); - this.responseDiv = this.contentEl.createDiv("sr-flashcard-response"); - this.responseDiv.setAttribute("style", `grid-template-columns: ${"1fr ".repeat(btnCols)}`); + this.response = this.contentEl.createDiv("sr-show-response"); + this.response.setAttribute("style", `grid-template-columns: ${"1fr ".repeat(btnCols)}`); this.buttons = []; this.createButtons_responses(); @@ -126,16 +125,15 @@ export class reviewResponseModal { this.options.forEach((opt: string, index) => { const btn = document.createElement("button"); btn.setAttribute("id", "sr-" + opt.toLowerCase() + "-btn"); - btn.setAttribute("class", this.barItemId); + btn.addClasses(["sr-response-button"]); //, "sr-is-hidden" // btn.setAttribute("aria-label", "Hotkey: " + (index + 1)); // btn.setAttribute("style", `width: calc(95%/${buttonCounts});`); // setIcon(btn, item.icon); - // let text = btnText[algo][index]; const text = this.getTextWithInterval(index); btn.setText(text); btn.addEventListener("click", () => this.buttonClick(opt)); this.buttons.push(btn); - this.responseDiv.appendChild(btn); + this.response.appendChild(btn); }); } @@ -248,7 +246,7 @@ export class reviewResponseModal { // this.mode = FlashcardModalMode.Back; this.answerBtn.style.display = "none"; - this.responseDiv.style.display = "grid"; + this.response.style.display = "grid"; this.options.forEach((opt, index) => { const btn = document.getElementById("sr-" + opt.toLowerCase() + "-btn"); @@ -262,7 +260,7 @@ export class reviewResponseModal { // this.mode = FlashcardModalMode.Front; this.answerBtn.style.display = "block"; - this.responseDiv.style.display = "none"; + this.response.style.display = "none"; // this.responseDiv.toggleVisibility(false); //还是会占位 } diff --git a/src/lang/locale/cz.ts b/src/lang/locale/cz.ts index 927f7769..8c07589f 100644 --- a/src/lang/locale/cz.ts +++ b/src/lang/locale/cz.ts @@ -80,6 +80,8 @@ export default { BURY_SIBLINGS_TILL_NEXT_DAY: "Odložit příbuzné kartičky na další den?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Příbuzné kartičky jsou kartičky generované z textu stejné poznámky například cloze smazání", + MULTI_CLOZE: "enable multi-cloze card?", + MULTI_CLOZE_DESC: "Combine new/ondue sibling clozes into one card.", SHOW_CARD_CONTEXT: "Ukázat kontext v kartičce?", SHOW_CARD_CONTEXT_DESC: "například Titulek > Nadpis1 > Podnadpis > ... > Podnadpis", CARD_MODAL_HEIGHT_PERCENT: "Výška kartiček v procentech", diff --git a/src/lang/locale/it.ts b/src/lang/locale/it.ts index 33ddff94..e0762f84 100644 --- a/src/lang/locale/it.ts +++ b/src/lang/locale/it.ts @@ -10,6 +10,7 @@ export default { SKIP: "Salta", EDIT_CARD: "Modifica scheda", RESET_CARD_PROGRESS: "Ripristina i progressi della scheda", + RESET: "Reset", HARD: "Difficile", GOOD: "Buono", EASY: "Facile", @@ -21,6 +22,7 @@ export default { CURRENT_EASE_HELP_TEXT: "Difficoltà attuale: ", CURRENT_INTERVAL_HELP_TEXT: "Intervallo attuale: ", CARD_GENERATED_FROM: "Generato da: ${notePath}", + OPEN_NOTE: "Open Note", // main.ts OPEN_NOTE_FOR_REVIEW: "Apri una nota per rivisita", @@ -49,6 +51,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}d", MONTHS_STR_IVL_MOBILE: "${interval}m", YEARS_STR_IVL_MOBILE: "${interval}y", + HOURS_STR_IVL: "${interval}hour(s)", + MINUTES_STR_IVL: "${interval}minute(s)", + HOURS_STR_IVL_MOBILE: "${interval}h", + MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts SETTINGS_HEADER: "Plugin per ripetizione spaziata - Impostazioni", @@ -76,6 +82,8 @@ export default { BURY_SIBLINGS_TILL_NEXT_DAY: "Sotterrare schede sorelle fino al giorno dopo?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Le schede sorelle sono schede generate dallo stesso testo della scheda, per esempio i.e. cloze deletions", + MULTI_CLOZE: "enable multi-cloze card?", + MULTI_CLOZE_DESC: "Combine new/ondue sibling clozes into one card.", SHOW_CARD_CONTEXT: "Mostrare contesto nelle schede?", SHOW_CARD_CONTEXT_DESC: "per esempio, Titolo > Intestazione 1 > Sottotitolo 1 > ... > Sottotitolo", @@ -152,6 +160,48 @@ export default { LOGGING: "Registrando", DISPLAY_DEBUG_INFO: "Visualizza informazione di debug sulla console per sviluppatori?", + DATA_LOC: "Data Location", + DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", + DATA_FOLDER: "Folder for `tracked_files.json`", + NEW_PER_DAY: "New Per Day", + NEW_PER_DAY_DESC: + "Maximum number of new (unreviewed) notes to add to the queue each day, set `-1` with unlimit.", + NEW_PER_DAY_NAN: "Timeout must be a number", + NEW_PER_DAY_NEG: "New per day must be -1 or greater.", + REPEAT_ITEMS: "Repeat Items", + REPEAT_ITEMS_DESC: "Should items marked as incorrect be repeated until correct?", + ALGORITHMS_CONFIRM: `Switching algorithms might reset or impact review timings on existing items. + This change is irreversible. Changing algorithms only takes effect after a restart + or a plugin reload. Are you sure you want to switch algorithms? + `, + ALGORITHMS_DESC: + 'The algorithm used for spaced repetition. For more information see algorithms.', + CONVERT_TRACKED_TO_DECK: "Convert Tracked Notes to decks?", + REVIEW_FLOATBAR: "Review Response FloatBar", + REVIEW_FLOATBAR_DESC: + "only working when autoNextNote is true. show it when reviewing note via click statusbar/sidebar/command.", + REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", + REVIEW_NOTE_DIRECTLY_DESC: + "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + INTERVAL_SHOWHIDE: "Display Next Review Interval", + INTERVAL_SHOWHIDE_DESC: "whether to display next revivew iterval on the response buttons.", + REQUEST_RETENTION: "Request_retention", + REQUEST_RETENTION_DESC: + "The probability (percentage) that you expect to recall the answer the next time you review", + REVLOG_TAGS: "Tags for output review log", + REVLOG_TAGS_DESC: + "Tags for output review log, could be flashcards tags or/and notes tags(e.g. #review #flashcards #tag1), default empty means it output to the review log file normally without filtered by tags", + + FLASHCARD_AGAIN_LABEL: "Again Button Text", + FLASHCARD_BLACKOUT_LABEL: "Blackout Button Text", + FLASHCARD_INCORRECT_LABEL: "Incorrect Button Text", + "FLASHCARD_INCORRECT (EASY)_LABEL": "Incorrect (Easy) Button Text", + FLASHCARD_AGAIN_DESC: 'Customize the label for the "Again" Button', + FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', + FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', + "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", + // sidebar.ts NOTES_REVIEW_QUEUE: "Coda di note da rivedere", CLOSE: "Chiusi", @@ -184,4 +234,10 @@ export default { CARD_TYPE_YOUNG: "Giovani", CARD_TYPE_MATURE: "Mature", CARD_TYPES_SUMMARY: "Schede tottali: ${totalCardsCount}", + REVIEWED_TODAY: "Reviewed today", + REVIEWED_TODAY_DESC: "counts of cards/notes you have reviewed today", + NEW_LEARNED: "New Learned", + DUE_REVIEWED: "due Reviewed", + REVIEWED_TODAY_SUMMARY: "Total Reviewed today: ${totalreviewedCount}", + DATE: "Date", }; diff --git a/src/lang/locale/pl.ts b/src/lang/locale/pl.ts index 3d3cf47d..cc7d19db 100644 --- a/src/lang/locale/pl.ts +++ b/src/lang/locale/pl.ts @@ -10,6 +10,7 @@ export default { SKIP: "Pomiń", EDIT_CARD: "Edytuj kartę", RESET_CARD_PROGRESS: "Zresetuj postęp karty", + RESET: "Reset", HARD: "Trudne", GOOD: "Średnio Trudne", EASY: "Łatwe", @@ -21,6 +22,7 @@ export default { CURRENT_EASE_HELP_TEXT: "Aktualna łatwość: ", CURRENT_INTERVAL_HELP_TEXT: "Aktualny interwał: ", CARD_GENERATED_FROM: "Wygenerowano z: ${notePath}", + OPEN_NOTE: "Open Note", // main.ts OPEN_NOTE_FOR_REVIEW: "Otwórz notatkę do przeglądu", @@ -48,6 +50,10 @@ export default { DAYS_STR_IVL_MOBILE: "${interval}d", MONTHS_STR_IVL_MOBILE: "${interval}m", YEARS_STR_IVL_MOBILE: "${interval}r", + HOURS_STR_IVL: "${interval}hour(s)", + MINUTES_STR_IVL: "${interval}minute(s)", + HOURS_STR_IVL_MOBILE: "${interval}h", + MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts SETTINGS_HEADER: "Spaced Repetition - Ustawienia", @@ -74,6 +80,8 @@ export default { BURY_SIBLINGS_TILL_NEXT_DAY: "Czy ukrywać karty rodzeństwa do następnego dnia?", BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Rodzeństwo to karty wygenerowane z tego samego tekstu karty, np. usunięcia zamaskowane", + MULTI_CLOZE: "enable multi-cloze card?", + MULTI_CLOZE_DESC: "Combine new/ondue sibling clozes into one card.", SHOW_CARD_CONTEXT: "Czy pokazywać kontekst na kartach?", SHOW_CARD_CONTEXT_DESC: "np. Tytuł > Nagłówek 1 > Podnagłówek > ... > Podnagłówek", CARD_MODAL_HEIGHT_PERCENT: "Procentowa wysokość fiszki", @@ -149,6 +157,48 @@ export default { LOGGING: "Logowanie", DISPLAY_DEBUG_INFO: "Wyświetl informacje debugowania w konsoli deweloperskiej?", // sidebar.ts + DATA_LOC: "Data Location", + DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", + DATA_FOLDER: "Folder for `tracked_files.json`", + NEW_PER_DAY: "New Per Day", + NEW_PER_DAY_DESC: + "Maximum number of new (unreviewed) notes to add to the queue each day, set `-1` with unlimit.", + NEW_PER_DAY_NAN: "Timeout must be a number", + NEW_PER_DAY_NEG: "New per day must be -1 or greater.", + REPEAT_ITEMS: "Repeat Items", + REPEAT_ITEMS_DESC: "Should items marked as incorrect be repeated until correct?", + ALGORITHMS_CONFIRM: `Switching algorithms might reset or impact review timings on existing items. + This change is irreversible. Changing algorithms only takes effect after a restart + or a plugin reload. Are you sure you want to switch algorithms? + `, + ALGORITHMS_DESC: + 'The algorithm used for spaced repetition. For more information see algorithms.', + CONVERT_TRACKED_TO_DECK: "Convert Tracked Notes to decks?", + REVIEW_FLOATBAR: "Review Response FloatBar", + REVIEW_FLOATBAR_DESC: + "only working when autoNextNote is true. show it when reviewing note via click statusbar/sidebar/command.", + REVIEW_NOTE_DIRECTLY: "Reviewing Note directly?", + REVIEW_NOTE_DIRECTLY_DESC: + "when reviewing note via click statusbar or command, open it directly without having to select a tag to open a note", + INTERVAL_SHOWHIDE: "Display Next Review Interval", + INTERVAL_SHOWHIDE_DESC: "whether to display next revivew iterval on the response buttons.", + REQUEST_RETENTION: "Request_retention", + REQUEST_RETENTION_DESC: + "The probability (percentage) that you expect to recall the answer the next time you review", + REVLOG_TAGS: "Tags for output review log", + REVLOG_TAGS_DESC: + "Tags for output review log, could be flashcards tags or/and notes tags(e.g. #review #flashcards #tag1), default empty means it output to the review log file normally without filtered by tags", + + FLASHCARD_AGAIN_LABEL: "Again Button Text", + FLASHCARD_BLACKOUT_LABEL: "Blackout Button Text", + FLASHCARD_INCORRECT_LABEL: "Incorrect Button Text", + "FLASHCARD_INCORRECT (EASY)_LABEL": "Incorrect (Easy) Button Text", + FLASHCARD_AGAIN_DESC: 'Customize the label for the "Again" Button', + FLASHCARD_BLACKOUT_DESC: 'Customize the label for the "Blackout" Button', + FLASHCARD_INCORRECT_DESC: 'Customize the label for the "Incorrect" Button', + "FLASHCARD_INCORRECT (EASY)_DESC": 'Customize the label for the "Incorrect (Easy)" Button', + UNTRACK_WITH_REVIEWTAG: "UntrackWithReviewTag", + //sidebar.ts NOTES_REVIEW_QUEUE: "Kolejka przeglądu notatek", CLOSE: "Zamknij", @@ -181,4 +231,10 @@ export default { CARD_TYPE_YOUNG: "Młode", CARD_TYPE_MATURE: "Stare", CARD_TYPES_SUMMARY: "Łączna liczba kart: ${totalCardsCount}", + REVIEWED_TODAY: "Reviewed today", + REVIEWED_TODAY_DESC: "counts of cards/notes you have reviewed today", + NEW_LEARNED: "New Learned", + DUE_REVIEWED: "due Reviewed", + REVIEWED_TODAY_SUMMARY: "Total Reviewed today: ${totalreviewedCount}", + DATE: "Date", }; diff --git a/src/main.ts b/src/main.ts index 8605720e..defdf36f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -565,12 +565,6 @@ export default class SRPlugin extends Plugin { if (this.getActiveLeaf(REVIEW_QUEUE_VIEW_TYPE)) this.reviewQueueView.redraw(); } - private getTimeDuration(fname: string) { - const tdur = Date.now() - this.clock_start; - const msg = `${fname} time duration: ${tdur}`; - debug(fname, undefined, { msg }); - } - async loadNote(noteFile: TFile): Promise { const loader: NoteFileLoader = new NoteFileLoader(this.data.settings); const srFile: ISRFile = this.createSrTFile(noteFile); @@ -579,7 +573,7 @@ export default class SRPlugin extends Plugin { this.data.settings, ); - const note: Note = await loader.load(this.createSrTFile(noteFile), folderTopicPath); + const note: Note = await loader.load(srFile, folderTopicPath); ItemToDecks.updateCardsSchedbyItems(note, folderTopicPath); note.createMultiCloze(this.data.settings); if (note.hasChanged) { @@ -600,7 +594,7 @@ export default class SRPlugin extends Plugin { return; } - const result = revnote.responseProcess(note, response, ease); + const result = await revnote.responseProcess(note, response, ease); if (settings.burySiblingCards) { this.data.buryList.push(...result.buryList); await this.savePluginData(); diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index a03ef6f4..d58ec319 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -15,7 +15,7 @@ import { DateUtils, isIgnoredPath } from "src/util/utils_recall"; type Tsync = (notes: TFile[], reviewDecks?: Decks, easeByPath?: NoteEaseList) => Promise; export type TrespResult = { sNote: SchedNote; buryList?: string[] }; -type TsaveResponse = (note: TFile, response: ReviewResponse, ease: number) => any; +type TsaveResponse = (note: TFile, response: ReviewResponse, ease: number) => Promise; export class ReviewNote { private static _instance: ReviewNote; @@ -96,7 +96,7 @@ export class ReviewNote { async sync(notes: TFile[], reviewDecks?: Decks, easeByPath?: NoteEaseList): Promise { throw new Error("not implemented"); } - responseProcess(note: TFile, response: ReviewResponse, ease: number): TrespResult { + responseProcess(note: TFile, response: ReviewResponse, ease: number): Promise { throw new Error("not implemented"); } @@ -272,7 +272,7 @@ class RNonTrackfiles extends ReviewNote { if (deckName == null) return false; return true; } - responseProcess(note: TFile, response: ReviewResponse, ease?: number) { + async responseProcess(note: TFile, response: ReviewResponse, ease?: number) { const store = DataStore.getInstance(); const option = SrsAlgorithm.getInstance().srsOptions()[response]; diff --git a/styles.css b/styles.css index f1304cf7..c4f8862f 100644 --- a/styles.css +++ b/styles.css @@ -1,20 +1,10 @@ .tag-pane-tag-self:before { - content: ""; position: absolute; width: 90%; - height: 100%; top: -6px; left: 10%; - cursor: pointer; -} -.sr-flashcard-menu { - width: 100%; - display: flex; - justify-content: center; - align-items: center; - flex-direction: row; - gap: 1rem; } + .is-mobile #sr-modal { --top-space: calc(var(--safe-area-inset-top) + var(--header-height) + var(--size-4-2)); width: 100vw !important; @@ -39,39 +29,6 @@ body:not(.native-scrollbars) #sr-modal .modal-close-button { overflow: hidden; } -.sr-flashcard-input-area > textarea { - height: 100%; -} - -.sr-flashcard-edit-button-bar { - display: flex; - flex-direction: row-reverse; - justify-content: space-between; - width: 100%; - margin-top: 1rem; -} - -.sr-flashcard-response { - grid-template-columns: auto auto auto auto; -} - -.sr-ignorestats-response, -.sr-flashcard-response { - display: inline-grid; - width: 100%; - grid-template-columns: auto auto auto; - position: absolute; - bottom: 0; -} - -.sr-ignorestats-btn { - width: 100%; -} - -.sr-ignorestats-response { - grid-template-columns: auto auto; - gap: var(--size-4-4); -} .sr-is-hidden { display: none !important; } @@ -92,11 +49,6 @@ body:not(.native-scrollbars) #sr-modal .modal-close-button { height: 100%; } -#sr-show-answer { - display: block; - height: 48px; - line-height: 48px; -} .sr-header { display: flex; flex-direction: column; @@ -145,15 +97,22 @@ body:not(.native-scrollbars) #sr-modal .modal-close-button { background-color: var(--background-modifier-hover); } +.srs-flex-row, +.sr-show-response, .sr-response { display: flex; width: 100%; - margin-top: var(--size-4-4); gap: var(--size-4-4); + justify-content: center; +} + +.sr-response { + margin-top: var(--size-4-4); } .sr-response-button { height: 48px; + width: 100%; flex-grow: 1; margin: auto; line-height: 48px; @@ -169,14 +128,17 @@ body:not(.native-scrollbars) #sr-modal .modal-close-button { color: #ffffff !important; } +#sr-easy-btn, .sr-bg-green { background-color: #4caf50 !important; } +#sr-good-btn, .sr-bg-blue { background-color: #2094f3 !important; } +#sr-hard-btn, .sr-bg-red { background-color: #ff7043 !important; } @@ -269,19 +231,6 @@ body:not(.native-scrollbars) #sr-modal .modal-close-button { gap: var(--size-4-4); } - -#sr-hard-btn { - background-color: #f44336; -} - -#sr-good-btn { - background-color: #2196f3; -} - -#sr-easy-btn { - background-color: #4caf50; -} - .sr-flashcard .sr-context { font-style: italic; color: var(--text-faint); @@ -339,12 +288,6 @@ body:not(.native-scrollbars) #sr-modal .modal-close-button { width: 100%; } -#sr-flashcard-view { - font-size: var(--font-text-size); - overflow-y: auto; - height: 77%; - user-select: text; -} .sr-edit-view .sr-response-button.sr-spacer { opacity: 0; cursor: default; @@ -357,78 +300,6 @@ body:not(.native-scrollbars) #sr-modal .modal-close-button { border-right: 8px solid transparent; } -@media only screen and (max-width: 600px) { - .sr-back-btn { - width: initial !important; - } - - .sr-modal-content { - width: 98% !important; - /* height: 90%; */ - } - - #sr-context { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - width: 92%; - /* height: 20px; */ - } - - #sr-flashcard-view { - height: 70% !important; - } - - .sr-modal-content::-webkit-scrollbar, - #sr-flashcard-view::-webkit-scrollbar { - display: none; - } - - .sr-flashcard-response, - #sr-show-answer { - width: 93.5% !important; - line-height: 60px; - } - - .ResponseFloatBarCommandItem, - #sr-hard-btn, - #sr-good-btn, - #sr-easy-btn { - width: 90%; - } - - /* sidebar */ - .nav-file-title, - .nav-folder-title { - margin-bottom: var(--size-2-1); - display: flex; - } - - .nav-folder-title { - padding: var(--nav-item-parent-padding); - } - - .nav-folder.mod-root .nav-folder > .nav-folder-children { - padding-left: var(--nav-item-children-padding-left); - margin: 0 0 0 var(--nav-item-children-margin-left); - border-left: var(--nav-indentation-guide-width) solid var(--nav-indentation-guide-color); - } - - .nav-file { - margin-left: var(--nav-item-children-margin-left); - border-radius: var(--radius-s); - } -} - -.srs-flex-row { - display: flex; - width: 100%; - flex-flow: row wrap; - justify-content: space-evenly; - align-items: flex-start; - padding-top: 10px; -} - /* https://img.shields.io/github/v/release/chetachiezikeuzor/cMenu-Plugin */ /*---------------------------------------------------------------- ResponseFloatBar TOOLBAR @@ -457,47 +328,10 @@ ResponseFloatBar TOOLBAR background: var(--background-primary-alt); } -.sr-show-response { - height: 48px; - position: relative; - display: flex; - flex-direction: row; - justify-content: space-around; -} - -.ResponseFloatBarCommandItem { - border: none; - cursor: pointer; - padding: 5px 6px; - min-width: 10px; - width: 90%; - height: 48px; - box-shadow: none; - margin: auto; - position: relative; - - border-radius: 3px; - font-size: initial !important; - --background-secondary: var(--background-primary-alt); -} - -#reviewResponseModalBar button.ResponseFloatBarCommandItem:hover { - color: #050505; - background-color: var(--background-secondary); -} - -#reviewResponseModalBar button.ResponseFloatBarCommandItem svg { - width: 1.3em; - height: 1.3em; -} /*---------------------------------------------------------------- - ResponseFloatBar SETTING ITEMS + ResponseFloatBar Buttons ----------------------------------------------------------------*/ -.setting-item.ResponseFloatBarCommandItem:first-child { - padding-top: 18px; -} - #sr-reset-btn, #sr-again-btn { background: #6b6b6b; @@ -511,44 +345,3 @@ ResponseFloatBar TOOLBAR #sr-incorrect\ \(easy\)-btn { background: #ff9088; } - -#sr-showintvl-btn, -#sr-close-btn { - margin-top: 13px; - margin-right: 3px; - height: 20px; - width: 30px; -} - -.ResponseFloatBarCommandItem { - cursor: grab; - padding: 18px 0 18px 0; -} - -/*---------------------------------------------------------------- - ResponseFloatBar CLASS CHANGES - ----------------------------------------------------------------*/ - -.ResponseFloatBarGlassAesthetic { - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); -} - -.ResponseFloatBarDefaultAesthetic { - background-color: var(--background-primary); -} - -/*---------------------------------------------------------------- - ResponseFloatBar ICONS - ----------------------------------------------------------------*/ - -.ResponseFloatBarIconPick { - line-height: normal; - vertical-align: middle; - margin-right: 8px; -} - -.ResponseFloatBarIconPick svg { - width: 17px; - height: 17px; -} diff --git a/tests/unit/Note.test.ts b/tests/unit/Note.test.ts index 36db37f5..7160ed86 100644 --- a/tests/unit/Note.test.ts +++ b/tests/unit/Note.test.ts @@ -57,6 +57,7 @@ Q1::A1 `; let settings2 = DEFAULT_SETTINGS; + settings2.multiClozeCard = true; settings2.convertBoldTextToClozes = true; settings2.convertHighlightsToClozes = true; settings2.convertCurlyBracketsToClozes = true; @@ -72,7 +73,7 @@ Q1::A1 note.appendCardsToDeck(deck); let subdeck: Deck = deck.getDeck(new TopicPath(["flashcards"])); expect(subdeck.newFlashcards[0].front).toEqual( - `"This is a really very interesting and fascinating and [......] test"\n`, + `"This is a really very {{interesting}} and ==fascinating== and [......] test"\n`, ); expect(subdeck.newFlashcards[0].back).toEqual( `"This is a really very interesting and fascinating and great test"\n`, @@ -85,7 +86,7 @@ Q1::A1 `"This is a really very interesting and [.........] and [......] test"\n`, ); expect(subdeck.dueFlashcards[1].front).toEqual( - `"This is a really very interesting and [.........] and [......] test"\n`, + `"This is a really very {{interesting}} and [.........] and [......] test"\n`, ); expect(subdeck.dueFlashcards[1].back).toEqual( `"This is a really very interesting and fascinating and [......] test"\n`, From 70e099d32dc20155e47da6a9c269cc0fe2d6cb3d Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 21 Jun 2024 21:02:14 +0800 Subject: [PATCH 121/155] add debug msg --- src/main.ts | 57 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/src/main.ts b/src/main.ts index defdf36f..d60b11dd 100644 --- a/src/main.ts +++ b/src/main.ts @@ -67,6 +67,7 @@ import { LinkRank } from "src/algorithms/priorities/linkPageranks"; import { Queue } from "./dataStore/queue"; import { ReviewDeckSelectionModal } from "./gui/reviewDeckSelectionModal"; import { setDueDates } from "./algorithms/balance/balance"; +import { RepetitionItem } from "./dataStore/repetitionItem"; interface PluginData { settings: SRSettings; @@ -779,6 +780,35 @@ export default class SRPlugin extends Plugin { let item; let index = -1; + const isPreviewUndueNote = (item: RepetitionItem) => { + return ( + item.nextReview > Date.now() && + !Object.keys(this.store.data.queues.toDayLatterQueue).includes(item.ID.toString()) + ); + }; + const fShowItemInfo = (item: RepetitionItem, msg: string) => { + if (this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile) { + if (isPreviewUndueNote(item)) { + const calcDueCnt = deck.scheduledNotes.filter( + (snote) => snote.dueUnix < Date.now(), + ).length; + if (calcDueCnt !== deck.dueNotesCount) { + debug( + "check cnt", + msg, + 0, + deck, + `${deck.deckName} due cnt error: calc ${calcDueCnt}, dnc: ${deck.dueNotesCount}`, + ); + } + const id = "obsidian-spaced-repetition-recall:view-item-info"; + // eslint-disable-next-line + // @ts-ignore + this.app.commands.executeCommandById(id); + } + } + }; + index = ReviewNote.getNextDueNoteIndex( deck.dueNotesCount, this.data.settings.openRandomNote, @@ -786,10 +816,12 @@ export default class SRPlugin extends Plugin { if (index >= 0) { await this.app.workspace.getLeaf().openFile(deck.scheduledNotes[index].note); item = deck.scheduledNotes[index].item; + fShowItemInfo(item, "scheduledNoes index: " + index); show = true; // return; } else if (queue.queueSize(deckKey) > 0) { item = this.store.getNext(deckKey); + fShowItemInfo(item, "queue"); const path = this.store.getFilePath(item); const note = this.app.vault.getAbstractFileByPath(path) as TFile; if (item != null && item.isTracked && path != null && note instanceof TFile) { @@ -805,36 +837,15 @@ export default class SRPlugin extends Plugin { : 0; await this.app.workspace.getLeaf().openFile(deck.newNotes[index].note); item = deck.newNotes[index].item; + fShowItemInfo(item, "newNotes index:" + index); show = true; // return; } if (show) { if (this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile) { - const calcDueCnt = deck.scheduledNotes.filter( - (snote) => snote.dueUnix < Date.now(), - ).length; - if (calcDueCnt !== deck.dueNotesCount) { - debug( - "check cnt", - 0, - deck, - `${deck.deckName} due cnt error: calc ${calcDueCnt}, dnc: ${deck.dueNotesCount}`, - ); - } this.reviewFloatBar.display(item); - if ( - item.nextReview > Date.now() && - !Object.keys(this.store.data.queues.toDayLatterQueue).includes( - item.ID.toString(), - ) - ) { - const id = "obsidian-spaced-repetition-recall:view-item-info"; - // eslint-disable-next-line - // @ts-ignore - this.app.commands.executeCommandById(id); - } + // fShowItemInfo(item); } - // this.getTimeDuration("reviewNextNote"); return; } From d0de74beec65380cb36f36fa2db21c5d1462ef1a Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 21 Jun 2024 21:56:47 +0800 Subject: [PATCH 122/155] auto review next after postpone a note --- src/commands.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/commands.ts b/src/commands.ts index 3df62cfe..1bddebba 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -1,4 +1,4 @@ -import { MarkdownView } from "obsidian"; +import { MarkdownView, Notice } from "obsidian"; import ObsidianSrsPlugin from "./main"; import { ReviewNote } from "src/reviewNote/review-note"; import { ItemInfoModal } from "src/gui/info"; @@ -248,6 +248,7 @@ export default class Commands { name: "Postpone this note after x days", checkCallback: (checking: boolean) => { const file = plugin.app.workspace.getActiveFile(); + const settings = plugin.data.settings; if (file != null) { if (plugin.store.getTrackedFile(file.path)?.isTrackedNote) { if (!checking) { @@ -256,10 +257,14 @@ export default class Commands { plugin.app, "please input positive number", ); - input.submitCallback = (days: number) => { + input.submitCallback = async (days: number) => { postponeItems([plugin.store.getItembyID(tkfile.noteID)], days); plugin.store.save(); - plugin.sync(); + new Notice(`This note has been postponed ${days} days`); + await plugin.sync(); + if (settings.autoNextNote && plugin.lastSelectedReviewDeck) { + plugin.reviewNextNote(plugin.lastSelectedReviewDeck); + } }; input.open(); } From cc9d9db0f649a07089df2345a54fe2c8c5b79637 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 09:53:43 +0800 Subject: [PATCH 123/155] fix #45 bury siblings --- README.md | 2 ++ docs/README_ZH.md | 3 ++- src/Card.ts | 18 +++++++++++++++ src/Deck.ts | 2 +- src/FlashcardReviewSequencer.ts | 5 +++- src/ReviewDeck.ts | 9 +++++++- src/dataStore/itemToDecks.ts | 37 +----------------------------- src/dataStore/queue.ts | 18 ++++++++++++++- src/main.ts | 6 ++--- src/reviewNote/review-note.ts | 5 +--- src/settings.ts | 5 +++- src/settings/burySiblingSetting.ts | 17 ++++++++++++++ 12 files changed, 77 insertions(+), 50 deletions(-) create mode 100644 src/settings/burySiblingSetting.ts diff --git a/README.md b/README.md index 40fd0024..1fed931c 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ This is a modified version of [obsidian-spaced-repetition](https://github.com/st - Postpone notes/cards; - postpone to review after x days; - reschedule all scheduled items; +- setting `burySiblingCards` split into `burySiblingCards`(origin) and `burySiblingCardsByNoteReview`, and multi-clozes will not be buried; + ## Maintainers Wanted diff --git a/docs/README_ZH.md b/docs/README_ZH.md index 3930bd0f..0112bbaf 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -16,7 +16,8 @@ 8. 延后笔记/卡片; 9. 修改笔记/卡片在x天后复习; 10. 重排所有已排程的复习项; -11. 其他待发现的小改动; +11. 设置项 隐藏关联卡片拆分为 隐藏关联卡片(即原来的)和复习笔记时隐藏关联卡片;另,多个挖空不会被隐藏关联卡片; +12. 其他待发现的小改动; **注意** 没有使用过 obsidian-spaced-repetition 插件的可以直接用,正在使用 obsidian-spaced-repetition 插件的话,建议试用前先备份 :yum: diff --git a/src/Card.ts b/src/Card.ts index c290ceb4..15356877 100644 --- a/src/Card.ts +++ b/src/Card.ts @@ -1,6 +1,9 @@ import { Question } from "./Question"; import { CardScheduleInfo } from "./CardSchedule"; import { CardListType } from "./Deck"; +import { IQuestionPostponementList } from "./QuestionPostponementList"; +import { globalDateProvider } from "./util/DateProvider"; +import { Queue } from "./dataStore/queue"; export class Card { question: Question; @@ -34,6 +37,21 @@ export class Card { return this.hasSchedule && this.scheduleInfo.isDue(); } + getIsNotBury(questionPostponementList: IQuestionPostponementList): boolean { + let notBury = !questionPostponementList.includes(this.question); + if (notBury) { + return true; + } else if (this.hasSchedule) { + if ( + this.scheduleInfo.dueDate.isSameOrBefore(globalDateProvider.today) && + Object.keys(Queue.getInstance().toDayLatterQueue).includes(this.Id?.toString()) + ) { + notBury = true; + } + } + return notBury; + } + get isMultiCloze(): boolean { return this?.multiClozeIndex >= 0; } diff --git a/src/Deck.ts b/src/Deck.ts index 56a84458..f378e0e0 100644 --- a/src/Deck.ts +++ b/src/Deck.ts @@ -327,7 +327,7 @@ export class DeckTreeFilter { return deckTree.copyWithCardFilter( (card) => (reviewMode == FlashcardReviewMode.Cram || card.isNew || card.isDue) && - !questionPostponementList.includes(card.question), + card.getIsNotBury(questionPostponementList), ); } } diff --git a/src/FlashcardReviewSequencer.ts b/src/FlashcardReviewSequencer.ts index 6f5622fa..fadfff96 100644 --- a/src/FlashcardReviewSequencer.ts +++ b/src/FlashcardReviewSequencer.ts @@ -161,7 +161,10 @@ export class FlashcardReviewSequencer implements IFlashcardReviewSequencer { this.cardSequencer.moveCurrentCardToEndOfList(); this.cardSequencer.nextCard(); } else { - if (this.settings.burySiblingCards && !this.currentCard.isMultiCloze) { + if ( + (this.settings.burySiblingCards || this.settings.burySiblingCardsByNoteReview) && + !this.currentCard.isMultiCloze + ) { await this.burySiblingCards(); this.cardSequencer.deleteCurrentQuestionFromAllDecks(); } else { diff --git a/src/ReviewDeck.ts b/src/ReviewDeck.ts index bb56801d..b0e931b8 100644 --- a/src/ReviewDeck.ts +++ b/src/ReviewDeck.ts @@ -2,6 +2,7 @@ import { TFile } from "obsidian"; import { t } from "src/lang/helpers"; import { RepetitionItem } from "./dataStore/repetitionItem"; +import { DateUtils } from "./util/utils_recall"; export interface SchedNote { note: TFile; @@ -18,7 +19,7 @@ export class ReviewDeck { public newNotes: SchedNote[] = []; public scheduledNotes: SchedNote[] = []; public activeFolders: Set; - public dueNotesCount = 0; + private _dueNotesCount = 0; constructor(name: string) { this.deckName = name; @@ -41,4 +42,10 @@ export class ReviewDeck { return (pageranks[b.note.path] || 0) - (pageranks[a.note.path] || 0); }); } + + get dueNotesCount(): number { + return this.scheduledNotes.filter((snote) => { + return snote.item?.isDue || snote.dueUnix <= DateUtils.EndofToday; + }).length; + } } diff --git a/src/dataStore/itemToDecks.ts b/src/dataStore/itemToDecks.ts index e8bc59db..f4c06c05 100644 --- a/src/dataStore/itemToDecks.ts +++ b/src/dataStore/itemToDecks.ts @@ -5,8 +5,7 @@ import { ReviewDeck } from "src/ReviewDeck"; import { SrTFile } from "src/SRFile"; import { TopicPath } from "src/TopicPath"; import { DataStore } from "src/dataStore/data"; -import { getKeysPreserveType } from "src/util/utils"; -import { BlockUtils, DateUtils, debug, logExecutionTime } from "src/util/utils_recall"; +import { BlockUtils, debug, logExecutionTime } from "src/util/utils_recall"; import { CardInfo } from "./trackedFile"; import { Card } from "src/Card"; import { DataLocation } from "./dataLocation"; @@ -115,8 +114,6 @@ export class ItemToDecks { const trackedFile = store.getTrackedFile(note.path); const fileid = store.getTrackedFile(note.path).noteID; const item = store.getItembyID(fileid); - let now_number: number = now; - const nowToday: number = DateUtils.EndofToday; if (item == null) { // store._updateItem(fileid, ind, RPITEMTYPE.NOTE, rdeck.deckName); @@ -129,34 +126,6 @@ export class ItemToDecks { } const latterQue = store.data.queues.toDayLatterQueue; delete latterQue[fileid]; - if (now == null) { - now_number = Date.now(); - } else { - getKeysPreserveType(latterQue).forEach((idStr, _idx, _arr) => { - const id: number = Number(idStr); - const item = store.getItembyID(id); - if (item.deckName === rdeck.deckName && item.nextReview - Date.now() < 0) { - rdeck.dueNotesCount++; - // console.debug( - // `${rdeck.deckName}keysPreserve dueCnt: ${rdeck.dueNotesCount} \ - // item: toQ:`, - // item, - // latterQue, - // ); - delete latterQue[id]; - } - }); - } - - if (item.nextReview - now_number > 0 && item.nextReview <= nowToday) { - // console.debug( - // `add ${rdeck.deckName} dueCnt: ${rdeck.dueNotesCount} \ - // item: toQ:`, - // item, - // latterQue, - // ); - latterQue[fileid] = rdeck.deckName; - } if (item.hasDue) { rdeck.scheduledNotes.push({ @@ -166,10 +135,6 @@ export class ItemToDecks { interval: item.interval, ease: item.ease, }); - if (item.nextReview <= now_number) { - rdeck.dueNotesCount++; - // console.debug(`${rdeck.deckName} isDue dueCnt: ${rdeck.dueNotesCount}`, item); - } } else { rdeck.newNotes.push({ note, item }); } diff --git a/src/dataStore/queue.ts b/src/dataStore/queue.ts index e90dfc4a..df94f777 100644 --- a/src/dataStore/queue.ts +++ b/src/dataStore/queue.ts @@ -2,6 +2,7 @@ import { DateUtils, isArray, logExecutionTime } from "src/util/utils_recall"; import { DataStore } from "./data"; import { TrackedFile } from "./trackedFile"; import { RepetitionItem } from "./repetitionItem"; +import { getKeysPreserveType } from "src/util/utils"; export interface IQueue { /** @@ -289,7 +290,6 @@ export class Queue implements IQueue { // // if (!Object.keys(repeatDeckCounts).includes(dname)) { // // repeatDeckCounts[dname] = 0; // // } - // rvdecks[dname].dueNotesCount++; // this.plugin.dueNotesCount++; // }); // // return repeatDeckCounts; @@ -351,6 +351,22 @@ export class Queue implements IQueue { this.remove(item, this.queue[item.deckName]); if (repeatItems && !correct) { this.push(this.repeatQueue, item.ID); // Re-add until correct. + } else { + // update this.toDayLatterQueue + const store = DataStore.getInstance(); + if (item.nextReview <= DateUtils.EndofToday) { + this.toDayLatterQueue[item.ID] = item.deckName; + } + getKeysPreserveType(this.toDayLatterQueue) + .map((idStr) => { + const id: number = Number(idStr); + return store.getItembyID(id); + }) + .forEach((item) => { + if (item.nextReview - Date.now() < 0) { + delete this.toDayLatterQueue[item.ID]; + } + }); } } diff --git a/src/main.ts b/src/main.ts index defdf36f..1c8ae99b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -537,10 +537,8 @@ export default class SRPlugin extends Plugin { const now = window.moment(Date.now()); Object.values(this.reviewDecks).forEach((reviewDeck: ReviewDeck) => { - reviewDeck.dueNotesCount = 0; reviewDeck.scheduledNotes.forEach((scheduledNote: SchedNote) => { if (scheduledNote.dueUnix <= now.valueOf()) { - reviewDeck.dueNotesCount++; this.dueNotesCount++; } @@ -595,7 +593,7 @@ export default class SRPlugin extends Plugin { } const result = await revnote.responseProcess(note, response, ease); - if (settings.burySiblingCards) { + if (settings.burySiblingCardsByNoteReview) { this.data.buryList.push(...result.buryList); await this.savePluginData(); } @@ -698,7 +696,7 @@ export default class SRPlugin extends Plugin { await this.app.vault.modify(note, fileText); const buryList: string[] = []; - if (this.data.settings.burySiblingCards) { + if (this.data.settings.burySiblingCardsByNoteReview) { const noteX: Note = await this.loadNote(note); for (const question of noteX.questionList) { buryList.push(question.questionText.textHash); diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index d58ec319..91e587e0 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -285,7 +285,7 @@ class RNonTrackfiles extends ReviewNote { item.updateAlgorithmData("ease", ease); } const buryList: string[] = []; - if (this.settings.burySiblingCards) { + if (this.settings.burySiblingCardsByNoteReview) { const trackFile = store.getTrackedFile(note.path); if (trackFile.hasCards) { for (const cardinfo of trackFile.cardItems) { @@ -324,9 +324,6 @@ function preUpdateDeck(deck: ReviewDeck, note: TFile) { return sNote.note === note; }); deck.scheduledNotes.splice(index, 1); - if (index < deck.dueNotesCount) { - deck.dueNotesCount--; - } } return; } diff --git a/src/settings.ts b/src/settings.ts index a19e5f29..8a2e3dd0 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -17,6 +17,7 @@ import { } from "./settings/algorithmSetting"; import { addUntrackSetting, addTrackedNoteToDecksSetting } from "./settings/trackSetting"; import { buildDonation } from "./settings/donation"; +import { addburySiblingSetting } from "./settings/burySiblingSetting"; export interface SRSettings { // flashcards @@ -28,6 +29,7 @@ export interface SRSettings { convertFoldersToDecks: boolean; cardCommentOnSameLine: boolean; burySiblingCards: boolean; + burySiblingCardsByNoteReview: boolean; multiClozeCard: boolean; showContextInCards: boolean; flashcardHeightPercentage: number; @@ -90,6 +92,7 @@ export const DEFAULT_SETTINGS: SRSettings = { convertFoldersToDecks: false, cardCommentOnSameLine: false, burySiblingCards: false, + burySiblingCardsByNoteReview: false, multiClozeCard: false, showContextInCards: true, flashcardHeightPercentage: Platform.isMobile ? 100 : 80, @@ -279,7 +282,7 @@ export class SRSettingTab extends PluginSettingTab { await this.plugin.savePluginData(); }), ); - + addburySiblingSetting(containerEl, this.plugin); addMultiClozeSetting(containerEl, this.plugin); new Setting(containerEl) .setName(t("SHOW_CARD_CONTEXT")) diff --git a/src/settings/burySiblingSetting.ts b/src/settings/burySiblingSetting.ts new file mode 100644 index 00000000..3944a14c --- /dev/null +++ b/src/settings/burySiblingSetting.ts @@ -0,0 +1,17 @@ +import { Setting } from "obsidian"; +import { t } from "src/lang/helpers"; +import SRPlugin from "src/main"; + +export function addburySiblingSetting(containerEl: HTMLElement, plugin: SRPlugin) { + new Setting(containerEl) + .setName(t("BURY_SIBLINGS_TILL_NEXT_DAY") + "by note review") + .setDesc(t("BURY_SIBLINGS_TILL_NEXT_DAY_DESC")) + .addToggle((toggle) => { + toggle + .setValue(plugin.data.settings.burySiblingCardsByNoteReview) + .onChange(async (newValue) => { + plugin.data.settings.burySiblingCardsByNoteReview = newValue; + await plugin.savePluginData(); + }); + }); +} From cc788fcd11961083a40db550a047f7f6f0173659 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 11:18:09 +0800 Subject: [PATCH 124/155] fix sidebar padding --- src/gui/Sidebar.tsx | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/gui/Sidebar.tsx b/src/gui/Sidebar.tsx index ec44a751..17457441 100644 --- a/src/gui/Sidebar.tsx +++ b/src/gui/Sidebar.tsx @@ -45,8 +45,11 @@ export class ReviewQueueListView extends ItemView { public redraw(): void { const activeFile: TFile | null = this.app.workspace.getActiveFile(); - const rootEl: HTMLElement = createDiv("nav-folder mod-root"); - const childrenEl: HTMLElement = rootEl.createDiv("nav-folder-children"); + // const rootEl: HTMLElement = createDiv("tree-item mod-root"); + // const childrenEl: HTMLElement = rootEl.createDiv("tree-item-children"); + // const childrenEl: HTMLElement = createDiv("tree-item mod-root"); + const childrenEl: HTMLElement = createDiv(); + const rootEl = childrenEl; for (const deckKey in this.plugin.reviewDecks) { const deck: ReviewDeck = this.plugin.reviewDecks[deckKey]; @@ -59,7 +62,7 @@ export class ReviewQueueListView extends ItemView { deckCollapsed, false, deck, - ).getElementsByClassName("nav-folder-children")[0] as HTMLElement; + ).getElementsByClassName("tree-item-children")[0] as HTMLElement; if (deck.newNotes.length > 0) { const newNotesFolderEl: HTMLElement = this.createRightPaneFolder( @@ -168,11 +171,11 @@ export class ReviewQueueListView extends ItemView { hidden: boolean, deck: ReviewDeck, ): HTMLElement { - const folderEl: HTMLDivElement = parentEl.createDiv("nav-folder"); - const folderTitleEl: HTMLDivElement = folderEl.createDiv("nav-folder-title"); - const childrenEl: HTMLDivElement = folderEl.createDiv("nav-folder-children"); + const folderEl: HTMLDivElement = parentEl.createDiv("tree-item"); + const folderTitleEl: HTMLDivElement = folderEl.createDiv("tree-item-self"); + const childrenEl: HTMLDivElement = folderEl.createDiv("tree-item-children"); const collapseIconEl: HTMLDivElement = folderTitleEl.createDiv( - "nav-folder-collapse-indicator collapse-icon", + "tree-item-collapse-indicator collapse-icon", ); collapseIconEl.innerHTML = COLLAPSE_ICON; @@ -180,7 +183,7 @@ export class ReviewQueueListView extends ItemView { (collapseIconEl.childNodes[0] as HTMLElement).style.transform = "rotate(-90deg)"; } - folderTitleEl.createDiv("nav-folder-title-content").setText(folderTitle); + folderTitleEl.createDiv("tree-item-self-content").setText(folderTitle); if (hidden) { folderEl.style.display = "none"; @@ -213,18 +216,18 @@ export class ReviewQueueListView extends ItemView { plugin: SRPlugin, ): void { const navFileEl: HTMLElement = folderEl - .getElementsByClassName("nav-folder-children")[0] - .createDiv("nav-file"); + .getElementsByClassName("tree-item-children")[0] + .createDiv("tree-item"); if (hidden) { navFileEl.style.display = "none"; } - const navFileTitle: HTMLElement = navFileEl.createDiv("nav-file-title"); + const navFileTitle: HTMLElement = navFileEl.createDiv("tree-item-self"); if (fileElActive) { navFileTitle.addClass("is-active"); } - navFileTitle.createDiv("nav-file-title-content").setText(file.note.basename); + navFileTitle.createDiv("tree-item-self-content").setText(file.note.basename); navFileTitle.addEventListener( "click", async (event: MouseEvent) => { @@ -256,7 +259,7 @@ export class ReviewQueueListView extends ItemView { } private changeFolderIconToExpanded(folderEl: HTMLElement): void { - const collapseIconEl = folderEl.find("div.nav-folder-collapse-indicator"); + const collapseIconEl = folderEl.find("div.tree-item-collapse-indicator"); (collapseIconEl.childNodes[0] as HTMLElement).style.transform = ""; } } From 7678ee0baad190c67554f13a358bc8ae789588d3 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 10:36:33 +0800 Subject: [PATCH 125/155] show cards info --- src/gui/info.ts | 49 ++++++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/gui/info.ts b/src/gui/info.ts index 1fb6f9f9..26ba32a3 100644 --- a/src/gui/info.ts +++ b/src/gui/info.ts @@ -4,6 +4,7 @@ import { AnkiData } from "src/algorithms/anki"; import { FsrsData } from "src/algorithms/fsrs"; import { DataStore } from "src/dataStore/data"; import { RepetitionItem } from "src/dataStore/repetitionItem"; +import { TrackedFile } from "src/dataStore/trackedFile"; import { SRSettings } from "src/settings"; export class ItemInfoModal extends Modal { @@ -32,20 +33,23 @@ export class ItemInfoModal extends Modal { const { contentEl } = this; //TODO: Implement Item info. // const item = this.store.getItemsOfFile(this.file.path)[0]; - // const path = this.store.getFilePath(item); + const path = this.file.path; // contentEl.createEl("p").setText("Item info of " + this.file.path); const buttonDivAll = contentEl.createDiv("srs-flex-row"); const contentdiv = contentEl.createEl("div"); - this.displayitem(contentdiv, this.item); - - // new ButtonComponent(buttonDivAll).setButtonText("Current").onClick(() => { - // this.displayitem(contentdiv, item); - // }); - // new ButtonComponent(buttonDivAll).setButtonText("All").onClick(() => { - // this.displayAllitems(contentdiv, this.store.data.items); - // // this.close(); - // }); + const tkfile = this.store.getTrackedFile(path); + const noteItem = this.store.getNoteItem(path); + if (tkfile.hasCards) { + new ButtonComponent(buttonDivAll).setButtonText("Note").onClick(() => { + this.displayitem(contentdiv, noteItem); + }); + new ButtonComponent(buttonDivAll).setButtonText("Cards in this Note").onClick(() => { + this.displayAllitems(contentdiv, tkfile); + // this.close(); + }); + } + this.displayitem(contentdiv, noteItem); const buttonDiv = contentEl.createDiv("srs-flex-row"); @@ -62,24 +66,27 @@ export class ItemInfoModal extends Modal { }); } - displayAllitems(contentEl: HTMLElement, items: RepetitionItem[]) { + displayAllitems(contentEl: HTMLElement, tkfile: TrackedFile) { contentEl.empty(); - items.forEach((item) => { - this.displayitemWithSummary(contentEl, item); + const stext = "LineNo:"; + tkfile.cardItems.forEach((cinfo) => { + const ln = cinfo.lineNo + 1; + this.displayitemWithSummary(contentEl, this.store.getItems(cinfo.itemIds), stext + ln); }); } - displayitemWithSummary(contentEl: HTMLElement, item: RepetitionItem) { + displayitemWithSummary(contentEl: HTMLElement, items: RepetitionItem[], text: string) { const details = contentEl.createEl("details"); const summary = details.createEl("summary"); - const div = details.createDiv(); - - // const plugin = this.plugin; - const path = this.store.getFilePath(item); - // details.createEl("p").setText("Item info of "+path); - summary.setText(path); - this.displayitem(div, item); + summary.setText(text); + items.forEach((item) => { + const divdetails = details.createEl("details"); + const divsummary = divdetails.createEl("summary"); + divsummary.setText("ID:" + item.ID.toString()); + const div = divdetails.createDiv(); + this.displayitem(div, item); + }); } displayitem(contentEl: HTMLElement, item: RepetitionItem) { From 88f4ffb3c562e8f66c2fb84dd4020e0eb99e2710 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 13:15:47 +0800 Subject: [PATCH 126/155] switch to ts-fsrs --- package.json | 20 +- pnpm-lock.yaml | 1786 ++++++++++++++++++---------------------- src/algorithms/fsrs.ts | 63 +- src/gui/StatsModal.tsx | 2 +- 4 files changed, 866 insertions(+), 1005 deletions(-) diff --git a/package.json b/package.json index 97c2950d..dec66753 100644 --- a/package.json +++ b/package.json @@ -21,20 +21,19 @@ "license": "MIT", "devDependencies": { "@popperjs/core": "^2.11.8", - "deepcopy": "^2.1.0", - "fsrs.js": "^1.2.1", "@types/jest": "^29.5.12", - "@types/node": "^20.11.24", + "@types/node": "^20.14.7", "@types/vhtml": "^2.2.9", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "@wdio/cli": "^8.32.3", - "@wdio/local-runner": "^8.32.3", - "@wdio/mocha-framework": "^8.32.3", - "@wdio/spec-reporter": "^8.32.2", + "@wdio/cli": "^8.39.0", + "@wdio/local-runner": "^8.39.0", + "@wdio/mocha-framework": "^8.39.0", + "@wdio/spec-reporter": "^8.39.0", "auto-changelog": "^2.4.0", "builtin-modules": "^3.3.0", "chai": "^4.4.1", + "deepcopy": "^2.1.0", "esbuild": "~0.19.12", "eslint": "^8.57.0", "jest": "^29.7.0", @@ -42,15 +41,16 @@ "jest-expect-message": "^1.1.3", "moment": "^2.30.1", "obsidian": "^1.5.7", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "prettier": "^3.3.2", + "ts-fsrs": "^3.5.7", + "ts-jest": "^29.1.5", "tslib": "2.6.1", "typescript": "5.1.6", "vhtml": "^2.2.0", "wdio-chromedriver-service": "^8.1.1" }, "dependencies": { - "chart.js": "^4.4.2", + "chart.js": "^4.4.3", "pagerank.js": "^1.0.2" }, "packageManager": "^pnpm@8.15.4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d870650e..41bce6f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: dependencies: chart.js: - specifier: ^4.4.2 - version: 4.4.2 + specifier: ^4.4.3 + version: 4.4.3 pagerank.js: specifier: ^1.0.2 version: 1.0.2 @@ -20,8 +20,8 @@ devDependencies: specifier: ^29.5.12 version: 29.5.12 '@types/node': - specifier: ^20.11.24 - version: 20.11.24 + specifier: ^20.14.7 + version: 20.14.7 '@types/vhtml': specifier: ^2.2.9 version: 2.2.9 @@ -32,17 +32,17 @@ devDependencies: specifier: ^6.21.0 version: 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@wdio/cli': - specifier: ^8.32.3 - version: 8.32.3(typescript@5.1.6) + specifier: ^8.39.0 + version: 8.39.0(typescript@5.1.6) '@wdio/local-runner': - specifier: ^8.32.3 - version: 8.32.3(typescript@5.1.6) + specifier: ^8.39.0 + version: 8.39.0(typescript@5.1.6) '@wdio/mocha-framework': - specifier: ^8.32.3 - version: 8.32.3 + specifier: ^8.39.0 + version: 8.39.0 '@wdio/spec-reporter': - specifier: ^8.32.2 - version: 8.32.2 + specifier: ^8.39.0 + version: 8.39.0 auto-changelog: specifier: ^2.4.0 version: 2.4.0 @@ -63,7 +63,7 @@ devDependencies: version: 8.57.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.11.24) + version: 29.7.0(@types/node@20.14.7) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -75,13 +75,16 @@ devDependencies: version: 2.30.1 obsidian: specifier: ^1.5.7 - version: 1.5.7(@codemirror/state@6.4.1)(@codemirror/view@6.24.1) + version: 1.5.7(@codemirror/state@6.4.1)(@codemirror/view@6.28.2) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.2 + version: 3.3.2 + ts-fsrs: + specifier: ^3.5.7 + version: 3.5.7 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(@babel/core@7.24.0)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6) + specifier: ^29.1.5 + version: 29.1.5(@babel/core@7.24.7)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6) tslib: specifier: 2.6.1 version: 2.6.1 @@ -93,15 +96,10 @@ devDependencies: version: 2.2.0 wdio-chromedriver-service: specifier: ^8.1.1 - version: 8.1.1(webdriverio@8.32.3) + version: 8.1.1(webdriverio@8.39.0) packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - /@ampproject/remapping@2.3.0: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -110,43 +108,35 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: true - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + /@babel/code-frame@7.24.7: + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - dev: true - - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 dev: true - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + /@babel/compat-data@7.24.7: + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.24.0: - resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} + /@babel/core@7.24.7: + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helpers': 7.24.0 - '@babel/parser': 7.24.0 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -154,292 +144,300 @@ packages: - supports-color dev: true - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + /@babel/generator@7.24.7: + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + /@babel/helper-compilation-targets@7.24.7: + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.1 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + /@babel/helper-environment-visitor@7.24.7: + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.7 dev: true - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + /@babel/helper-function-name@7.24.7: + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 dev: true - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + /@babel/helper-hoist-variables@7.24.7: + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + /@babel/helper-module-imports@7.24.7: + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-plugin-utils@7.24.0: - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + /@babel/helper-plugin-utils@7.24.7: + resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + /@babel/helper-simple-access@7.24.7: + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + /@babel/helper-split-export-declaration@7.24.7: + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + /@babel/helper-string-parser@7.24.7: + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + /@babel/helper-validator-option@7.24.7: + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.24.0: - resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} + /@babel/helpers@7.24.7: + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 - transitivePeerDependencies: - - supports-color + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 dev: true - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.1 dev: true - /@babel/parser@7.24.0: - resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} + /@babel/parser@7.24.7: + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + /@babel/template@7.24.7: + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 dev: true - /@babel/traverse@7.24.0: - resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} + /@babel/traverse@7.24.7: + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 - debug: 4.3.4(supports-color@8.1.1) + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + debug: 4.3.5 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.24.0: - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + /@babel/types@7.24.7: + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 dev: true @@ -451,8 +449,8 @@ packages: resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} dev: true - /@codemirror/view@6.24.1: - resolution: {integrity: sha512-sBfP4rniPBRQzNakwuQEqjEuiJDWJyF2kqLLqij4WXRoVwPPJfjx966Eq3F7+OPQxDtMt/Q9MWLoZLWjeveBlg==} + /@codemirror/view@6.28.2: + resolution: {integrity: sha512-A3DmyVfjgPsGIjiJqM/zvODUAPQdQl3ci0ghehYNnbt5x+o76xq+dL5+mMBuysDXnI3kapgOkoeJ0sbtL/3qPw==} dependencies: '@codemirror/state': 6.4.1 style-mod: 4.1.2 @@ -676,8 +674,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + /@eslint-community/regexpp@4.10.1: + resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -686,7 +684,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -703,12 +701,13 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4(supports-color@8.1.1) + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -719,8 +718,9 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead dev: true /@isaacs/cliui@8.0.2: @@ -756,7 +756,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.14.7 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -777,14 +777,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.14.7 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.11.24) + jest-config: 29.7.0(@types/node@20.14.7) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -796,7 +796,7 @@ packages: jest-util: 29.7.0 jest-validate: 29.7.0 jest-watcher: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 @@ -812,7 +812,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.14.7 jest-mock: 29.7.0 dev: true @@ -839,7 +839,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.11.24 + '@types/node': 20.14.7 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -872,9 +872,9 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.11.24 + '@types/node': 20.14.7 chalk: 4.1.2 - collect-v8-coverage: 1.0.1 + collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -917,7 +917,7 @@ packages: '@jest/console': 29.7.0 '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.1 + collect-v8-coverage: 1.0.2 dev: true /@jest/test-sequencer@29.7.0: @@ -934,7 +934,7 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.7 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -945,7 +945,7 @@ packages: jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 @@ -960,7 +960,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.24 + '@types/node': 20.14.7 '@types/yargs': 17.0.32 chalk: 4.1.2 dev: true @@ -999,8 +999,8 @@ packages: resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} dev: false - /@ljharb/through@2.3.12: - resolution: {integrity: sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==} + /@ljharb/through@2.3.13: + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -1038,6 +1038,12 @@ packages: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: true + /@promptbook/utils@0.57.0: + resolution: {integrity: sha512-+6JCuNlUYWgCjwOaPnTaw7o8HyMwaLN23UinZcSMPxeKfdsEeM8xpbHn8g6AOf3nUG50Yk5O6GGK7z/9AxsX4g==} + dependencies: + spacetrim: 0.11.27 + dev: true + /@puppeteer/browsers@1.4.6(typescript@5.1.6): resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==} engines: {node: '>=16.3.0'} @@ -1091,8 +1097,8 @@ packages: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers@10.0.2: - resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: '@sinonjs/commons': 3.0.1 dev: true @@ -1116,36 +1122,36 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 dev: true /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 dev: true - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + /@types/babel__traverse@7.20.6: + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 dev: true /@types/codemirror@5.60.8: resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} dependencies: - '@types/tern': 0.23.7 + '@types/tern': 0.23.9 dev: true /@types/estree@1.0.5: @@ -1155,7 +1161,7 @@ packages: /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.14.7 dev: true /@types/http-cache-semantics@4.0.4: @@ -1188,7 +1194,7 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.14.7 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 dev: true @@ -1201,8 +1207,8 @@ packages: resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} dev: true - /@types/node@20.11.24: - resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} + /@types/node@20.14.7: + resolution: {integrity: sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==} dependencies: undici-types: 5.26.5 dev: true @@ -1219,8 +1225,8 @@ packages: resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} dev: true - /@types/tern@0.23.7: - resolution: {integrity: sha512-0YS9XCZ0LAhlP11HV9SqncUYyz9Ggsgc7Om/AmchKvoeFyj0qPaJmX6rJ93mJVExizWDzUMb49gAtVpI1uHd8Q==} + /@types/tern@0.23.9: + resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} dependencies: '@types/estree': 1.0.5 dev: true @@ -1240,15 +1246,15 @@ packages: /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.14.7 dev: true /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} dev: true - /@types/yargs@17.0.31: - resolution: {integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==} + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} dependencies: '@types/yargs-parser': 21.0.3 dev: true @@ -1257,7 +1263,7 @@ packages: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 20.11.24 + '@types/node': 20.14.7 dev: true optional: true @@ -1272,19 +1278,19 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.10.1 '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.1.6) + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color @@ -1304,7 +1310,7 @@ packages: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.1.6) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 eslint: 8.57.0 typescript: 5.1.6 transitivePeerDependencies: @@ -1331,9 +1337,9 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.1.6) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.1.6) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 eslint: 8.57.0 - ts-api-utils: 1.2.1(typescript@5.1.6) + ts-api-utils: 1.3.0(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color @@ -1355,12 +1361,12 @@ packages: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.1.6) + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color @@ -1379,7 +1385,7 @@ packages: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.1.6) eslint: 8.57.0 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript @@ -1397,42 +1403,42 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitest/snapshot@1.3.1: - resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} + /@vitest/snapshot@1.6.0: + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} dependencies: - magic-string: 0.30.7 + magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@wdio/cli@8.32.3(typescript@5.1.6): - resolution: {integrity: sha512-qjR1MFKQM547iCooceBHyggJRNguD7fhgF4Q7L2r7psG3AQFWzdCN/8rulRGIxTz4PJlIqks9AH9kUJlVAf44A==} + /@wdio/cli@8.39.0(typescript@5.1.6): + resolution: {integrity: sha512-kAd+8TYjJWRN6gZaRGiSu6Yj3k4+ULRt2NWAgNtGhnr0/Rwlr3j9bjAIhXGL574VqrH+rSnrevDdeGuLcZa1xg==} engines: {node: ^16.13 || >=18} hasBin: true dependencies: - '@types/node': 20.11.24 - '@vitest/snapshot': 1.3.1 - '@wdio/config': 8.32.3 - '@wdio/globals': 8.32.3(typescript@5.1.6) - '@wdio/logger': 8.28.0 - '@wdio/protocols': 8.32.0 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 + '@types/node': 20.14.7 + '@vitest/snapshot': 1.6.0 + '@wdio/config': 8.39.0 + '@wdio/globals': 8.39.0(typescript@5.1.6) + '@wdio/logger': 8.38.0 + '@wdio/protocols': 8.38.0 + '@wdio/types': 8.39.0 + '@wdio/utils': 8.39.0 async-exit-hook: 2.0.1 chalk: 5.3.0 chokidar: 3.6.0 cli-spinners: 2.9.2 dotenv: 16.4.5 - ejs: 3.1.9 + ejs: 3.1.10 execa: 8.0.1 - import-meta-resolve: 4.0.0 + import-meta-resolve: 4.1.0 inquirer: 9.2.12 lodash.flattendeep: 4.4.0 lodash.pickby: 4.6.0 lodash.union: 4.6.0 read-pkg-up: 10.0.0 recursive-readdir: 2.2.3 - webdriverio: 8.32.3(typescript@5.1.6) + webdriverio: 8.39.0(typescript@5.1.6) yargs: 17.7.2 transitivePeerDependencies: - bufferutil @@ -1443,27 +1449,27 @@ packages: - utf-8-validate dev: true - /@wdio/config@8.32.3: - resolution: {integrity: sha512-hZkaz5Fd8830uniQvRgPus8yp9rp50MAsHa5kZ2Jt8y++Rp330FyJpQZE5oPjTATuz35G5Anprk2Q3fmFd0Ifw==} + /@wdio/config@8.39.0: + resolution: {integrity: sha512-yNuGPMPibY91s936gnJCHWlStvIyDrwLwGfLC/NCdTin4F7HL4Gp5iJnHWkJFty1/DfFi8jjoIUBNLM8HEez+A==} engines: {node: ^16.13 || >=18} dependencies: - '@wdio/logger': 8.28.0 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 + '@wdio/logger': 8.38.0 + '@wdio/types': 8.39.0 + '@wdio/utils': 8.39.0 decamelize: 6.0.0 deepmerge-ts: 5.1.0 - glob: 10.3.10 - import-meta-resolve: 4.0.0 + glob: 10.4.2 + import-meta-resolve: 4.1.0 transitivePeerDependencies: - supports-color dev: true - /@wdio/globals@8.32.3(typescript@5.1.6): - resolution: {integrity: sha512-jyK89GvWaOYQT9pfZ6HNwkFANgai9eBVfeDPw5yFLXfk6js9GSWbvqMJg/PFi1dQ7xbnbuuf5eYVc65bfAt9KQ==} + /@wdio/globals@8.39.0(typescript@5.1.6): + resolution: {integrity: sha512-qZo6JjRCIOtdvba6fdSqj6b91TnWXD6rmamyud93FTqbcspnhBvr8lmgOs5wnslTKeeTTigCjpsT310b4/AyHA==} engines: {node: ^16.13 || >=18} optionalDependencies: - expect-webdriverio: 4.11.9(typescript@5.1.6) - webdriverio: 8.32.3(typescript@5.1.6) + expect-webdriverio: 4.15.1(typescript@5.1.6) + webdriverio: 8.39.0(typescript@5.1.6) transitivePeerDependencies: - bufferutil - devtools @@ -1473,18 +1479,18 @@ packages: - utf-8-validate dev: true - /@wdio/local-runner@8.32.3(typescript@5.1.6): - resolution: {integrity: sha512-YgqYkKarx2m9OjA8WO4NqQPCfFNLmZHnuEWQ6P2LqUeYFsdXRd3wR3UTo9XrI23VSQo+kcpqInsR5vLOYDd1zg==} + /@wdio/local-runner@8.39.0(typescript@5.1.6): + resolution: {integrity: sha512-TSGJVVWqshH7IO13OKw7G/364q3FczZDEh4h6bYe+GAs91KpZrEhZanyALgjh5F3crWtlffX+GA2HUwpi8X0sA==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 - '@wdio/logger': 8.28.0 + '@types/node': 20.14.7 + '@wdio/logger': 8.38.0 '@wdio/repl': 8.24.12 - '@wdio/runner': 8.32.3(typescript@5.1.6) - '@wdio/types': 8.32.2 + '@wdio/runner': 8.39.0(typescript@5.1.6) + '@wdio/types': 8.39.0 async-exit-hook: 2.0.1 split2: 4.2.0 - stream-buffers: 3.0.2 + stream-buffers: 3.0.3 transitivePeerDependencies: - bufferutil - devtools @@ -1494,8 +1500,8 @@ packages: - utf-8-validate dev: true - /@wdio/logger@8.28.0: - resolution: {integrity: sha512-/s6zNCqwy1hoc+K4SJypis0Ud0dlJ+urOelJFO1x0G0rwDRWyFiUP6ijTaCcFxAm29jYEcEPWijl2xkVIHwOyA==} + /@wdio/logger@8.38.0: + resolution: {integrity: sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==} engines: {node: ^16.13 || >=18} dependencies: chalk: 5.3.0 @@ -1504,57 +1510,57 @@ packages: strip-ansi: 7.1.0 dev: true - /@wdio/mocha-framework@8.32.3: - resolution: {integrity: sha512-wwQ6rDd6TMPqwGfkwvtcBmcirYZUi9GUiwH2OsHvMJ4i+YY7H2dLyZon1ghcIan7r4ufr8KlljbwyerCpUzvcw==} + /@wdio/mocha-framework@8.39.0: + resolution: {integrity: sha512-OFau1dd5mUAqC70gkx0WeZ8rJG191Snb4qhOTS18FpszUoZgoHtgjFICC0cxqZBFtmT9j7+22hNrj6d4sQVPJw==} engines: {node: ^16.13 || >=18} dependencies: '@types/mocha': 10.0.6 - '@types/node': 20.11.24 - '@wdio/logger': 8.28.0 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 - mocha: 10.3.0 + '@types/node': 20.14.7 + '@wdio/logger': 8.38.0 + '@wdio/types': 8.39.0 + '@wdio/utils': 8.39.0 + mocha: 10.4.0 transitivePeerDependencies: - supports-color dev: true - /@wdio/protocols@8.32.0: - resolution: {integrity: sha512-inLJRrtIGdTz/YPbcsvpSvPlYQFTVtF3OYBwAXhG2FiP1ZwE1CQNLP/xgRGye1ymdGCypGkexRqIx3KBGm801Q==} + /@wdio/protocols@8.38.0: + resolution: {integrity: sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA==} dev: true /@wdio/repl@8.24.12: resolution: {integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.14.7 dev: true - /@wdio/reporter@8.32.2: - resolution: {integrity: sha512-BZdReAFfRCtgtYbyhkKgSGqqoIn/yG5/Z4COjvRvon9NJkz+eA4PiHCKdEP7+ekBIjud7H8Gy+6mPBDEu+wllw==} + /@wdio/reporter@8.39.0: + resolution: {integrity: sha512-XahXhmaA1okdwg4/ThHFSqy/41KywxhbtszPcTzyXB+9INaqFNHA1b1vvWs0mrD5+tTtKbg4caTcEHVJU4iv0w==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 - '@wdio/logger': 8.28.0 - '@wdio/types': 8.32.2 + '@types/node': 20.14.7 + '@wdio/logger': 8.38.0 + '@wdio/types': 8.39.0 diff: 5.2.0 object-inspect: 1.13.1 dev: true - /@wdio/runner@8.32.3(typescript@5.1.6): - resolution: {integrity: sha512-HlhdQ4lJ07seL7/x0UQPDnK+o5a0okyjd8ukFYqDL+g9+d3KlW/oM3NvFfX7pb9liIYNEpmoNMwKFp+5XPUE7w==} + /@wdio/runner@8.39.0(typescript@5.1.6): + resolution: {integrity: sha512-M1ixrrCtuwxHVzwsOKGMWBZCteafV0ztoS9+evMWGQtj0ZEsmhjAhWR3n2nZftt24vWOs+eNLGe2p+IO9Sm9bA==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 - '@wdio/config': 8.32.3 - '@wdio/globals': 8.32.3(typescript@5.1.6) - '@wdio/logger': 8.28.0 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 + '@types/node': 20.14.7 + '@wdio/config': 8.39.0 + '@wdio/globals': 8.39.0(typescript@5.1.6) + '@wdio/logger': 8.38.0 + '@wdio/types': 8.39.0 + '@wdio/utils': 8.39.0 deepmerge-ts: 5.1.0 - expect-webdriverio: 4.11.9(typescript@5.1.6) + expect-webdriverio: 4.15.1(typescript@5.1.6) gaze: 1.1.3 - webdriver: 8.32.3 - webdriverio: 8.32.3(typescript@5.1.6) + webdriver: 8.39.0 + webdriverio: 8.39.0(typescript@5.1.6) transitivePeerDependencies: - bufferutil - devtools @@ -1564,38 +1570,38 @@ packages: - utf-8-validate dev: true - /@wdio/spec-reporter@8.32.2: - resolution: {integrity: sha512-3hUXpE+idC4KOXofJnpubdDDCE8X0OTd6ykypiaXMI2hJTA2nIZcHtpRQnAE0E4JT9OzLnPWODcMq54GGBDRkg==} + /@wdio/spec-reporter@8.39.0: + resolution: {integrity: sha512-2DX0+xvP+PyeVTBd6iGCH/RU66WXaa8HL+HpsJXZu5rSkZ4+6B2Tv8JB3ZE/pOWGNpI+B4ac/NfDs1DrX9sB7A==} engines: {node: ^16.13 || >=18} dependencies: - '@wdio/reporter': 8.32.2 - '@wdio/types': 8.32.2 + '@wdio/reporter': 8.39.0 + '@wdio/types': 8.39.0 chalk: 5.3.0 easy-table: 1.2.0 pretty-ms: 7.0.1 dev: true - /@wdio/types@8.32.2: - resolution: {integrity: sha512-jq8LcBBQpBP9ZF5kECKEpXv8hN7irCGCjLFAN0Bd5ScRR6qu6MGWvwkDkau2sFPr0b++sKDCEaMzQlwrGFjZXg==} + /@wdio/types@8.39.0: + resolution: {integrity: sha512-86lcYROTapOJuFd9ouomFDfzDnv3Kn+jE0RmqfvN9frZAeLVJ5IKjX9M6HjplsyTZhjGO1uCaehmzx+HJus33Q==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.14.7 dev: true - /@wdio/utils@8.32.3: - resolution: {integrity: sha512-UnR9rPpR1W9U5wz2TU+6BQ2rlxtuK/e3fvdaiWIMZKleB/OCcEQFGiGPAGGVi4ShfaTPwz6hK1cTTgj1OtMXkg==} + /@wdio/utils@8.39.0: + resolution: {integrity: sha512-jY+n6jlGeK+9Tx8T659PKLwMQTGpLW5H78CSEWgZLbjbVSr2LfGR8Lx0CRktNXxAtqEVZPj16Pi74OtAhvhE6Q==} engines: {node: ^16.13 || >=18} dependencies: '@puppeteer/browsers': 1.9.1 - '@wdio/logger': 8.28.0 - '@wdio/types': 8.32.2 + '@wdio/logger': 8.38.0 + '@wdio/types': 8.39.0 decamelize: 6.0.0 deepmerge-ts: 5.1.0 - edgedriver: 5.3.10 - geckodriver: 4.3.3 - get-port: 7.0.0 - import-meta-resolve: 4.0.0 - locate-app: 2.2.20 + edgedriver: 5.6.0 + geckodriver: 4.4.1 + get-port: 7.1.0 + import-meta-resolve: 4.1.0 + locate-app: 2.4.18 safaridriver: 0.1.2 split2: 4.2.0 wait-port: 1.1.0 @@ -1603,33 +1609,47 @@ packages: - supports-color dev: true + /@zip.js/zip.js@2.7.45: + resolution: {integrity: sha512-Mm2EXF33DJQ/3GWWEWeP1UCqzpQ5+fiMvT3QWspsXY05DyqqxWu7a9awSzU4/spHMHVFrTjani1PR0vprgZpow==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} + dev: true + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead dev: true + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: true + /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.11.2 - acorn-walk: 8.3.0 + acorn: 8.12.0 + acorn-walk: 8.3.3 dev: true - /acorn-jsx@5.3.2(acorn@8.11.2): + /acorn-jsx@5.3.2(acorn@8.12.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.2 + acorn: 8.12.0 dev: true - /acorn-walk@8.3.0: - resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + /acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.12.0 dev: true - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + /acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -1638,13 +1658,13 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 transitivePeerDependencies: - supports-color dev: true - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + /agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: debug: 4.3.4(supports-color@8.1.1) @@ -1715,29 +1735,30 @@ packages: picomatch: 2.3.1 dev: true - /archiver-utils@4.0.1: - resolution: {integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==} - engines: {node: '>= 12.0.0'} + /archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} dependencies: - glob: 8.1.0 + glob: 10.4.2 graceful-fs: 4.2.11 + is-stream: 2.0.1 lazystream: 1.0.1 lodash: 4.17.21 normalize-path: 3.0.0 - readable-stream: 3.6.2 + readable-stream: 4.5.2 dev: true - /archiver@6.0.2: - resolution: {integrity: sha512-UQ/2nW7NMl1G+1UnrLypQw1VdT9XZg/ECcKPq7l+STzStrSivFIXIp34D8M5zeNGW5NoOupdYCHv6VySCPNNlw==} - engines: {node: '>= 12.0.0'} + /archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} dependencies: - archiver-utils: 4.0.1 + archiver-utils: 5.0.2 async: 3.2.5 - buffer-crc32: 0.2.13 - readable-stream: 3.6.2 + buffer-crc32: 1.0.0 + readable-stream: 4.5.2 readdir-glob: 1.1.3 tar-stream: 3.1.7 - zip-stream: 5.0.2 + zip-stream: 6.0.1 dev: true /argparse@1.0.10: @@ -1750,17 +1771,10 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.1 - dev: true - - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.2 + dequal: 2.0.3 dev: true /array-union@2.1.0: @@ -1801,7 +1815,7 @@ packages: handlebars: 4.7.8 node-fetch: 2.7.0 parse-github-url: 1.0.2 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - encoding dev: true @@ -1810,17 +1824,17 @@ packages: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} dev: true - /babel-jest@29.7.0(@babel/core@7.24.0): + /babel-jest@29.7.0(@babel/core@7.24.7): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.7 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.0) + babel-preset-jest: 29.6.3(@babel/core@7.24.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -1832,7 +1846,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.7 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -1845,75 +1859,82 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.0): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.24.0): + '@babel/core': 7.24.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.24.7): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.7 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) dev: true /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /bare-events@2.2.1: - resolution: {integrity: sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==} + /bare-events@2.4.2: + resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} requiresBuild: true dev: true optional: true - /bare-fs@2.2.1: - resolution: {integrity: sha512-+CjmZANQDFZWy4PGbVdmALIwmt33aJg8qTkVjClU6X4WmZkTPBDxRHiBn7fpqEWEfF3AC2io++erpViAIQbSjg==} + /bare-fs@2.3.1: + resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==} requiresBuild: true dependencies: - bare-events: 2.2.1 - bare-os: 2.2.0 - bare-path: 2.1.0 - streamx: 2.16.1 + bare-events: 2.4.2 + bare-path: 2.1.3 + bare-stream: 2.1.3 dev: true optional: true - /bare-os@2.2.0: - resolution: {integrity: sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==} + /bare-os@2.4.0: + resolution: {integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==} requiresBuild: true dev: true optional: true - /bare-path@2.1.0: - resolution: {integrity: sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==} + /bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} requiresBuild: true dependencies: - bare-os: 2.2.0 + bare-os: 2.4.0 + dev: true + optional: true + + /bare-stream@2.1.3: + resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==} + requiresBuild: true + dependencies: + streamx: 2.18.0 dev: true optional: true @@ -1926,23 +1947,11 @@ packages: engines: {node: '>=10.0.0'} dev: true - /big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} dev: true - /binary@0.3.0: - resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} - dependencies: - buffers: 0.1.1 - chainsaw: 0.1.0 - dev: true - /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -1951,10 +1960,6 @@ packages: readable-stream: 3.6.2 dev: true - /bluebird@3.4.7: - resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - dev: true - /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1968,26 +1973,26 @@ packages: balanced-match: 1.0.2 dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 dev: true /browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + /browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001591 - electron-to-chromium: 1.4.690 + caniuse-lite: 1.0.30001636 + electron-to-chromium: 1.4.808 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + update-browserslist-db: 1.0.16(browserslist@4.23.1) dev: true /bs-logger@0.2.6: @@ -2007,13 +2012,13 @@ packages: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + /buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} dev: true - /buffer-indexof-polyfill@1.0.2: - resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} - engines: {node: '>=0.10'} + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true /buffer@5.7.1: @@ -2023,9 +2028,11 @@ packages: ieee754: 1.2.1 dev: true - /buffers@0.1.1: - resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} - engines: {node: '>=0.2.0'} + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 dev: true /builtin-modules@3.3.0: @@ -2047,7 +2054,7 @@ packages: http-cache-semantics: 4.1.1 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.0 + normalize-url: 8.0.1 responselike: 3.0.0 dev: true @@ -2059,7 +2066,7 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + set-function-length: 1.2.2 dev: true /callsites@3.1.0: @@ -2077,8 +2084,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001591: - resolution: {integrity: sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==} + /caniuse-lite@1.0.30001636: + resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} dev: true /chai@4.4.1: @@ -2087,19 +2094,13 @@ packages: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 dev: true - /chainsaw@0.1.0: - resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} - dependencies: - traverse: 0.3.9 - dev: true - /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2131,8 +2132,8 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /chart.js@4.4.2: - resolution: {integrity: sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==} + /chart.js@4.4.3: + resolution: {integrity: sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==} engines: {pnpm: '>=8'} dependencies: '@kurkle/color': 0.3.2 @@ -2149,7 +2150,7 @@ packages: engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -2164,7 +2165,7 @@ packages: engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -2188,8 +2189,8 @@ packages: engines: {node: '>=8'} dev: true - /cjs-module-lexer@1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + /cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} dev: true /cli-cursor@3.1.0: @@ -2199,8 +2200,8 @@ packages: restore-cursor: 3.1.0 dev: true - /cli-spinners@2.9.1: - resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} dev: true @@ -2237,8 +2238,8 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collect-v8-coverage@1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} dev: true /color-convert@1.9.3: @@ -2279,14 +2280,15 @@ packages: engines: {node: ^12.20.0 || >=14} dev: true - /compress-commons@5.0.3: - resolution: {integrity: sha512-/UIcLWvwAQyVibgpQDPtfNM3SvqN7G9elAPAV7GM0L53EbNWwWiCsWtK8Fwed/APEbptPHXs5PuW+y8Bq8lFTA==} - engines: {node: '>= 12.0.0'} + /compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} dependencies: crc-32: 1.2.2 - crc32-stream: 5.0.1 + crc32-stream: 6.0.0 + is-stream: 2.0.1 normalize-path: 3.0.0 - readable-stream: 3.6.2 + readable-stream: 4.5.2 dev: true /concat-map@0.0.1: @@ -2307,15 +2309,15 @@ packages: hasBin: true dev: true - /crc32-stream@5.0.1: - resolution: {integrity: sha512-lO1dFui+CEUh/ztYIpgpKItKW9Bb4NWakCRJrnqAbFIYD+OZAwb2VfD5T5eXMw2FNcsDHkQcNl/Wh3iVXYwU6g==} - engines: {node: '>= 12.0.0'} + /crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} dependencies: crc-32: 1.2.2 - readable-stream: 3.6.2 + readable-stream: 4.5.2 dev: true - /create-jest@29.7.0(@types/node@20.11.24): + /create-jest@29.7.0(@types/node@20.14.7): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2324,7 +2326,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.11.24) + jest-config: 29.7.0(@types/node@20.14.7) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -2418,6 +2420,18 @@ packages: supports-color: 8.1.1 dev: true + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + /decamelize@4.0.0: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} @@ -2439,8 +2453,8 @@ packages: mimic-response: 3.1.0 dev: true - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + /dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -2448,36 +2462,13 @@ packages: optional: true dev: true - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + /deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} dependencies: type-detect: 4.0.8 dev: true - /deep-equal@2.2.1: - resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.2 - is-arguments: 1.1.1 - is-array-buffer: 3.0.2 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.0 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.13 - dev: true - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -2520,15 +2511,6 @@ packages: gopd: 1.0.1 dev: true - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 - object-keys: 1.1.1 - dev: true - /degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -2543,6 +2525,11 @@ packages: engines: {node: '>=0.4.0'} dev: true + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -2552,8 +2539,8 @@ packages: resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} dev: true - /devtools-protocol@0.0.1262051: - resolution: {integrity: sha512-YJe4CT5SA8on3Spa+UDtNhEqtuV6Epwz3OZ4HQVLhlRccpZ9/PAYk0/cy/oKxFKRrZPBUPyxympQci4yWNWZ9g==} + /devtools-protocol@0.0.1302984: + resolution: {integrity: sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA==} dev: true /diff-sequences@29.6.3: @@ -2598,12 +2585,6 @@ packages: engines: {node: '>=12'} dev: true - /duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - dependencies: - readable-stream: 2.3.8 - dev: true - /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true @@ -2624,29 +2605,29 @@ packages: which: 2.0.2 dev: true - /edgedriver@5.3.10: - resolution: {integrity: sha512-RFSHYMNtcF1PjaGZCA2rdQQ8hSTLPZgcYgeY1V6dC+tR4NhZXwFAku+8hCbRYh7ZlwKKrTbVu9FwknjFddIuuw==} + /edgedriver@5.6.0: + resolution: {integrity: sha512-IeJXEczG+DNYBIa9gFgVYTqrawlxmc9SUqUsWU2E98jOsO/amA7wzabKOS8Bwgr/3xWoyXCJ6yGFrbFKrilyyQ==} hasBin: true requiresBuild: true dependencies: - '@wdio/logger': 8.28.0 + '@wdio/logger': 8.38.0 + '@zip.js/zip.js': 2.7.45 decamelize: 6.0.0 edge-paths: 3.0.5 node-fetch: 3.3.2 - unzipper: 0.10.14 which: 4.0.0 dev: true - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true dependencies: - jake: 10.8.7 + jake: 10.9.1 dev: true - /electron-to-chromium@1.4.690: - resolution: {integrity: sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==} + /electron-to-chromium@1.4.808: + resolution: {integrity: sha512-0ItWyhPYnww2VOuCGF4s1LTfbrdAV2ajy/TN+ZTuhR23AHI6rWHCrBXJ/uxoXOvRRqw8qjYVrG81HFI7x/2wdQ==} dev: true /emittery@0.13.1: @@ -2778,7 +2759,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.10.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -2788,7 +2769,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -2800,7 +2781,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.23.0 + globals: 13.24.0 graphemer: 1.4.0 ignore: 5.3.1 imurmurhash: 0.1.4 @@ -2812,7 +2793,7 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -2823,8 +2804,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) eslint-visitor-keys: 3.4.3 dev: true @@ -2858,6 +2839,16 @@ packages: engines: {node: '>=0.10.0'} dev: true + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2893,18 +2884,18 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /expect-webdriverio@4.11.9(typescript@5.1.6): - resolution: {integrity: sha512-nHVLoC4W8wuVAyfpitJ07iDMLjeQ2OeYVjrKEb7dMeG4fqlegzN1SGYnnsKay+KWrte9KzuW1pZ7h5Nmbm/hAQ==} + /expect-webdriverio@4.15.1(typescript@5.1.6): + resolution: {integrity: sha512-xtBSidt7Whs1fsUC+utxVzfmkmaStXWW17b+BcMCiCltx0Yku6l7BTv1Y14DEKX8L6rttaDQobYyRtBKbi4ssg==} engines: {node: '>=16 || >=18 || >=20'} dependencies: - '@vitest/snapshot': 1.3.1 + '@vitest/snapshot': 1.6.0 expect: 29.7.0 jest-matcher-utils: 29.7.0 lodash.isequal: 4.5.0 optionalDependencies: - '@wdio/globals': 8.32.3(typescript@5.1.6) - '@wdio/logger': 8.28.0 - webdriverio: 8.32.3(typescript@5.1.6) + '@wdio/globals': 8.39.0(typescript@5.1.6) + '@wdio/logger': 8.38.0 + webdriverio: 8.39.0(typescript@5.1.6) transitivePeerDependencies: - bufferutil - devtools @@ -2968,7 +2959,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 dev: true /fast-json-stable-stringify@2.1.0: @@ -3017,7 +3008,7 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.1.1 + flat-cache: 3.2.0 dev: true /filelist@1.0.4: @@ -3026,8 +3017,8 @@ packages: minimatch: 5.1.6 dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 @@ -3057,9 +3048,9 @@ packages: path-exists: 5.0.0 dev: true - /flat-cache@3.1.1: - resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} - engines: {node: '>=12.0.0'} + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flatted: 3.3.1 keyv: 4.5.4 @@ -3075,14 +3066,8 @@ packages: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + /foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 @@ -3131,29 +3116,10 @@ packages: dev: true optional: true - /fsrs.js@1.2.1: - resolution: {integrity: sha512-nPvEhYKtXYzCdaSwT024dqwfXAaRmQ+qhppu2JxL3hQDYku7+2DrQH1R6s777VVo2Og7vuACTYyz64DcuDZ78A==} - engines: {node: '>=10'} - dev: true - - /fstream@1.0.12: - resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} - engines: {node: '>=0.6'} - dependencies: - graceful-fs: 4.2.11 - inherits: 2.0.4 - mkdirp: 0.5.6 - rimraf: 2.7.1 - dev: true - /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - /gaze@1.1.3: resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==} engines: {node: '>= 4.0.0'} @@ -3161,19 +3127,19 @@ packages: globule: 1.3.4 dev: true - /geckodriver@4.3.3: - resolution: {integrity: sha512-we2c2COgxFkLVuoknJNx+ioP+7VDq0sr6SCqWHTzlA4kzIbzR0EQ1Pps34s8WrsOnQqPC8a4sZV9dRPROOrkSg==} + /geckodriver@4.4.1: + resolution: {integrity: sha512-nnAdIrwLkMcDu4BitWXF23pEMeZZ0Cj7HaWWFdSpeedBP9z6ft150JYiGO2mwzw6UiR823Znk1JeIf07RyzloA==} engines: {node: ^16.13 || >=18 || >=20} hasBin: true requiresBuild: true dependencies: - '@wdio/logger': 8.28.0 + '@wdio/logger': 8.38.0 + '@zip.js/zip.js': 2.7.45 decamelize: 6.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 node-fetch: 3.3.2 - tar-fs: 3.0.5 - unzipper: 0.10.14 + tar-fs: 3.0.6 which: 4.0.0 transitivePeerDependencies: - supports-color @@ -3201,7 +3167,7 @@ packages: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 dev: true /get-package-type@0.1.0: @@ -3209,8 +3175,8 @@ packages: engines: {node: '>=8.0.0'} dev: true - /get-port@7.0.0: - resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} + /get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} engines: {node: '>=16'} dev: true @@ -3257,31 +3223,34 @@ packages: is-glob: 4.0.3 dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} + /glob@10.4.2: + resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} + engines: {node: '>=16 || 14 >=14.18'} hasBin: true dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 + foreground-child: 3.2.1 + jackspeak: 3.4.0 + minimatch: 9.0.4 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 dev: true /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.2 + minimatch: 3.0.8 once: 1.4.0 path-is-absolute: 1.0.1 dev: true /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -3294,6 +3263,7 @@ packages: /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -3307,8 +3277,8 @@ packages: engines: {node: '>=4'} dev: true - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -3380,11 +3350,7 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.4 - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + uglify-js: 3.18.0 dev: true /has-flag@3.0.0: @@ -3420,16 +3386,23 @@ packages: function-bind: 1.1.2 dev: true + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true dev: true - /hosted-git-info@7.0.1: - resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} + /hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} dependencies: - lru-cache: 10.2.0 + lru-cache: 10.2.2 dev: true /html-encoding-sniffer@3.0.0: @@ -3453,7 +3426,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 transitivePeerDependencies: - supports-color dev: true @@ -3462,8 +3435,8 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + agent-base: 7.1.1 + debug: 4.3.5 transitivePeerDependencies: - supports-color dev: true @@ -3481,7 +3454,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 transitivePeerDependencies: - supports-color dev: true @@ -3490,8 +3463,8 @@ packages: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + agent-base: 7.1.1 + debug: 4.3.5 transitivePeerDependencies: - supports-color dev: true @@ -3529,6 +3502,10 @@ packages: engines: {node: '>= 4'} dev: true + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: true + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -3546,8 +3523,8 @@ packages: resolve-cwd: 3.0.0 dev: true - /import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + /import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} dev: true /imurmurhash@0.1.4: @@ -3557,6 +3534,7 @@ packages: /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -3570,7 +3548,7 @@ packages: resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} engines: {node: '>=14.18.0'} dependencies: - '@ljharb/through': 2.3.12 + '@ljharb/through': 2.3.13 ansi-escapes: 4.3.2 chalk: 5.3.0 cli-cursor: 3.1.0 @@ -3604,30 +3582,11 @@ packages: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + binary-extensions: 2.3.0 dev: true /is-core-module@2.13.1: @@ -3636,11 +3595,11 @@ packages: hasown: 2.0.1 dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + /is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + hasown: 2.0.2 dev: true /is-extglob@2.1.1: @@ -3670,17 +3629,6 @@ packages: engines: {node: '>=8'} dev: true - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -3705,24 +3653,6 @@ packages: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.5 - dev: true - /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -3733,31 +3663,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -3772,17 +3677,6 @@ packages: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} dev: true - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - dev: true - /is2@2.0.9: resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} engines: {node: '>=v0.10.0'} @@ -3796,10 +3690,6 @@ packages: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true @@ -3818,8 +3708,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -3831,11 +3721,11 @@ packages: resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - supports-color dev: true @@ -3853,7 +3743,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -3868,8 +3758,8 @@ packages: istanbul-lib-report: 3.0.1 dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + /jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 @@ -3877,8 +3767,8 @@ packages: '@pkgjs/parseargs': 0.11.0 dev: true - /jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + /jake@10.9.1: + resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} engines: {node: '>=10'} hasBin: true dependencies: @@ -3905,10 +3795,10 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.14.7 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.1 + dedent: 1.5.3 is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -3918,7 +3808,7 @@ packages: jest-util: 29.7.0 p-limit: 3.1.0 pretty-format: 29.7.0 - pure-rand: 6.0.4 + pure-rand: 6.1.0 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: @@ -3926,7 +3816,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.11.24): + /jest-cli@29.7.0(@types/node@20.14.7): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3940,10 +3830,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.11.24) + create-jest: 29.7.0(@types/node@20.14.7) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.11.24) + jest-config: 29.7.0(@types/node@20.14.7) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -3954,7 +3844,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.11.24): + /jest-config@29.7.0(@types/node@20.14.7): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3966,11 +3856,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.7 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 - babel-jest: 29.7.0(@babel/core@7.24.0) + '@types/node': 20.14.7 + babel-jest: 29.7.0(@babel/core@7.24.7) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -3984,7 +3874,7 @@ packages: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 @@ -4035,7 +3925,7 @@ packages: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.11.24 + '@types/node': 20.14.7 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -4052,7 +3942,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.14.7 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -4072,14 +3962,14 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.11.24 + '@types/node': 20.14.7 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.7 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -4107,12 +3997,12 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.7 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.7 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -4123,7 +4013,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.14.7 jest-util: 29.7.0 dev: true @@ -4178,7 +4068,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.14.7 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -4209,10 +4099,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.14.7 chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 @@ -4232,15 +4122,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.0 - '@babel/generator': 7.23.6 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) - '@babel/types': 7.24.0 + '@babel/core': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) + '@babel/types': 7.24.7 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -4251,7 +4141,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - supports-color dev: true @@ -4261,7 +4151,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.14.7 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -4286,7 +4176,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.14.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -4298,13 +4188,13 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.14.7 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@20.11.24): + /jest@29.7.0(@types/node@20.14.7): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -4317,7 +4207,7 @@ packages: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.11.24) + jest-cli: 29.7.0(@types/node@20.14.7) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4358,7 +4248,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.11.2 + acorn: 8.12.0 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -4371,17 +4261,17 @@ packages: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.4 + nwsapi: 2.2.10 parse5: 7.1.2 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.2 + tough-cookie: 4.1.4 w3c-xmlserializer: 4.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.14.2 + ws: 8.17.1 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -4403,8 +4293,8 @@ packages: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-parse-even-better-errors@3.0.1: - resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} + /json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true @@ -4430,6 +4320,15 @@ packages: graceful-fs: 4.2.11 dev: true + /jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: true + /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -4466,6 +4365,12 @@ packages: type-check: 0.4.0 dev: true + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: true + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -4475,14 +4380,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /listenercount@1.0.1: - resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} - dev: true - - /locate-app@2.2.20: - resolution: {integrity: sha512-TOCp8H9l75GhNtd+BgyUnLMNzR+IpYge7cWjxELsyDlqH+MyYWxq+NfyjQ+o6oRAORzOs3IfMM6KAR6q3JNfhg==} + /locate-app@2.4.18: + resolution: {integrity: sha512-eWvEDmEti5FfLrZt9QnNsZ7iD+xgS/VmSfw0kBRjixek1iQA+UH5ymuLZgQl/MgdYSm5JfVojc+8nQdBF18+PA==} dependencies: - n12: 1.8.23 + '@promptbook/utils': 0.57.0 type-fest: 2.13.0 userhome: 1.0.0 dev: true @@ -4573,11 +4474,9 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + /lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} - dependencies: - semver: 7.5.4 dev: true /lru-cache@5.1.1: @@ -4586,21 +4485,13 @@ packages: yallist: 3.1.1 dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - /lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} dev: true - /magic-string@0.30.7: - resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} - engines: {node: '>=12'} + /magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 dev: true @@ -4609,7 +4500,7 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.6.0 + semver: 7.6.2 dev: true /make-error@1.3.6: @@ -4631,11 +4522,11 @@ packages: engines: {node: '>= 8'} dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 dev: true @@ -4704,12 +4595,19 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} dev: true @@ -4721,15 +4619,8 @@ packages: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: true - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /mocha@10.3.0: - resolution: {integrity: sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==} + /mocha@10.4.0: + resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} engines: {node: '>= 14.0.0'} hasBin: true dependencies: @@ -4776,10 +4667,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /n12@1.8.23: - resolution: {integrity: sha512-kQITb5LlO0Gk8rmbMAkfbmhs+QlXZ5SRHsx6YcG++3yc57iolbiQuo5rsfu3dkB7Qw3jKCqntsZvNNgvdfotkA==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -4827,13 +4714,13 @@ packages: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true - /normalize-package-data@6.0.0: - resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + /normalize-package-data@6.0.1: + resolution: {integrity: sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==} engines: {node: ^16.14.0 || >=18.0.0} dependencies: - hosted-git-info: 7.0.1 - is-core-module: 2.13.1 - semver: 7.6.0 + hosted-git-info: 7.0.2 + is-core-module: 2.14.0 + semver: 7.6.2 validate-npm-package-license: 3.0.4 dev: true @@ -4842,8 +4729,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /normalize-url@8.0.0: - resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + /normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'} dev: true @@ -4861,22 +4748,22 @@ packages: path-key: 4.0.0 dev: true - /nwsapi@2.2.4: - resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==} + /nwsapi@2.2.10: + resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} dev: true /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true - /obsidian@1.5.7(@codemirror/state@6.4.1)(@codemirror/view@6.24.1): + /obsidian@1.5.7(@codemirror/state@6.4.1)(@codemirror/view@6.28.2): resolution: {integrity: sha512-DNcvQJ6TvMflHZqWfO9cLGbOUbKTy2KBi6B6vjo5RG8XsftKZZq1zS/OQFhII2BnXK/DWan/lUcb2JYxfM3p5A==} peerDependencies: '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.24.1 + '@codemirror/view': 6.28.2 '@types/codemirror': 5.60.8 moment: 2.29.4 dev: true @@ -4901,16 +4788,16 @@ packages: mimic-fn: 4.0.0 dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 dev: true /ora@5.4.1: @@ -4920,7 +4807,7 @@ packages: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.9.1 + cli-spinners: 2.9.2 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -4990,13 +4877,13 @@ packages: engines: {node: '>= 14'} dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.4(supports-color@8.1.1) get-uri: 6.0.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.2 + socks-proxy-agent: 8.0.3 transitivePeerDependencies: - supports-color dev: true @@ -5009,10 +4896,18 @@ packages: netmask: 2.0.2 dev: true + /package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + dev: true + /pagerank.js@1.0.2: resolution: {integrity: sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw==} dev: false + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -5030,7 +4925,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -5040,9 +4935,9 @@ packages: resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} engines: {node: '>=16'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 - json-parse-even-better-errors: 3.0.1 + json-parse-even-better-errors: 3.0.2 lines-and-columns: 2.0.4 type-fest: 3.13.1 dev: true @@ -5087,12 +4982,12 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} dependencies: - lru-cache: 10.2.0 - minipass: 7.0.4 + lru-cache: 10.2.2 + minipass: 7.1.2 dev: true /path-type@4.0.0: @@ -5112,8 +5007,8 @@ packages: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} dev: true /picomatch@2.3.1: @@ -5138,8 +5033,8 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + /prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} engines: {node: '>=14'} hasBin: true dev: true @@ -5150,13 +5045,12 @@ packages: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 dev: true /pretty-ms@7.0.1: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} - hasBin: true dependencies: is-core-module: 2.13.1 parse-ms: 2.1.0 @@ -5168,6 +5062,11 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -5185,14 +5084,14 @@ packages: resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.4(supports-color@8.1.1) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 lru-cache: 7.18.3 pac-proxy-agent: 7.0.1 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 + socks-proxy-agent: 8.0.3 transitivePeerDependencies: - supports-color dev: true @@ -5201,14 +5100,14 @@ packages: resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.4(supports-color@8.1.1) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 lru-cache: 7.18.3 pac-proxy-agent: 7.0.1 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 + socks-proxy-agent: 8.0.3 transitivePeerDependencies: - supports-color dev: true @@ -5256,8 +5155,8 @@ packages: - utf-8-validate dev: true - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + /pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} dev: true /query-selector-shadow-dom@1.0.1: @@ -5287,8 +5186,8 @@ packages: safe-buffer: 5.2.1 dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} dev: true /read-pkg-up@10.0.0: @@ -5305,9 +5204,9 @@ packages: engines: {node: '>=16'} dependencies: '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.0 + normalize-package-data: 6.0.1 parse-json: 7.1.1 - type-fest: 4.10.3 + type-fest: 4.20.1 dev: true /readable-stream@2.3.8: @@ -5331,6 +5230,17 @@ packages: util-deprecate: 1.0.2 dev: true + /readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: true + /readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} dependencies: @@ -5351,15 +5261,6 @@ packages: minimatch: 3.1.2 dev: true - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - dev: true - /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -5399,7 +5300,7 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.1 + is-core-module: 2.14.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -5434,15 +5335,9 @@ packages: resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} dev: true - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 @@ -5488,17 +5383,19 @@ packages: xmlchars: 2.2.0 dev: true + /seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + dev: true + /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + /semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true - dependencies: - lru-cache: 6.0.0 dev: true /serialize-error@11.0.3: @@ -5514,8 +5411,8 @@ packages: randombytes: 2.1.0 dev: true - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 @@ -5542,14 +5439,6 @@ packages: engines: {node: '>=8'} dev: true - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 - dev: true - /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true @@ -5573,19 +5462,19 @@ packages: engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} dev: true - /socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + /socks-proxy-agent@8.0.3: + resolution: {integrity: sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.4(supports-color@8.1.1) - socks: 2.8.1 + socks: 2.8.3 transitivePeerDependencies: - supports-color dev: true - /socks@2.8.1: - resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==} + /socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} dependencies: ip-address: 9.0.5 @@ -5604,11 +5493,15 @@ packages: engines: {node: '>=0.10.0'} dev: true + /spacetrim@0.11.27: + resolution: {integrity: sha512-dwH0FuVEdapG4Qb2kNlZXM5kCyOgqsC0LkZbF+ESICLMTWH3RQsisSlnNy9raB38qxvUlUvpFrbEirB0RFKv5A==} + dev: true + /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.18 dev: true /spdx-exceptions@2.5.0: @@ -5619,11 +5512,11 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.18 dev: true - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + /spdx-license-ids@3.0.18: + resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} dev: true /split2@4.2.0: @@ -5646,25 +5539,19 @@ packages: escape-string-regexp: 2.0.0 dev: true - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.5 - dev: true - - /stream-buffers@3.0.2: - resolution: {integrity: sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==} + /stream-buffers@3.0.3: + resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==} engines: {node: '>= 0.10.0'} dev: true - /streamx@2.16.1: - resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + /streamx@2.18.0: + resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 + text-decoder: 1.1.0 optionalDependencies: - bare-events: 2.2.1 + bare-events: 2.4.2 dev: true /string-length@4.0.2: @@ -5781,14 +5668,14 @@ packages: tar-stream: 3.1.7 dev: true - /tar-fs@3.0.5: - resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} + /tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} dependencies: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.2.1 - bare-path: 2.1.0 + bare-fs: 2.3.1 + bare-path: 2.1.3 dev: true /tar-stream@3.1.7: @@ -5796,7 +5683,7 @@ packages: dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 - streamx: 2.16.1 + streamx: 2.18.0 dev: true /tcp-port-used@1.0.2: @@ -5817,6 +5704,12 @@ packages: minimatch: 3.1.2 dev: true + /text-decoder@1.1.0: + resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} + dependencies: + b4a: 1.6.6 + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -5848,8 +5741,8 @@ packages: is-number: 7.0.0 dev: true - /tough-cookie@4.1.2: - resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} + /tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} dependencies: psl: 1.9.0 @@ -5869,12 +5762,8 @@ packages: punycode: 2.3.1 dev: true - /traverse@0.3.9: - resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} - dev: true - - /ts-api-utils@1.2.1(typescript@5.1.6): - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + /ts-api-utils@1.3.0(typescript@5.1.6): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -5882,12 +5771,20 @@ packages: typescript: 5.1.6 dev: true - /ts-jest@29.1.2(@babel/core@7.24.0)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6): - resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + /ts-fsrs@3.5.7: + resolution: {integrity: sha512-xA18Igi1adkuCNgNjKkorjYgZq842+HdgRjatQPDERcrAWMlzM+3BwIbrF/Q0ijYEyw3NcTp3yJIMSO7agBLKQ==} + engines: {node: '>=16.0.0'} + dependencies: + seedrandom: 3.0.5 + dev: true + + /ts-jest@29.1.5(@babel/core@7.24.7)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6): + resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 '@jest/types': ^29.0.0 babel-jest: ^29.0.0 esbuild: '*' @@ -5896,6 +5793,8 @@ packages: peerDependenciesMeta: '@babel/core': optional: true + '@jest/transform': + optional: true '@jest/types': optional: true babel-jest: @@ -5903,16 +5802,16 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.7 bs-logger: 0.2.6 esbuild: 0.19.12 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.11.24) + jest: 29.7.0(@types/node@20.14.7) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.6.0 + semver: 7.6.2 typescript: 5.1.6 yargs-parser: 21.1.1 dev: true @@ -5958,8 +5857,8 @@ packages: engines: {node: '>=14.16'} dev: true - /type-fest@4.10.3: - resolution: {integrity: sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==} + /type-fest@4.20.1: + resolution: {integrity: sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==} engines: {node: '>=16'} dev: true @@ -5969,8 +5868,8 @@ packages: hasBin: true dev: true - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + /uglify-js@3.18.0: + resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true @@ -5998,30 +5897,15 @@ packages: engines: {node: '>= 10.0.0'} dev: true - /unzipper@0.10.14: - resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} - dependencies: - big-integer: 1.6.52 - binary: 0.3.0 - bluebird: 3.4.7 - buffer-indexof-polyfill: 1.0.2 - duplexer2: 0.1.4 - fstream: 1.0.12 - graceful-fs: 4.2.11 - listenercount: 1.0.1 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + /update-browserslist-db@1.0.16(browserslist@4.23.1): + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.23.0 + browserslist: 4.23.1 escalade: 3.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 dev: true /uri-js@4.4.1: @@ -6084,7 +5968,7 @@ packages: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 transitivePeerDependencies: - supports-color dev: true @@ -6101,7 +5985,7 @@ packages: defaults: 1.0.4 dev: true - /wdio-chromedriver-service@8.1.1(webdriverio@8.32.3): + /wdio-chromedriver-service@8.1.1(webdriverio@8.39.0): resolution: {integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==} engines: {node: ^16.13 || >=18} peerDependencies: @@ -6114,11 +5998,11 @@ packages: chromedriver: optional: true dependencies: - '@wdio/logger': 8.28.0 + '@wdio/logger': 8.38.0 fs-extra: 11.2.0 split2: 4.2.0 tcp-port-used: 1.0.2 - webdriverio: 8.32.3(typescript@5.1.6) + webdriverio: 8.39.0(typescript@5.1.6) transitivePeerDependencies: - supports-color dev: true @@ -6128,29 +6012,29 @@ packages: engines: {node: '>= 8'} dev: true - /webdriver@8.32.3: - resolution: {integrity: sha512-1/kpZvuftt59oikHs+6FvWXNfOM5tgMMMAk3LnMe7D938dVOoNGAe46fq0oL/xsxxPicbMRTRgIy1OifLiglaA==} + /webdriver@8.39.0: + resolution: {integrity: sha512-Kc3+SfiH4ufyrIht683VT2vnJocx0pfH8rYdyPvEh1b2OYewtFTHK36k9rBDHZiBmk6jcSXs4M2xeFgOuon9Lg==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.14.7 '@types/ws': 8.5.10 - '@wdio/config': 8.32.3 - '@wdio/logger': 8.28.0 - '@wdio/protocols': 8.32.0 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 + '@wdio/config': 8.39.0 + '@wdio/logger': 8.38.0 + '@wdio/protocols': 8.38.0 + '@wdio/types': 8.39.0 + '@wdio/utils': 8.39.0 deepmerge-ts: 5.1.0 got: 12.6.1 ky: 0.33.3 - ws: 8.14.2 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /webdriverio@8.32.3(typescript@5.1.6): - resolution: {integrity: sha512-SupbQKMtUZHSH7lmF5xaJPgxsn8sIBNAjs1CyPI33u30eY9VcVQ4CJQ818ZS3FLxR0q2XdWk9lsQNyhZwlN3RA==} + /webdriverio@8.39.0(typescript@5.1.6): + resolution: {integrity: sha512-pDpGu0V+TL1LkXPode67m3s+IPto4TcmcOzMpzFgu2oeLMBornoLN3yQSFR1fjZd1gK4UfnG3lJ4poTGOfbWfw==} engines: {node: ^16.13 || >=18} peerDependencies: devtools: ^8.14.0 @@ -6158,30 +6042,31 @@ packages: devtools: optional: true dependencies: - '@types/node': 20.11.24 - '@wdio/config': 8.32.3 - '@wdio/logger': 8.28.0 - '@wdio/protocols': 8.32.0 + '@types/node': 20.14.7 + '@wdio/config': 8.39.0 + '@wdio/logger': 8.38.0 + '@wdio/protocols': 8.38.0 '@wdio/repl': 8.24.12 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 - archiver: 6.0.2 + '@wdio/types': 8.39.0 + '@wdio/utils': 8.39.0 + archiver: 7.0.1 aria-query: 5.3.0 css-shorthand-properties: 1.1.1 css-value: 0.0.1 - devtools-protocol: 0.0.1262051 + devtools-protocol: 0.0.1302984 grapheme-splitter: 1.0.4 - import-meta-resolve: 4.0.0 + import-meta-resolve: 4.1.0 is-plain-obj: 4.1.0 + jszip: 3.10.1 lodash.clonedeep: 4.5.0 lodash.zip: 4.2.0 - minimatch: 9.0.3 + minimatch: 9.0.4 puppeteer-core: 20.9.0(typescript@5.1.6) query-selector-shadow-dom: 1.0.1 resq: 1.11.0 rgb2hex: 0.2.5 serialize-error: 11.0.3 - webdriver: 8.32.3 + webdriver: 8.39.0 transitivePeerDependencies: - bufferutil - encoding @@ -6226,36 +6111,6 @@ packages: webidl-conversions: 3.0.1 dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - dev: true - - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -6272,6 +6127,11 @@ packages: isexe: 3.1.1 dev: true + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true @@ -6332,8 +6192,8 @@ packages: optional: true dev: true - /ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -6363,10 +6223,6 @@ packages: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - /yargs-parser@20.2.4: resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} engines: {node: '>=10'} @@ -6443,11 +6299,11 @@ packages: engines: {node: '>=12.20'} dev: true - /zip-stream@5.0.2: - resolution: {integrity: sha512-LfOdrUvPB8ZoXtvOBz6DlNClfvi//b5d56mSWyJi7XbH/HfhOHfUhOqxhT/rUiR7yiktlunqRo+jY6y/cWC/5g==} - engines: {node: '>= 12.0.0'} + /zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} dependencies: - archiver-utils: 4.0.1 - compress-commons: 5.0.3 - readable-stream: 3.6.2 + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.5.2 dev: true diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index b6fd023d..118cb658 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -3,11 +3,11 @@ import { DateUtils, MiscUtils } from "src/util/utils_recall"; import { SrsAlgorithm, algorithmNames } from "./algorithms"; import { DataStore } from "../dataStore/data"; -import * as fsrsjs from "fsrs.js"; +import * as tsfsrs from "ts-fsrs"; import { t } from "src/lang/helpers"; import deepcopy from "deepcopy"; import { AnkiData } from "./anki"; -import { Rating, ReviewLog } from "fsrs.js"; +import { Rating, ReviewLog } from "ts-fsrs"; import { RepetitionItem, ReviewResult } from "src/dataStore/repetitionItem"; // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/Settings.ts @@ -17,7 +17,7 @@ function applySettingsUpdate(callback: () => void): void { applyDebounceTimer = window.setTimeout(callback, 512); } -export type FsrsData = fsrsjs.Card; +export type FsrsData = tsfsrs.Card; export class RevLog { // https://github.com/open-spaced-repetition/fsrs-optimizer @@ -53,9 +53,10 @@ interface FsrsSettings { request_retention: number; maximum_interval: number; w: number[]; + enable_fuzz: boolean; } -const FsrsOptions: string[] = ["Again", "Hard", "Good", "Easy"]; +const FsrsOptions: string[] = ["Again", "Hard", "Good", "Easy"]; // Manual =0 /** * This is an implementation of the Free Spaced Repetition Scheduling Algorithm as described in @@ -64,8 +65,9 @@ const FsrsOptions: string[] = ["Again", "Hard", "Good", "Easy"]; */ export class FsrsAlgorithm extends SrsAlgorithm { settings: FsrsSettings; - fsrs = new fsrsjs.FSRS(); - card = new fsrsjs.Card(); + + fsrs = new tsfsrs.FSRS(tsfsrs.generatorParameters(this.settings)); + card = tsfsrs.createEmptyCard(); filename = "ob_revlog.csv"; logfilepath: string = null; @@ -82,12 +84,14 @@ export class FsrsAlgorithm extends SrsAlgorithm { defaultSettings(): FsrsSettings { return { revlog_tags: [], - request_retention: 0.9, - maximum_interval: 36500, - w: [ - 0.4, 0.6, 2.4, 5.8, 4.93, 0.94, 0.86, 0.01, 1.49, 0.14, 0.94, 2.18, 0.05, 0.34, - 1.26, 0.29, 2.61, - ], + ...tsfsrs.generatorParameters(), + // request_retention: 0.9, + // maximum_interval: 36500, + // w: [ + // 0.4, 0.6, 2.4, 5.8, 4.93, 0.94, 0.86, 0.01, 1.49, 0.14, 0.94, 2.18, 0.05, 0.34, + // 1.26, 0.29, 2.61, + // ], + // enable_fuzz: false, }; } updateSettings(settings: unknown) { @@ -98,9 +102,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { } updateFsrsParams() { - if (this.settings != undefined) { - this.fsrs.p = deepcopy(this.settings); - } + this.fsrs = new tsfsrs.FSRS(tsfsrs.generatorParameters(this.settings)); } getLogfilepath() { @@ -110,7 +112,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { } defaultData(): FsrsData { - return new fsrsjs.Card(); + return tsfsrs.createEmptyCard(); } srsOptions(): string[] { @@ -123,9 +125,9 @@ export class FsrsAlgorithm extends SrsAlgorithm { const now = new Date(); const scheduling_cards = this.fsrs.repeat(card, now); const intvls: number[] = []; - this.srsOptions().forEach((opt, ind) => { - const due = scheduling_cards[ind + 1].card.due.valueOf(); - const lastrv = scheduling_cards[ind + 1].card.last_review.valueOf(); + tsfsrs.Grades.forEach((grade, _ind) => { + const due = scheduling_cards[grade].card.due.valueOf(); + const lastrv = scheduling_cards[grade].card.last_review.valueOf(); const nextInterval = due - lastrv; intvls.push(nextInterval / DateUtils.DAYS_TO_MILLIS); // console.debug("due:" + due + ", last: " + lastrv + ", intvl: " + nextInterval); @@ -140,7 +142,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { log: boolean = true, ): ReviewResult { let data = item.data as FsrsData; - const response = FsrsOptions.indexOf(optionStr) + 1; + const response = (FsrsOptions.indexOf(optionStr) + 1) as tsfsrs.Grade; let correct = true; if (response == 1) { @@ -166,7 +168,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { // Get the review log after rating : if (log) { - const review_log = scheduling_cards[response].review_log; + const review_log = scheduling_cards[response].log; this.appendRevlog(item, review_log); } @@ -331,9 +333,9 @@ export class FsrsAlgorithm extends SrsAlgorithm { .setValue(this.settings.request_retention * 100) .setDynamicTooltip() .onChange(async (value) => { - this.settings.request_retention = this.fsrs.p.request_retention = - value / 100; + this.settings.request_retention = value / 100; update(this.settings); + this.updateFsrsParams(); }), ) .addExtraButton((button) => { @@ -344,8 +346,8 @@ export class FsrsAlgorithm extends SrsAlgorithm { applySettingsUpdate(async () => { this.settings.request_retention = this.defaultSettings().request_retention; - this.fsrs.p.request_retention = this.settings.request_retention; update(this.settings); + this.updateFsrsParams(); this.displaySettings(containerEl, update); }); }); @@ -365,10 +367,10 @@ export class FsrsAlgorithm extends SrsAlgorithm { return; } - this.settings.maximum_interval = this.fsrs.p.maximum_interval = - numValue; + this.settings.maximum_interval = numValue; text.setValue(this.settings.maximum_interval.toString()); update(this.settings); + this.updateFsrsParams(); } else { new Notice(t("VALID_NUMBER_WARNING")); } @@ -381,9 +383,10 @@ export class FsrsAlgorithm extends SrsAlgorithm { .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { applySettingsUpdate(async () => { - this.settings.maximum_interval = this.fsrs.p.maximum_interval = + this.settings.maximum_interval = this.defaultSettings().maximum_interval; update(this.settings, true); + this.updateFsrsParams(); }); }); }); @@ -399,8 +402,9 @@ export class FsrsAlgorithm extends SrsAlgorithm { return Number.parseFloat(v); }); if (numValue.length === this.settings.w.length) { - this.settings.w = this.fsrs.p.w = numValue; + this.settings.w = numValue; update(this.settings); + this.updateFsrsParams(); return; } } catch (error) { @@ -417,8 +421,9 @@ export class FsrsAlgorithm extends SrsAlgorithm { .setTooltip(t("RESET_DEFAULT")) .onClick(async () => { applySettingsUpdate(async () => { - this.settings.w = this.fsrs.p.w = this.defaultSettings().w; + this.settings.w = this.defaultSettings().w; update(this.settings, true); + this.updateFsrsParams(); }); }); }) diff --git a/src/gui/StatsModal.tsx b/src/gui/StatsModal.tsx index 2a32325a..4d4b731c 100644 --- a/src/gui/StatsModal.tsx +++ b/src/gui/StatsModal.tsx @@ -21,7 +21,7 @@ import { getKeysPreserveType, getTypedObjectEntries } from "src/util/utils"; import { textInterval } from "src/scheduling"; import { t } from "src/lang/helpers"; import { ReviewedCounts } from "src/dataStore/data"; -import { State } from "fsrs.js"; +import { State } from "ts-fsrs"; import { algorithmNames } from "src/algorithms/algorithms"; import { Stats } from "src/stats"; import { CardListType } from "src/Deck"; From d86357c313b09de277a5ef1e4743937824dcb373 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 13:31:56 +0800 Subject: [PATCH 127/155] add debug info --- src/algorithms/balance/balance.ts | 2 +- src/dataStore/repetitionItem.ts | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/algorithms/balance/balance.ts b/src/algorithms/balance/balance.ts index 671cb303..4615cf5f 100644 --- a/src/algorithms/balance/balance.ts +++ b/src/algorithms/balance/balance.ts @@ -70,7 +70,7 @@ export function balance( if (isChange) { const msg = `balance: interval from ${beforeIntvl} balance to ${interval} days.`; console.debug(msg); - // new Notice(msg); + new Notice(msg); } else { interval = beforeIntvl; } diff --git a/src/dataStore/repetitionItem.ts b/src/dataStore/repetitionItem.ts index 2296993e..1c8f8fdc 100644 --- a/src/dataStore/repetitionItem.ts +++ b/src/dataStore/repetitionItem.ts @@ -1,7 +1,8 @@ +import { Notice } from "obsidian"; import { AnkiData } from "src/algorithms/anki"; import { balance } from "src/algorithms/balance/balance"; import { FsrsData } from "src/algorithms/fsrs"; -import { DateUtils } from "src/util/utils_recall"; +import { DateUtils, debug } from "src/util/utils_recall"; export enum RPITEMTYPE { NOTE = "note", @@ -98,6 +99,8 @@ export class RepetitionItem { * @return {*} */ reviewUpdate(result: ReviewResult) { + debug("review result:", [this.nextReview, this.data.due, result]); + const old_nr = this.nextReview; const newitvl = balance(result.nextReview / DateUtils.DAYS_TO_MILLIS, this.itemType); this.nextReview = DateUtils.fromNow(newitvl * DateUtils.DAYS_TO_MILLIS).getTime(); this.timesReviewed += 1; @@ -107,6 +110,26 @@ export class RepetitionItem { } else { this.errorStreak += 1; } + if (this.nextReview - Date.now() < 100) { + new Notice( + "Error: reviewUpdate: " + + this.nextReview + + "\t last:" + + old_nr + + "\t itvl:" + + result.nextReview + + "\t new itvl:" + + newitvl, + ); + } + const dt = window.moment(this.nextReview).format("YYYY-MM-DD HH:mm:ss"); + debug("review result after:", [ + this.nextReview, + dt, + (this.nextReview - Date.now()) / DateUtils.DAYS_TO_MILLIS, + result.nextReview / DateUtils.DAYS_TO_MILLIS, + newitvl, + ]); } /** From f6876f4d73eafae781b356605fc5bf6754663e93 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 13:31:57 +0800 Subject: [PATCH 128/155] update debug func --- src/util/utils_recall.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/utils_recall.ts b/src/util/utils_recall.ts index e75fba3f..d8577113 100644 --- a/src/util/utils_recall.ts +++ b/src/util/utils_recall.ts @@ -180,7 +180,7 @@ export const debug = (functionname: string, ...data: unknown[]) => { data = data.slice(1); } const msg = { plugin: "SRR", func: functionname, ...data }; - console.debug(msg); + console.debug("plugin: SRR, func: " + functionname + "\t" + JSON.stringify(data)); if (Platform.isMobile) { MiscUtils.notice(JSON.stringify(msg), duration); } From 7408f752244b6ace8385d3768bff4159d5a684cb Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 13:31:57 +0800 Subject: [PATCH 129/155] fix #53 --- src/algorithms/balance/balance.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/algorithms/balance/balance.ts b/src/algorithms/balance/balance.ts index 4615cf5f..a0d9058d 100644 --- a/src/algorithms/balance/balance.ts +++ b/src/algorithms/balance/balance.ts @@ -43,12 +43,12 @@ export function balance( dueDates[interval] = 0; } else if (dueDates[interval] >= lowestCount) { // disable fuzzing for small intervals - if (interval >= 1) { + if (interval >= 3) { const fuzz = getFuzz(interval); const originalInterval = interval; outer: for (let i = 1; i <= fuzz; i++) { - for (const ivl of [originalInterval - i, originalInterval + i]) { + for (const ivl of [originalInterval + i, originalInterval - i]) { if (!Object.prototype.hasOwnProperty.call(dueDates, ivl)) { dueDates[ivl] = 0; interval = ivl; From f70127c0140d20fc6679676e0565cb889706ce83 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 13:31:58 +0800 Subject: [PATCH 130/155] chore: update docs --- docs/changelog.md | 4 ++++ "docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 38e478b3..4c3a44e6 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.11.1.??] + +- fix #53 复习日期没有更新问题; + ## [1.11.1.4] - fix #47 null error; diff --git "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" index 7c850fe4..7e13068e 100644 --- "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" +++ "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" @@ -87,6 +87,10 @@ _建议只是修改个别的笔记或笔记内卡片,不要做大批量修改 _这个基本用不到_ _如果对新排程不满意,直接重启Obsidian即可恢复之前的排程。在复习个笔记/卡片后新排程才会保存_ +#### 自动均衡 +当某天的复习卡片/笔记数大于等于10个,下次复习间隔大于等于3天时,会自动进行均衡,以避免相邻几天内的复习量相差过大。 + + #### 查看数据统计 通过命令行,`SR 查看数据` From 65a04da763ba19fd3444634dc9a3500f996ba509 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 14:05:55 +0800 Subject: [PATCH 131/155] chore: update version --- README.md | 2 +- docs/README_ZH.md | 5 +++-- docs/changelog.md | 9 ++++++++- docs/usage.md | 2 +- .../\344\275\277\347\224\250\346\225\231\347\250\213.md" | 4 ++-- manifest.json | 2 +- package.json | 2 +- styles.css | 1 - 8 files changed, 17 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 1fed931c..50321bf1 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,9 @@ This is a modified version of [obsidian-spaced-repetition](https://github.com/st - Postpone notes/cards; - postpone to review after x days; - reschedule all scheduled items; +- support multi-clozes; - setting `burySiblingCards` split into `burySiblingCards`(origin) and `burySiblingCardsByNoteReview`, and multi-clozes will not be buried; - ## Maintainers Wanted Since I am not a programmer, I don't know much about typescript programming, so I can only do some bug fixes and small feature updates. I can only do some bug fixes and small feature updates, but it is difficult to realize some of the proposed features. Welcome to join us if you are interested in this plugin, and work together to maintain and update this plugin. diff --git a/docs/README_ZH.md b/docs/README_ZH.md index 0112bbaf..9bb6f8df 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -16,8 +16,9 @@ 8. 延后笔记/卡片; 9. 修改笔记/卡片在x天后复习; 10. 重排所有已排程的复习项; -11. 设置项 隐藏关联卡片拆分为 隐藏关联卡片(即原来的)和复习笔记时隐藏关联卡片;另,多个挖空不会被隐藏关联卡片; -12. 其他待发现的小改动; +11. 支持多个挖空; +12. 设置项 隐藏关联卡片拆分为 隐藏关联卡片(即原来的)和复习笔记时隐藏关联卡片;另,多个挖空不会被隐藏关联卡片; +13. 其他待发现的小改动; **注意** 没有使用过 obsidian-spaced-repetition 插件的可以直接用,正在使用 obsidian-spaced-repetition 插件的话,建议试用前先备份 :yum: diff --git a/docs/changelog.md b/docs/changelog.md index 4c3a44e6..bca42a5d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,9 +4,16 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). -## [1.11.1.??] +## [1.12.4.5] +- feat: 同步原插件最新分支sync upsteam branch +- feat: support multi-clozes; +- feat: item info 可以显示卡片的信息了; +- feat: 如果设置了自动打开下篇笔记,在延迟某笔记后自动打开下篇笔记; +- refactor code; +- switch to ts-fsrs; - fix #53 复习日期没有更新问题; +- fix [#45](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues/45) can't review card in this day latter, after burysibling cards; ## [1.11.1.4] diff --git a/docs/usage.md b/docs/usage.md index 8ee71da2..d63ec7b5 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -92,7 +92,7 @@ Via command line, `SR view statistics` #### View review information -Via command line, `SR Item Info`, you can view review information for current/all notes +Via command line, `SR Item Info`, you can view review information for current note/all cards in current note. #### Algorithms diff --git "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" index 7e13068e..b190a1e1 100644 --- "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" +++ "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" @@ -88,8 +88,8 @@ _这个基本用不到_ _如果对新排程不满意,直接重启Obsidian即可恢复之前的排程。在复习个笔记/卡片后新排程才会保存_ #### 自动均衡 -当某天的复习卡片/笔记数大于等于10个,下次复习间隔大于等于3天时,会自动进行均衡,以避免相邻几天内的复习量相差过大。 +当某天的复习卡片/笔记数大于等于10个,下次复习间隔大于等于3天时,会自动进行均衡,以避免相邻几天内的复习量相差过大。 #### 查看数据统计 @@ -97,7 +97,7 @@ _如果对新排程不满意,直接重启Obsidian即可恢复之前的排程 #### 查看复习信息 -通过命令行,`SR Item Info`,可查看当前/所有笔记的复习信息 +通过命令行,`SR Item Info`,可查看当前笔记/当前笔记内卡片的复习信息 #### 算法 Algorithms diff --git a/manifest.json b/manifest.json index 9e0b1bbd..bbb0f3bc 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.11.1.4", + "version": "1.12.4.5", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index dec66753..dcdc28d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.11.1.4", + "version": "1.12.4.5", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { diff --git a/styles.css b/styles.css index c4f8862f..7ed344f7 100644 --- a/styles.css +++ b/styles.css @@ -328,7 +328,6 @@ ResponseFloatBar TOOLBAR background: var(--background-primary-alt); } - /*---------------------------------------------------------------- ResponseFloatBar Buttons ----------------------------------------------------------------*/ From faac1d504cf6cbde6357dc68b3a4e0553a0d3890 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 14:51:50 +0800 Subject: [PATCH 132/155] fix test error --- src/ReviewDeck.ts | 3 ++- src/algorithms/balance/postpone.ts | 3 ++- src/dataStore/location_switch.ts | 11 +++++++++-- src/dataStore/queue.ts | 8 ++++++-- src/dataStore/repetitionItem.ts | 6 +++--- src/gui/Sidebar.tsx | 3 ++- src/reviewNote/review-note.ts | 7 +++++-- src/stats.ts | 8 -------- src/util/DateProvider.ts | 7 +++++++ src/util/utils_recall.ts | 6 ------ tests/unit/NoteQuestionParser.test.ts | 2 +- 11 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/ReviewDeck.ts b/src/ReviewDeck.ts index b0e931b8..d60407c0 100644 --- a/src/ReviewDeck.ts +++ b/src/ReviewDeck.ts @@ -3,6 +3,7 @@ import { TFile } from "obsidian"; import { t } from "src/lang/helpers"; import { RepetitionItem } from "./dataStore/repetitionItem"; import { DateUtils } from "./util/utils_recall"; +import { globalDateProvider } from "./util/DateProvider"; export interface SchedNote { note: TFile; @@ -45,7 +46,7 @@ export class ReviewDeck { get dueNotesCount(): number { return this.scheduledNotes.filter((snote) => { - return snote.item?.isDue || snote.dueUnix <= DateUtils.EndofToday; + return snote.item?.isDue || snote.dueUnix <= globalDateProvider.endofToday.valueOf(); }).length; } } diff --git a/src/algorithms/balance/postpone.ts b/src/algorithms/balance/postpone.ts index 467f8ccf..a79dbb29 100644 --- a/src/algorithms/balance/postpone.ts +++ b/src/algorithms/balance/postpone.ts @@ -1,4 +1,5 @@ import { RepetitionItem } from "src/dataStore/repetitionItem"; +import { globalDateProvider } from "src/util/DateProvider"; import { DateUtils, debug } from "src/util/utils_recall"; export function postponeItems(items: RepetitionItem[], days?: number): RepetitionItem[] { @@ -6,7 +7,7 @@ export function postponeItems(items: RepetitionItem[], days?: number): Repetitio const newdue: number = days ? now + days * DateUtils.DAYS_TO_MILLIS : undefined; let fltItems = items.filter((item) => item.isTracked); const safe_fltItems = fltItems - .filter((item) => item.nextReview < DateUtils.StartofToday) + .filter((item) => item.nextReview < globalDateProvider.startofToday.valueOf()) .sort((a, b) => currentRetention(a) - currentRetention(b)) // https://github.com/open-spaced-repetition/fsrs4anki-helper/blob/58bcfcf8b5eeb60835c5cbde1d0d0ef769af62b0/schedule/postpone.py#L73 .filter((item) => { diff --git a/src/dataStore/location_switch.ts b/src/dataStore/location_switch.ts index 3e84f2a3..5ad694f2 100644 --- a/src/dataStore/location_switch.ts +++ b/src/dataStore/location_switch.ts @@ -22,6 +22,7 @@ import { RPITEMTYPE } from "./repetitionItem"; import deepcopy from "deepcopy"; import { NoteCardScheduleParser } from "src/CardSchedule"; import { DataLocation, getStorePath } from "./dataLocation"; +import { globalDateProvider } from "src/util/DateProvider"; export class LocationSwitch { public plugin: SRPlugin; @@ -338,7 +339,10 @@ export class LocationSwitch { scheduling.push(sched); dueIds.push(citem.ID); } - this.aftercardStats.updateStats(citem, DateUtils.EndofToday); + this.aftercardStats.updateStats( + citem, + globalDateProvider.endofToday.valueOf(), + ); // } }); const newCardText = updateCardSchedXml( @@ -367,7 +371,10 @@ export class LocationSwitch { } // console.debug(tkfile.path, this.afternoteStats.youngCount); } - this.afternoteStats.updateStats(item, DateUtils.EndofToday); + this.afternoteStats.updateStats( + item, + globalDateProvider.endofToday.valueOf(), + ); //update tag to note if (item?.itemType === RPITEMTYPE.NOTE) { const noteTag = Tags.getNoteDeckName(note, this.settings); diff --git a/src/dataStore/queue.ts b/src/dataStore/queue.ts index df94f777..32681a81 100644 --- a/src/dataStore/queue.ts +++ b/src/dataStore/queue.ts @@ -3,6 +3,7 @@ import { DataStore } from "./data"; import { TrackedFile } from "./trackedFile"; import { RepetitionItem } from "./repetitionItem"; import { getKeysPreserveType } from "src/util/utils"; +import { globalDateProvider } from "src/util/DateProvider"; export interface IQueue { /** @@ -236,7 +237,10 @@ export class Queue implements IQueue { if (item.nextReview <= now.getTime()) { this.remove(item, this.repeatQueue); oldAdd += this.push(this.queue[KEY_ALL], item.ID); - } else if (newDayFlag && item.nextReview <= DateUtils.EndofToday) { + } else if ( + newDayFlag && + item.nextReview <= globalDateProvider.endofToday.valueOf() + ) { this.push(this.queue[item.deckName], item.ID); } } @@ -354,7 +358,7 @@ export class Queue implements IQueue { } else { // update this.toDayLatterQueue const store = DataStore.getInstance(); - if (item.nextReview <= DateUtils.EndofToday) { + if (item.nextReview <= globalDateProvider.endofToday.valueOf()) { this.toDayLatterQueue[item.ID] = item.deckName; } getKeysPreserveType(this.toDayLatterQueue) diff --git a/src/dataStore/repetitionItem.ts b/src/dataStore/repetitionItem.ts index 1c8f8fdc..1bf2ab82 100644 --- a/src/dataStore/repetitionItem.ts +++ b/src/dataStore/repetitionItem.ts @@ -2,6 +2,7 @@ import { Notice } from "obsidian"; import { AnkiData } from "src/algorithms/anki"; import { balance } from "src/algorithms/balance/balance"; import { FsrsData } from "src/algorithms/fsrs"; +import { globalDateProvider } from "src/util/DateProvider"; import { DateUtils, debug } from "src/util/utils_recall"; export enum RPITEMTYPE { @@ -99,7 +100,6 @@ export class RepetitionItem { * @return {*} */ reviewUpdate(result: ReviewResult) { - debug("review result:", [this.nextReview, this.data.due, result]); const old_nr = this.nextReview; const newitvl = balance(result.nextReview / DateUtils.DAYS_TO_MILLIS, this.itemType); this.nextReview = DateUtils.fromNow(newitvl * DateUtils.DAYS_TO_MILLIS).getTime(); @@ -122,7 +122,7 @@ export class RepetitionItem { newitvl, ); } - const dt = window.moment(this.nextReview).format("YYYY-MM-DD HH:mm:ss"); + const dt = new Date(this.nextReview).toISOString(); debug("review result after:", [ this.nextReview, dt, @@ -274,7 +274,7 @@ export class RepetitionItem { if (this.nextReview < now_number) { return true; } - if (this.nextReview < DateUtils.EndofToday) { + if (this.nextReview < globalDateProvider.endofToday.valueOf()) { if (this.isFsrs) { const data: FsrsData = this.data as FsrsData; if (data.scheduled_days >= 1) { diff --git a/src/gui/Sidebar.tsx b/src/gui/Sidebar.tsx index 17457441..9d49952a 100644 --- a/src/gui/Sidebar.tsx +++ b/src/gui/Sidebar.tsx @@ -6,6 +6,7 @@ import { ReviewDeck, SchedNote } from "src/ReviewDeck"; import { t } from "src/lang/helpers"; import { DataLocation } from "src/dataStore/dataLocation"; import { DateUtils } from "src/util/utils_recall"; +import { globalDateProvider } from "src/util/DateProvider"; export const REVIEW_QUEUE_VIEW_TYPE = "review-queue-list-view"; @@ -98,7 +99,7 @@ export class ReviewQueueListView extends ItemView { now = Date.now(); } else { // end of today - now = DateUtils.EndofToday; + now = globalDateProvider.endofToday.valueOf(); } let currnDays: number | null = null; let schedFolderEl: HTMLElement | null = null, diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index 91e587e0..ad210942 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -11,6 +11,7 @@ import { Decks, ReviewDeck, SchedNote } from "src/ReviewDeck"; import { ReviewResponse } from "src/scheduling"; import { SRSettings } from "src/settings"; import { Tags } from "src/tags"; +import { globalDateProvider } from "src/util/DateProvider"; import { DateUtils, isIgnoredPath } from "src/util/utils_recall"; type Tsync = (notes: TFile[], reviewDecks?: Decks, easeByPath?: NoteEaseList) => Promise; @@ -202,7 +203,7 @@ export class ReviewNote { static updateminNextView(minNextView: number, nextReview: number): number { const now = Date.now(); - const nowToday: number = DateUtils.EndofToday; + const nowToday: number = globalDateProvider.endofToday.valueOf(); if (nextReview <= nowToday) { if (minNextView == undefined || minNextView < now || minNextView > nextReview) { @@ -329,7 +330,9 @@ function preUpdateDeck(deck: ReviewDeck, note: TFile) { } export function updatenDays(dueDates: Record, dueUnix: number) { - const nDays: number = Math.ceil((dueUnix - DateUtils.EndofToday) / DateUtils.DAYS_TO_MILLIS); + const nDays: number = Math.ceil( + (dueUnix - globalDateProvider.endofToday.valueOf()) / DateUtils.DAYS_TO_MILLIS, + ); if (!Object.prototype.hasOwnProperty.call(dueDates, nDays)) { dueDates[nDays] = 0; } diff --git a/src/stats.ts b/src/stats.ts index 8e1bb719..106f7f21 100644 --- a/src/stats.ts +++ b/src/stats.ts @@ -67,7 +67,6 @@ export class Stats { return; } if (now == undefined) { - // now = DateUtils.EndofToday; now = Date.now(); } @@ -76,13 +75,6 @@ export class Stats { const delayedDays: number = Math.ceil( (parseFloat(scheduling[1]) - now) / DateUtils.DAYS_TO_MILLIS, ); - // const delayedDays: number = Math.ceil( - // (window - // .moment(scheduling[1], ["YYYY-MM-DD", "DD-MM-YYYY", "ddd MMM DD YYYY"]) - // .valueOf() - - // now) / - // DateUtils.DAYS_TO_MILLIS, - // ); this.update(delayedDays, interval, ease); } diff --git a/src/util/DateProvider.ts b/src/util/DateProvider.ts index 5df68e9f..edfe0fce 100644 --- a/src/util/DateProvider.ts +++ b/src/util/DateProvider.ts @@ -4,6 +4,7 @@ import { ALLOWED_DATE_FORMATS } from "src/constants"; export interface IDateProvider { get today(): Moment; + get startofToday(): Moment; get endofToday(): Moment; } @@ -12,6 +13,9 @@ export class LiveDateProvider implements IDateProvider { // return moment().startOf("day"); return moment(); } + get startofToday(): Moment { + return moment().startOf("day"); + } get endofToday(): Moment { return moment().endOf("day"); } @@ -27,6 +31,9 @@ export class StaticDateProvider implements IDateProvider { get today(): Moment { return this.moment.clone(); } + get startofToday(): Moment { + return this.moment.clone().startOf("day"); + } get endofToday(): Moment { return this.moment.clone().endOf("day"); } diff --git a/src/util/utils_recall.ts b/src/util/utils_recall.ts index d8577113..a043eac3 100644 --- a/src/util/utils_recall.ts +++ b/src/util/utils_recall.ts @@ -6,12 +6,6 @@ export class DateUtils { * ms * @type {number} */ - static get StartofToday() { - return window.moment().startOf("day").valueOf(); - } - static get EndofToday() { - return window.moment().endOf("day").valueOf(); - } static addTime(date: Date, time: number): Date { return new Date(date.getTime() + time); diff --git a/tests/unit/NoteQuestionParser.test.ts b/tests/unit/NoteQuestionParser.test.ts index ae42d74e..7d8f156c 100644 --- a/tests/unit/NoteQuestionParser.test.ts +++ b/tests/unit/NoteQuestionParser.test.ts @@ -551,7 +551,7 @@ Stop trying ==to milk the crowd== for sympathy. // доить толпу topicPathList: TopicPathList.fromPsv("#flashcards/English", 3), // #flashcards/English is on the 4th line, line number 3 cards: [ new Card({ - front: "Stop trying [...] for sympathy. // доить толпу", + front: "Stop trying [............] for sympathy. // доить толпу", back: `Stop trying to milk the crowd for sympathy. // доить толпу`, }), ], From 47ae13fc47a87a1a8b2a18595047af480065fe39 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 14:57:46 +0800 Subject: [PATCH 133/155] fix lint error --- src/algorithms/balance/balance.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/algorithms/balance/balance.ts b/src/algorithms/balance/balance.ts index a0d9058d..7423534a 100644 --- a/src/algorithms/balance/balance.ts +++ b/src/algorithms/balance/balance.ts @@ -1,4 +1,3 @@ -import { Notice } from "obsidian"; import { RPITEMTYPE } from "src/dataStore/repetitionItem"; let dueDatesDict: { [type: string]: Record }; @@ -70,7 +69,6 @@ export function balance( if (isChange) { const msg = `balance: interval from ${beforeIntvl} balance to ${interval} days.`; console.debug(msg); - new Notice(msg); } else { interval = beforeIntvl; } From c79d0a25de7f7fed5a3e172c43ff0350e36e1149 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sat, 22 Jun 2024 17:11:35 +0800 Subject: [PATCH 134/155] hide popup message --- src/Events/touchEvent.ts | 2 +- src/dataStore/repetitionItem.ts | 16 ++++++++-------- src/main.ts | 4 +++- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Events/touchEvent.ts b/src/Events/touchEvent.ts index 4bf60f80..8cb4aac7 100644 --- a/src/Events/touchEvent.ts +++ b/src/Events/touchEvent.ts @@ -31,7 +31,7 @@ export class TouchOnMobile { } setTimeout(() => { console.debug("time up"); - if (this.isLongClick(0)) { + if (this.originTouches.length > 0 && this.isLongClick(0)) { evt.preventDefault(); this.showcb(); this.handleCancel(evt); diff --git a/src/dataStore/repetitionItem.ts b/src/dataStore/repetitionItem.ts index 1bf2ab82..ff75f47b 100644 --- a/src/dataStore/repetitionItem.ts +++ b/src/dataStore/repetitionItem.ts @@ -122,14 +122,14 @@ export class RepetitionItem { newitvl, ); } - const dt = new Date(this.nextReview).toISOString(); - debug("review result after:", [ - this.nextReview, - dt, - (this.nextReview - Date.now()) / DateUtils.DAYS_TO_MILLIS, - result.nextReview / DateUtils.DAYS_TO_MILLIS, - newitvl, - ]); + // const dt = new Date(this.nextReview).toISOString(); + // debug("review result after:", [ + // this.nextReview, + // dt, + // (this.nextReview - Date.now()) / DateUtils.DAYS_TO_MILLIS, + // result.nextReview / DateUtils.DAYS_TO_MILLIS, + // newitvl, + // ]); } /** diff --git a/src/main.ts b/src/main.ts index b6cc0e75..41fb789e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -733,7 +733,9 @@ export default class SRPlugin extends Plugin { this.updateAndSortDueNotes(); - new Notice(t("RESPONSE_RECEIVED")); + if(!this.data.settings.reviewResponseFloatBar){ + new Notice(t("RESPONSE_RECEIVED")); + } if (this.data.settings.autoNextNote) { if (!this.lastSelectedReviewDeck) { From 27109e5f79bc37270fdb17b41c6e5a50c14febb3 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 23 Jun 2024 16:34:50 +0800 Subject: [PATCH 135/155] =?UTF-8?q?fix:=20#54=20#56=20=E5=A4=8D=E4=B9=A0?= =?UTF-8?q?=E6=97=B6=E6=89=93=E5=BC=80=E4=BA=86=E6=B2=A1=E5=88=B0=E6=9C=9F?= =?UTF-8?q?=E7=9A=84=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/changelog.md | 4 ++ manifest.json | 2 +- package.json | 2 +- src/Card.ts | 2 +- src/ReviewDeck.ts | 20 +++++++-- src/commands.ts | 4 +- src/dataStore/itemToDecks.ts | 5 +-- src/dataStore/queue.ts | 83 +++++++++++------------------------ src/main.ts | 25 ++++------- src/reviewNote/review-note.ts | 6 +-- 10 files changed, 63 insertions(+), 90 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index bca42a5d..ceb5d1b7 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.12.4.6] + +- fix: #54 #56 复习时打开了没到期的笔记 + ## [1.12.4.5] - feat: 同步原插件最新分支sync upsteam branch diff --git a/manifest.json b/manifest.json index bbb0f3bc..b50dac5c 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.12.4.5", + "version": "1.12.4.6", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index dcdc28d4..799a4200 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.12.4.5", + "version": "1.12.4.6", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { diff --git a/src/Card.ts b/src/Card.ts index 15356877..5d2e34cf 100644 --- a/src/Card.ts +++ b/src/Card.ts @@ -44,7 +44,7 @@ export class Card { } else if (this.hasSchedule) { if ( this.scheduleInfo.dueDate.isSameOrBefore(globalDateProvider.today) && - Object.keys(Queue.getInstance().toDayLatterQueue).includes(this.Id?.toString()) + Queue.getInstance().isInLaterQueue(this?.Id) ) { notBury = true; } diff --git a/src/ReviewDeck.ts b/src/ReviewDeck.ts index d60407c0..10d64419 100644 --- a/src/ReviewDeck.ts +++ b/src/ReviewDeck.ts @@ -36,7 +36,13 @@ export class ReviewDeck { // sort scheduled notes by date & within those days, sort them by importance this.scheduledNotes = this.scheduledNotes.sort((a: SchedNote, b: SchedNote) => { - const result = a.dueUnix - b.dueUnix; + const adue = isDue(a) ? -1 : 1; + const bdue = isDue(b) ? 1 : -1; + let result = adue + bdue; + if (result != 0) { + return result; + } + result = a.dueUnix - b.dueUnix; if (result != 0) { return result; } @@ -45,8 +51,14 @@ export class ReviewDeck { } get dueNotesCount(): number { - return this.scheduledNotes.filter((snote) => { - return snote.item?.isDue || snote.dueUnix <= globalDateProvider.endofToday.valueOf(); - }).length; + return this.scheduledNotes.filter(isDue).length; + } +} + +function isDue(snote: SchedNote): boolean { + if (Object.prototype.hasOwnProperty.call(snote, "item")) { + return snote.item.isDue; + } else { + return snote.dueUnix <= globalDateProvider.endofToday.valueOf(); } } diff --git a/src/commands.ts b/src/commands.ts index 1bddebba..7fc606a4 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -36,7 +36,7 @@ export default class Commands { tkfile, noteDelayed: this.plugin.noteStats.delayedDays.dict, // decks: deck.scheduledNotes.map((sn) => [sn.note.path, sn.item]), - que: store.data.queues.toDayLatterQueue, + que: store.data.queues.toDayLaterQueue, }); new ItemInfoModal(plugin.data.settings, file).open(); } @@ -154,8 +154,6 @@ export default class Commands { // console.log("There are " + plugin.store.data.queue.length + " items in queue."); // console.log(plugin.store.data.newAdded + " new where added to today."); // console.log("repeatQueue: " + plugin.store.data.repeatQueue); - // console.log("cardQueue: " + plugin.store.data.cardQueue); - // console.log("cardRepeatQueue: " + plugin.store.data.cardRepeatQueue); // }, // }); diff --git a/src/dataStore/itemToDecks.ts b/src/dataStore/itemToDecks.ts index f4c06c05..9199b96f 100644 --- a/src/dataStore/itemToDecks.ts +++ b/src/dataStore/itemToDecks.ts @@ -112,8 +112,7 @@ export class ItemToDecks { // const queue = store.data.queues; const ind = store.getFileIndex(note.path); const trackedFile = store.getTrackedFile(note.path); - const fileid = store.getTrackedFile(note.path).noteID; - const item = store.getItembyID(fileid); + const item = store.getNoteItem(note.path); if (item == null) { // store._updateItem(fileid, ind, RPITEMTYPE.NOTE, rdeck.deckName); @@ -124,8 +123,6 @@ export class ItemToDecks { if (!trackedFile.isDefault && !item.isTracked) { item.setTracked(ind); } - const latterQue = store.data.queues.toDayLatterQueue; - delete latterQue[fileid]; if (item.hasDue) { rdeck.scheduledNotes.push({ diff --git a/src/dataStore/queue.ts b/src/dataStore/queue.ts index 32681a81..4fea0899 100644 --- a/src/dataStore/queue.ts +++ b/src/dataStore/queue.ts @@ -14,16 +14,9 @@ export interface IQueue { * @type {number[]} */ repeatQueue: number[]; - /** - * @type {number[]} - */ - cardQueue: number[]; - /** - * @type {number[]} - */ - cardRepeatQueue: number[]; + toDayAllQueue: Record; - toDayLatterQueue: Record; + toDayLaterQueue: Record; /** * @type {number} @@ -44,16 +37,9 @@ export const DEFAULT_QUEUE_DATA: IQueue = { * @type {number[]} */ repeatQueue: [], - /** - * @type {number[]} - */ - cardQueue: [], - /** - * @type {number[]} - */ - cardRepeatQueue: [], + toDayAllQueue: {}, - toDayLatterQueue: {}, + toDayLaterQueue: {}, /** * @type {number} */ @@ -70,22 +56,16 @@ export class Queue implements IQueue { static instance: Queue; /** * @type {number[]} + * e.g. review: [1,2,3] */ queue: Record; /** * @type {number[]} */ repeatQueue: number[]; - /** - * @type {number[]} - */ - cardQueue: number[]; - /** - * @type {number[]} - */ - cardRepeatQueue: number[]; + toDayAllQueue: Record; - toDayLatterQueue: Record; + toDayLaterQueue: Record; // maxNewPerDay: number; lastQueue: number; @@ -109,10 +89,8 @@ export class Queue implements IQueue { constructor() { this.queue = {}; this.repeatQueue = []; - this.cardQueue = []; - this.cardRepeatQueue = []; this.toDayAllQueue = {}; - this.toDayLatterQueue = {}; + this.toDayLaterQueue = {}; Queue.instance = this; } @@ -130,7 +108,11 @@ export class Queue implements IQueue { } return this.queue[key]?.length ?? 0; } - todaylatterSize(): number { + get laterSize(): number { + const len = Object.keys(this.toDayLaterQueue).length; + if (len) { + return len; + } const keys = Object.keys(this.queue); keys.remove(KEY_ALL); return keys @@ -183,8 +165,6 @@ export class Queue implements IQueue { let oldAdd = 0; let newAdd = 0; - let oldAdd_card = 0; - let newAdd_card = 0; let untrackedFiles = 0; let removedItems = 0; @@ -208,20 +188,7 @@ export class Queue implements IQueue { }), ); const validItems = store.items.filter((item) => item != null && item.isTracked); - validItems - .filter((item) => item.isCard) - .forEach((item) => { - if (item.isNew) { - // This is a new item. - if (maxNew == -1 || this.newAdded < maxNew) { - this.newAdded += 1; - newAdd_card += this.push(this.cardQueue, item.ID); - } - } else if (item.nextReview <= now.getTime()) { - this.remove(item, this.cardRepeatQueue); - oldAdd_card += this.push(this.cardQueue, item.ID); - } - }); + validItems .filter((item) => !item.isCard) .forEach(async (item) => { @@ -304,10 +271,8 @@ export class Queue implements IQueue { if (queue == null) { this.queue = {}; this.repeatQueue = []; - this.cardQueue = []; - this.cardRepeatQueue = []; this.toDayAllQueue = {}; - this.toDayLatterQueue = {}; + this.toDayLaterQueue = {}; console.debug("all queue are cleared!"); } else if (isArray(queue)) { queue = []; @@ -326,6 +291,9 @@ export class Queue implements IQueue { return queue?.includes(id) ?? false; } + isInLaterQueue(id: number): boolean { + return Object.keys(this.toDayLaterQueue).includes(id.toString()); + } InitQIfMissing(key: string, queueR?: Record): void { if (!this.hasQueue(key, queueR)) queueR[key] = []; } @@ -344,7 +312,7 @@ export class Queue implements IQueue { * @returns {boolean} */ isInRepeatQueue(item: number): boolean { - return this.repeatQueue.includes(item) || this.cardRepeatQueue.includes(item); + return this.repeatQueue.includes(item); } updateWhenReview(item: RepetitionItem, correct: boolean, repeatItems: boolean) { @@ -356,19 +324,20 @@ export class Queue implements IQueue { if (repeatItems && !correct) { this.push(this.repeatQueue, item.ID); // Re-add until correct. } else { - // update this.toDayLatterQueue + // update this.toDayLaterQueue const store = DataStore.getInstance(); + delete this.toDayLaterQueue[item.ID]; if (item.nextReview <= globalDateProvider.endofToday.valueOf()) { - this.toDayLatterQueue[item.ID] = item.deckName; + this.toDayLaterQueue[item.ID] = item.deckName; } - getKeysPreserveType(this.toDayLatterQueue) + getKeysPreserveType(this.toDayLaterQueue) .map((idStr) => { const id: number = Number(idStr); return store.getItembyID(id); }) .forEach((item) => { if (item.nextReview - Date.now() < 0) { - delete this.toDayLatterQueue[item.ID]; + delete this.toDayLaterQueue[item.ID]; } }); } @@ -384,8 +353,8 @@ export class Queue implements IQueue { this.remove(item, this.queue[KEY_ALL]); } - if (this.toDayLatterQueue[item.ID] !== null) { - delete this.toDayLatterQueue[item.ID]; + if (this.toDayLaterQueue[item.ID] !== null) { + delete this.toDayLaterQueue[item.ID]; } } else { if (this.isQueued(queue, item.ID)) { diff --git a/src/main.ts b/src/main.ts index 41fb789e..81eead4a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -538,11 +538,9 @@ export default class SRPlugin extends Plugin { const now = window.moment(Date.now()); Object.values(this.reviewDecks).forEach((reviewDeck: ReviewDeck) => { + this.dueNotesCount += reviewDeck.dueNotesCount; + this.noteStats.newCount += reviewDeck.newNotes.length; reviewDeck.scheduledNotes.forEach((scheduledNote: SchedNote) => { - if (scheduledNote.dueUnix <= now.valueOf()) { - this.dueNotesCount++; - } - const nDays: number = Math.ceil( (scheduledNote.dueUnix - now.valueOf()) / (24 * 3600 * 1000), ); @@ -552,7 +550,6 @@ export default class SRPlugin extends Plugin { this.dueDatesNotes[nDays]++; this.noteStats.update(nDays, scheduledNote.interval, scheduledNote.ease); }); - this.noteStats.newCount += reviewDeck.newNotes.length; reviewDeck.sortNotes(this.linkRank.pageranks); }); @@ -666,7 +663,6 @@ export default class SRPlugin extends Plugin { ); interval = schedObj.interval; ease = schedObj.ease; - this.easeByPath.setEaseForPath(note.path, ease); const due = window.moment(now + interval * 24 * 3600 * 1000); const dueString: string = due.format("YYYY-MM-DD"); @@ -733,9 +729,9 @@ export default class SRPlugin extends Plugin { this.updateAndSortDueNotes(); - if(!this.data.settings.reviewResponseFloatBar){ + if (!this.data.settings.reviewResponseFloatBar) { new Notice(t("RESPONSE_RECEIVED")); - } + } if (this.data.settings.autoNextNote) { if (!this.lastSelectedReviewDeck) { @@ -781,10 +777,7 @@ export default class SRPlugin extends Plugin { let index = -1; const isPreviewUndueNote = (item: RepetitionItem) => { - return ( - item.nextReview > Date.now() && - !Object.keys(this.store.data.queues.toDayLatterQueue).includes(item.ID.toString()) - ); + return item.nextReview > Date.now() && !Queue.getInstance().isInLaterQueue(item.ID); }; const fShowItemInfo = (item: RepetitionItem, msg: string) => { if (this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile) { @@ -795,11 +788,11 @@ export default class SRPlugin extends Plugin { if (calcDueCnt !== deck.dueNotesCount) { debug( "check cnt", - msg, 0, - deck, + msg, `${deck.deckName} due cnt error: calc ${calcDueCnt}, dnc: ${deck.dueNotesCount}`, ); + console.debug("schedNotes:", deck.scheduledNotes); } const id = "obsidian-spaced-repetition-recall:view-item-info"; // eslint-disable-next-line @@ -864,7 +857,7 @@ export default class SRPlugin extends Plugin { } } - ReviewNote.nextReviewNotice(Queue.getInstance().toDayLatterQueue); + ReviewNote.nextReviewNotice(Queue.getInstance().laterSize); this.reviewFloatBar.selfDestruct(); this.reviewQueueView.redraw(); @@ -943,7 +936,7 @@ export default class SRPlugin extends Plugin { updateStatusBar() { this.statusBar.setText( t("STATUS_BAR", { - dueNotesCount: this.noteStats.onDueCount + this.store.data.queues.todaylatterSize(), // this.dueNotesCount, + dueNotesCount: this.noteStats.onDueCount, // this.dueNotesCount, + this.store.data.queues.todaylatterSize() dueFlashcardsCount: this.remainingDeckTree.getDistinctCardCount( CardListType.All, true, diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index ad210942..8ec1d85d 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -142,7 +142,7 @@ export class ReviewNote { return; } - this.nextReviewNotice(store.data.queues.toDayLatterQueue); + this.nextReviewNotice(store.data.queues.laterSize); // plugin.updateStatusBar(); @@ -214,8 +214,8 @@ export class ReviewNote { return minNextView; } - static nextReviewNotice(toDayLatterQueue: Record) { - if (this.minNextView > 0 && Object.keys(toDayLatterQueue).length > 0) { + static nextReviewNotice(laterSize: number) { + if (this.minNextView > 0 && laterSize > 0) { const now = Date.now(); const interval = Math.round((this.minNextView - now) / 1000 / 60); if (interval < 60) { From 2bb88ae8d7dc9aabd93ac197a8c6456f4c1717e6 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Wed, 26 Jun 2024 20:28:15 +0800 Subject: [PATCH 136/155] fix#56 #58 (#61) --- docs/changelog.md | 7 + manifest.json | 2 +- package.json | 2 +- src/CardSchedule.ts | 1 - src/NoteQuestionParser.ts | 5 +- src/ReviewDeck.ts | 1 - src/commands.ts | 6 +- .../{itemToDecks.ts => itemTrans.ts} | 57 +++---- src/dataStore/trackedFile.ts | 7 +- src/gui/FlashcardReviewView.tsx | 4 +- src/gui/info.ts | 69 ++++---- src/gui/reviewView.ts | 97 +++++++++++ src/main.ts | 69 ++++---- src/reviewNote/review-note.ts | 153 +++++------------- src/settings/locationSetting.ts | 1 - 15 files changed, 257 insertions(+), 224 deletions(-) rename src/dataStore/{itemToDecks.ts => itemTrans.ts} (80%) create mode 100644 src/gui/reviewView.ts diff --git a/docs/changelog.md b/docs/changelog.md index ceb5d1b7..47584365 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.12.4.7] + +- fix: #56 复习时打开了没到期的笔记; +- fix: #58 卡片复习数据显示不正确; +- iteminfo 窗口显示优化 + + ## [1.12.4.6] - fix: #54 #56 复习时打开了没到期的笔记 diff --git a/manifest.json b/manifest.json index b50dac5c..7be874a3 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.12.4.6", + "version": "1.12.4.7", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index 799a4200..5ab3ad48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.12.4.6", + "version": "1.12.4.7", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { diff --git a/src/CardSchedule.ts b/src/CardSchedule.ts index 54dae2e4..cee79fb8 100644 --- a/src/CardSchedule.ts +++ b/src/CardSchedule.ts @@ -9,7 +9,6 @@ import { ReviewResponse, schedule } from "./scheduling"; import { SRSettings } from "./settings"; import { formatDate_YYYY_MM_DD } from "./util/utils"; import { DateUtil, globalDateProvider } from "./util/DateProvider"; -import { DateUtils } from "./util/utils_recall"; export class CardScheduleInfo { dueDate: Moment; diff --git a/src/NoteQuestionParser.ts b/src/NoteQuestionParser.ts index c6c74ec9..6ae18165 100644 --- a/src/NoteQuestionParser.ts +++ b/src/NoteQuestionParser.ts @@ -317,7 +317,7 @@ export class NoteQuestionParser { // private determineQuestionTopicPathList(question: Question): TopicPathList { let result: TopicPathList; - if (this.settings.convertFoldersToDecks || this.settings.trackedNoteToDecks) { + if (this.settings.convertFoldersToDecks) { result = new TopicPathList([this.folderTopicPath]); } else { // If present, the question specific TopicPath takes precedence over everything else @@ -348,6 +348,9 @@ export class NoteQuestionParser { } } } + if (!result && this.settings.trackedNoteToDecks && this.folderTopicPath) { + result = new TopicPathList([this.folderTopicPath]); + } return result; } } diff --git a/src/ReviewDeck.ts b/src/ReviewDeck.ts index 10d64419..811f7d12 100644 --- a/src/ReviewDeck.ts +++ b/src/ReviewDeck.ts @@ -2,7 +2,6 @@ import { TFile } from "obsidian"; import { t } from "src/lang/helpers"; import { RepetitionItem } from "./dataStore/repetitionItem"; -import { DateUtils } from "./util/utils_recall"; import { globalDateProvider } from "./util/DateProvider"; export interface SchedNote { diff --git a/src/commands.ts b/src/commands.ts index 7fc606a4..bf0e7a36 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -1,12 +1,12 @@ import { MarkdownView, Notice } from "obsidian"; import ObsidianSrsPlugin from "./main"; -import { ReviewNote } from "src/reviewNote/review-note"; import { ItemInfoModal } from "src/gui/info"; import { Queue } from "./dataStore/queue"; import { debug } from "./util/utils_recall"; import { postponeItems } from "./algorithms/balance/postpone"; import { reschedule } from "./algorithms/balance/reschedule"; import { GetInputModal } from "./gui/getInputModal"; +import { ReviewView } from "./gui/reviewView"; export default class Commands { plugin: ObsidianSrsPlugin; @@ -38,7 +38,7 @@ export default class Commands { // decks: deck.scheduledNotes.map((sn) => [sn.note.path, sn.item]), que: store.data.queues.toDayLaterQueue, }); - new ItemInfoModal(plugin.data.settings, file).open(); + new ItemInfoModal(plugin, file).open(); } return true; } @@ -124,7 +124,7 @@ export default class Commands { name: "Review", callback: () => { Queue.getInstance().buildQueue(); - ReviewNote.recallReviewNote(this.plugin.data.settings); + ReviewView.getInstance().recallReviewNote(this.plugin.data.settings); }, }); diff --git a/src/dataStore/itemToDecks.ts b/src/dataStore/itemTrans.ts similarity index 80% rename from src/dataStore/itemToDecks.ts rename to src/dataStore/itemTrans.ts index 9199b96f..a9347136 100644 --- a/src/dataStore/itemToDecks.ts +++ b/src/dataStore/itemTrans.ts @@ -1,7 +1,7 @@ import { TFile } from "obsidian"; import { CardScheduleInfo, NoteCardScheduleParser } from "src/CardSchedule"; import { Note } from "src/Note"; -import { ReviewDeck } from "src/ReviewDeck"; +import { ReviewDeck, SchedNote } from "src/ReviewDeck"; import { SrTFile } from "src/SRFile"; import { TopicPath } from "src/TopicPath"; import { DataStore } from "src/dataStore/data"; @@ -9,17 +9,17 @@ import { BlockUtils, debug, logExecutionTime } from "src/util/utils_recall"; import { CardInfo } from "./trackedFile"; import { Card } from "src/Card"; import { DataLocation } from "./dataLocation"; -import { RPITEMTYPE } from "./repetitionItem"; +import { RPITEMTYPE, RepetitionItem } from "./repetitionItem"; import { Tags } from "src/tags"; import { SRSettings } from "src/settings"; import { INoteEaseList } from "src/NoteEaseList"; import { algorithmNames } from "src/algorithms/algorithms"; -export class ItemToDecks { +export class ItemTrans { settings: SRSettings; static create(settings: SRSettings) { - return new ItemToDecks(settings); + return new ItemTrans(settings); } constructor(settings: SRSettings) { this.settings = settings; @@ -39,7 +39,6 @@ export class ItemToDecks { const store = DataStore.getInstance(); const settings = this.settings; // store.data.queues.buildQueue(); - const now = new Date().getTime(); notes.forEach(async (note) => { let deckname = Tags.getNoteDeckName(note, this.settings); if (deckname == null) { @@ -74,27 +73,8 @@ export class ItemToDecks { } } } - ItemToDecks.toRevDeck(reviewDecks[deckname], note); + ItemTrans._toRevDeck(reviewDecks[deckname], note); } - - // Add Recall reviewnote deck - // const dkname = DEFAULT_DECKNAME; - // if (!Object.prototype.hasOwnProperty.call(reviewDecks, dkname)) { - // reviewDecks[dkname] = new ReviewDeck(dkname); - // } - - // store.data.trackedFiles - // .filter((trackedFile) => trackedFile?.noteID >= 0 && trackedFile.isTracked) - // .filter((trackedFile) => trackedFile.isDefault) - // .filter((trackedFile) => { - // // only add default deck. - // const note = app.vault.getAbstractFileByPath(trackedFile.path) as TFile; - // if (note instanceof TFile) { - // noteStats.updateStats(store.getItembyID(trackedFile.noteID)); - // DataSyncer.syncRCDataToSRrevDeck(reviewDecks[deckName], note); - // return true; - // } - // }); }); return; } @@ -105,11 +85,9 @@ export class ItemToDecks { * @param rdeck * @returns */ - static toRevDeck(rdeck: ReviewDeck, note: TFile, now?: number) { + private static _toRevDeck(rdeck: ReviewDeck, note: TFile, now?: number) { // const plugin = plugin; - // const rdeck = reviewDecks[deckName]; const store = DataStore.getInstance(); - // const queue = store.data.queues; const ind = store.getFileIndex(note.path); const trackedFile = store.getTrackedFile(note.path); const item = store.getNoteItem(note.path); @@ -125,13 +103,7 @@ export class ItemToDecks { } if (item.hasDue) { - rdeck.scheduledNotes.push({ - note, - item, - dueUnix: item.nextReview, - interval: item.interval, - ease: item.ease, - }); + rdeck.scheduledNotes.push(itemToShedNote(item, note)); } else { rdeck.newNotes.push({ note, item }); } @@ -146,7 +118,10 @@ export class ItemToDecks { const store = DataStore.getInstance(); const settings = store.settings; const noteFile: SrTFile = note.file as SrTFile; - if (topicPath.isEmptyPath || settings.dataLocation === DataLocation.SaveOnNoteFile) { + if ( + note.questionList.length === 0 || + settings.dataLocation === DataLocation.SaveOnNoteFile + ) { return; } if (store.getFileIndex(note.filePath) < 0) { @@ -208,3 +183,13 @@ function updateCardObjs(cards: Card[], cardinfo: CardInfo, scheduling: RegExpMat cardObj.Id = carditemIds[i]; } } + +export function itemToShedNote(item: RepetitionItem, note: TFile): SchedNote { + return { + note, + item, + dueUnix: item.nextReview, + interval: item.interval, + ease: item.ease, + }; +} diff --git a/src/dataStore/trackedFile.ts b/src/dataStore/trackedFile.ts index 7943b4af..47b7e8aa 100644 --- a/src/dataStore/trackedFile.ts +++ b/src/dataStore/trackedFile.ts @@ -175,6 +175,9 @@ export class TrackedFile implements ITrackedFile { settings.convertBoldTextToClozes, settings.convertCurlyBracketsToClozes, ); + if (!this.hasCards && parsedCards.length === 0) { + return false; + } for (const parsedCard of parsedCards) { // deckPath = noteDeckPath; @@ -218,7 +221,7 @@ export class TrackedFile implements ITrackedFile { // sync by total parsedCards.length if (!this.hasCards) { - return; + return false; } const carditems = this?.cardItems; if (lines.length === carditems.length && negIndFlag) { @@ -233,7 +236,7 @@ export class TrackedFile implements ITrackedFile { } } // store.save(); - return; + return true; } get lastTag() { diff --git a/src/gui/FlashcardReviewView.tsx b/src/gui/FlashcardReviewView.tsx index 5e33fbf4..a3d26eda 100644 --- a/src/gui/FlashcardReviewView.tsx +++ b/src/gui/FlashcardReviewView.tsx @@ -377,7 +377,7 @@ export class FlashcardReviewView { private _processReviewbyAlgo(response: ReviewResponse) { const algo = this.plugin.algorithm; - setDueDates(this.plugin.noteStats.delayedDays.dict, this.plugin.noteStats.delayedDays.dict); + setDueDates(this.plugin.cardStats.delayedDays.dict, this.plugin.cardStats.delayedDays.dict); const opt = algo.srsOptions()[response]; const store = this.plugin.store; const id = this._currentCard.Id; @@ -506,7 +506,7 @@ export class FlashcardReviewView { const srfile = this._currentNote.file as SrTFile; const store = this.plugin.store; const id = this._currentCard.Id; - const infoM = new ItemInfoModal(this.settings, srfile.file, store.getItembyID(id)); + const infoM = new ItemInfoModal(this.plugin, srfile.file, store.getItembyID(id)); infoM.open(); }); } diff --git a/src/gui/info.ts b/src/gui/info.ts index 26ba32a3..36211a71 100644 --- a/src/gui/info.ts +++ b/src/gui/info.ts @@ -1,14 +1,15 @@ -import { ButtonComponent, Modal, Setting, TFile } from "obsidian"; +import { ButtonComponent, MarkdownRenderer, Modal, Setting, TFile } from "obsidian"; import { algorithmNames } from "src/algorithms/algorithms"; import { AnkiData } from "src/algorithms/anki"; import { FsrsData } from "src/algorithms/fsrs"; import { DataStore } from "src/dataStore/data"; import { RepetitionItem } from "src/dataStore/repetitionItem"; import { TrackedFile } from "src/dataStore/trackedFile"; +import SRPlugin from "src/main"; import { SRSettings } from "src/settings"; export class ItemInfoModal extends Modal { - // plugin: ObsidianSrsPlugin; + plugin: SRPlugin; store: DataStore; settings: SRSettings; file: TFile; @@ -16,14 +17,14 @@ export class ItemInfoModal extends Modal { nextReview: number; lastInterval: number; - constructor(settings: SRSettings, file: TFile, item: RepetitionItem = null) { + constructor(plugin: SRPlugin, file: TFile, item: RepetitionItem = null) { super(app); - // this.plugin = plugin; + this.plugin = plugin; this.store = DataStore.getInstance(); - this.settings = settings; + this.settings = plugin.data.settings; this.file = file; if (item == null) { - this.item = this.store.getItemsOfFile(this.file.path)[0]; + this.item = this.store.getNoteItem(file.path); } else { this.item = item; } @@ -32,24 +33,23 @@ export class ItemInfoModal extends Modal { onOpen() { const { contentEl } = this; //TODO: Implement Item info. - // const item = this.store.getItemsOfFile(this.file.path)[0]; const path = this.file.path; // contentEl.createEl("p").setText("Item info of " + this.file.path); const buttonDivAll = contentEl.createDiv("srs-flex-row"); const contentdiv = contentEl.createEl("div"); + contentdiv.setAttr("style", "min-height: 200px"); const tkfile = this.store.getTrackedFile(path); - const noteItem = this.store.getNoteItem(path); if (tkfile.hasCards) { - new ButtonComponent(buttonDivAll).setButtonText("Note").onClick(() => { - this.displayitem(contentdiv, noteItem); + new ButtonComponent(buttonDivAll).setButtonText(this.item.itemType).onClick(() => { + this.displayitem(contentdiv, this.item); }); new ButtonComponent(buttonDivAll).setButtonText("Cards in this Note").onClick(() => { this.displayAllitems(contentdiv, tkfile); // this.close(); }); } - this.displayitem(contentdiv, noteItem); + this.displayitem(contentdiv, this.item); const buttonDiv = contentEl.createDiv("srs-flex-row"); @@ -83,7 +83,8 @@ export class ItemInfoModal extends Modal { items.forEach((item) => { const divdetails = details.createEl("details"); const divsummary = divdetails.createEl("summary"); - divsummary.setText("ID:" + item.ID.toString()); + const dt = window.moment(item.nextReview).format("YYYY-MM-DD HH:mm:ss"); + divsummary.setText(`ID: ${item.ID} \t nextReivew: ${dt}`); const div = divdetails.createDiv(); this.displayitem(div, item); }); @@ -100,42 +101,48 @@ export class ItemInfoModal extends Modal { // contentEl.createDiv("li").setText(key+ ": "+ item[key]) // }); // type dataType = typeof plugin.algorithm.defaultData; + const title = + "key | value \n\ + ---|---\n"; + let tablestr = ""; Object.keys(item).forEach((key) => { if (key != "data") { - new Setting(contentdiv).setDesc(key).addText((text) => { - if (key === "nextReview") { + if (key === "nextReview") { + new Setting(contentdiv).setDesc(key).addText((text) => { this.nextReview = undefined; const dt = window.moment(item.nextReview).format("YYYY-MM-DD HH:mm:ss"); text.setValue(dt).onChange((value) => { const nr = window.moment(value).valueOf(); this.nextReview = nr ?? 0; }); - } else { - text.setDisabled(true); - text.setValue(item[key as keyof typeof item]?.toString()); - } - }); + }); + } else { + tablestr += `| ${key} | ${item[key as keyof typeof item]} |\n`; + // const span = contentdiv.createDiv("span"); + // span.setText(key + "\t: " + item[key as keyof typeof item]?.toString()); + } } }); + MarkdownRenderer.render(this.plugin.app, title + tablestr, contentdiv, "", this.plugin); contentdiv.createEl("p").setText("Item.data info"); - const data = item.data as AnkiData; + tablestr = ""; Object.keys(item.data).forEach((key) => { - new Setting(contentdiv).setDesc(key).addText((text) => { - key = key as keyof typeof item.data; - if (key === "lastInterval") { + const dkey = key as keyof typeof item.data; + if (key === "lastInterval") { + const akey = key as keyof AnkiData; + new Setting(contentdiv).setDesc(key).addText((text) => { + const data = item.data as AnkiData; this.lastInterval = undefined; - text.setValue(data[key]?.toString()).onChange((value) => { + text.setValue(data[akey]?.toString()).onChange((value) => { this.lastInterval = Number(value) ?? 0; }); - } else { - text.setDisabled(true); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - text.setValue(data[key]?.toString()); - } - }); + }); + } else { + tablestr += `| ${key} | ${item.data[dkey]} |\n`; + } }); + MarkdownRenderer.render(this.plugin.app, title + tablestr, contentdiv, "", this.plugin); } submit() { diff --git a/src/gui/reviewView.ts b/src/gui/reviewView.ts new file mode 100644 index 00000000..a44f5b76 --- /dev/null +++ b/src/gui/reviewView.ts @@ -0,0 +1,97 @@ +import { Notice, TFile } from "obsidian"; +import { DataStore } from "src/dataStore/data"; +import { itemToShedNote } from "src/dataStore/itemTrans"; +import { reviewResponseModal } from "src/gui/reviewresponse-modal"; +import { t } from "src/lang/helpers"; +import SRPlugin from "src/main"; +import { IReviewNote } from "src/reviewNote/review-note"; + +import { SRSettings } from "src/settings"; + +export class ReviewView { + private static _instance: ReviewView; + itemId: number; + + private plugin: SRPlugin; + private settings: SRSettings; + + static create(plugin: SRPlugin, settings: SRSettings) { + return new ReviewView(plugin, settings); + } + + static getInstance() { + if (!ReviewView._instance) { + throw Error("there is not ReviewView instance."); + } + return ReviewView._instance; + } + + constructor(plugin: SRPlugin, settings: SRSettings) { + this.plugin = plugin; + this.settings = settings; + ReviewView._instance = this; + } + + recallReviewNote(settings: SRSettings) { + const plugin = this.plugin; + let note: TFile; + const store = DataStore.getInstance(); + const reviewFloatBar = reviewResponseModal.getInstance(); + // const settings = plugin.data.settings; + const que = store.data.queues; + que.buildQueue(); + const item = store.getNext(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const state: any = { mode: "empty" }; + if (item != null && item.isTracked) { + this.itemId = item.ID; + console.debug("item:", item, que.queueSize()); + const path = store.getFilePath(item); + if (path != null) { + note = plugin.app.vault.getAbstractFileByPath(path) as TFile; + state.file = path; + state.item = que.getNextId(); + // state.mode = "question"; + + reviewFloatBar.display(item, (opt) => { + IReviewNote.recallReviewResponse(this.itemId, opt); + plugin.postponeResponse(note, itemToShedNote(item, note)); + if (settings.autoNextNote) { + this.recallReviewNote(settings); + } + }); + } + } + const leaf = plugin.app.workspace.getLeaf(); + leaf.setViewState({ + type: "markdown", + state: state, + }); + + plugin.app.workspace.setActiveLeaf(leaf); + + if (item != null) { + const newstate = leaf.getViewState(); + console.debug(newstate); + return; + } + + ReviewView.nextReviewNotice(IReviewNote.minNextView, store.data.queues.laterSize); + + reviewFloatBar.selfDestruct(); + new Notice(t("ALL_CAUGHT_UP")); + this.plugin.sync(); + } + + static nextReviewNotice(minNextView: number, laterSize: number) { + if (minNextView > 0 && laterSize > 0) { + const now = Date.now(); + const interval = Math.round((minNextView - now) / 1000 / 60); + if (interval < 60) { + new Notice("可以在" + interval + "分钟后来复习"); + } else if (interval < 60 * 5) { + new Notice("可以在" + interval / 60 + "小时后来复习"); + } + } + } +} diff --git a/src/main.ts b/src/main.ts index 81eead4a..af8dd14e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -49,7 +49,6 @@ import { SrsAlgorithm, algorithmNames } from "src/algorithms/algorithms"; import { reviewResponseModal } from "src/gui/reviewresponse-modal"; import { - DateUtils, debug, isVersionNewerThanOther, logExecutionTime, @@ -60,14 +59,14 @@ import { ReleaseNotes } from "src/gui/ReleaseNotes"; import { algorithms } from "src/algorithms/algorithms_switch"; import { DataLocation } from "./dataStore/dataLocation"; import { addFileMenuEvt, registerTrackFileEvents } from "./Events/trackFileEvents"; -import { ReviewNote } from "src/reviewNote/review-note"; -import { Tags } from "./tags"; -import { ItemToDecks } from "./dataStore/itemToDecks"; +import { ItemTrans } from "./dataStore/itemTrans"; import { LinkRank } from "src/algorithms/priorities/linkPageranks"; import { Queue } from "./dataStore/queue"; import { ReviewDeckSelectionModal } from "./gui/reviewDeckSelectionModal"; import { setDueDates } from "./algorithms/balance/balance"; import { RepetitionItem } from "./dataStore/repetitionItem"; +import { IReviewNote } from "./reviewNote/review-note"; +import { ReviewView } from "./gui/reviewView"; interface PluginData { settings: SRSettings; @@ -126,8 +125,13 @@ export default class SRPlugin extends Plugin { public settingTab: SRSettingTab; public clock_start: number; + private static _instance: SRPlugin; + static getInstance() { + return SRPlugin._instance; + } async onload(): Promise { + SRPlugin._instance = this; await this.loadPluginData(); this.easeByPath = new NoteEaseList(this.data.settings); this.questionPostponementList = new QuestionPostponementList( @@ -150,12 +154,14 @@ export default class SRPlugin extends Plugin { settings.algorithmSettings[settings.algorithm] = this.algorithm.settings; this.savePluginData(); - ReviewNote.create( + IReviewNote.create( settings, this.sync_onNote.bind(this), this.tagCheck.bind(this), + this.noteIsNew.bind(this), this.saveReviewResponse_onNote.bind(this), ); + ReviewView.create(this, this.data.settings); this.commands = new Commands(this); this.commands.addCommands(); if (this.data.settings.showDebugMessages) { @@ -169,9 +175,9 @@ export default class SRPlugin extends Plugin { registerTrackFileEvents(this); - // if (this.data.settings.dataLocation != DataLocation.SaveOnNoteFile) { - // this.registerInterval(window.setInterval(() => this.sync(), 5 * 60 * 1000)); - // } + if (this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile) { + this.registerInterval(window.setInterval(() => this.store.save(), 5 * 60 * 1000)); + } this.statusBar = this.addStatusBarItem(); this.statusBar.classList.add("mod-clickable"); @@ -439,7 +445,7 @@ export default class SRPlugin extends Plugin { } }), ); - await ReviewNote.getInstance().sync(notes, this.reviewDecks, this.easeByPath); + await IReviewNote.getInstance().sync(notes, this.reviewDecks, this.easeByPath); // Reviewable cards are all except those with the "edit later" tag this.deckTree = DeckTreeFilter.filterForReviewableCards(fullDeckTree); @@ -570,7 +576,7 @@ export default class SRPlugin extends Plugin { ); const note: Note = await loader.load(srFile, folderTopicPath); - ItemToDecks.updateCardsSchedbyItems(note, folderTopicPath); + ItemTrans.updateCardsSchedbyItems(note, folderTopicPath); note.createMultiCloze(this.data.settings); if (note.hasChanged) { note.writeNoteFile(this.data.settings); @@ -584,12 +590,15 @@ export default class SRPlugin extends Plugin { new Notice(t("NOTE_IN_IGNORED_FOLDER")); return; } - const ease = this.getLinkedEase(note); - const revnote = ReviewNote.getInstance(); + const revnote = IReviewNote.getInstance(); if (!revnote.tagCheck(note)) { return; } + let ease: number; + if (revnote.isNew && settings.algorithm !== algorithmNames.Fsrs) { + ease = this.linkRank.getContribution(note, this.easeByPath).ease; + } const result = await revnote.responseProcess(note, response, ease); if (settings.burySiblingCardsByNoteReview) { this.data.buryList.push(...result.buryList); @@ -623,6 +632,16 @@ export default class SRPlugin extends Plugin { return true; } + noteIsNew(note: TFile): boolean { + const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; + const frontmatter: FrontMatterCache | Record = + fileCachedData.frontmatter || {}; + return !( + Object.prototype.hasOwnProperty.call(frontmatter, "sr-due") && + Object.prototype.hasOwnProperty.call(frontmatter, "sr-interval") && + Object.prototype.hasOwnProperty.call(frontmatter, "sr-ease") + ); + } async saveReviewResponse_onNote(note: TFile, response: ReviewResponse, ease: number) { const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; const frontmatter: FrontMatterCache | Record = @@ -639,7 +658,7 @@ export default class SRPlugin extends Plugin { Object.prototype.hasOwnProperty.call(frontmatter, "sr-ease") ) ) { - // ease = this.linkRank.getContribution(note, this.easeByPath).ease; + ease = this.linkRank.getContribution(note, this.easeByPath).ease; ease = Math.round(ease); interval = 1.0; delayBeforeReview = 0; @@ -704,7 +723,7 @@ export default class SRPlugin extends Plugin { return { sNote: snote, buryList }; } - private postponeResponse(note: TFile, sNote: SchedNote) { + postponeResponse(note: TFile, sNote: SchedNote) { Object.values(this.reviewDecks).forEach((reviewDeck: ReviewDeck) => { let wasDueInDeck = false; reviewDeck.scheduledNotes.findIndex((newNote, ind) => { @@ -753,7 +772,7 @@ export default class SRPlugin extends Plugin { } else if (this.data.settings.reviewingNoteDirectly) { const rdname = this.lastSelectedReviewDeck ?? - ReviewNote.getDeckNameForReviewDirectly(this.reviewDecks) ?? + IReviewNote.getDeckNameForReviewDirectly(this.reviewDecks) ?? reviewDeckNames[0]; this.reviewNextNote(rdname); } else { @@ -777,7 +796,7 @@ export default class SRPlugin extends Plugin { let index = -1; const isPreviewUndueNote = (item: RepetitionItem) => { - return item.nextReview > Date.now() && !Queue.getInstance().isInLaterQueue(item.ID); + return item.nextReview > Date.now() && !item.isDue; }; const fShowItemInfo = (item: RepetitionItem, msg: string) => { if (this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile) { @@ -802,7 +821,7 @@ export default class SRPlugin extends Plugin { } }; - index = ReviewNote.getNextDueNoteIndex( + index = IReviewNote.getNextDueNoteIndex( deck.dueNotesCount, this.data.settings.openRandomNote, ); @@ -850,14 +869,14 @@ export default class SRPlugin extends Plugin { this.data.settings.reviewingNoteDirectly && this.noteStats.onDueCount + this.noteStats.newCount > 0 ) { - const rdname: string = ReviewNote.getDeckNameForReviewDirectly(this.reviewDecks); + const rdname: string = IReviewNote.getDeckNameForReviewDirectly(this.reviewDecks); if (rdname != undefined) { this.reviewNextNote(rdname); return; } } - ReviewNote.nextReviewNotice(Queue.getInstance().laterSize); + ReviewView.nextReviewNotice(IReviewNote.minNextView, Queue.getInstance().laterSize); this.reviewFloatBar.selfDestruct(); this.reviewQueueView.redraw(); @@ -944,16 +963,4 @@ export default class SRPlugin extends Plugin { }), ); } - - getLinkedEase(note: TFile) { - const settings = this.data.settings; - if ( - settings.algorithm === algorithmNames.Anki || - settings.algorithm === algorithmNames.Default || - settings.algorithm === algorithmNames.SM2 - ) { - const ease = this.linkRank.getContribution(note, this.easeByPath).ease; - return ease; - } - } } diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index 8ec1d85d..afd38318 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -2,10 +2,8 @@ import { Notice, TFile } from "obsidian"; import { SrsAlgorithm } from "src/algorithms/algorithms"; import { DataStore } from "src/dataStore/data"; import { DataLocation } from "src/dataStore/dataLocation"; -import { ItemToDecks } from "src/dataStore/itemToDecks"; -import { reviewResponseModal } from "src/gui/reviewresponse-modal"; +import { ItemTrans } from "src/dataStore/itemTrans"; import { t } from "src/lang/helpers"; -import SRPlugin from "src/main"; import { NoteEaseList } from "src/NoteEaseList"; import { Decks, ReviewDeck, SchedNote } from "src/ReviewDeck"; import { ReviewResponse } from "src/scheduling"; @@ -18,8 +16,8 @@ type Tsync = (notes: TFile[], reviewDecks?: Decks, easeByPath?: NoteEaseList) => export type TrespResult = { sNote: SchedNote; buryList?: string[] }; type TsaveResponse = (note: TFile, response: ReviewResponse, ease: number) => Promise; -export class ReviewNote { - private static _instance: ReviewNote; +export abstract class IReviewNote { + private static _instance: IReviewNote; static itemId: number; static minNextView: number; @@ -32,11 +30,12 @@ export class ReviewNote { settings: SRSettings, sync: Tsync, tagCheck: (note: TFile) => boolean, + isNew: (note: TFile) => boolean, saveResponse: TsaveResponse, ) { switch (settings.dataLocation) { case DataLocation.SaveOnNoteFile: - return new RNonNote(settings, sync, tagCheck, saveResponse); + return new RNonNote(settings, sync, tagCheck, isNew, saveResponse); break; default: @@ -46,15 +45,15 @@ export class ReviewNote { } static getInstance() { - if (!ReviewNote._instance) { + if (!IReviewNote._instance) { throw Error("there is not ReviewNote instance."); } - return ReviewNote._instance; + return IReviewNote._instance; } constructor(settings: SRSettings) { this.settings = settings; - ReviewNote._instance = this; + IReviewNote._instance = this; } /** @@ -90,65 +89,14 @@ export class ReviewNote { return deckName; } - tagCheck(note: TFile): boolean { - throw new Error("not implemented"); - } - - async sync(notes: TFile[], reviewDecks?: Decks, easeByPath?: NoteEaseList): Promise { - throw new Error("not implemented"); - } - responseProcess(note: TFile, response: ReviewResponse, ease: number): Promise { - throw new Error("not implemented"); - } - - static recallReviewNote(settings: SRSettings) { - // const plugin = this.plugin; - const store = DataStore.getInstance(); - const reviewFloatBar = reviewResponseModal.getInstance(); - // const settings = plugin.data.settings; - const que = store.data.queues; - que.buildQueue(); - const item = store.getNext(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const state: any = { mode: "empty" }; - if (item != null && item.isTracked) { - this.itemId = item.ID; - console.debug("item:", item, que.queueSize()); - const path = store.getFilePath(item); - if (path != null) { - state.file = path; - state.item = que.getNextId(); - // state.mode = "question"; - - reviewFloatBar.display(item, (opt) => { - this.recallReviewResponse(this.itemId, opt); - if (settings.autoNextNote) { - this.recallReviewNote(settings); - } - }); - } - } - const leaf = app.workspace.getLeaf(); - leaf.setViewState({ - type: "markdown", - state: state, - }); - - app.workspace.setActiveLeaf(leaf); - - if (item != null) { - const newstate = leaf.getViewState(); - console.debug(newstate); - return; - } - - this.nextReviewNotice(store.data.queues.laterSize); - - // plugin.updateStatusBar(); - - reviewFloatBar.selfDestruct(); - new Notice(t("ALL_CAUGHT_UP")); - } + abstract tagCheck(note: TFile): boolean; + abstract isNew(note: TFile): boolean; + abstract sync(notes: TFile[], reviewDecks?: Decks, easeByPath?: NoteEaseList): Promise; + abstract responseProcess( + note: TFile, + response: ReviewResponse, + ease: number, + ): Promise; static recallReviewResponse(itemId: number, response: string) { const store = DataStore.getInstance(); @@ -201,61 +149,56 @@ export class ReviewNote { return index; } - static updateminNextView(minNextView: number, nextReview: number): number { + static updateminNextView(mnv: number, nextReview: number): number { const now = Date.now(); const nowToday: number = globalDateProvider.endofToday.valueOf(); if (nextReview <= nowToday) { - if (minNextView == undefined || minNextView < now || minNextView > nextReview) { - // console.debug("interval diff:should be - (", minNextView - nextReview); - minNextView = nextReview; - } - } - return minNextView; - } - - static nextReviewNotice(laterSize: number) { - if (this.minNextView > 0 && laterSize > 0) { - const now = Date.now(); - const interval = Math.round((this.minNextView - now) / 1000 / 60); - if (interval < 60) { - new Notice("可以在" + interval + "分钟后来复习"); - } else if (interval < 60 * 5) { - new Notice("可以在" + interval / 60 + "小时后来复习"); + if (mnv == undefined || mnv < now || mnv > nextReview) { + // console.debug("interval diff:should be - (", mnv - nextReview); + mnv = nextReview; } } + return mnv; } } -class RNonNote extends ReviewNote { +class RNonNote extends IReviewNote { + tagCheck: (note: TFile) => boolean; + isNew: (note: TFile) => boolean; + sync: (notes: TFile[], reviewDecks?: Decks, easeByPath?: NoteEaseList) => Promise; + responseProcess: (note: TFile, response: ReviewResponse, ease: number) => Promise; + constructor( settings: SRSettings, sync: Tsync, tagCheck: (note: TFile) => boolean, + isNew: (note: TFile) => boolean, saveResponse: TsaveResponse, ) { super(settings); this.sync = sync; this.tagCheck = tagCheck; + this.isNew = isNew; this.responseProcess = saveResponse; } } -class RNonTrackfiles extends ReviewNote { +export class RNonTrackfiles extends IReviewNote { + private store = DataStore.getInstance(); // @logExecutionTime() async sync(notes: TFile[], reviewDecks: Decks, easeByPath: NoteEaseList): Promise { // const settings = this.data.settings; - const store = DataStore.getInstance(); - store.data.queues.buildQueue(); + this.store.data.queues.buildQueue(); // check trackfile - await store.reLoad(); + await this.store.reLoad(); - ItemToDecks.create(this.settings).itemToReviewDecks(reviewDecks, notes, easeByPath); + ItemTrans.create(this.settings).itemToReviewDecks(reviewDecks, notes, easeByPath); } tagCheck(note: TFile): boolean { - const store = DataStore.getInstance(); + const store = this.store; let deckName = Tags.getNoteDeckName(note, this.settings); if ( @@ -273,8 +216,11 @@ class RNonTrackfiles extends ReviewNote { if (deckName == null) return false; return true; } + isNew(note: TFile): boolean { + return this.store.getNoteItem(note.path).isNew; + } async responseProcess(note: TFile, response: ReviewResponse, ease?: number) { - const store = DataStore.getInstance(); + const store = this.store; const option = SrsAlgorithm.getInstance().srsOptions()[response]; const now = Date.now(); @@ -295,10 +241,8 @@ class RNonTrackfiles extends ReviewNote { } } - ReviewNote.recallReviewResponse(itemId, option); + IReviewNote.recallReviewResponse(itemId, option); - // preUpdateDeck(deck, note); - // ItemToDecks.toRevDeck(deck, note, now); return { buryList, sNote: { @@ -312,23 +256,6 @@ class RNonTrackfiles extends ReviewNote { } } -function preUpdateDeck(deck: ReviewDeck, note: TFile) { - const newindex = deck.newNotes.findIndex((sNote, _index) => { - return sNote.note === note; - }); - if (newindex >= 0) { - // isNew - deck.newNotes.splice(newindex, 1); - } else { - //isDued - const index = deck.scheduledNotes.findIndex((sNote, _index) => { - return sNote.note === note; - }); - deck.scheduledNotes.splice(index, 1); - } - return; -} - export function updatenDays(dueDates: Record, dueUnix: number) { const nDays: number = Math.ceil( (dueUnix - globalDateProvider.endofToday.valueOf()) / DateUtils.DAYS_TO_MILLIS, diff --git a/src/settings/locationSetting.ts b/src/settings/locationSetting.ts index 0fc1c8ed..fdc58ff1 100644 --- a/src/settings/locationSetting.ts +++ b/src/settings/locationSetting.ts @@ -168,7 +168,6 @@ export function addSpecifiedFolderSetting(containerEl: HTMLElement, plugin: SRPl plugin.data.settings.customFolder = cusFolder + "/" + cusFilename; await locSwitch.moveStoreLocation(); await plugin.savePluginData(); - this.display(); }), ); } From 14b9a60c2b32a698007a671f017c668dcbe49090 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 21 Jul 2024 16:11:40 +0800 Subject: [PATCH 137/155] blockid newandDue iteminfo (#65) Co-authored-by: Newdea --- README.md | 4 +- docs/README_ZH.md | 6 +- docs/changelog.md | 9 +- docs/usage.md | 2 +- ...77\347\224\250\346\225\231\347\250\213.md" | 10 +- src/Events/trackFileEvents.ts | 4 + src/FlashcardReviewSequencer.ts | 6 + src/Question.ts | 15 +- src/ReviewDeck.ts | 11 +- src/algorithms/fsrs.ts | 10 +- src/commands.ts | 178 +++++++++--------- src/constants.ts | 2 +- src/dataStore/itemTrans.ts | 22 ++- src/dataStore/mixQueSet.ts | 58 ++++++ src/dataStore/trackedFile.ts | 31 ++- src/gui/FlashcardReviewView.tsx | 3 +- src/gui/info.ts | 61 ++++-- src/main.ts | 12 +- src/parser.ts | 7 +- src/settings.ts | 16 +- src/settings/cardBlockIDSetting.ts | 51 +++++ src/settings/mixQueueSetting.ts | 52 +++++ src/util/MultiLineTextFinder.ts | 2 +- src/util/utils.ts | 5 +- tests/unit/NoteQuestionParser.test.ts | 25 +++ tests/unit/util/MultiLineTextFinder.test.ts | 36 +++- 26 files changed, 489 insertions(+), 149 deletions(-) create mode 100644 src/dataStore/mixQueSet.ts create mode 100644 src/settings/cardBlockIDSetting.ts create mode 100644 src/settings/mixQueueSetting.ts diff --git a/README.md b/README.md index 50321bf1..d9d77df1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ This is a modified version of [obsidian-spaced-repetition](https://github.com/st3v3nmw/obsidian-spaced-repetition) and merging [recall plugin](https://github.com/martin-jw/obsidian-recall) to use seperate json data file, and add some interesting features. -就是 SR 的时间排程信息可以单独保存,不修改原笔记文件内容,以及添加其他功能。 +就是 SR 的时间排程信息可以单独保存,~~不修改原笔记文件内容~~(如果卡片复习,开启blockid设置,会在卡片文本后追加BlockID),以及添加其他功能。 # Flashcard-Based and Note-Based Spaced Repetition Plugin @@ -25,6 +25,8 @@ This is a modified version of [obsidian-spaced-repetition](https://github.com/st - reschedule all scheduled items; - support multi-clozes; - setting `burySiblingCards` split into `burySiblingCards`(origin) and `burySiblingCardsByNoteReview`, and multi-clozes will not be buried; +- Setting: Card index uses BlockID, which appends BlockID (e.g. `^blkid1`) to the card text, **will modify the original notes file**. Off by default, but card index may not be accurate enough; +- Setting: Mix ondue and new notes queue when reviewing(default: 3 ondue notes, then 2 new notes); ## Maintainers Wanted diff --git a/docs/README_ZH.md b/docs/README_ZH.md index 9bb6f8df..0f201028 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -1,5 +1,5 @@ 本插件是魔改自[obsidian-spaced-repetition](https://github.com/st3v3nmw/obsidian-spaced-repetition) 和 [recall plugin](https://github.com/martin-jw/obsidian-recall) -就是 SR 的复习时间信息可以单独保存,不修改原笔记文件内容,以及添加其他功能。 +就是 SR 的复习时间信息可以单独保存,~~不修改原笔记文件内容~~(如果卡片复习,开启blockid设置,会在卡片文本后追加BlockID),以及添加其他功能。 ## Features @@ -18,7 +18,9 @@ 10. 重排所有已排程的复习项; 11. 支持多个挖空; 12. 设置项 隐藏关联卡片拆分为 隐藏关联卡片(即原来的)和复习笔记时隐藏关联卡片;另,多个挖空不会被隐藏关联卡片; -13. 其他待发现的小改动; +13. 设置项: 卡片定位使用BlockID,会在卡片文本后追加BlockID (e.g. `^blkid1`),**即修改了原笔记文件**。默认关闭,但卡片定位可能不太准确,但也够用; +14. 设置项: 复习笔记时,复习顺序可混合新旧笔记(默认: 3篇到期的,然后2篇新的笔记); +15. 其他待发现的小改动; **注意** 没有使用过 obsidian-spaced-repetition 插件的可以直接用,正在使用 obsidian-spaced-repetition 插件的话,建议试用前先备份 :yum: diff --git a/docs/changelog.md b/docs/changelog.md index 47584365..6a44fbd9 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,13 +4,20 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.12.4.8] + +- feat #20 卡片定位使用BlockID,会在卡片文本后追加BlockID (e.g. `^blkid1`),**即修改了原笔记文件**。默认关闭,但卡片定位可能不太准确,但也够用; +- feat: #63 笔记复习优先推送最早创建的笔记; +- feat: 设置项: 复习笔记时,复习顺序可混合新旧笔记(默认: 3篇到期的,然后2篇新的笔记); +- UI: iteminfo 窗口显示优化, 数据保存优化; +- chore: 延迟重排相关命令 在 关闭调试选项时也可以使用了; + ## [1.12.4.7] - fix: #56 复习时打开了没到期的笔记; - fix: #58 卡片复习数据显示不正确; - iteminfo 窗口显示优化 - ## [1.12.4.6] - fix: #54 #56 复习时打开了没到期的笔记 diff --git a/docs/usage.md b/docs/usage.md index d63ec7b5..40d2b640 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -92,7 +92,7 @@ Via command line, `SR view statistics` #### View review information -Via command line, `SR Item Info`, you can view review information for current note/all cards in current note. +Via command line, `SR Item Info`, you can view review information for current note/all cards in current note. And can modify next review date/time. #### Algorithms diff --git "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" index b190a1e1..178f24ee 100644 --- "a/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" +++ "b/docs/\344\275\277\347\224\250\346\225\231\347\250\213.md" @@ -70,6 +70,14 @@ 集中复习(CRAM)模式,不更新复习数据。 +#### 卡片复习相关设置项 + +- 支持多个挖空:最多4,再多按3个一组拆分; +- 可使用BlockID准确定位卡片,确保卡片与复习时间信息可以一一对应。但会在原笔记卡片文本后追加BlockID (e.g. `^blkid1`),**即修改了原笔记文件**。默认关闭,即使用卡片行号和文本hash值定位,但卡片定位可能不太准确,也够用; +- 可显示或隐藏到下次复习的时间间隔; +- 在卡片复习时,隐藏关联卡片到下一天; +- 在笔记复习时,隐藏笔记内卡片到下一天; + #### 延后Postpone 对今天之前(不包含今天)的笔记/卡片(当前保留率大于65%)进行延后 @@ -97,7 +105,7 @@ _如果对新排程不满意,直接重启Obsidian即可恢复之前的排程 #### 查看复习信息 -通过命令行,`SR Item Info`,可查看当前笔记/当前笔记内卡片的复习信息 +通过命令行,`SR Item Info`,可查看当前笔记/当前笔记内卡片的复习信息,并可修改下次复习时间。 #### 算法 Algorithms diff --git a/src/Events/trackFileEvents.ts b/src/Events/trackFileEvents.ts index ad410235..8a5d8257 100644 --- a/src/Events/trackFileEvents.ts +++ b/src/Events/trackFileEvents.ts @@ -3,6 +3,7 @@ import { DataLocation } from "src/dataStore/dataLocation"; import SRPlugin from "src/main"; export function registerTrackFileEvents(plugin: SRPlugin) { + const settings = plugin.data.settings; plugin.registerEvent( plugin.app.vault.on("rename", async (file, old) => { const trackFile = plugin.store.getTrackedFile(old); @@ -26,6 +27,9 @@ export function registerTrackFileEvents(plugin: SRPlugin) { if (plugin.data.settings.dataLocation === DataLocation.SaveOnNoteFile) { return; } + if (settings.cardBlockID) { + return; + } if (plugin.store.isTrackedCardfile(file.path)) { const trackFile = plugin.store.getTrackedFile(file.path); const fileText = await plugin.app.vault.read(file); diff --git a/src/FlashcardReviewSequencer.ts b/src/FlashcardReviewSequencer.ts index fadfff96..671d16f8 100644 --- a/src/FlashcardReviewSequencer.ts +++ b/src/FlashcardReviewSequencer.ts @@ -154,6 +154,12 @@ export class FlashcardReviewSequencer implements IFlashcardReviewSequencer { // Update the source file with the updated schedule await this.currentQuestion.writeQuestion(this.settings); } + } else if ( + this.settings.cardBlockID && + !this.currentQuestion.questionText.obsidianBlockId + ) { + // Update the source file with the updated block id + await this.currentQuestion.writeQuestion(this.settings); } // Move/delete the card diff --git a/src/Question.ts b/src/Question.ts index 126baf69..b02b039b 100644 --- a/src/Question.ts +++ b/src/Question.ts @@ -94,6 +94,7 @@ export class QuestionText { // Block identifiers can only consist of letters, numbers, and dashes. // If present, then first character is "^" obsidianBlockId: string; + genBlockId?: string; // Hash of string (topicPath + actualQuestion) // Explicitly excludes the HTML comment with the scheduling info @@ -235,10 +236,19 @@ export class Question { formatForNote(settings: SRSettings): string { let result: string = this.questionText.formatTopicAndQuestion(); + let blockId: string = this.questionText.obsidianBlockId; if (settings.dataLocation !== DataLocation.SaveOnNoteFile) { + if (settings.cardBlockID && !blockId) { + blockId = this.questionText.obsidianBlockId = this.questionText.genBlockId; + } + if (blockId) { + this.questionText.original += "\n"; + if (this.isCardCommentsOnSameLine(settings)) result += ` ${blockId}\n`; + else result += `\n${blockId}\n`; + } + return result; } - const blockId: string = this.questionText.obsidianBlockId; const hasSchedule: boolean = this.cards.some((card) => card.hasSchedule); if (hasSchedule) { result = result.trimEnd(); @@ -258,13 +268,12 @@ export class Question { } updateQuestionText(noteText: string, settings: SRSettings): string { - const originalText: string = this.questionText.original; - // Get the entire text for the question including: // 1. the topic path (if present), // 2. the question text // 3. the schedule HTML comment (if present) const replacementText = this.formatForNote(settings); + const originalText: string = this.questionText.original; let newText = MultiLineTextFinder.findAndReplace(noteText, originalText, replacementText); if (newText) { diff --git a/src/ReviewDeck.ts b/src/ReviewDeck.ts index 811f7d12..a7dd0636 100644 --- a/src/ReviewDeck.ts +++ b/src/ReviewDeck.ts @@ -28,10 +28,13 @@ export class ReviewDeck { public sortNotes(pageranks: Record): void { // sort new notes by importance - this.newNotes = this.newNotes.sort( - (a: SchedNote, b: SchedNote) => - (pageranks[b.note.path] || 0) - (pageranks[a.note.path] || 0), - ); + this.newNotes = this.newNotes.sort((a: SchedNote, b: SchedNote) => { + const result = (pageranks[b.note.path] || 0) - (pageranks[a.note.path] || 0); + if (result != 0) { + return result; + } + return a.note.stat.ctime - b.note.stat.ctime; + }); // sort scheduled notes by date & within those days, sort them by importance this.scheduledNotes = this.scheduledNotes.sort((a: SchedNote, b: SchedNote) => { diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index 118cb658..43fea3fb 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -97,6 +97,12 @@ export class FsrsAlgorithm extends SrsAlgorithm { updateSettings(settings: unknown) { this.settings = MiscUtils.assignOnly(this.defaultSettings(), settings); SrsAlgorithm.instance = this; + if (this.settings.w.length !== this.defaultSettings().w.length) { + const errmsg = + "fsrs algothrim has been updated, please update w of algorithm setting. reset `w` to default will fix this error"; + console.error(errmsg); + new Notice(errmsg, 0); + } this.updateFsrsParams(); this.getLogfilepath(); } @@ -428,7 +434,9 @@ export class FsrsAlgorithm extends SrsAlgorithm { }); }) .settingEl.querySelector(".setting-item-description").innerHTML = - '查阅 FSRS V4 WIKI 以对各参数进行设置.'; + '查阅 FSRS V4 WIKI 和\ + FSRS w参数可视化 \ + 以对各参数进行设置.'; return; } diff --git a/src/commands.ts b/src/commands.ts index bf0e7a36..13c2887e 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -87,6 +87,95 @@ export default class Commands { }, }); + plugin.addCommand({ + id: "reschedule", + name: "Reschedule", + callback: () => { + reschedule(plugin.store.items.filter((item) => item.hasDue && item.isTracked)); + }, + }); + + plugin.addCommand({ + id: "postpone-cards", + name: "Postpone cards", + callback: () => { + postponeItems(plugin.store.items.filter((item) => item.isCard && item.isTracked)); + }, + }); + plugin.addCommand({ + id: "postpone-notes", + name: "Postpone notes", + callback: () => { + postponeItems(plugin.store.items.filter((item) => !item.isCard && item.isTracked)); + }, + }); + plugin.addCommand({ + id: "postpone-all", + name: "Postpone All", + callback: () => { + postponeItems(plugin.store.items.filter((item) => item.isTracked)); + }, + }); + + plugin.addCommand({ + id: "postpone-note-manual", + name: "Postpone this note after x days", + checkCallback: (checking: boolean) => { + const file = plugin.app.workspace.getActiveFile(); + const settings = plugin.data.settings; + if (file != null) { + if (plugin.store.getTrackedFile(file.path)?.isTrackedNote) { + if (!checking) { + const tkfile = plugin.store.getTrackedFile(file.path); + const input = new GetInputModal( + plugin.app, + "please input positive number", + ); + input.submitCallback = async (days: number) => { + postponeItems([plugin.store.getItembyID(tkfile.noteID)], days); + plugin.store.save(); + new Notice(`This note has been postponed ${days} days`); + await plugin.sync(); + if (settings.autoNextNote && plugin.lastSelectedReviewDeck) { + plugin.reviewNextNote(plugin.lastSelectedReviewDeck); + } + }; + input.open(); + } + return true; + } + } + return false; + }, + }); + + plugin.addCommand({ + id: "postpone-cards-manual", + name: "Postpone cards in this note after x days", + checkCallback: (checking: boolean) => { + const file = plugin.app.workspace.getActiveFile(); + if (file != null) { + if (plugin.store.getTrackedFile(file.path)?.isTracked) { + if (!checking) { + const tkfile = plugin.store.getTrackedFile(file.path); + const input = new GetInputModal( + plugin.app, + "please input positive number", + ); + input.submitCallback = (days: number) => + postponeItems(tkfile.cardIDs.map(plugin.store.getItembyID), days); + input.open(); + + // plugin.store.save(); + plugin.sync(); + } + return true; + } + } + return false; + }, + }); + // plugin.addCommand({ // id: "update-file", // name: "Update Note", @@ -210,94 +299,5 @@ export default class Commands { plugin.store.verifyItems(); }, }); - - plugin.addCommand({ - id: "reschedule", - name: "Reschedule", - callback: () => { - reschedule(plugin.store.items.filter((item) => item.hasDue && item.isTracked)); - }, - }); - - plugin.addCommand({ - id: "postpone-cards", - name: "Postpone cards", - callback: () => { - postponeItems(plugin.store.items.filter((item) => item.isCard && item.isTracked)); - }, - }); - plugin.addCommand({ - id: "postpone-notes", - name: "Postpone notes", - callback: () => { - postponeItems(plugin.store.items.filter((item) => !item.isCard && item.isTracked)); - }, - }); - plugin.addCommand({ - id: "postpone-all", - name: "Postpone All", - callback: () => { - postponeItems(plugin.store.items.filter((item) => item.isTracked)); - }, - }); - - plugin.addCommand({ - id: "postpone-note-manual", - name: "Postpone this note after x days", - checkCallback: (checking: boolean) => { - const file = plugin.app.workspace.getActiveFile(); - const settings = plugin.data.settings; - if (file != null) { - if (plugin.store.getTrackedFile(file.path)?.isTrackedNote) { - if (!checking) { - const tkfile = plugin.store.getTrackedFile(file.path); - const input = new GetInputModal( - plugin.app, - "please input positive number", - ); - input.submitCallback = async (days: number) => { - postponeItems([plugin.store.getItembyID(tkfile.noteID)], days); - plugin.store.save(); - new Notice(`This note has been postponed ${days} days`); - await plugin.sync(); - if (settings.autoNextNote && plugin.lastSelectedReviewDeck) { - plugin.reviewNextNote(plugin.lastSelectedReviewDeck); - } - }; - input.open(); - } - return true; - } - } - return false; - }, - }); - - plugin.addCommand({ - id: "postpone-cards-manual", - name: "Postpone cards in this note after x days", - checkCallback: (checking: boolean) => { - const file = plugin.app.workspace.getActiveFile(); - if (file != null) { - if (plugin.store.getTrackedFile(file.path)?.isTracked) { - if (!checking) { - const tkfile = plugin.store.getTrackedFile(file.path); - const input = new GetInputModal( - plugin.app, - "please input positive number", - ); - input.submitCallback = (days: number) => - postponeItems(tkfile.cardIDs.map(plugin.store.getItembyID), days); - input.open(); - - // plugin.store.save(); - plugin.sync(); - } - return true; - } - } - return false; - }, - }); } } diff --git a/src/constants.ts b/src/constants.ts index 486dbca1..9b633b28 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -14,7 +14,7 @@ export const OBSIDIAN_TAG_AT_STARTOFLINE_REGEX = /^#[^\s#]+/gi; // Block identifiers can only consist of letters, numbers, and dashes. // RZ: 2024-01-01 Empirically determined that obsidian only recognizes a block identifier if the // "^" is preceded by a space -export const OBSIDIAN_BLOCK_ID_ENDOFLINE_REGEX = / (\^[a-zA-Z0-9-]+)$/; +export const OBSIDIAN_BLOCK_ID_ENDOFLINE_REGEX = /[ \n](\^[a-zA-Z0-9-]+)$/; export const PREFERRED_DATE_FORMAT = "YYYY-MM-DD"; export const ALLOWED_DATE_FORMATS = [PREFERRED_DATE_FORMAT, "DD-MM-YYYY", "ddd MMM DD YYYY"]; diff --git a/src/dataStore/itemTrans.ts b/src/dataStore/itemTrans.ts index a9347136..8d605273 100644 --- a/src/dataStore/itemTrans.ts +++ b/src/dataStore/itemTrans.ts @@ -141,11 +141,15 @@ export class ItemTrans { const cardText: string = question.questionText.actualQuestion; const lineNo: number = question.lineNo; const cardTextHash = BlockUtils.getTxtHash(cardText); + let blockID = question.questionText.obsidianBlockId; const count: number = question.cards.length; const scheduling: RegExpMatchArray[] = []; - let carditem = trackedFile.getSyncCardInfo(lineNo, cardTextHash); - if (carditem != null) { - carditem.itemIds + if (settings.cardBlockID && !blockID) { + blockID = question.questionText.genBlockId = "^" + BlockUtils.generateBlockId(); + } + let cardinfo = trackedFile.getSyncCardInfo(lineNo, cardTextHash, blockID); + if (cardinfo != null) { + cardinfo.itemIds .map((id: number) => store.getItembyID(id).getSched()) .filter((sched) => { // ignore new add card sched != null && @@ -155,17 +159,21 @@ export class ItemTrans { } }); } else { - carditem = trackedFile.trackCard(lineNo, cardTextHash); + cardinfo = trackedFile.trackCard(lineNo, cardTextHash); } const dtppath = question.topicPathList.list[0] ?? undefined; let deckname = dtppath?.hasPath ? dtppath.path[0] : topicPath.path[0]; deckname = Tags.isDefaultDackName(deckname) ? deckname : "#" + deckname; - store.updateCardItems(trackedFile, carditem, count, deckname, false); - updateCardObjs(question.cards, carditem, scheduling); + store.updateCardItems(trackedFile, cardinfo, count, deckname, false); + updateCardObjs(question.cards, cardinfo, scheduling); // update question - question.hasChanged = false; + if (question.questionText.genBlockId) { + question.hasChanged = true; + } else { + question.hasChanged = false; + } } } } diff --git a/src/dataStore/mixQueSet.ts b/src/dataStore/mixQueSet.ts new file mode 100644 index 00000000..9f6bdd7e --- /dev/null +++ b/src/dataStore/mixQueSet.ts @@ -0,0 +1,58 @@ +export type tIMixQueSet = Record; // isDue,DueDefaultCnt, NewDefaultCnt +export interface IMixQueSet { + isDue: boolean; + isCard: boolean; + DueDefaultCnt: number; + NewDefaultCnt: number; +} + +export class MixQueSet implements IMixQueSet { + isDue: boolean; + DueDefaultCnt: number; + NewDefaultCnt: number; + + isCard: boolean; + CardDefaultCnt: number; + NoteDefaultCnt: number; + + private static _instance: MixQueSet; + private _dnCnt: number = 0; + + constructor() { + MixQueSet._instance = this; + } + + static create(due: number = 3, newdc: number = 2, card: number = 3, note: number = 1) { + const mqs = new MixQueSet(); + mqs.isDue = true; + mqs.isCard = false; + mqs.DueDefaultCnt = due; + mqs.NewDefaultCnt = newdc; + mqs.CardDefaultCnt = card; + mqs.NoteDefaultCnt = note; + return mqs; + } + + static getInstance() { + return this._instance; + } + + calcNext(dueCnthad: number, newCnthad: number) { + if (this.DueDefaultCnt === 0) return (this.isDue = newCnthad > 0 ? false : true); + if (this.NewDefaultCnt === 0) return (this.isDue = dueCnthad > 0 ? true : false); + this._dnCnt++; + if (this.isDue) { + if (this._dnCnt >= this.DueDefaultCnt && newCnthad > 0) { + this.isDue = false; + this._dnCnt = 0; + } + } else { + if (this._dnCnt >= this.NewDefaultCnt && dueCnthad > 0) { + this.isDue = true; + this._dnCnt = 0; + } + } + + // todo: update card note cnt + } +} diff --git a/src/dataStore/trackedFile.ts b/src/dataStore/trackedFile.ts index 47b7e8aa..012ad7af 100644 --- a/src/dataStore/trackedFile.ts +++ b/src/dataStore/trackedFile.ts @@ -40,14 +40,21 @@ export class CardInfo { * @type {string} */ cardTextHash: string; + /** + * @type {string} + */ + blockID?: string; /** * @type {number[]} */ itemIds: number[]; - constructor(lineNo: number = -1, cardTextHash: string = "") { + constructor(lineNo: number = -1, cardTextHash: string = "", blockid?: string) { this.lineNo = lineNo; this.cardTextHash = cardTextHash; + if (blockid) { + this.blockID = blockid; + } this.itemIds = []; } } @@ -108,8 +115,8 @@ export class TrackedFile implements ITrackedFile { * @param cardTextHash * @returns {CardInfo} cardinfo | null: didn't have cardInfo */ - getSyncCardInfo(lineNo: number, cardTextHash?: string): CardInfo { - const cardinfo = this.getCardInfo(lineNo, cardTextHash); + getSyncCardInfo(lineNo: number, cardTextHash?: string, blockID?: string): CardInfo { + const cardinfo = this.getCardInfo(lineNo, cardTextHash, blockID); if (cardinfo !== null) { if (cardinfo.lineNo !== lineNo) { cardinfo.lineNo = lineNo; @@ -119,6 +126,9 @@ export class TrackedFile implements ITrackedFile { cardinfo.cardTextHash = cardTextHash; // console.debug("syncCardInfo, change hash"); } + if (blockID != undefined && cardinfo.blockID !== blockID) { + cardinfo.blockID = blockID; + } } return cardinfo; } @@ -128,12 +138,19 @@ export class TrackedFile implements ITrackedFile { * @param cardTextHash * @returns {CardInfo} cardinfo | null: didn't have cardInfo */ - getCardInfo(lineNo: number, cardTextHash?: string): CardInfo { + getCardInfo(lineNo: number, cardTextHash?: string, blockID?: string): CardInfo { let cardind = -2; if (this.cardItems != undefined) { - cardind = this.cardItems.findIndex((cinfo, _ind) => { - return cardTextHash != null && cinfo.cardTextHash.includes(cardTextHash); - }); + if (blockID) { + cardind = this.cardItems.findIndex((cinfo, _ind) => { + return cinfo.blockID === blockID; + }); + } + if (cardind < 0 && cardTextHash) { + cardind = this.cardItems.findIndex((cinfo, _ind) => { + return cinfo.cardTextHash.includes(cardTextHash); + }); + } if (cardind < 0) { cardind = this.cardItems.findIndex((cinfo, _ind) => { return cinfo.lineNo === lineNo; diff --git a/src/gui/FlashcardReviewView.tsx b/src/gui/FlashcardReviewView.tsx index a3d26eda..86f59829 100644 --- a/src/gui/FlashcardReviewView.tsx +++ b/src/gui/FlashcardReviewView.tsx @@ -21,7 +21,7 @@ import { SrTFile } from "src/SRFile"; import { ItemInfoModal } from "./info"; import { setDueDates } from "src/algorithms/balance/balance"; import { DataLocation } from "src/dataStore/dataLocation"; -import { debug } from "src/util/utils_recall"; +import { BlockUtils, debug } from "src/util/utils_recall"; export class FlashcardReviewView { public app: App; @@ -381,7 +381,6 @@ export class FlashcardReviewView { const opt = algo.srsOptions()[response]; const store = this.plugin.store; const id = this._currentCard.Id; - store.updateReviewedCounts(id, RPITEMTYPE.CARD); store.reviewId(id, opt); store.save(); diff --git a/src/gui/info.ts b/src/gui/info.ts index 36211a71..3616bfaf 100644 --- a/src/gui/info.ts +++ b/src/gui/info.ts @@ -14,7 +14,7 @@ export class ItemInfoModal extends Modal { settings: SRSettings; file: TFile; item: RepetitionItem; - nextReview: number; + mnextReview: Map = new Map(); lastInterval: number; constructor(plugin: SRPlugin, file: TFile, item: RepetitionItem = null) { @@ -28,6 +28,7 @@ export class ItemInfoModal extends Modal { } else { this.item = item; } + this.modalEl.style.height = this.settings.flashcardHeightPercentage + "%"; } onOpen() { @@ -36,22 +37,29 @@ export class ItemInfoModal extends Modal { const path = this.file.path; // contentEl.createEl("p").setText("Item info of " + this.file.path); const buttonDivAll = contentEl.createDiv("srs-flex-row"); + buttonDivAll.setAttr("style", "position: sticky;top: 0"); const contentdiv = contentEl.createEl("div"); - contentdiv.setAttr("style", "min-height: 200px"); const tkfile = this.store.getTrackedFile(path); if (tkfile.hasCards) { - new ButtonComponent(buttonDivAll).setButtonText(this.item.itemType).onClick(() => { - this.displayitem(contentdiv, this.item); - }); + if (this.item) { + new ButtonComponent(buttonDivAll).setButtonText(this.item.itemType).onClick(() => { + this.displayitem(contentdiv, this.item); + }); + } new ButtonComponent(buttonDivAll).setButtonText("Cards in this Note").onClick(() => { this.displayAllitems(contentdiv, tkfile); // this.close(); }); } - this.displayitem(contentdiv, this.item); + if (this.item) { + this.displayitem(contentdiv, this.item); + } else { + this.displayAllitems(contentdiv, tkfile); + } const buttonDiv = contentEl.createDiv("srs-flex-row"); + buttonDiv.setAttr("style", "position: sticky;bottom: 0;margin-top: auto;"); new ButtonComponent(buttonDiv) .setButtonText("Save") @@ -79,13 +87,24 @@ export class ItemInfoModal extends Modal { const details = contentEl.createEl("details"); const summary = details.createEl("summary"); + details.open = true; summary.setText(text); + summary.addClass("tree-item"); items.forEach((item) => { const divdetails = details.createEl("details"); const divsummary = divdetails.createEl("summary"); - const dt = window.moment(item.nextReview).format("YYYY-MM-DD HH:mm:ss"); - divsummary.setText(`ID: ${item.ID} \t nextReivew: ${dt}`); + let cardmsg = ""; + if (item.hasDue) { + const dt = window.moment(item.nextReview).format("YYYY-MM-DD HH:mm:ss"); + cardmsg = `nextReivew: ${dt}`; + } else { + cardmsg = "NewCard"; + } + + divsummary.setText(`ID: ${item.ID} \t ${cardmsg}`); + divsummary.addClass("tree-item-children"); const div = divdetails.createDiv(); + div.addClass("tree-item-children"); this.displayitem(div, item); }); } @@ -109,11 +128,10 @@ export class ItemInfoModal extends Modal { if (key != "data") { if (key === "nextReview") { new Setting(contentdiv).setDesc(key).addText((text) => { - this.nextReview = undefined; const dt = window.moment(item.nextReview).format("YYYY-MM-DD HH:mm:ss"); text.setValue(dt).onChange((value) => { const nr = window.moment(value).valueOf(); - this.nextReview = nr ?? 0; + this.mnextReview.set(item.ID, nr ?? 0); }); }); } else { @@ -149,14 +167,21 @@ export class ItemInfoModal extends Modal { const item = this.item; console.debug(this); const algo = this.settings.algorithm; - if (this.nextReview) { - const nr = window.moment(this.nextReview).valueOf(); - this.nextReview = nr ?? 0; - item.nextReview = this.nextReview > 0 ? this.nextReview : item.nextReview; - if (algo === algorithmNames.Fsrs) { - const data = item.data as FsrsData; - data.due = new Date(item.nextReview); - } + if (this.mnextReview.size > 0) { + this.mnextReview.forEach((v, id) => { + const item = this.store.getItembyID(id); + console.log( + `update item priority from ${item.nextReview} to ${v}, current item info:`, + item, + ); + const nr = window.moment(v).valueOf() ?? 0; + item.nextReview = nr > 0 ? nr : item.nextReview; + + if (algo === algorithmNames.Fsrs) { + const data = item.data as FsrsData; + data.due = new Date(item.nextReview); + } + }); } // item.nextReview= this.nextReview?this.nextReview:item.nextReview; if (algo !== algorithmNames.Fsrs) { diff --git a/src/main.ts b/src/main.ts index af8dd14e..eebacafb 100644 --- a/src/main.ts +++ b/src/main.ts @@ -67,6 +67,7 @@ import { setDueDates } from "./algorithms/balance/balance"; import { RepetitionItem } from "./dataStore/repetitionItem"; import { IReviewNote } from "./reviewNote/review-note"; import { ReviewView } from "./gui/reviewView"; +import { MixQueSet } from "./dataStore/mixQueSet"; interface PluginData { settings: SRSettings; @@ -162,6 +163,7 @@ export default class SRPlugin extends Plugin { this.saveReviewResponse_onNote.bind(this), ); ReviewView.create(this, this.data.settings); + MixQueSet.create(settings.mixDue, settings.mixNew); this.commands = new Commands(this); this.commands.addCommands(); if (this.data.settings.showDebugMessages) { @@ -791,10 +793,13 @@ export default class SRPlugin extends Plugin { this.lastSelectedReviewDeck = deckKey; const deck = this.reviewDecks[deckKey]; const queue = this.store.data.queues; + const mqs = MixQueSet.getInstance(); let show = false; let item; let index = -1; + mqs.calcNext(deck.dueNotesCount, deck.newNotes.length); + const isPreviewUndueNote = (item: RepetitionItem) => { return item.nextReview > Date.now() && !item.isDue; }; @@ -825,13 +830,13 @@ export default class SRPlugin extends Plugin { deck.dueNotesCount, this.data.settings.openRandomNote, ); - if (index >= 0) { + if (mqs.isDue && index >= 0) { await this.app.workspace.getLeaf().openFile(deck.scheduledNotes[index].note); item = deck.scheduledNotes[index].item; fShowItemInfo(item, "scheduledNoes index: " + index); show = true; // return; - } else if (queue.queueSize(deckKey) > 0) { + } else if (mqs.isDue && queue.queueSize(deckKey) > 0) { item = this.store.getNext(deckKey); fShowItemInfo(item, "queue"); const path = this.store.getFilePath(item); @@ -843,7 +848,8 @@ export default class SRPlugin extends Plugin { } else { queue.remove(item, queue.queue[deckKey]); } - } else if (deck.newNotes.length > 0) { + } + if (!mqs.isDue && deck.newNotes.length > 0) { const index = this.data.settings.openRandomNote ? Math.floor(Math.random() * deck.newNotes.length) : 0; diff --git a/src/parser.ts b/src/parser.ts index 3cc06542..c604c0fe 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -77,7 +77,12 @@ export function parseEx( // This could be the first line of a multi line question firstLineNo = i; } - cardText += currentLine.trimEnd(); + if (i + 1 < lines.length && lines[i + 1].length === 0) { + // keep last block line as it is for adding block id + cardText += currentLine; + } else { + cardText += currentLine.trimEnd(); + } if ( currentLine.includes(singlelineReversedCardSeparator) || diff --git a/src/settings.ts b/src/settings.ts index 8a2e3dd0..e71b44ce 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -18,6 +18,8 @@ import { import { addUntrackSetting, addTrackedNoteToDecksSetting } from "./settings/trackSetting"; import { buildDonation } from "./settings/donation"; import { addburySiblingSetting } from "./settings/burySiblingSetting"; +import { addcardBlockIDSetting } from "./settings/cardBlockIDSetting"; +import { addmixQueueSetting } from "./settings/mixQueueSetting"; export interface SRSettings { // flashcards @@ -31,6 +33,7 @@ export interface SRSettings { burySiblingCards: boolean; burySiblingCardsByNoteReview: boolean; multiClozeCard: boolean; + cardBlockID: boolean; showContextInCards: boolean; flashcardHeightPercentage: number; flashcardWidthPercentage: number; @@ -52,6 +55,8 @@ export interface SRSettings { noteFoldersToIgnore: string[]; openRandomNote: boolean; autoNextNote: boolean; + mixDue: number; + mixNew: number; reviewResponseFloatBar: boolean; responseBarPositionPercentage: number; reviewingNoteDirectly: boolean; @@ -94,6 +99,7 @@ export const DEFAULT_SETTINGS: SRSettings = { burySiblingCards: false, burySiblingCardsByNoteReview: false, multiClozeCard: false, + cardBlockID: false, showContextInCards: true, flashcardHeightPercentage: Platform.isMobile ? 100 : 80, flashcardWidthPercentage: Platform.isMobile ? 100 : 40, @@ -116,6 +122,8 @@ export const DEFAULT_SETTINGS: SRSettings = { noteFoldersToIgnore: [], openRandomNote: false, autoNextNote: false, + mixDue: 3, + mixNew: 2, reviewResponseFloatBar: false, responseBarPositionPercentage: 5, reviewingNoteDirectly: false, @@ -193,7 +201,7 @@ export class SRSettingTab extends PluginSettingTab { display(): void { const { containerEl } = this; - + const settings = this.plugin.data.settings; containerEl.empty(); const header = containerEl.createEl("h1", { text: `${t("SETTINGS_HEADER")}` }); @@ -284,6 +292,11 @@ export class SRSettingTab extends PluginSettingTab { ); addburySiblingSetting(containerEl, this.plugin); addMultiClozeSetting(containerEl, this.plugin); + if (settings.dataLocation !== DataLocation.SaveOnNoteFile) { + addcardBlockIDSetting(containerEl, this.plugin); + } else { + settings.cardBlockID = false; + } new Setting(containerEl) .setName(t("SHOW_CARD_CONTEXT")) .setDesc(t("SHOW_CARD_CONTEXT_DESC")) @@ -574,6 +587,7 @@ export class SRSettingTab extends PluginSettingTab { }), ); + addmixQueueSetting(containerEl.createDiv(), this.plugin); addTrackedNoteToDecksSetting(containerEl.createDiv(), this.plugin); addUntrackSetting(containerEl.createDiv(), this.plugin); addResponseFloatBarSetting(containerEl.createDiv(), this.plugin); diff --git a/src/settings/cardBlockIDSetting.ts b/src/settings/cardBlockIDSetting.ts new file mode 100644 index 00000000..475add1f --- /dev/null +++ b/src/settings/cardBlockIDSetting.ts @@ -0,0 +1,51 @@ +import { Setting } from "obsidian"; +import ConfirmModal from "src/gui/confirm"; +import { t } from "src/lang/helpers"; +import SRPlugin from "src/main"; + +export function addcardBlockIDSetting(containerEl: HTMLElement, plugin: SRPlugin) { + const desc = createFragment((frag) => { + frag.createDiv().innerHTML = + "use Card Block ID instead of line number and text hash.
If set True, block id will append after card text. And block id will keep in note after reset to False again."; + }); + const mesg = `**If set True, block id will append after card text. And block id will keep in note after reset to False again. ** \n +Suggestion: backup your vault before set True. Or try it in sandbox vault. \n +设置打开后,就会在所有卡片后添加blockid, 就算再关闭添加的blockid也依然保留在笔记中,不会被删除。\n +建议 ** 先备份 ** 笔记库,或在沙盒库中试用。 + `; + let confirmP: Promise; + new Setting(containerEl) + .setName("Card Block ID") + .setDesc(desc) + .addToggle((toggle) => { + const value = plugin.data.settings.cardBlockID; + toggle.setValue(value); + // if (value) { + // toggle.setDisabled(true); + // return; + // } + toggle.onChange(async (newValue) => { + if (newValue) { + confirmP = new Promise(function (resolve) { + new ConfirmModal(plugin, mesg, async (confirm) => { + if (confirm) { + plugin.data.settings.cardBlockID = newValue; + await plugin.savePluginData(); + resolve(true); + } else { + toggle.setValue(false); + plugin.data.settings.cardBlockID = newValue; + await plugin.savePluginData(); + resolve(false); + } + }).open(); + }); + // if (await confirmP) { + // toggle.setDisabled(true); + // } else { + // toggle.setValue(false); + // } + } + }); + }); +} diff --git a/src/settings/mixQueueSetting.ts b/src/settings/mixQueueSetting.ts new file mode 100644 index 00000000..fcde3e52 --- /dev/null +++ b/src/settings/mixQueueSetting.ts @@ -0,0 +1,52 @@ +import { Setting } from "obsidian"; +import { t } from "src/lang/helpers"; +import SRPlugin from "src/main"; +import { DEFAULT_SETTINGS, applySettingsUpdate } from "src/settings"; + +export function addmixQueueSetting(containerEl: HTMLElement, plugin: SRPlugin) { + const settings = plugin.data.settings; + new Setting(containerEl) + .setName("Mix queue") + .setDesc( + "mix ondue and new notes when review. **first** slider for total count, second slider for ondue count. And new count is (total - ondue).", + ) + .addSlider((slider) => + slider + .setLimits(1, 7, 1) + .setValue(settings.mixDue + settings.mixNew) + .setDynamicTooltip() + .onChange(async (value) => { + applySettingsUpdate(async () => { + settings.mixDue = Math.min(value, settings.mixDue); + settings.mixNew = value - settings.mixDue; + await plugin.savePluginData(); + plugin.settingTab.display(); + }); + }), + ) + .addSlider((slider) => + slider + .setLimits(0, Math.min(7, settings.mixDue + settings.mixNew), 1) + .setValue(settings.mixDue) + .setDynamicTooltip() + .onChange((value) => { + applySettingsUpdate(async () => { + settings.mixDue = value; + await plugin.savePluginData(); + }); + }), + ) + .addExtraButton((button) => { + button + .setIcon("reset") + .setTooltip(t("RESET_DEFAULT")) + .onClick(() => { + applySettingsUpdate(async () => { + settings.mixDue = DEFAULT_SETTINGS.mixDue; + settings.mixNew = DEFAULT_SETTINGS.mixNew; + await plugin.savePluginData(); + plugin.settingTab.display(); + }); + }); + }); +} diff --git a/src/util/MultiLineTextFinder.ts b/src/util/MultiLineTextFinder.ts index a21d579a..49e08dab 100644 --- a/src/util/MultiLineTextFinder.ts +++ b/src/util/MultiLineTextFinder.ts @@ -7,7 +7,7 @@ export class MultiLineTextFinder { replacementText: string, ): string | null { let result: string = null; - if (sourceText.includes(searchText)) { + if (sourceText.includes(searchText.trimEnd())) { result = literalStringReplace(sourceText, searchText, replacementText); } else { const sourceTextArray = splitTextIntoLineArray(sourceText); diff --git a/src/util/utils.ts b/src/util/utils.ts index 6e4bfef8..83d12819 100644 --- a/src/util/utils.ts +++ b/src/util/utils.ts @@ -44,7 +44,10 @@ export function literalStringReplace( replacementStr: string, ): string { let result: string = text; - const startIdx: number = text.indexOf(searchStr); + let startIdx: number = text.indexOf(searchStr); + if (startIdx < 0) { + startIdx = text.indexOf(searchStr.trimEnd()); + } if (startIdx >= 0) { const startStr: string = text.substring(0, startIdx); const endIdx: number = startIdx + searchStr.length; diff --git a/tests/unit/NoteQuestionParser.test.ts b/tests/unit/NoteQuestionParser.test.ts index 7d8f156c..a8131d3e 100644 --- a/tests/unit/NoteQuestionParser.test.ts +++ b/tests/unit/NoteQuestionParser.test.ts @@ -370,6 +370,31 @@ Q3::A3 expect(questionList[2].topicPathList.formatPsv()).toEqual("#flashcards/science"); }); + test("SingleLineBasic: Note topic applies to all questions when trackedNoteToDecks", async () => { + let noteText: string = ` +Q1::A1 +Q2::A2 +Q3::A3 +`; + let noteFile: ISRFile = new UnitTestSRFile(noteText); + + let folderTopicPath: TopicPath = new TopicPath(["flashcards", "science"]); + let settings_trackedNoteToDecks: SRSettings = { ...DEFAULT_SETTINGS }; + settings_trackedNoteToDecks.trackedNoteToDecks = true; + let parser_trackedNoteToDecks: NoteQuestionParser = createTest_NoteQuestionParser( + settings_trackedNoteToDecks, + ); + let questionList: Question[] = await parser_trackedNoteToDecks.createQuestionList( + noteFile, + folderTopicPath, + true, + ); + expect(questionList.length).toEqual(3); + expect(questionList[0].topicPathList.formatPsv()).toEqual("#flashcards/science"); + expect(questionList[1].topicPathList.formatPsv()).toEqual("#flashcards/science"); + expect(questionList[2].topicPathList.formatPsv()).toEqual("#flashcards/science"); + }); + test("SingleLineBasic: Tags within frontmatter applies to all questions when not overriden", async () => { let noteText: string = `--- sr-due: 2024-01-17 diff --git a/tests/unit/util/MultiLineTextFinder.test.ts b/tests/unit/util/MultiLineTextFinder.test.ts index bec40d9f..c661a97b 100644 --- a/tests/unit/util/MultiLineTextFinder.test.ts +++ b/tests/unit/util/MultiLineTextFinder.test.ts @@ -112,11 +112,19 @@ describe("find", () => { describe("findAndReplace", () => { test("Multi line search string present as exact match", () => { - let searchStr: string = `Some Stuff 4 More Stuff -Some Stuff 5 More Stuff -Some Stuff 6 More Stuff`; + let postText: string = `Some Stuff 0 More Stuff +Some Stuff 1 More Stuff +Some Stuff 2 More Stuff +Some Stuff 3 More Stuff +Replacement line +Some Stuff 7 More Stuff +Some Stuff 8 More Stuff +Some Stuff 9 More Stuff `; + let searchStr: string = `Some Stuff 8 More Stuff +Some Stuff 9 More Stuff `; - let replacementStr: string = `Replacement line`; + let replacementStr: string = `Some Stuff 8 More Stuff +Some Stuff 9 More Stuff ^123456`; let expectedResult: string = `Some Stuff 0 More Stuff Some Stuff 1 More Stuff @@ -125,6 +133,26 @@ Some Stuff 3 More Stuff Replacement line Some Stuff 7 More Stuff Some Stuff 8 More Stuff +Some Stuff 9 More Stuff ^123456`; + checkFindAndReplaceResult(postText, searchStr, replacementStr, expectedResult); + }); + + test("line search string has pre/post spaces for block id", () => { + let searchStr: string = `Some Stuff 4 More Stuff +${space}Some Stuff 5 More Stuff +Some Stuff 6 More Stuff${space}${space}`; + + let replacementStr: string = `Replacement line 1 +Replacement line 2`; + + let expectedResult: string = `Some Stuff 0 More Stuff +Some Stuff 1 More Stuff +Some Stuff 2 More Stuff +Some Stuff 3 More Stuff +Replacement line 1 +Replacement line 2 +Some Stuff 7 More Stuff +Some Stuff 8 More Stuff Some Stuff 9 More Stuff`; checkFindAndReplaceResult(text10, searchStr, replacementStr, expectedResult); }); From aaf03a28b2fb199892819d4321a60e9f43873bd2 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 21 Jul 2024 16:43:38 +0800 Subject: [PATCH 138/155] update version 12.4.8 --- manifest.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 7be874a3..f8e1838d 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.12.4.7", + "version": "1.12.4.8", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index 5ab3ad48..32f04baa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.12.4.7", + "version": "1.12.4.8", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { From 3d644b30ea7b8424429d661ddf6bf264f390c452 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Sun, 21 Jul 2024 17:12:20 +0800 Subject: [PATCH 139/155] fix merge --- src/util/utils_recall.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/util/utils_recall.ts b/src/util/utils_recall.ts index a043eac3..9a885a9e 100644 --- a/src/util/utils_recall.ts +++ b/src/util/utils_recall.ts @@ -1,5 +1,5 @@ import { Notice, Platform } from "obsidian"; -import { cyrb53 } from "src/util/utils"; +import { cyrb53, isEqualOrSubPath } from "src/util/utils"; export class DateUtils { /** @@ -214,9 +214,6 @@ export const logExecutionTime = () => { }; export function isIgnoredPath(noteFoldersToIgnore: string[], path: string) { - if (noteFoldersToIgnore.some((folder) => path.includes(folder))) { - return true; - } else { - return false; - } + // return noteFoldersToIgnore.some((folder) => isEqualOrSubPath(path, folder)); + return noteFoldersToIgnore.some((folder) => path.includes(folder)); } From 108fe5ab383d691ef87b8019da0ffa9f8eb323a1 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 22 Jul 2024 20:41:00 +0800 Subject: [PATCH 140/155] fix isdue --- src/dataStore/repetitionItem.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dataStore/repetitionItem.ts b/src/dataStore/repetitionItem.ts index ff75f47b..541f807f 100644 --- a/src/dataStore/repetitionItem.ts +++ b/src/dataStore/repetitionItem.ts @@ -277,7 +277,8 @@ export class RepetitionItem { if (this.nextReview < globalDateProvider.endofToday.valueOf()) { if (this.isFsrs) { const data: FsrsData = this.data as FsrsData; - if (data.scheduled_days >= 1) { + const lastr = data.last_review.valueOf(); + if (lastr > 0 && lastr < globalDateProvider.startofToday.valueOf()) { return true; } } else { From cdb6646c3e8979b4268b6633dc3698fbe1b613bb Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Mon, 22 Jul 2024 20:44:15 +0800 Subject: [PATCH 141/155] fix 0due or 0new --- src/dataStore/mixQueSet.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dataStore/mixQueSet.ts b/src/dataStore/mixQueSet.ts index 9f6bdd7e..949e5803 100644 --- a/src/dataStore/mixQueSet.ts +++ b/src/dataStore/mixQueSet.ts @@ -40,6 +40,8 @@ export class MixQueSet implements IMixQueSet { calcNext(dueCnthad: number, newCnthad: number) { if (this.DueDefaultCnt === 0) return (this.isDue = newCnthad > 0 ? false : true); if (this.NewDefaultCnt === 0) return (this.isDue = dueCnthad > 0 ? true : false); + if (dueCnthad === 0 && newCnthad > 0) return (this.isDue = false); + if (dueCnthad > 0 && newCnthad === 0) return (this.isDue = true); this._dnCnt++; if (this.isDue) { if (this._dnCnt >= this.DueDefaultCnt && newCnthad > 0) { From ccd0794b6073e63b80b6e2d1394efafd500ed79c Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 6 Aug 2024 12:58:23 +0800 Subject: [PATCH 142/155] sort new notes by file create time only. --- src/ReviewDeck.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/ReviewDeck.ts b/src/ReviewDeck.ts index a7dd0636..1ce85bce 100644 --- a/src/ReviewDeck.ts +++ b/src/ReviewDeck.ts @@ -27,12 +27,8 @@ export class ReviewDeck { } public sortNotes(pageranks: Record): void { - // sort new notes by importance + // sort new notes by file create time. this.newNotes = this.newNotes.sort((a: SchedNote, b: SchedNote) => { - const result = (pageranks[b.note.path] || 0) - (pageranks[a.note.path] || 0); - if (result != 0) { - return result; - } return a.note.stat.ctime - b.note.stat.ctime; }); From 9020dd9df7dcf269ff606e83e7f977f1ffd8c159 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:18:42 +0800 Subject: [PATCH 143/155] chore: update version --- docs/changelog.md | 6 ++++++ manifest.json | 2 +- package.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 6a44fbd9..317abef2 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.12.4.9] + +- 同步原插件最新分支sync upsteam branch; +- fix #67 新旧笔记混合排序修复; +- fix #66 新笔记复习时,只根据文件创建时间排序; + ## [1.12.4.8] - feat #20 卡片定位使用BlockID,会在卡片文本后追加BlockID (e.g. `^blkid1`),**即修改了原笔记文件**。默认关闭,但卡片定位可能不太准确,但也够用; diff --git a/manifest.json b/manifest.json index f8e1838d..122ef14d 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.12.4.8", + "version": "1.12.4.9", "minAppVersion": "0.15.4", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index 32f04baa..5e9861c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.12.4.8", + "version": "1.12.4.9", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { From 6a1f75b02a9413a1355828a73884af2fe81cb3d6 Mon Sep 17 00:00:00 2001 From: Stephen Mwangi Date: Sun, 25 Aug 2024 22:12:20 +0300 Subject: [PATCH 144/155] fix linting, bump dependencies --- .github/workflows/e2e.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 2 +- .npmrc | 2 +- CHANGELOG.md | 2 +- CONTRIBUTING.md | 2 +- package.json | 20 +- pnpm-lock.yaml | 1889 +++++++++++++++++---------------- src/NoteQuestionParser.ts | 2 +- src/generateParser.ts | 37 +- src/parser.ts | 111 +- tests/unit/parser.test.ts | 166 +-- 12 files changed, 1146 insertions(+), 1091 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index bd3c98fb..9a90a8c9 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -16,7 +16,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "22" - uses: actions/checkout@v3 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index c899559a..9cf59cdd 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -15,7 +15,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "22" - uses: actions/checkout@v3 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c6e0e03e..4b34099f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "22" - name: Build id: build diff --git a/.npmrc b/.npmrc index 4ae152d7..e546ce77 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1 @@ -use-node-version=20.1.0 +use-node-version=22.2.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cc39a66..cb4f94f7 120000 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1 @@ -docs/changelog.md +docs/docs/changelog.md \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9815d5bd..54cb9a6d 120000 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1 @@ -docs/en/contributing.md +docs/docs/en/contributing.md \ No newline at end of file diff --git a/package.json b/package.json index e96b28e7..05797a81 100644 --- a/package.json +++ b/package.json @@ -21,33 +21,33 @@ "license": "MIT", "devDependencies": { "@types/jest": "^29.5.12", - "@types/node": "^20.11.24", + "@types/node": "^20.16.1", "@types/vhtml": "^2.2.9", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "@wdio/cli": "^8.32.3", - "@wdio/local-runner": "^8.32.3", - "@wdio/mocha-framework": "^8.32.3", - "@wdio/spec-reporter": "^8.32.2", + "@wdio/cli": "^8.40.3", + "@wdio/local-runner": "^8.40.3", + "@wdio/mocha-framework": "^8.40.3", + "@wdio/spec-reporter": "^8.40.3", "auto-changelog": "^2.4.0", "builtin-modules": "^3.3.0", - "chai": "^4.4.1", + "chai": "^4.5.0", "esbuild": "~0.19.12", "eslint": "^8.57.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-expect-message": "^1.1.3", "moment": "^2.30.1", - "obsidian": "^1.5.7", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", + "obsidian": "^1.6.6", + "prettier": "^3.3.3", + "ts-jest": "^29.2.5", "tslib": "2.6.1", "typescript": "5.1.6", "vhtml": "^2.2.0", "wdio-chromedriver-service": "^8.1.1" }, "dependencies": { - "chart.js": "^4.4.2", + "chart.js": "^4.4.4", "pagerank.js": "^1.0.2", "peggy": "^4.0.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8f050ec..45cb26fc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: dependencies: chart.js: - specifier: ^4.4.2 - version: 4.4.2 + specifier: ^4.4.4 + version: 4.4.4 pagerank.js: specifier: ^1.0.2 version: 1.0.2 @@ -20,8 +20,8 @@ devDependencies: specifier: ^29.5.12 version: 29.5.12 '@types/node': - specifier: ^20.11.24 - version: 20.11.24 + specifier: ^20.16.1 + version: 20.16.1 '@types/vhtml': specifier: ^2.2.9 version: 2.2.9 @@ -32,17 +32,17 @@ devDependencies: specifier: ^6.21.0 version: 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@wdio/cli': - specifier: ^8.32.3 - version: 8.32.3(typescript@5.1.6) + specifier: ^8.40.3 + version: 8.40.3 '@wdio/local-runner': - specifier: ^8.32.3 - version: 8.32.3(typescript@5.1.6) + specifier: ^8.40.3 + version: 8.40.3 '@wdio/mocha-framework': - specifier: ^8.32.3 - version: 8.32.3 + specifier: ^8.40.3 + version: 8.40.3 '@wdio/spec-reporter': - specifier: ^8.32.2 - version: 8.32.2 + specifier: ^8.40.3 + version: 8.40.3 auto-changelog: specifier: ^2.4.0 version: 2.4.0 @@ -50,8 +50,8 @@ devDependencies: specifier: ^3.3.0 version: 3.3.0 chai: - specifier: ^4.4.1 - version: 4.4.1 + specifier: ^4.5.0 + version: 4.5.0 esbuild: specifier: ~0.19.12 version: 0.19.12 @@ -60,7 +60,7 @@ devDependencies: version: 8.57.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.11.24) + version: 29.7.0(@types/node@20.16.1) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -71,14 +71,14 @@ devDependencies: specifier: ^2.30.1 version: 2.30.1 obsidian: - specifier: ^1.5.7 - version: 1.5.7(@codemirror/state@6.4.1)(@codemirror/view@6.24.1) + specifier: ^1.6.6 + version: 1.6.6(@codemirror/state@6.4.1)(@codemirror/view@6.33.0) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.3 + version: 3.3.3 ts-jest: - specifier: ^29.1.2 - version: 29.1.2(@babel/core@7.24.0)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6) + specifier: ^29.2.5 + version: 29.2.5(@babel/core@7.25.2)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6) tslib: specifier: 2.6.1 version: 2.6.1 @@ -90,15 +90,10 @@ devDependencies: version: 2.2.0 wdio-chromedriver-service: specifier: ^8.1.1 - version: 8.1.1(webdriverio@8.32.3) + version: 8.1.1(webdriverio@8.40.3) packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - /@ampproject/remapping@2.3.0: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -107,35 +102,35 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: true - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + /@babel/code-frame@7.24.7: + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 dev: true - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + /@babel/compat-data@7.25.4: + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.24.0: - resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} + /@babel/core@7.25.2: + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helpers': 7.24.0 - '@babel/parser': 7.24.0 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.5 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.4 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -143,292 +138,297 @@ packages: - supports-color dev: true - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + /@babel/generator@7.25.5: + resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.25.4 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + /@babel/helper-compilation-targets@7.25.2: + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 - dev: true - - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + /@babel/helper-module-imports@7.24.7: + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-plugin-utils@7.24.0: - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} - engines: {node: '>=6.9.0'} + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.4 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + /@babel/helper-plugin-utils@7.24.8: + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.0 dev: true - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + /@babel/helper-simple-access@7.24.7: + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + /@babel/helper-string-parser@7.24.8: + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + /@babel/helper-validator-option@7.24.8: + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.24.0: - resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} + /@babel/helpers@7.25.0: + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 - transitivePeerDependencies: - - supports-color + '@babel/template': 7.25.0 + '@babel/types': 7.25.4 dev: true - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.1 dev: true - /@babel/parser@7.24.0: - resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} + /@babel/parser@7.25.4: + resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.25.4 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + /@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + /@babel/template@7.25.0: + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 dev: true - /@babel/traverse@7.24.0: - resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} + /@babel/traverse@7.25.4: + resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 - debug: 4.3.4(supports-color@8.1.1) + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.5 + '@babel/parser': 7.25.4 + '@babel/template': 7.25.0 + '@babel/types': 7.25.4 + debug: 4.3.6(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.24.0: - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + /@babel/types@7.25.4: + resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 dev: true @@ -440,8 +440,8 @@ packages: resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} dev: true - /@codemirror/view@6.24.1: - resolution: {integrity: sha512-sBfP4rniPBRQzNakwuQEqjEuiJDWJyF2kqLLqij4WXRoVwPPJfjx966Eq3F7+OPQxDtMt/Q9MWLoZLWjeveBlg==} + /@codemirror/view@6.33.0: + resolution: {integrity: sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ==} dependencies: '@codemirror/state': 6.4.1 style-mod: 4.1.2 @@ -665,8 +665,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + /@eslint-community/regexpp@4.11.0: + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -675,10 +675,10 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -695,9 +695,10 @@ packages: /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4(supports-color@8.1.1) + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.6(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -708,8 +709,9 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead dev: true /@isaacs/cliui@8.0.2: @@ -745,7 +747,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.16.1 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -766,14 +768,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.16.1 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.11.24) + jest-config: 29.7.0(@types/node@20.16.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -785,7 +787,7 @@ packages: jest-util: 29.7.0 jest-validate: 29.7.0 jest-watcher: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 @@ -801,7 +803,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.16.1 jest-mock: 29.7.0 dev: true @@ -828,7 +830,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.11.24 + '@types/node': 20.16.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -861,14 +863,14 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.11.24 + '@types/node': 20.16.1 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 + istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.7 @@ -878,7 +880,7 @@ packages: slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.2.0 + v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color dev: true @@ -923,7 +925,7 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.25.2 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -934,7 +936,7 @@ packages: jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 @@ -949,8 +951,8 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.24 - '@types/yargs': 17.0.32 + '@types/node': 20.16.1 + '@types/yargs': 17.0.33 chalk: 4.1.2 dev: true @@ -959,7 +961,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 dev: true @@ -973,23 +975,23 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} dev: true /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 dev: true /@kurkle/color@0.3.2: resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} dev: false - /@ljharb/through@2.3.12: - resolution: {integrity: sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==} + /@ljharb/through@2.3.13: + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -1030,26 +1032,10 @@ packages: dev: true optional: true - /@puppeteer/browsers@1.4.6(typescript@5.1.6): - resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==} - engines: {node: '>=16.3.0'} - hasBin: true - peerDependencies: - typescript: '>= 4.7.4' - peerDependenciesMeta: - typescript: - optional: true + /@promptbook/utils@0.67.2: + resolution: {integrity: sha512-if73lNrGoRJkAZSf6Vc6gyfvShaYM6x26tm/WVmdoGwES6fDWzFeCqwYWENx3rVUd3qkT0+Z4MhmLOJzcjLTig==} dependencies: - debug: 4.3.4(supports-color@8.1.1) - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.3.0 - tar-fs: 3.0.4 - typescript: 5.1.6 - unbzip2-stream: 1.4.3 - yargs: 17.7.1 - transitivePeerDependencies: - - supports-color + spacetrim: 0.11.39 dev: true /@puppeteer/browsers@1.9.1: @@ -1057,7 +1043,7 @@ packages: engines: {node: '>=16.3.0'} hasBin: true dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.3.1 @@ -1108,30 +1094,30 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 dev: true /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.25.4 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.0 - '@babel/types': 7.24.0 + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 dev: true - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + /@types/babel__traverse@7.20.6: + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.25.4 dev: true /@types/codemirror@5.60.8: @@ -1147,7 +1133,7 @@ packages: /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.16.1 dev: true /@types/http-cache-semantics@4.0.4: @@ -1180,7 +1166,7 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.16.1 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 dev: true @@ -1189,14 +1175,20 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true - /@types/mocha@10.0.6: - resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} + /@types/mocha@10.0.7: + resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==} dev: true - /@types/node@20.11.24: - resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} + /@types/node@20.16.1: + resolution: {integrity: sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==} dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 + dev: true + + /@types/node@22.5.0: + resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==} + dependencies: + undici-types: 6.19.8 dev: true /@types/normalize-package-data@2.4.4: @@ -1229,18 +1221,18 @@ packages: resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} dev: true - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + /@types/ws@8.5.12: + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.16.1 dev: true /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} dev: true - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + /@types/yargs@17.0.33: + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} dependencies: '@types/yargs-parser': 21.0.3 dev: true @@ -1249,7 +1241,7 @@ packages: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 20.11.24 + '@types/node': 20.16.1 dev: true optional: true @@ -1264,19 +1256,19 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.1.6) + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color @@ -1296,7 +1288,7 @@ packages: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.1.6) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 typescript: 5.1.6 transitivePeerDependencies: @@ -1323,9 +1315,9 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.1.6) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.1.6) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 - ts-api-utils: 1.2.1(typescript@5.1.6) + ts-api-utils: 1.3.0(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color @@ -1347,12 +1339,12 @@ packages: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.1.6) + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color @@ -1371,7 +1363,7 @@ packages: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.1.6) eslint: 8.57.0 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -1389,105 +1381,108 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitest/snapshot@1.3.1: - resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} + /@vitest/pretty-format@2.0.5: + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} dependencies: - magic-string: 0.30.7 + tinyrainbow: 1.2.0 + dev: true + + /@vitest/snapshot@2.0.5: + resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + dependencies: + '@vitest/pretty-format': 2.0.5 + magic-string: 0.30.11 pathe: 1.1.2 - pretty-format: 29.7.0 dev: true - /@wdio/cli@8.32.3(typescript@5.1.6): - resolution: {integrity: sha512-qjR1MFKQM547iCooceBHyggJRNguD7fhgF4Q7L2r7psG3AQFWzdCN/8rulRGIxTz4PJlIqks9AH9kUJlVAf44A==} + /@wdio/cli@8.40.3: + resolution: {integrity: sha512-woB6RQj3upBOaytL/Ru3QPErJa80Ct2E/jHvQMSTC0xBTAOqpL/Q/vgMriyNTdvwkFwLi8Z3Jpoi9FnAhX0Lfg==} engines: {node: ^16.13 || >=18} hasBin: true dependencies: - '@types/node': 20.11.24 - '@vitest/snapshot': 1.3.1 - '@wdio/config': 8.32.3 - '@wdio/globals': 8.32.3(typescript@5.1.6) - '@wdio/logger': 8.28.0 - '@wdio/protocols': 8.32.0 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 + '@types/node': 22.5.0 + '@vitest/snapshot': 2.0.5 + '@wdio/config': 8.40.3 + '@wdio/globals': 8.40.3 + '@wdio/logger': 8.38.0 + '@wdio/protocols': 8.40.3 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 async-exit-hook: 2.0.1 chalk: 5.3.0 chokidar: 3.6.0 cli-spinners: 2.9.2 dotenv: 16.4.5 - ejs: 3.1.9 + ejs: 3.1.10 execa: 8.0.1 - import-meta-resolve: 4.0.0 + import-meta-resolve: 4.1.0 inquirer: 9.2.12 lodash.flattendeep: 4.4.0 lodash.pickby: 4.6.0 lodash.union: 4.6.0 read-pkg-up: 10.0.0 recursive-readdir: 2.2.3 - webdriverio: 8.32.3(typescript@5.1.6) + webdriverio: 8.40.3 yargs: 17.7.2 transitivePeerDependencies: - bufferutil - devtools - encoding - supports-color - - typescript - utf-8-validate dev: true - /@wdio/config@8.32.3: - resolution: {integrity: sha512-hZkaz5Fd8830uniQvRgPus8yp9rp50MAsHa5kZ2Jt8y++Rp330FyJpQZE5oPjTATuz35G5Anprk2Q3fmFd0Ifw==} + /@wdio/config@8.40.3: + resolution: {integrity: sha512-HIi+JnHEDAExhzGRQuZOXw1HWIpe/bsVFHwNISJhY6wS4Nijaigmegs2p14Rv16ydOF19hGrxdKsl8k5STIP2A==} engines: {node: ^16.13 || >=18} dependencies: - '@wdio/logger': 8.28.0 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 + '@wdio/logger': 8.38.0 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 decamelize: 6.0.0 deepmerge-ts: 5.1.0 - glob: 10.3.10 - import-meta-resolve: 4.0.0 + glob: 10.4.5 + import-meta-resolve: 4.1.0 transitivePeerDependencies: - supports-color dev: true - /@wdio/globals@8.32.3(typescript@5.1.6): - resolution: {integrity: sha512-jyK89GvWaOYQT9pfZ6HNwkFANgai9eBVfeDPw5yFLXfk6js9GSWbvqMJg/PFi1dQ7xbnbuuf5eYVc65bfAt9KQ==} + /@wdio/globals@8.40.3: + resolution: {integrity: sha512-oir+wEx8kfcDsuUzwgw48UvVXYDjvlXEj6/xYjymyAWzpWSL2rUADTdUbkm4StOlWQ47Z4h8Y5YoDEvWh7DwHA==} engines: {node: ^16.13 || >=18} optionalDependencies: - expect-webdriverio: 4.11.9(typescript@5.1.6) - webdriverio: 8.32.3(typescript@5.1.6) + expect-webdriverio: 4.15.4 + webdriverio: 8.40.3 transitivePeerDependencies: - bufferutil - devtools - encoding - supports-color - - typescript - utf-8-validate dev: true - /@wdio/local-runner@8.32.3(typescript@5.1.6): - resolution: {integrity: sha512-YgqYkKarx2m9OjA8WO4NqQPCfFNLmZHnuEWQ6P2LqUeYFsdXRd3wR3UTo9XrI23VSQo+kcpqInsR5vLOYDd1zg==} + /@wdio/local-runner@8.40.3: + resolution: {integrity: sha512-rlTddOWPttPQSqxpXZfLgmrG9x1ZpbfaIu4uDTAbToYh13DsXKm+AgBMvHw7wZnPgFs+tW2v0+skFYGGWM0JtQ==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 - '@wdio/logger': 8.28.0 - '@wdio/repl': 8.24.12 - '@wdio/runner': 8.32.3(typescript@5.1.6) - '@wdio/types': 8.32.2 + '@types/node': 22.5.0 + '@wdio/logger': 8.38.0 + '@wdio/repl': 8.40.3 + '@wdio/runner': 8.40.3 + '@wdio/types': 8.40.3 async-exit-hook: 2.0.1 split2: 4.2.0 - stream-buffers: 3.0.2 + stream-buffers: 3.0.3 transitivePeerDependencies: - bufferutil - devtools - encoding - supports-color - - typescript - utf-8-validate dev: true - /@wdio/logger@8.28.0: - resolution: {integrity: sha512-/s6zNCqwy1hoc+K4SJypis0Ud0dlJ+urOelJFO1x0G0rwDRWyFiUP6ijTaCcFxAm29jYEcEPWijl2xkVIHwOyA==} + /@wdio/logger@8.38.0: + resolution: {integrity: sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==} engines: {node: ^16.13 || >=18} dependencies: chalk: 5.3.0 @@ -1496,98 +1491,107 @@ packages: strip-ansi: 7.1.0 dev: true - /@wdio/mocha-framework@8.32.3: - resolution: {integrity: sha512-wwQ6rDd6TMPqwGfkwvtcBmcirYZUi9GUiwH2OsHvMJ4i+YY7H2dLyZon1ghcIan7r4ufr8KlljbwyerCpUzvcw==} + /@wdio/logger@9.0.4: + resolution: {integrity: sha512-b6gcu0PTVb3fgK4kyAH/k5UUWN5FOUdAfhA4PAY/IZvxZTMFYMqnrZb0WRWWWqL6nu9pcrOVtCOdPBvj0cb+Nw==} + engines: {node: '>=18'} + dependencies: + chalk: 5.3.0 + loglevel: 1.9.1 + loglevel-plugin-prefix: 0.8.4 + strip-ansi: 7.1.0 + dev: true + + /@wdio/mocha-framework@8.40.3: + resolution: {integrity: sha512-u8toUYRroA5MgCQZPHiQQv88RbeLjJFXSeowXQX6hwMTLurqDLfrqKtaTweFO6QJRFROeq/M0iNJbK008EXXMQ==} engines: {node: ^16.13 || >=18} dependencies: - '@types/mocha': 10.0.6 - '@types/node': 20.11.24 - '@wdio/logger': 8.28.0 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 - mocha: 10.3.0 + '@types/mocha': 10.0.7 + '@types/node': 22.5.0 + '@wdio/logger': 8.38.0 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 + mocha: 10.7.3 transitivePeerDependencies: - supports-color dev: true - /@wdio/protocols@8.32.0: - resolution: {integrity: sha512-inLJRrtIGdTz/YPbcsvpSvPlYQFTVtF3OYBwAXhG2FiP1ZwE1CQNLP/xgRGye1ymdGCypGkexRqIx3KBGm801Q==} + /@wdio/protocols@8.40.3: + resolution: {integrity: sha512-wK7+eyrB3TAei8RwbdkcyoNk2dPu+mduMBOdPJjp8jf/mavd15nIUXLID1zA+w5m1Qt1DsT1NbvaeO9+aJQ33A==} dev: true - /@wdio/repl@8.24.12: - resolution: {integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==} + /@wdio/repl@8.40.3: + resolution: {integrity: sha512-mWEiBbaC7CgxvSd2/ozpbZWebnRIc8KRu/J81Hlw/txUWio27S7IpXBlZGVvhEsNzq0+cuxB/8gDkkXvMPbesw==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 + '@types/node': 22.5.0 dev: true - /@wdio/reporter@8.32.2: - resolution: {integrity: sha512-BZdReAFfRCtgtYbyhkKgSGqqoIn/yG5/Z4COjvRvon9NJkz+eA4PiHCKdEP7+ekBIjud7H8Gy+6mPBDEu+wllw==} + /@wdio/reporter@8.40.3: + resolution: {integrity: sha512-icoUnlyIqLKgxB215OPdDTHG+hlu+U+t/sO6S9eI0ZTYBYaDIQBWVCilkUWRvgfcNSiXYo+1VlVt6waIgIHKwQ==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 - '@wdio/logger': 8.28.0 - '@wdio/types': 8.32.2 + '@types/node': 22.5.0 + '@wdio/logger': 8.38.0 + '@wdio/types': 8.40.3 diff: 5.2.0 - object-inspect: 1.13.1 + object-inspect: 1.13.2 dev: true - /@wdio/runner@8.32.3(typescript@5.1.6): - resolution: {integrity: sha512-HlhdQ4lJ07seL7/x0UQPDnK+o5a0okyjd8ukFYqDL+g9+d3KlW/oM3NvFfX7pb9liIYNEpmoNMwKFp+5XPUE7w==} + /@wdio/runner@8.40.3: + resolution: {integrity: sha512-zk4KIMrkopW2FW/gbtwFFm4UbMiJxscwAAeCPnXHPYMcJZ/qf8VuBTDzt490csLT4DsumOK/1pH9TDXG+4/cQQ==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 - '@wdio/config': 8.32.3 - '@wdio/globals': 8.32.3(typescript@5.1.6) - '@wdio/logger': 8.28.0 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 + '@types/node': 22.5.0 + '@wdio/config': 8.40.3 + '@wdio/globals': 8.40.3 + '@wdio/logger': 8.38.0 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 deepmerge-ts: 5.1.0 - expect-webdriverio: 4.11.9(typescript@5.1.6) + expect-webdriverio: 4.15.4 gaze: 1.1.3 - webdriver: 8.32.3 - webdriverio: 8.32.3(typescript@5.1.6) + webdriver: 8.40.3 + webdriverio: 8.40.3 transitivePeerDependencies: - bufferutil - devtools - encoding - supports-color - - typescript - utf-8-validate dev: true - /@wdio/spec-reporter@8.32.2: - resolution: {integrity: sha512-3hUXpE+idC4KOXofJnpubdDDCE8X0OTd6ykypiaXMI2hJTA2nIZcHtpRQnAE0E4JT9OzLnPWODcMq54GGBDRkg==} + /@wdio/spec-reporter@8.40.3: + resolution: {integrity: sha512-Qp8hI4ZqxOLQAeqpt1wmOzR0QgarsoT35NOVfEA7gSy8FcF+H/axrPwEToOLRSQIU4bKEh5/khJ7j81GaVqtVg==} engines: {node: ^16.13 || >=18} dependencies: - '@wdio/reporter': 8.32.2 - '@wdio/types': 8.32.2 + '@wdio/reporter': 8.40.3 + '@wdio/types': 8.40.3 chalk: 5.3.0 easy-table: 1.2.0 pretty-ms: 7.0.1 dev: true - /@wdio/types@8.32.2: - resolution: {integrity: sha512-jq8LcBBQpBP9ZF5kECKEpXv8hN7irCGCjLFAN0Bd5ScRR6qu6MGWvwkDkau2sFPr0b++sKDCEaMzQlwrGFjZXg==} + /@wdio/types@8.40.3: + resolution: {integrity: sha512-zK17uyON3Ise3m+XwiF5VrrdZcXXmvqB8AWXoKe88DiksFUPMVoCOuVL2SSX1KnA2YLlZBA55qcFZT99GORVKQ==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 + '@types/node': 22.5.0 dev: true - /@wdio/utils@8.32.3: - resolution: {integrity: sha512-UnR9rPpR1W9U5wz2TU+6BQ2rlxtuK/e3fvdaiWIMZKleB/OCcEQFGiGPAGGVi4ShfaTPwz6hK1cTTgj1OtMXkg==} + /@wdio/utils@8.40.3: + resolution: {integrity: sha512-pv/848KGfPN3YXU4QRfTYGkAu4/lejIfoGzGpvGNDcACiVxgZhyRZkJ2xVaSnGaXzF0R7pMozrkU5/DnEhcxMg==} engines: {node: ^16.13 || >=18} dependencies: '@puppeteer/browsers': 1.9.1 - '@wdio/logger': 8.28.0 - '@wdio/types': 8.32.2 + '@wdio/logger': 8.38.0 + '@wdio/types': 8.40.3 decamelize: 6.0.0 deepmerge-ts: 5.1.0 - edgedriver: 5.3.10 - geckodriver: 4.3.3 - get-port: 7.0.0 - import-meta-resolve: 4.0.0 - locate-app: 2.2.20 + edgedriver: 5.6.1 + geckodriver: 4.4.3 + get-port: 7.1.0 + import-meta-resolve: 4.1.0 + locate-app: 2.4.31 safaridriver: 0.1.2 split2: 4.2.0 wait-port: 1.1.0 @@ -1595,33 +1599,47 @@ packages: - supports-color dev: true + /@zip.js/zip.js@2.7.51: + resolution: {integrity: sha512-RKHaebzZZgQkUuzb49/qweN69e8Np9AUZ9QygydDIrbG1njypSAKwkeqIVeuf2JVGBDyB7Z9HKvzPgYrSlv9gw==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} + dev: true + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead dev: true + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: true + /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.11.3 - acorn-walk: 8.3.2 + acorn: 8.12.1 + acorn-walk: 8.3.3 dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.12.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.3 + acorn: 8.12.1 dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + /acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.12.1 dev: true - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -1630,16 +1648,16 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + /agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true @@ -1653,8 +1671,8 @@ packages: uri-js: 4.4.1 dev: true - /ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true @@ -1707,29 +1725,30 @@ packages: picomatch: 2.3.1 dev: true - /archiver-utils@4.0.1: - resolution: {integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==} - engines: {node: '>= 12.0.0'} + /archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} dependencies: - glob: 8.1.0 + glob: 10.4.5 graceful-fs: 4.2.11 + is-stream: 2.0.1 lazystream: 1.0.1 lodash: 4.17.21 normalize-path: 3.0.0 - readable-stream: 3.6.2 + readable-stream: 4.5.2 dev: true - /archiver@6.0.2: - resolution: {integrity: sha512-UQ/2nW7NMl1G+1UnrLypQw1VdT9XZg/ECcKPq7l+STzStrSivFIXIp34D8M5zeNGW5NoOupdYCHv6VySCPNNlw==} - engines: {node: '>= 12.0.0'} + /archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} dependencies: - archiver-utils: 4.0.1 - async: 3.2.5 - buffer-crc32: 0.2.13 - readable-stream: 3.6.2 + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.5.2 readdir-glob: 1.1.3 tar-stream: 3.1.7 - zip-stream: 5.0.2 + zip-stream: 6.0.1 dev: true /argparse@1.0.10: @@ -1769,8 +1788,8 @@ packages: engines: {node: '>=0.12.0'} dev: true - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + /async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} dev: true /asynckit@0.4.0: @@ -1785,8 +1804,8 @@ packages: commander: 7.2.0 handlebars: 4.7.8 node-fetch: 2.7.0 - parse-github-url: 1.0.2 - semver: 7.6.0 + parse-github-url: 1.0.3 + semver: 7.6.3 transitivePeerDependencies: - encoding dev: true @@ -1795,17 +1814,17 @@ packages: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} dev: true - /babel-jest@29.7.0(@babel/core@7.24.0): + /babel-jest@29.7.0(@babel/core@7.25.2): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.25.2 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.0) + babel-preset-jest: 29.6.3(@babel/core@7.25.2) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -1817,7 +1836,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.8 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -1830,75 +1849,85 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/template': 7.25.0 + '@babel/types': 7.25.4 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.0): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + /babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.2): + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.24.0): + '@babel/core': 7.25.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.25.2): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.25.2 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) dev: true /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /bare-events@2.2.1: - resolution: {integrity: sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==} + /bare-events@2.4.2: + resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} requiresBuild: true dev: true optional: true - /bare-fs@2.2.1: - resolution: {integrity: sha512-+CjmZANQDFZWy4PGbVdmALIwmt33aJg8qTkVjClU6X4WmZkTPBDxRHiBn7fpqEWEfF3AC2io++erpViAIQbSjg==} + /bare-fs@2.3.1: + resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==} requiresBuild: true dependencies: - bare-events: 2.2.1 - bare-os: 2.2.0 - bare-path: 2.1.0 - streamx: 2.16.1 + bare-events: 2.4.2 + bare-path: 2.1.3 + bare-stream: 2.1.3 + dev: true + optional: true + + /bare-os@2.4.0: + resolution: {integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==} + requiresBuild: true dev: true optional: true - /bare-os@2.2.0: - resolution: {integrity: sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==} + /bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} requiresBuild: true + dependencies: + bare-os: 2.4.0 dev: true optional: true - /bare-path@2.1.0: - resolution: {integrity: sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==} + /bare-stream@2.1.3: + resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==} requiresBuild: true dependencies: - bare-os: 2.2.0 + streamx: 2.19.0 dev: true optional: true @@ -1911,23 +1940,11 @@ packages: engines: {node: '>=10.0.0'} dev: true - /big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} dev: true - /binary@0.3.0: - resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} - dependencies: - buffers: 0.1.1 - chainsaw: 0.1.0 - dev: true - /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -1936,10 +1953,6 @@ packages: readable-stream: 3.6.2 dev: true - /bluebird@3.4.7: - resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - dev: true - /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1953,26 +1966,26 @@ packages: balanced-match: 1.0.2 dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 dev: true /browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + /browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001591 - electron-to-chromium: 1.4.690 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + caniuse-lite: 1.0.30001653 + electron-to-chromium: 1.5.13 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) dev: true /bs-logger@0.2.6: @@ -1992,13 +2005,13 @@ packages: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + /buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} dev: true - /buffer-indexof-polyfill@1.0.2: - resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} - engines: {node: '>=0.10'} + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true /buffer@5.7.1: @@ -2008,9 +2021,11 @@ packages: ieee754: 1.2.1 dev: true - /buffers@0.1.1: - resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} - engines: {node: '>=0.2.0'} + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 dev: true /builtin-modules@3.3.0: @@ -2032,7 +2047,7 @@ packages: http-cache-semantics: 4.1.1 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.0 + normalize-url: 8.0.1 responselike: 3.0.0 dev: true @@ -2044,7 +2059,7 @@ packages: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + set-function-length: 1.2.2 dev: true /callsites@3.1.0: @@ -2062,27 +2077,21 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001591: - resolution: {integrity: sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==} + /caniuse-lite@1.0.30001653: + resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==} dev: true - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + /chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /chainsaw@0.1.0: - resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} - dependencies: - traverse: 0.3.9 + type-detect: 4.1.0 dev: true /chalk@2.4.2: @@ -2116,8 +2125,8 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /chart.js@4.4.2: - resolution: {integrity: sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==} + /chart.js@4.4.4: + resolution: {integrity: sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==} engines: {pnpm: '>=8'} dependencies: '@kurkle/color': 0.3.2 @@ -2129,27 +2138,12 @@ packages: get-func-name: 2.0.2 dev: true - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -2159,13 +2153,14 @@ packages: fsevents: 2.3.3 dev: true - /chromium-bidi@0.4.16(devtools-protocol@0.0.1147663): - resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==} + /chromium-bidi@0.5.8(devtools-protocol@0.0.1232444): + resolution: {integrity: sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==} peerDependencies: devtools-protocol: '*' dependencies: - devtools-protocol: 0.0.1147663 - mitt: 3.0.0 + devtools-protocol: 0.0.1232444 + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 dev: true /ci-info@3.9.0: @@ -2173,8 +2168,8 @@ packages: engines: {node: '>=8'} dev: true - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + /cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} dev: true /cli-cursor@3.1.0: @@ -2269,14 +2264,15 @@ packages: engines: {node: ^12.20.0 || >=14} dev: true - /compress-commons@5.0.3: - resolution: {integrity: sha512-/UIcLWvwAQyVibgpQDPtfNM3SvqN7G9elAPAV7GM0L53EbNWwWiCsWtK8Fwed/APEbptPHXs5PuW+y8Bq8lFTA==} - engines: {node: '>= 12.0.0'} + /compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} dependencies: crc-32: 1.2.2 - crc32-stream: 5.0.1 + crc32-stream: 6.0.0 + is-stream: 2.0.1 normalize-path: 3.0.0 - readable-stream: 3.6.2 + readable-stream: 4.5.2 dev: true /concat-map@0.0.1: @@ -2297,15 +2293,15 @@ packages: hasBin: true dev: true - /crc32-stream@5.0.1: - resolution: {integrity: sha512-lO1dFui+CEUh/ztYIpgpKItKW9Bb4NWakCRJrnqAbFIYD+OZAwb2VfD5T5eXMw2FNcsDHkQcNl/Wh3iVXYwU6g==} - engines: {node: '>= 12.0.0'} + /crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} dependencies: crc-32: 1.2.2 - readable-stream: 3.6.2 + readable-stream: 4.5.2 dev: true - /create-jest@29.7.0(@types/node@20.11.24): + /create-jest@29.7.0(@types/node@20.16.1): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2314,7 +2310,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.11.24) + jest-config: 29.7.0(@types/node@20.16.1) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -2395,9 +2391,21 @@ packages: ms: 2.1.2 dev: true - /debug@4.3.4(supports-color@8.1.1): + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /debug@4.3.6(supports-color@8.1.1): + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -2429,8 +2437,8 @@ packages: mimic-response: 3.1.0 dev: true - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + /dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -2438,11 +2446,11 @@ packages: optional: true dev: true - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + /deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} dependencies: - type-detect: 4.0.8 + type-detect: 4.1.0 dev: true /deep-is@0.1.4: @@ -2504,12 +2512,12 @@ packages: engines: {node: '>=8'} dev: true - /devtools-protocol@0.0.1147663: - resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} + /devtools-protocol@0.0.1232444: + resolution: {integrity: sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==} dev: true - /devtools-protocol@0.0.1262051: - resolution: {integrity: sha512-YJe4CT5SA8on3Spa+UDtNhEqtuV6Epwz3OZ4HQVLhlRccpZ9/PAYk0/cy/oKxFKRrZPBUPyxympQci4yWNWZ9g==} + /devtools-protocol@0.0.1340018: + resolution: {integrity: sha512-yiZNvYDYW8P93XT1q3QxB/y5n/4D7hGfKN6+342Bp1UJpkqzIlt9QLfZuSG8njk6lt6u2s2ZYyLXW3uABtKmtg==} dev: true /diff-sequences@29.6.3: @@ -2517,11 +2525,6 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - dev: true - /diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} @@ -2554,12 +2557,6 @@ packages: engines: {node: '>=12'} dev: true - /duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - dependencies: - readable-stream: 2.3.8 - dev: true - /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true @@ -2580,29 +2577,30 @@ packages: which: 2.0.2 dev: true - /edgedriver@5.3.10: - resolution: {integrity: sha512-RFSHYMNtcF1PjaGZCA2rdQQ8hSTLPZgcYgeY1V6dC+tR4NhZXwFAku+8hCbRYh7ZlwKKrTbVu9FwknjFddIuuw==} + /edgedriver@5.6.1: + resolution: {integrity: sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==} hasBin: true requiresBuild: true dependencies: - '@wdio/logger': 8.28.0 + '@wdio/logger': 8.38.0 + '@zip.js/zip.js': 2.7.51 decamelize: 6.0.0 edge-paths: 3.0.5 + fast-xml-parser: 4.4.1 node-fetch: 3.3.2 - unzipper: 0.10.14 which: 4.0.0 dev: true - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true dependencies: - jake: 10.8.7 + jake: 10.9.2 dev: true - /electron-to-chromium@1.4.690: - resolution: {integrity: sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==} + /electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} dev: true /emittery@0.13.1: @@ -2734,7 +2732,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -2744,13 +2742,13 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -2758,7 +2756,7 @@ packages: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -2768,7 +2766,7 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -2779,8 +2777,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 dev: true @@ -2790,8 +2788,8 @@ packages: hasBin: true dev: true - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -2814,6 +2812,16 @@ packages: engines: {node: '>=0.10.0'} dev: true + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2849,24 +2857,23 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /expect-webdriverio@4.11.9(typescript@5.1.6): - resolution: {integrity: sha512-nHVLoC4W8wuVAyfpitJ07iDMLjeQ2OeYVjrKEb7dMeG4fqlegzN1SGYnnsKay+KWrte9KzuW1pZ7h5Nmbm/hAQ==} + /expect-webdriverio@4.15.4: + resolution: {integrity: sha512-Op1xZoevlv1pohCq7g2Og5Gr3xP2NhY7MQueOApmopVxgweoJ/BqJxyvMNP0A//QsMg8v0WsN/1j81Sx2er9Wg==} engines: {node: '>=16 || >=18 || >=20'} dependencies: - '@vitest/snapshot': 1.3.1 + '@vitest/snapshot': 2.0.5 expect: 29.7.0 jest-matcher-utils: 29.7.0 lodash.isequal: 4.5.0 optionalDependencies: - '@wdio/globals': 8.32.3(typescript@5.1.6) - '@wdio/logger': 8.28.0 - webdriverio: 8.32.3(typescript@5.1.6) + '@wdio/globals': 8.40.3 + '@wdio/logger': 8.38.0 + webdriverio: 8.40.3 transitivePeerDependencies: - bufferutil - devtools - encoding - supports-color - - typescript - utf-8-validate dev: true @@ -2895,7 +2902,7 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -2924,7 +2931,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 dev: true /fast-json-stable-stringify@2.1.0: @@ -2935,6 +2942,13 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-xml-parser@4.4.1: + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: true + /fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: @@ -2982,8 +2996,8 @@ packages: minimatch: 5.1.6 dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 @@ -3031,8 +3045,8 @@ packages: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + /foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 @@ -3081,16 +3095,6 @@ packages: dev: true optional: true - /fstream@1.0.12: - resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} - engines: {node: '>=0.6'} - dependencies: - graceful-fs: 4.2.11 - inherits: 2.0.4 - mkdirp: 0.5.6 - rimraf: 2.7.1 - dev: true - /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true @@ -3102,19 +3106,19 @@ packages: globule: 1.3.4 dev: true - /geckodriver@4.3.3: - resolution: {integrity: sha512-we2c2COgxFkLVuoknJNx+ioP+7VDq0sr6SCqWHTzlA4kzIbzR0EQ1Pps34s8WrsOnQqPC8a4sZV9dRPROOrkSg==} + /geckodriver@4.4.3: + resolution: {integrity: sha512-79rvaq8pvKVUtuM9XBjQApb04kOVkl3TFRX+zTt1wlmL+wqpt85ocWCdqiENU/3zIzg2Me21eClUcnE7F1kL2w==} engines: {node: ^16.13 || >=18 || >=20} hasBin: true requiresBuild: true dependencies: - '@wdio/logger': 8.28.0 + '@wdio/logger': 9.0.4 + '@zip.js/zip.js': 2.7.51 decamelize: 6.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.5 node-fetch: 3.3.2 - tar-fs: 3.0.5 - unzipper: 0.10.14 + tar-fs: 3.0.6 which: 4.0.0 transitivePeerDependencies: - supports-color @@ -3142,7 +3146,7 @@ packages: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 dev: true /get-package-type@0.1.0: @@ -3150,8 +3154,8 @@ packages: engines: {node: '>=8.0.0'} dev: true - /get-port@7.0.0: - resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} + /get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} engines: {node: '>=16'} dev: true @@ -3178,7 +3182,7 @@ packages: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 fs-extra: 11.2.0 transitivePeerDependencies: - supports-color @@ -3198,20 +3202,21 @@ packages: is-glob: 4.0.3 dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 dev: true /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -3223,6 +3228,7 @@ packages: /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -3235,11 +3241,12 @@ packages: /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.0.1 + minimatch: 5.1.6 once: 1.4.0 dev: true @@ -3262,7 +3269,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -3321,7 +3328,7 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.4 + uglify-js: 3.19.2 dev: true /has-flag@3.0.0: @@ -3350,8 +3357,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -3362,11 +3369,11 @@ packages: hasBin: true dev: true - /hosted-git-info@7.0.1: - resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} + /hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} dependencies: - lru-cache: 10.2.0 + lru-cache: 10.4.3 dev: true /html-encoding-sniffer@3.0.0: @@ -3390,7 +3397,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -3399,8 +3406,8 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + agent-base: 7.1.1 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -3418,17 +3425,17 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + /https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + agent-base: 7.1.1 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -3461,11 +3468,15 @@ packages: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} dev: true + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: true + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -3474,8 +3485,8 @@ packages: resolve-from: 4.0.0 dev: true - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + /import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} hasBin: true dependencies: @@ -3483,8 +3494,8 @@ packages: resolve-cwd: 3.0.0 dev: true - /import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + /import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} dev: true /imurmurhash@0.1.4: @@ -3494,6 +3505,7 @@ packages: /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -3507,7 +3519,7 @@ packages: resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} engines: {node: '>=14.18.0'} dependencies: - '@ljharb/through': 2.3.12 + '@ljharb/through': 2.3.13 ansi-escapes: 4.3.2 chalk: 5.3.0 cli-cursor: 3.1.0 @@ -3545,13 +3557,14 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 dev: true - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + /is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} dependencies: - hasown: 2.0.1 + hasown: 2.0.2 dev: true /is-extglob@2.1.1: @@ -3660,8 +3673,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/core': 7.25.2 + '@babel/parser': 7.25.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -3669,15 +3682,15 @@ packages: - supports-color dev: true - /istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + /istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/core': 7.25.2 + '@babel/parser': 7.25.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color dev: true @@ -3695,7 +3708,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -3710,21 +3723,20 @@ packages: istanbul-lib-report: 3.0.1 dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 dev: true - /jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + /jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} hasBin: true dependencies: - async: 3.2.5 + async: 3.2.6 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 @@ -3747,10 +3759,10 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.16.1 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.1 + dedent: 1.5.3 is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -3760,7 +3772,7 @@ packages: jest-util: 29.7.0 p-limit: 3.1.0 pretty-format: 29.7.0 - pure-rand: 6.0.4 + pure-rand: 6.1.0 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: @@ -3768,7 +3780,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.11.24): + /jest-cli@29.7.0(@types/node@20.16.1): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3782,10 +3794,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.11.24) + create-jest: 29.7.0(@types/node@20.16.1) exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.11.24) + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.16.1) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -3796,7 +3808,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.11.24): + /jest-config@29.7.0(@types/node@20.16.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3808,11 +3820,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 - babel-jest: 29.7.0(@babel/core@7.24.0) + '@types/node': 20.16.1 + babel-jest: 29.7.0(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -3826,7 +3838,7 @@ packages: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 @@ -3877,7 +3889,7 @@ packages: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.11.24 + '@types/node': 20.16.1 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -3894,7 +3906,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.16.1 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -3914,14 +3926,14 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.11.24 + '@types/node': 20.16.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -3949,12 +3961,12 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.7 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.8 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -3965,7 +3977,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.16.1 jest-util: 29.7.0 dev: true @@ -4020,7 +4032,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.16.1 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -4051,9 +4063,9 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.16.1 chalk: 4.1.2 - cjs-module-lexer: 1.2.3 + cjs-module-lexer: 1.3.1 collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -4074,15 +4086,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.0 - '@babel/generator': 7.23.6 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0) - '@babel/types': 7.24.0 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.5 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) + '@babel/types': 7.25.4 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -4093,7 +4105,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color dev: true @@ -4103,7 +4115,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.16.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -4128,7 +4140,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.11.24 + '@types/node': 20.16.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -4140,13 +4152,13 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.16.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@20.11.24): + /jest@29.7.0(@types/node@20.16.1): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -4158,8 +4170,8 @@ packages: dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.11.24) + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.16.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4200,7 +4212,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.11.3 + acorn: 8.12.1 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -4213,17 +4225,17 @@ packages: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 + nwsapi: 2.2.12 parse5: 7.1.2 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.3 + tough-cookie: 4.1.4 w3c-xmlserializer: 4.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.16.0 + ws: 8.18.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -4245,8 +4257,8 @@ packages: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-parse-even-better-errors@3.0.1: - resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} + /json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true @@ -4272,6 +4284,15 @@ packages: graceful-fs: 4.2.11 dev: true + /jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: true + /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -4308,6 +4329,12 @@ packages: type-check: 0.4.0 dev: true + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: true + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -4317,14 +4344,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /listenercount@1.0.1: - resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} - dev: true - - /locate-app@2.2.20: - resolution: {integrity: sha512-TOCp8H9l75GhNtd+BgyUnLMNzR+IpYge7cWjxELsyDlqH+MyYWxq+NfyjQ+o6oRAORzOs3IfMM6KAR6q3JNfhg==} + /locate-app@2.4.31: + resolution: {integrity: sha512-fwc8SGUxNhgHA2Z6Sr8sW60eUOdxEsXJpjf3xrAIFr/cxCYSWOHLDGltxcMQf5dZg+39I05lWA3i8e5jb5eXOg==} dependencies: - n12: 1.8.23 + '@promptbook/utils': 0.67.2 type-fest: 2.13.0 userhome: 1.0.0 dev: true @@ -4415,9 +4438,8 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} dev: true /lru-cache@5.1.1: @@ -4431,24 +4453,24 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 + dev: false /lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} dev: true - /magic-string@0.30.7: - resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} - engines: {node: '>=12'} + /magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 dev: true /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.6.0 + semver: 7.6.3 dev: true /make-error@1.3.6: @@ -4470,11 +4492,11 @@ packages: engines: {node: '>= 8'} dev: true - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 dev: true @@ -4522,13 +4544,6 @@ packages: brace-expansion: 1.1.11 dev: true - /minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} @@ -4543,54 +4558,54 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} dev: true - /mitt@3.0.0: - resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} dev: true /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: true - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /mocha@10.3.0: - resolution: {integrity: sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==} + /mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} engines: {node: '>= 14.0.0'} hasBin: true dependencies: - ansi-colors: 4.1.1 + ansi-colors: 4.1.3 browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 + chokidar: 3.6.0 + debug: 4.3.6(supports-color@8.1.1) + diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 glob: 8.1.0 he: 1.2.0 js-yaml: 4.1.0 log-symbols: 4.1.0 - minimatch: 5.0.1 + minimatch: 5.1.6 ms: 2.1.3 - serialize-javascript: 6.0.0 + serialize-javascript: 6.0.2 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 6.2.1 + workerpool: 6.5.1 yargs: 16.2.0 - yargs-parser: 20.2.4 + yargs-parser: 20.2.9 yargs-unparser: 2.0.0 dev: true @@ -4615,10 +4630,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /n12@1.8.23: - resolution: {integrity: sha512-kQITb5LlO0Gk8rmbMAkfbmhs+QlXZ5SRHsx6YcG++3yc57iolbiQuo5rsfu3dkB7Qw3jKCqntsZvNNgvdfotkA==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -4662,17 +4673,16 @@ packages: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + /node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} dev: true - /normalize-package-data@6.0.0: - resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + /normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} dependencies: - hosted-git-info: 7.0.1 - is-core-module: 2.13.1 - semver: 7.6.0 + hosted-git-info: 7.0.2 + semver: 7.6.3 validate-npm-package-license: 3.0.4 dev: true @@ -4681,8 +4691,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /normalize-url@8.0.0: - resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + /normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'} dev: true @@ -4700,22 +4710,23 @@ packages: path-key: 4.0.0 dev: true - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + /nwsapi@2.2.12: + resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} dev: true - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + /object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} dev: true - /obsidian@1.5.7(@codemirror/state@6.4.1)(@codemirror/view@6.24.1): - resolution: {integrity: sha512-DNcvQJ6TvMflHZqWfO9cLGbOUbKTy2KBi6B6vjo5RG8XsftKZZq1zS/OQFhII2BnXK/DWan/lUcb2JYxfM3p5A==} + /obsidian@1.6.6(@codemirror/state@6.4.1)(@codemirror/view@6.33.0): + resolution: {integrity: sha512-GZHzeOiwmw/wBjB5JwrsxAZBLqxGQmqtEKSvJJvT0LtTcqeOFnV8jv0ZK5kO7hBb44WxJc+LdS7mZgLXbb+qXQ==} peerDependencies: '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.24.1 + '@codemirror/view': 6.33.0 '@types/codemirror': 5.60.8 moment: 2.29.4 dev: true @@ -4740,16 +4751,16 @@ packages: mimic-fn: 4.0.0 dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 dev: true /ora@5.4.1: @@ -4795,7 +4806,7 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 dev: true /p-locate@4.1.0: @@ -4824,18 +4835,18 @@ packages: engines: {node: '>=6'} dev: true - /pac-proxy-agent@7.0.1: - resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} + /pac-proxy-agent@7.0.2: + resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} engines: {node: '>= 14'} dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + agent-base: 7.1.1 + debug: 4.3.4 get-uri: 6.0.3 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.5 pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.2 + socks-proxy-agent: 8.0.4 transitivePeerDependencies: - supports-color dev: true @@ -4848,10 +4859,18 @@ packages: netmask: 2.0.2 dev: true + /package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + dev: true + /pagerank.js@1.0.2: resolution: {integrity: sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw==} dev: false + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4859,9 +4878,9 @@ packages: callsites: 3.1.0 dev: true - /parse-github-url@1.0.2: - resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} - engines: {node: '>=0.10.0'} + /parse-github-url@1.0.3: + resolution: {integrity: sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==} + engines: {node: '>= 0.10'} hasBin: true dev: true @@ -4869,7 +4888,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -4879,9 +4898,9 @@ packages: resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} engines: {node: '>=16'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 - json-parse-even-better-errors: 3.0.1 + json-parse-even-better-errors: 3.0.2 lines-and-columns: 2.0.4 type-fest: 3.13.1 dev: true @@ -4926,12 +4945,12 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} dependencies: - lru-cache: 10.2.0 - minipass: 7.0.4 + lru-cache: 10.4.3 + minipass: 7.1.2 dev: true /path-type@4.0.0: @@ -4961,8 +4980,8 @@ packages: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} dev: true /picomatch@2.3.1: @@ -4987,8 +5006,8 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + /prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true dev: true @@ -4999,7 +5018,7 @@ packages: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 dev: true /pretty-ms@7.0.1: @@ -5013,6 +5032,11 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -5026,34 +5050,18 @@ packages: sisteransi: 1.0.5 dev: true - /proxy-agent@6.3.0: - resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - dev: true - /proxy-agent@6.3.1: resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + agent-base: 7.1.1 + debug: 4.3.4 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.5 lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 + pac-proxy-agent: 7.0.2 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 + socks-proxy-agent: 8.0.4 transitivePeerDependencies: - supports-color dev: true @@ -5078,22 +5086,16 @@ packages: engines: {node: '>=6'} dev: true - /puppeteer-core@20.9.0(typescript@5.1.6): - resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==} - engines: {node: '>=16.3.0'} - peerDependencies: - typescript: '>= 4.7.4' - peerDependenciesMeta: - typescript: - optional: true + /puppeteer-core@21.11.0: + resolution: {integrity: sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==} + engines: {node: '>=16.13.2'} dependencies: - '@puppeteer/browsers': 1.4.6(typescript@5.1.6) - chromium-bidi: 0.4.16(devtools-protocol@0.0.1147663) + '@puppeteer/browsers': 1.9.1 + chromium-bidi: 0.5.8(devtools-protocol@0.0.1232444) cross-fetch: 4.0.0 - debug: 4.3.4(supports-color@8.1.1) - devtools-protocol: 0.0.1147663 - typescript: 5.1.6 - ws: 8.13.0 + debug: 4.3.4 + devtools-protocol: 0.0.1232444 + ws: 8.16.0 transitivePeerDependencies: - bufferutil - encoding @@ -5101,8 +5103,8 @@ packages: - utf-8-validate dev: true - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + /pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} dev: true /query-selector-shadow-dom@1.0.1: @@ -5132,8 +5134,8 @@ packages: safe-buffer: 5.2.1 dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} dev: true /read-pkg-up@10.0.0: @@ -5150,9 +5152,9 @@ packages: engines: {node: '>=16'} dependencies: '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.0 + normalize-package-data: 6.0.2 parse-json: 7.1.1 - type-fest: 4.10.3 + type-fest: 4.25.0 dev: true /readable-stream@2.3.8: @@ -5176,6 +5178,17 @@ packages: util-deprecate: 1.0.2 dev: true + /readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: true + /readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} dependencies: @@ -5235,7 +5248,7 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.1 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -5270,15 +5283,9 @@ packages: resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} dev: true - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 @@ -5335,6 +5342,13 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: false + + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: true /serialize-error@11.0.3: resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} @@ -5343,14 +5357,14 @@ packages: type-fest: 2.19.0 dev: true - /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 dev: true - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 @@ -5400,19 +5414,19 @@ packages: engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} dev: true - /socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + /socks-proxy-agent@8.0.4: + resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.8.1 + agent-base: 7.1.1 + debug: 4.3.4 + socks: 2.8.3 transitivePeerDependencies: - supports-color dev: true - /socks@2.8.1: - resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==} + /socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} dependencies: ip-address: 9.0.5 @@ -5436,11 +5450,15 @@ packages: engines: {node: '>=0.10.0'} dev: true + /spacetrim@0.11.39: + resolution: {integrity: sha512-S/baW29azJ7py5ausQRE2S6uEDQnlxgMHOEEq4V770ooBDD1/9kZnxRcco/tjZYuDuqYXblCk/r3N13ZmvHZ2g==} + dev: true + /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.20 dev: true /spdx-exceptions@2.5.0: @@ -5451,11 +5469,11 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.20 dev: true - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + /spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} dev: true /split2@4.2.0: @@ -5478,18 +5496,19 @@ packages: escape-string-regexp: 2.0.0 dev: true - /stream-buffers@3.0.2: - resolution: {integrity: sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==} + /stream-buffers@3.0.3: + resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==} engines: {node: '>= 0.10.0'} dev: true - /streamx@2.16.1: - resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + /streamx@2.19.0: + resolution: {integrity: sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg==} dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 + text-decoder: 1.1.1 optionalDependencies: - bare-events: 2.2.1 + bare-events: 2.4.2 dev: true /string-length@4.0.2: @@ -5564,6 +5583,10 @@ packages: engines: {node: '>=8'} dev: true + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: true + /style-mod@4.1.2: resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} dev: true @@ -5606,14 +5629,14 @@ packages: tar-stream: 3.1.7 dev: true - /tar-fs@3.0.5: - resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} + /tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} dependencies: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.2.1 - bare-path: 2.1.0 + bare-fs: 2.3.1 + bare-path: 2.1.3 dev: true /tar-stream@3.1.7: @@ -5621,7 +5644,7 @@ packages: dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 - streamx: 2.16.1 + streamx: 2.19.0 dev: true /tcp-port-used@1.0.2: @@ -5642,6 +5665,12 @@ packages: minimatch: 3.1.2 dev: true + /text-decoder@1.1.1: + resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + dependencies: + b4a: 1.6.6 + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -5650,6 +5679,11 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true + /tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + dev: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -5673,8 +5707,8 @@ packages: is-number: 7.0.0 dev: true - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + /tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} dependencies: psl: 1.9.0 @@ -5694,12 +5728,8 @@ packages: punycode: 2.3.1 dev: true - /traverse@0.3.9: - resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} - dev: true - - /ts-api-utils@1.2.1(typescript@5.1.6): - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + /ts-api-utils@1.3.0(typescript@5.1.6): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -5707,12 +5737,13 @@ packages: typescript: 5.1.6 dev: true - /ts-jest@29.1.2(@babel/core@7.24.0)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6): - resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + /ts-jest@29.2.5(@babel/core@7.25.2)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6): + resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 '@jest/types': ^29.0.0 babel-jest: ^29.0.0 esbuild: '*' @@ -5721,6 +5752,8 @@ packages: peerDependenciesMeta: '@babel/core': optional: true + '@jest/transform': + optional: true '@jest/types': optional: true babel-jest: @@ -5728,16 +5761,17 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.25.2 bs-logger: 0.2.6 + ejs: 3.1.10 esbuild: 0.19.12 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.11.24) + jest: 29.7.0(@types/node@20.16.1) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.6.0 + semver: 7.6.3 typescript: 5.1.6 yargs-parser: 21.1.1 dev: true @@ -5758,6 +5792,11 @@ packages: engines: {node: '>=4'} dev: true + /type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + dev: true + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -5783,8 +5822,8 @@ packages: engines: {node: '>=14.16'} dev: true - /type-fest@4.10.3: - resolution: {integrity: sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==} + /type-fest@4.25.0: + resolution: {integrity: sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==} engines: {node: '>=16'} dev: true @@ -5794,8 +5833,8 @@ packages: hasBin: true dev: true - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + /uglify-js@3.19.2: + resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true @@ -5809,8 +5848,8 @@ packages: through: 2.3.8 dev: true - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} dev: true /universalify@0.2.0: @@ -5823,30 +5862,15 @@ packages: engines: {node: '>= 10.0.0'} dev: true - /unzipper@0.10.14: - resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} - dependencies: - big-integer: 1.6.52 - binary: 0.3.0 - bluebird: 3.4.7 - buffer-indexof-polyfill: 1.0.2 - duplexer2: 0.1.4 - fstream: 1.0.12 - graceful-fs: 4.2.11 - listenercount: 1.0.1 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + /update-browserslist-db@1.1.0(browserslist@4.23.3): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.23.0 + browserslist: 4.23.3 escalade: 3.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 dev: true /uri-js@4.4.1: @@ -5862,6 +5886,10 @@ packages: requires-port: 1.0.0 dev: true + /urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + dev: true + /userhome@1.0.0: resolution: {integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==} engines: {node: '>= 0.8.0'} @@ -5871,8 +5899,8 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + /v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -5909,7 +5937,7 @@ packages: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -5926,7 +5954,7 @@ packages: defaults: 1.0.4 dev: true - /wdio-chromedriver-service@8.1.1(webdriverio@8.32.3): + /wdio-chromedriver-service@8.1.1(webdriverio@8.40.3): resolution: {integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==} engines: {node: ^16.13 || >=18} peerDependencies: @@ -5939,11 +5967,11 @@ packages: chromedriver: optional: true dependencies: - '@wdio/logger': 8.28.0 + '@wdio/logger': 8.38.0 fs-extra: 11.2.0 split2: 4.2.0 tcp-port-used: 1.0.2 - webdriverio: 8.32.3(typescript@5.1.6) + webdriverio: 8.40.3 transitivePeerDependencies: - supports-color dev: true @@ -5953,29 +5981,29 @@ packages: engines: {node: '>= 8'} dev: true - /webdriver@8.32.3: - resolution: {integrity: sha512-1/kpZvuftt59oikHs+6FvWXNfOM5tgMMMAk3LnMe7D938dVOoNGAe46fq0oL/xsxxPicbMRTRgIy1OifLiglaA==} + /webdriver@8.40.3: + resolution: {integrity: sha512-mc/pxLpgAQphnIaWvix/QXzp9CJpEvIA3YeF9t5plPaTbvbEaCAYYWkTP6e3vYPYWvx57krjGaYkNUnDCBNolA==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.11.24 - '@types/ws': 8.5.10 - '@wdio/config': 8.32.3 - '@wdio/logger': 8.28.0 - '@wdio/protocols': 8.32.0 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 + '@types/node': 22.5.0 + '@types/ws': 8.5.12 + '@wdio/config': 8.40.3 + '@wdio/logger': 8.38.0 + '@wdio/protocols': 8.40.3 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 deepmerge-ts: 5.1.0 got: 12.6.1 ky: 0.33.3 - ws: 8.16.0 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /webdriverio@8.32.3(typescript@5.1.6): - resolution: {integrity: sha512-SupbQKMtUZHSH7lmF5xaJPgxsn8sIBNAjs1CyPI33u30eY9VcVQ4CJQ818ZS3FLxR0q2XdWk9lsQNyhZwlN3RA==} + /webdriverio@8.40.3: + resolution: {integrity: sha512-2UQ/Vg2X7tTHmfWmB6QaXuUheodRRNwzT8VK6cHM2JrDHxDZzUawqSt4L7H7ba6/ctuRt5/pgbmKFtU/moLfhA==} engines: {node: ^16.13 || >=18} peerDependencies: devtools: ^8.14.0 @@ -5983,35 +6011,35 @@ packages: devtools: optional: true dependencies: - '@types/node': 20.11.24 - '@wdio/config': 8.32.3 - '@wdio/logger': 8.28.0 - '@wdio/protocols': 8.32.0 - '@wdio/repl': 8.24.12 - '@wdio/types': 8.32.2 - '@wdio/utils': 8.32.3 - archiver: 6.0.2 + '@types/node': 22.5.0 + '@wdio/config': 8.40.3 + '@wdio/logger': 8.38.0 + '@wdio/protocols': 8.40.3 + '@wdio/repl': 8.40.3 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 + archiver: 7.0.1 aria-query: 5.3.0 css-shorthand-properties: 1.1.1 css-value: 0.0.1 - devtools-protocol: 0.0.1262051 + devtools-protocol: 0.0.1340018 grapheme-splitter: 1.0.4 - import-meta-resolve: 4.0.0 + import-meta-resolve: 4.1.0 is-plain-obj: 4.1.0 + jszip: 3.10.1 lodash.clonedeep: 4.5.0 lodash.zip: 4.2.0 - minimatch: 9.0.3 - puppeteer-core: 20.9.0(typescript@5.1.6) + minimatch: 9.0.5 + puppeteer-core: 21.11.0 query-selector-shadow-dom: 1.0.1 resq: 1.11.0 rgb2hex: 0.2.5 serialize-error: 11.0.3 - webdriver: 8.32.3 + webdriver: 8.40.3 transitivePeerDependencies: - bufferutil - encoding - supports-color - - typescript - utf-8-validate dev: true @@ -6067,12 +6095,17 @@ packages: isexe: 3.1.1 dev: true + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true - /workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + /workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} dev: true /wrap-ansi@6.2.0: @@ -6114,8 +6147,8 @@ packages: signal-exit: 3.0.7 dev: true - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -6127,8 +6160,8 @@ packages: optional: true dev: true - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + /ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -6160,9 +6193,10 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false - /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true @@ -6191,20 +6225,7 @@ packages: require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 20.2.4 - dev: true - - /yargs@17.7.1: - resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 + yargs-parser: 20.2.9 dev: true /yargs@17.7.2: @@ -6232,16 +6253,16 @@ packages: engines: {node: '>=10'} dev: true - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + /yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} dev: true - /zip-stream@5.0.2: - resolution: {integrity: sha512-LfOdrUvPB8ZoXtvOBz6DlNClfvi//b5d56mSWyJi7XbH/HfhOHfUhOqxhT/rUiR7yiktlunqRo+jY6y/cWC/5g==} - engines: {node: '>= 12.0.0'} + /zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} dependencies: - archiver-utils: 4.0.1 - compress-commons: 5.0.3 - readable-stream: 3.6.2 + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.5.2 dev: true diff --git a/src/NoteQuestionParser.ts b/src/NoteQuestionParser.ts index 78d664e3..fcee24f1 100644 --- a/src/NoteQuestionParser.ts +++ b/src/NoteQuestionParser.ts @@ -137,7 +137,7 @@ export class NoteQuestionParser { private parseQuestions(): ParsedQuestionInfo[] { // We pass contentText which has the frontmatter blanked out; see extractFrontmatter for reasoning const parserOptions: ParserOptions = { - singleLineCardSeparator:this.settings.singleLineCardSeparator, + singleLineCardSeparator: this.settings.singleLineCardSeparator, singleLineReversedCardSeparator: this.settings.singleLineReversedCardSeparator, multilineCardSeparator: this.settings.multilineCardSeparator, multilineReversedCardSeparator: this.settings.multilineReversedCardSeparator, diff --git a/src/generateParser.ts b/src/generateParser.ts index 369c05fd..9ce11d75 100644 --- a/src/generateParser.ts +++ b/src/generateParser.ts @@ -7,38 +7,41 @@ let parser: Parser | null = null; let oldOptions: ParserOptions; export function generateParser(options: ParserOptions): Parser { - let grammar: string | null = null; // If the parser did not already exist or if the parser options changed since last the last // parser was generated, we generate a new parser. Otherwise, we skip the block to save // some execution time. - if(parser === null || !areParserOptionsEqual(options,oldOptions)) { - + if (parser === null || !areParserOptionsEqual(options, oldOptions)) { /* GENERATE A NEW PARSER */ oldOptions = copyParserOptions(options); grammar = generateGrammar(options); - if(debugParser) { + if (debugParser) { const t0 = Date.now(); parser = generate(grammar); - const t1 = Date.now(); + const t1 = Date.now(); console.log("New parser generated in " + (t1 - t0) + " milliseconds."); } else { parser = generate(grammar); } } else { - if(debugParser) console.log("Parser already existed. No need to generate a new parser."); + if (debugParser) console.log("Parser already existed. No need to generate a new parser."); } - if(debugParser) { - if(grammar === null) { + if (debugParser) { + if (grammar === null) { grammar = generateGrammar(options); } - console.log("The parsers grammar is provided below. You can test it with https://peggyjs.org/online.html."); - console.log({info: "Copy the grammar by right-clicking on the property grammar and copying it as a string. Then, paste it in https://peggyjs.org/online.html.", grammar: grammar}); + console.log( + "The parsers grammar is provided below. You can test it with https://peggyjs.org/online.html.", + ); + console.log({ + info: "Copy the grammar by right-clicking on the property grammar and copying it as a string. Then, paste it in https://peggyjs.org/online.html.", + grammar: grammar, + }); } return parser; @@ -47,13 +50,13 @@ export function generateParser(options: ParserOptions): Parser { function generateGrammar(options: ParserOptions): string { const close_rules_list: string[] = []; - if(options.convertHighlightsToClozes) close_rules_list.push("close_equal"); - if(options.convertBoldTextToClozes) close_rules_list.push("close_star"); - if(options.convertCurlyBracketsToClozes) close_rules_list.push("close_bracket"); - - const close_rules = close_rules_list.join(" / "); + if (options.convertHighlightsToClozes) close_rules_list.push("close_equal"); + if (options.convertBoldTextToClozes) close_rules_list.push("close_star"); + if (options.convertCurlyBracketsToClozes) close_rules_list.push("close_bracket"); - return `{ + const close_rules = close_rules_list.join(" / "); + + return `{ // The fallback case is important if we want to test the rules with https://peggyjs.org/online.html const CardTypeFallBack = { SingleLineBasic: 0, @@ -265,4 +268,4 @@ optional_whitespaces whitespace_char = ([ \\f\\t\\v\\u0020\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]) `; -} \ No newline at end of file +} diff --git a/src/parser.ts b/src/parser.ts index d1de9ae4..a40187d7 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -6,14 +6,14 @@ import { generateParser } from "./generateParser"; export let debugParser = false; export interface ParserOptions { - singleLineCardSeparator: string, - singleLineReversedCardSeparator: string, - multilineCardSeparator: string, - multilineReversedCardSeparator: string, - multilineCardEndMarker: string, - convertHighlightsToClozes: boolean, - convertBoldTextToClozes: boolean, - convertCurlyBracketsToClozes: boolean, + singleLineCardSeparator: string; + singleLineReversedCardSeparator: string; + multilineCardSeparator: string; + multilineReversedCardSeparator: string; + multilineCardEndMarker: string; + convertHighlightsToClozes: boolean; + convertBoldTextToClozes: boolean; + convertCurlyBracketsToClozes: boolean; } export function areParserOptionsEqual(options1: ParserOptions, options2: ParserOptions): boolean { @@ -31,14 +31,14 @@ export function areParserOptionsEqual(options1: ParserOptions, options2: ParserO export function copyParserOptions(src: ParserOptions): ParserOptions { return { - singleLineCardSeparator:src.singleLineCardSeparator, - singleLineReversedCardSeparator:src.singleLineReversedCardSeparator, - multilineCardSeparator:src.multilineCardSeparator, - multilineReversedCardSeparator:src.multilineReversedCardSeparator, - multilineCardEndMarker:src.multilineCardEndMarker, - convertHighlightsToClozes:src.convertHighlightsToClozes, - convertBoldTextToClozes:src.convertBoldTextToClozes, - convertCurlyBracketsToClozes:src.convertCurlyBracketsToClozes, + singleLineCardSeparator: src.singleLineCardSeparator, + singleLineReversedCardSeparator: src.singleLineReversedCardSeparator, + multilineCardSeparator: src.multilineCardSeparator, + multilineReversedCardSeparator: src.multilineReversedCardSeparator, + multilineCardEndMarker: src.multilineCardEndMarker, + convertHighlightsToClozes: src.convertHighlightsToClozes, + convertBoldTextToClozes: src.convertBoldTextToClozes, + convertCurlyBracketsToClozes: src.convertCurlyBracketsToClozes, }; } @@ -47,30 +47,30 @@ export function setDebugParser(value: boolean) { } export class ParsedQuestionInfo { - cardType: CardType; - text: string; + cardType: CardType; + text: string; - // Line numbers start at 0 - firstLineNum: number; - lastLineNum: number; + // Line numbers start at 0 + firstLineNum: number; + lastLineNum: number; - constructor(cardType: CardType, text: string, firstLineNum: number, lastLineNum: number) { + constructor(cardType: CardType, text: string, firstLineNum: number, lastLineNum: number) { this.cardType = cardType; - this.text = text; // text.replace(/\s*$/gm, ""); // reproduce the same old behavior as when adding new lines with trimEnd. It is not clear why we need it in real life. However, it is needed to pass the tests. - this.firstLineNum = firstLineNum; - this.lastLineNum = lastLineNum; - } - - isQuestionLineNum(lineNum: number): boolean { - return lineNum >= this.firstLineNum && lineNum <= this.lastLineNum; - } + this.text = text; // text.replace(/\s*$/gm, ""); // reproduce the same old behavior as when adding new lines with trimEnd. It is not clear why we need it in real life. However, it is needed to pass the tests. + this.firstLineNum = firstLineNum; + this.lastLineNum = lastLineNum; + } + + isQuestionLineNum(lineNum: number): boolean { + return lineNum >= this.firstLineNum && lineNum <= this.lastLineNum; + } } /** * Returns flashcards found in `text` * * It is best that the text does not contain frontmatter, see extractFrontmatter for reasoning - * + * * EXCEPTIONS: The underlying peggy parser can throw an exception if the input it receives does * not conform to the grammar it was built with. However, the grammar used in generating this * parser, see generateParser(), intentionally matches all input text and therefore @@ -80,42 +80,43 @@ export class ParsedQuestionInfo { * @param options - Plugin's settings * @returns An array of [CardType, card text, line number] tuples */ -export function parseEx( - text: string, - options: ParserOptions, -): ParsedQuestionInfo[] { - - if(debugParser) { - console.log("Text to parse:\n<<<" + text + ">>>"); +export function parseEx(text: string, options: ParserOptions): ParsedQuestionInfo[] { + if (debugParser) { + console.log("Text to parse:\n<<<" + text + ">>>"); } - let cards: ParsedQuestionInfo[] = []; - try { - if(!options) throw Error("No parser options provided."); + let cards: ParsedQuestionInfo[] = []; + try { + if (!options) throw Error("No parser options provided."); - const parser: Parser = generateParser(options); + const parser: Parser = generateParser(options); - // Use this function when you call the parse method + // Use this function when you call the parse method // // The few extra lines empty lines appended to the end of the text "\n\n\n" // is a trick to avoid unnecessarily complex grammar rules for the parer, // which differen between the case when the last line ends with "\n" or not. // // Prusamably a single "\n" would be sufficient, but a few more do not bother. - cards = parser.parse(text + "\n\n\n", { - CardType, - createParsedQuestionInfo: (cardType: CardType, text: string, firstLineNum: number, lastLineNum: number) => { - return new ParsedQuestionInfo(cardType, text, firstLineNum, lastLineNum); - } - }); - } catch (error) { - console.error("Unexpected error:", error); - } - - if(debugParser) { + cards = parser.parse(text + "\n\n\n", { + CardType, + createParsedQuestionInfo: ( + cardType: CardType, + text: string, + firstLineNum: number, + lastLineNum: number, + ) => { + return new ParsedQuestionInfo(cardType, text, firstLineNum, lastLineNum); + }, + }); + } catch (error) { + console.error("Unexpected error:", error); + } + + if (debugParser) { console.log("Parsed cards:"); console.log(cards); } - return cards; + return cards; } diff --git a/tests/unit/parser.test.ts b/tests/unit/parser.test.ts index 3e7d1ca3..3f32bca7 100644 --- a/tests/unit/parser.test.ts +++ b/tests/unit/parser.test.ts @@ -18,10 +18,7 @@ const parserOptions: ParserOptions = { * Created when the actual parser changed from returning [CardType, string, number, number] to ParsedQuestionInfo. * It's purpose is to minimise changes to all the test cases here during the parser()->parserEx() change. */ -function parse( - text: string, - options: ParserOptions, -): [CardType, string, number, number][] { +function parse(text: string, options: ParserOptions): [CardType, string, number, number][] { // for testing purposes, generate parser each time, overwriting the default one const list: ParsedQuestionInfo[] = parseEx(text, options); @@ -98,19 +95,8 @@ test("Test parsing of multi line basic cards", () => { expect(parse("#flashcards/tag-on-previous-line\nQuestion\n?\nAnswer", parserOptions)).toEqual([ [CardType.MultiLineBasic, "#flashcards/tag-on-previous-line\nQuestion\n?\nAnswer", 0, 3], ]); - expect(parse("Question\n?\nAnswer line 1\nAnswer line 2\n\n---", { - singleLineCardSeparator: "::", - singleLineReversedCardSeparator: ":::", - multilineCardSeparator: "?", - multilineReversedCardSeparator: "??", - multilineCardEndMarker: "---", - convertHighlightsToClozes: false, - convertBoldTextToClozes: true, - convertCurlyBracketsToClozes: false, - })).toEqual([ - [CardType.MultiLineBasic, "Question\n?\nAnswer line 1\nAnswer line 2", 0, 4], - ]); - expect(parse("Question 1\n?\nAnswer line 1\nAnswer line 2\n\n---\nQuestion 2\n?\nAnswer line 1\nAnswer line 2\n---\n", { + expect( + parse("Question\n?\nAnswer line 1\nAnswer line 2\n\n---", { singleLineCardSeparator: "::", singleLineReversedCardSeparator: ":::", multilineCardSeparator: "?", @@ -119,22 +105,48 @@ test("Test parsing of multi line basic cards", () => { convertHighlightsToClozes: false, convertBoldTextToClozes: true, convertCurlyBracketsToClozes: false, - })).toEqual([ + }), + ).toEqual([[CardType.MultiLineBasic, "Question\n?\nAnswer line 1\nAnswer line 2", 0, 4]]); + expect( + parse( + "Question 1\n?\nAnswer line 1\nAnswer line 2\n\n---\nQuestion 2\n?\nAnswer line 1\nAnswer line 2\n---\n", + { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "---", + convertHighlightsToClozes: false, + convertBoldTextToClozes: true, + convertCurlyBracketsToClozes: false, + }, + ), + ).toEqual([ [CardType.MultiLineBasic, "Question 1\n?\nAnswer line 1\nAnswer line 2", 0, 4], - [CardType.MultiLineBasic, "Question 2\n?\nAnswer line 1\nAnswer line 2", 6, 9] + [CardType.MultiLineBasic, "Question 2\n?\nAnswer line 1\nAnswer line 2", 6, 9], ]); - expect(parse("Question 1\n?\nAnswer line 1\nAnswer line 2\n\n---\nQuestion with empty line after question mark\n?\n\nAnswer line 1\nAnswer line 2\n---\n", { - singleLineCardSeparator: "::", - singleLineReversedCardSeparator: ":::", - multilineCardSeparator: "?", - multilineReversedCardSeparator: "??", - multilineCardEndMarker: "---", - convertHighlightsToClozes: false, - convertBoldTextToClozes: true, - convertCurlyBracketsToClozes: false, - })).toEqual([ + expect( + parse( + "Question 1\n?\nAnswer line 1\nAnswer line 2\n\n---\nQuestion with empty line after question mark\n?\n\nAnswer line 1\nAnswer line 2\n---\n", + { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "---", + convertHighlightsToClozes: false, + convertBoldTextToClozes: true, + convertCurlyBracketsToClozes: false, + }, + ), + ).toEqual([ [CardType.MultiLineBasic, "Question 1\n?\nAnswer line 1\nAnswer line 2", 0, 4], - [CardType.MultiLineBasic, "Question with empty line after question mark\n?\n\nAnswer line 1\nAnswer line 2", 6, 10] + [ + CardType.MultiLineBasic, + "Question with empty line after question mark\n?\n\nAnswer line 1\nAnswer line 2", + 6, + 10, + ], ]); }); @@ -148,8 +160,7 @@ test("Test parsing of multi line reversed cards", () => { expect(parse("Question\n??\nAnswer line 1\nAnswer line 2", parserOptions)).toEqual([ [CardType.MultiLineReversed, "Question\n??\nAnswer line 1\nAnswer line 2", 0, 3], ]); - expect(parse("#Title\n\nLine0\nQ1\n??\nA1\nAnswerExtra\n\nQ2\n??\nA2", parserOptions)).toEqual( - [ + expect(parse("#Title\n\nLine0\nQ1\n??\nA1\nAnswerExtra\n\nQ2\n??\nA2", parserOptions)).toEqual([ [ CardType.MultiLineReversed, "Line0\nQ1\n??\nA1\nAnswerExtra", @@ -157,21 +168,9 @@ test("Test parsing of multi line reversed cards", () => { /* AnswerExtra */ 6, ], [CardType.MultiLineReversed, "Q2\n??\nA2", 8, 10], - ], - ); - expect(parse("Question\n??\nAnswer line 1\nAnswer line 2\n\n---", { - singleLineCardSeparator: "::", - singleLineReversedCardSeparator: ":::", - multilineCardSeparator: "?", - multilineReversedCardSeparator: "??", - multilineCardEndMarker: "---", - convertHighlightsToClozes: true, - convertBoldTextToClozes: true, - convertCurlyBracketsToClozes: true, - })).toEqual([ - [CardType.MultiLineReversed, "Question\n??\nAnswer line 1\nAnswer line 2", 0, 4], ]); - expect(parse("Question 1\n?\nAnswer line 1\nAnswer line 2\n\n---\nQuestion 2\n??\nAnswer line 1\nAnswer line 2\n---\n", { + expect( + parse("Question\n??\nAnswer line 1\nAnswer line 2\n\n---", { singleLineCardSeparator: "::", singleLineReversedCardSeparator: ":::", multilineCardSeparator: "?", @@ -180,9 +179,25 @@ test("Test parsing of multi line reversed cards", () => { convertHighlightsToClozes: true, convertBoldTextToClozes: true, convertCurlyBracketsToClozes: true, - })).toEqual([ + }), + ).toEqual([[CardType.MultiLineReversed, "Question\n??\nAnswer line 1\nAnswer line 2", 0, 4]]); + expect( + parse( + "Question 1\n?\nAnswer line 1\nAnswer line 2\n\n---\nQuestion 2\n??\nAnswer line 1\nAnswer line 2\n---\n", + { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "---", + convertHighlightsToClozes: true, + convertBoldTextToClozes: true, + convertCurlyBracketsToClozes: true, + }, + ), + ).toEqual([ [CardType.MultiLineBasic, "Question 1\n?\nAnswer line 1\nAnswer line 2", 0, 4], - [CardType.MultiLineReversed, "Question 2\n??\nAnswer line 1\nAnswer line 2", 6, 9] + [CardType.MultiLineReversed, "Question 2\n??\nAnswer line 1\nAnswer line 2", 6, 9], ]); }); @@ -214,7 +229,8 @@ test("Test parsing of cloze cards", () => { expect(parse("lorem ipsum ==p\ndolor won==", parserOptions)).toEqual([]); expect(parse("lorem ipsum ==dolor won=", parserOptions)).toEqual([]); // ==highlights== turned off - expect(parse("cloze ==deletion== test",{ + expect( + parse("cloze ==deletion== test", { singleLineCardSeparator: "::", singleLineReversedCardSeparator: ":::", multilineCardSeparator: "?", @@ -223,9 +239,8 @@ test("Test parsing of cloze cards", () => { convertHighlightsToClozes: false, convertBoldTextToClozes: true, convertCurlyBracketsToClozes: false, - })).toEqual( - [], - ); + }), + ).toEqual([]); // **bolded** expect(parse("cloze **deletion** test", parserOptions)).toEqual([ @@ -254,7 +269,8 @@ test("Test parsing of cloze cards", () => { expect(parse("lorem ipsum **p\ndolor won**", parserOptions)).toEqual([]); expect(parse("lorem ipsum **dolor won*", parserOptions)).toEqual([]); // **bolded** turned off - expect(parse("cloze **deletion** test", { + expect( + parse("cloze **deletion** test", { singleLineCardSeparator: "::", singleLineReversedCardSeparator: ":::", multilineCardSeparator: "?", @@ -263,27 +279,41 @@ test("Test parsing of cloze cards", () => { convertHighlightsToClozes: true, convertBoldTextToClozes: false, convertCurlyBracketsToClozes: false, - })).toEqual( - [], - ); + }), + ).toEqual([]); // both expect(parse("cloze **deletion** test ==another deletion==!", parserOptions)).toEqual([ [CardType.Cloze, "cloze **deletion** test ==another deletion==!", 0, 0], ]); - expect(parse("Test 1\nTest 2\nThis is a close with ===secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.\n\n---\n\nTest 3\nTest 4\nThis is a close with ===super secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.\n\n---\n\nHere is some more text.", { - singleLineCardSeparator: "::", - singleLineReversedCardSeparator: ":::", - multilineCardSeparator: "?", - multilineReversedCardSeparator: "??", - multilineCardEndMarker: "---", - convertHighlightsToClozes: true, - convertBoldTextToClozes: false, - convertCurlyBracketsToClozes: false, - })).toEqual([ - [CardType.Cloze, "Test 1\nTest 2\nThis is a close with ===secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.", 0, 7], - [CardType.Cloze, "Test 3\nTest 4\nThis is a close with ===super secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.", 10, 17] + expect( + parse( + "Test 1\nTest 2\nThis is a close with ===secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.\n\n---\n\nTest 3\nTest 4\nThis is a close with ===super secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.\n\n---\n\nHere is some more text.", + { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "---", + convertHighlightsToClozes: true, + convertBoldTextToClozes: false, + convertCurlyBracketsToClozes: false, + }, + ), + ).toEqual([ + [ + CardType.Cloze, + "Test 1\nTest 2\nThis is a close with ===secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.", + 0, + 7, + ], + [ + CardType.Cloze, + "Test 3\nTest 4\nThis is a close with ===super secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.", + 10, + 17, + ], ]); }); From 4c0bf01610e6cbcec053adde54e624f3de9bf0e1 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Thu, 29 Aug 2024 20:08:35 +0800 Subject: [PATCH 145/155] add tagsToIgnore setting --- src/lang/locale/ar.ts | 4 ++++ src/lang/locale/cz.ts | 4 ++++ src/lang/locale/de.ts | 4 ++++ src/lang/locale/en.ts | 4 ++++ src/lang/locale/es.ts | 4 ++++ src/lang/locale/it.ts | 4 ++++ src/lang/locale/ja.ts | 4 ++++ src/lang/locale/ko.ts | 4 ++++ src/lang/locale/pl.ts | 4 ++++ src/lang/locale/pt-br.ts | 4 ++++ src/lang/locale/ru.ts | 4 ++++ src/lang/locale/zh-cn.ts | 6 +++++- src/lang/locale/zh-tw.ts | 6 +++++- src/main.ts | 26 ++++++++++++++++++++------ src/settings.ts | 7 ++++++- src/settings/ignoreSetting.ts | 22 ++++++++++++++++++++++ 16 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 src/settings/ignoreSetting.ts diff --git a/src/lang/locale/ar.ts b/src/lang/locale/ar.ts index 28517d4f..47281963 100644 --- a/src/lang/locale/ar.ts +++ b/src/lang/locale/ar.ts @@ -36,6 +36,7 @@ export default { STATUS_BAR: "البطاقات المستحقة ${dueFlashcardsCount},ملاحظات ${dueNotesCount}:مراجعة", SYNC_TIME_TAKEN: "${t}ms استغراق المزامنة", NOTE_IN_IGNORED_FOLDER: ".الملاحظة يتم حفظها ضمن المجلد الذي تم تجاهله (تحقق من الإعدادات)", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: ".يرجى وضع وسم على الملاحظة بشكل مناسب للمراجعة (في الإعدادات)", RESPONSE_RECEIVED: ".استُلمت الاستجابة", NO_DECK_EXISTS: "${deckName} لا يوجد رُزمَة", @@ -73,6 +74,9 @@ export default { FOLDERS_TO_IGNORE: "مجلدات لتجاهلها", FOLDERS_TO_IGNORE_DESC: `Templates Meta/Scripts. Note that this setting is common to both Flashcards and Notes. : أدخل مسارات المجلد مفصولة بواسطة سطور جديدة,مثال`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "البطاقات", FLASHCARD_EASY_LABEL: "نص الزر سهل", FLASHCARD_GOOD_LABEL: "نص الزر جيد", diff --git a/src/lang/locale/cz.ts b/src/lang/locale/cz.ts index aca4680c..826e30c6 100644 --- a/src/lang/locale/cz.ts +++ b/src/lang/locale/cz.ts @@ -36,6 +36,7 @@ export default { STATUS_BAR: "Revize: ${dueNotesCount} poznámek, ${dueFlashcardsCount} kartiček po termínu", SYNC_TIME_TAKEN: "Synchronizace trvala ${t}ms", NOTE_IN_IGNORED_FOLDER: "Poznámka je uložena v ignorované složce (zkontrolujte nastavení).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Prosím označne poznámku odpovídajícím tagem pro revizi (v nastavení).", RESPONSE_RECEIVED: "Odpověď přijata.", NO_DECK_EXISTS: "Neexistuje žádný balíček pro ${deckName}", @@ -72,6 +73,9 @@ export default { 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Ignorované složky", FOLDERS_TO_IGNORE_DESC: `Zadejte cesty ke složkám oddělené odřádkováním napříkad. Šablony Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Kartičky", FLASHCARD_EASY_LABEL: "Easy Button Text", diff --git a/src/lang/locale/de.ts b/src/lang/locale/de.ts index a16afadd..f1a0a7c9 100644 --- a/src/lang/locale/de.ts +++ b/src/lang/locale/de.ts @@ -41,6 +41,7 @@ export default { SYNC_TIME_TAKEN: "Synchronisierung dauerte ${t}ms", NOTE_IN_IGNORED_FOLDER: "Notiz befindet sich in einem ausgeschlossenen Ordner (siehe Einstellungen).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Bitte die Notiz für Wiederholungen entsprechend taggen (siehe Einstellungen).", RESPONSE_RECEIVED: "Antwort erhalten.", @@ -78,6 +79,9 @@ export default { 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Ausgeschlossene Ordner", FOLDERS_TO_IGNORE_DESC: `Mehrere Ordner mit Zeilenumbrüchen getrennt angeben. Bsp. OrdnerA[Zeilenumbruch]OrdnerB/Unterordner. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Lernkarten", FLASHCARD_EASY_LABEL: "Einfach Knopf Text", diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 8152b319..f25dcaf9 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -36,6 +36,7 @@ export default { STATUS_BAR: "Review: ${dueNotesCount} note(s), ${dueFlashcardsCount} card(s) due", SYNC_TIME_TAKEN: "Sync took ${t}ms", NOTE_IN_IGNORED_FOLDER: "Note is saved under ignored folder (check settings).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Please tag the note appropriately for reviewing (in settings).", RESPONSE_RECEIVED: "Response received.", NO_DECK_EXISTS: "No deck exists for ${deckName}", @@ -72,6 +73,9 @@ export default { 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Folders to ignore", FOLDERS_TO_IGNORE_DESC: `Enter folder paths separated by newlines e.g. Templates Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Flashcards", FLASHCARD_EASY_LABEL: "Easy Button Text", diff --git a/src/lang/locale/es.ts b/src/lang/locale/es.ts index e679f10b..0c67c5ef 100644 --- a/src/lang/locale/es.ts +++ b/src/lang/locale/es.ts @@ -36,6 +36,7 @@ export default { STATUS_BAR: "Revisar: ${dueNotesCount} nota(s), ${dueFlashcardsCount} tarjetas vencidas", SYNC_TIME_TAKEN: "La sincronización tomó ${t} milisegundos", NOTE_IN_IGNORED_FOLDER: "La nota está guardada en un directorio ignorado (revisa los ajustes).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Por favor etiquete apropiadamente la nota para revisión (en los ajustes).", RESPONSE_RECEIVED: "Respuesta Recibida", NO_DECK_EXISTS: "No existen mazos para: ${deckName}", @@ -72,6 +73,9 @@ export default { 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Directorios a ignorar", FOLDERS_TO_IGNORE_DESC: `Escriba las rutas de los directorios separadas por saltos de línea, por ejemplo, Plantillas Extra/Guiones. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Tarjetas de Memorización", FLASHCARD_EASY_LABEL: "Texto del botón: Fácil", diff --git a/src/lang/locale/it.ts b/src/lang/locale/it.ts index e8164498..314d934b 100644 --- a/src/lang/locale/it.ts +++ b/src/lang/locale/it.ts @@ -36,6 +36,7 @@ export default { STATUS_BAR: "Da rivedere: ${dueNotesCount} scheda/e, ${dueFlashcardsCount} schede in ritardo", SYNC_TIME_TAKEN: "Sincronizzato in ${t}ms", NOTE_IN_IGNORED_FOLDER: "La nota è salvata in una cartella ignorata (rivedi le impostazioni).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Per favore etichetta la nota appropriatamente per la revisione (nelle impostazioni).", RESPONSE_RECEIVED: "Risposta ricevuta.", @@ -73,6 +74,9 @@ export default { 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Cartelle da ignorare", FOLDERS_TO_IGNORE_DESC: `Inserisci i percorsi delle cartelle separati da a capo, per esempio, Templates Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Schede", FLASHCARD_EASY_LABEL: "Testo del bottone facile", diff --git a/src/lang/locale/ja.ts b/src/lang/locale/ja.ts index f97c3c45..677abe45 100644 --- a/src/lang/locale/ja.ts +++ b/src/lang/locale/ja.ts @@ -36,6 +36,7 @@ export default { STATUS_BAR: "レビュー: ${dueNotesCount}ノート, ${dueFlashcardsCount}カードが期日", SYNC_TIME_TAKEN: "同期に${t}msかかりました。", NOTE_IN_IGNORED_FOLDER: "ノートが無視するフォルダに保存されています(設定を確認してください)。", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "レビューを行うにはノートに対して正しくタグ付けしてください(設定を確認してください)。", RESPONSE_RECEIVED: "答えを受け取りました。", @@ -73,6 +74,9 @@ export default { 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "無視するフォルダ", FOLDERS_TO_IGNORE_DESC: `フォルダパスを改行で区切って入力してください。"Templates Meta/Scripts" のようなスペースによる区切りでの書き方は無効です。. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "フラッシュカード", FLASHCARD_EASY_LABEL: "Easy Button Text", diff --git a/src/lang/locale/ko.ts b/src/lang/locale/ko.ts index e5390321..12b2b772 100644 --- a/src/lang/locale/ko.ts +++ b/src/lang/locale/ko.ts @@ -36,6 +36,7 @@ export default { STATUS_BAR: "--리뷰: ${dueNotesCount} 노트, ${dueFlashcardsCount} 카드 남았습니다.", SYNC_TIME_TAKEN: "동기화에 ${t}밀리초 걸렸습니다", NOTE_IN_IGNORED_FOLDER: "노트가 무시된 폴더 아래에 저장되어 있습니다. (설정을 확인해주세요)", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "리뷰를 하기위해 노트에 적절히 태그해주세요. (설정을 확인해주세요)", RESPONSE_RECEIVED: "요청이 완료되었습니다", NO_DECK_EXISTS: "${deckName}이라는 이름의 덱이 존재하지 않습니다.", @@ -72,6 +73,9 @@ export default { 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "무시할 폴더들", FOLDERS_TO_IGNORE_DESC: `폴더 경로를 빈 줄로 구분해서 입력해주세요. 'Templates Meta/Scripts' 와 같이 입력하는 것은 유효하지 않습니다. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "플래시카드", FLASHCARD_EASY_LABEL: "Easy Button Text", diff --git a/src/lang/locale/pl.ts b/src/lang/locale/pl.ts index 8c9a59d5..06128456 100644 --- a/src/lang/locale/pl.ts +++ b/src/lang/locale/pl.ts @@ -36,6 +36,7 @@ export default { STATUS_BAR: "Przeglądaj: ${dueNotesCount} notatek, ${dueFlashcardsCount} fiszek z terminem", SYNC_TIME_TAKEN: "Synchronizacja zajęła ${t}ms", NOTE_IN_IGNORED_FOLDER: "Notatka jest zapisana w folderze zignorowanym (sprawdź ustawienia).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Proszę odpowiednio otagować notatkę do przeglądu (w ustawieniach).", RESPONSE_RECEIVED: "Otrzymano odpowiedź.", NO_DECK_EXISTS: "Nie istnieje talia o nazwie ${deckName}", @@ -72,6 +73,9 @@ export default { 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Foldery do zignorowania", FOLDERS_TO_IGNORE_DESC: `Wprowadź ścieżki folderów oddzielone nowymi liniami, np. Szablony Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Fiszki", FLASHCARD_EASY_LABEL: "Tekst przycisku Łatwe", diff --git a/src/lang/locale/pt-br.ts b/src/lang/locale/pt-br.ts index 0e66cb1e..21a1834a 100644 --- a/src/lang/locale/pt-br.ts +++ b/src/lang/locale/pt-br.ts @@ -38,6 +38,7 @@ export default { "Revisão: ${dueNotesCount} nota(s), ${dueFlashcardsCount} Carta(s) para colocar em dia", SYNC_TIME_TAKEN: "Sincronização levou ${t}ms", NOTE_IN_IGNORED_FOLDER: "Nota é salva na pasta ignorada (cheque as configurações).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Por favor etiquete a nota apropriadamente para revisar (nas configurações).", RESPONSE_RECEIVED: "Resposta recebida.", NO_DECK_EXISTS: "Nenhum baralho existe para ${deckName}", @@ -74,6 +75,9 @@ export default { 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Pastas para ignorar", FOLDERS_TO_IGNORE_DESC: `Insira o caminho das pastas separado por quebras de linha ex: Templates Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Flashcards", FLASHCARD_EASY_LABEL: "Texto do Botão de Fácil", diff --git a/src/lang/locale/ru.ts b/src/lang/locale/ru.ts index dec63f83..bb94b039 100644 --- a/src/lang/locale/ru.ts +++ b/src/lang/locale/ru.ts @@ -45,6 +45,7 @@ export default { STATUS_BAR: "Повторить: ${dueNotesCount} заметок, ${dueFlashcardsCount} карточек", SYNC_TIME_TAKEN: "Синхронизация заняла ${t}мс", NOTE_IN_IGNORED_FOLDER: "Заметка сохранена в игнорируемую папку (см. настройки).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Для изучения, пожалуйста, правильно пометьте заметку тегом (см. настройки).", RESPONSE_RECEIVED: "Ответ получен.", NO_DECK_EXISTS: "Не существует уровня ${deckName}", @@ -81,6 +82,9 @@ export default { 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Игнорируемые папки", FOLDERS_TO_IGNORE_DESC: `Укажите пути папок, каждый на своей строке, например: Templates Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Карточки", FLASHCARD_EASY_LABEL: 'Текст кнопки "Легко"', diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 383a4bba..3ba561c5 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -32,10 +32,11 @@ export default { REVIEW_CARDS_IN_NOTE: "复习此笔记中的卡片", CRAM_CARDS_IN_NOTE: "集中复习此笔记中的卡片", VIEW_STATS: "查看数据", - OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + OPEN_REVIEW_QUEUE_VIEW: "打开侧边栏的笔记复习队列", STATUS_BAR: "复习: ${dueNotesCount} 笔记, ${dueFlashcardsCount} 卡片已到期", SYNC_TIME_TAKEN: "同步时间 ${t}ms", NOTE_IN_IGNORED_FOLDER: "笔记保存在已被忽略的路径中(检查设置选项)。", + NOTE_IN_IGNORED_TAGS: "保存的笔记带有已被忽略的标签(检查设置选项)。", PLEASE_TAG_NOTE: "请将需要复习的笔记中加入正确的标签(检查设置选项)。", RESPONSE_RECEIVED: "反馈已收到", NO_DECK_EXISTS: "没有 ${deckName} 卡组", @@ -73,6 +74,9 @@ export default { FOLDERS_TO_IGNORE: "忽略此文件夹", FOLDERS_TO_IGNORE_DESC: `输入文件夹路径,用新建行分隔,例如:Templates Meta/Scripts. Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "忽略此标签", + TAGS_TO_IGNORE_DESC: `输入标签,用新建行分隔,例如: #excalidraw. + 注意卡片与笔记共用该项设置。`, FLASHCARDS: "卡片", FLASHCARD_EASY_LABEL: "“简单”按钮文本", FLASHCARD_GOOD_LABEL: "“记得”按钮文本", diff --git a/src/lang/locale/zh-tw.ts b/src/lang/locale/zh-tw.ts index 640b578f..e5210314 100644 --- a/src/lang/locale/zh-tw.ts +++ b/src/lang/locale/zh-tw.ts @@ -32,10 +32,11 @@ export default { REVIEW_ALL_CARDS: "復習所有筆記中的卡片", CRAM_CARDS_IN_NOTE: "不計難易度復習此筆記中的卡片", VIEW_STATS: "檢視數據", - OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + OPEN_REVIEW_QUEUE_VIEW: "打開側邊欄的筆記復習序列", STATUS_BAR: "復習: ${dueNotesCount} 筆記, ${dueFlashcardsCount} 卡片已到期", SYNC_TIME_TAKEN: "同步時間 ${t}ms", NOTE_IN_IGNORED_FOLDER: "筆記儲存在已被忽略的路徑中(檢查設定選項)。", + NOTE_IN_IGNORED_TAGS: "儲存的筆記带有已被忽略的標籤(檢查設定選項)。", PLEASE_TAG_NOTE: "請將需要復習的筆記中加入正確的標籤(檢查設定選項)。", RESPONSE_RECEIVED: "回饋已收到", NO_DECK_EXISTS: "沒有 ${deckName} 牌組", @@ -73,6 +74,9 @@ export default { FOLDERS_TO_IGNORE: "忽略此資料夾", FOLDERS_TO_IGNORE_DESC: `輸入資料夾路徑(用換行字元分隔),例如:Templates Meta/Scripts. Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "忽略此標籤", + TAGS_TO_IGNORE_DESC: `輸入標籤,用換行字元分隔,例如: #excalidraw . +注意闪卡與筆記共用該項設置。`, FLASHCARDS: "卡片", FLASHCARD_EASY_LABEL: "簡單按鈕文字", FLASHCARD_GOOD_LABEL: "記得按鈕文字", diff --git a/src/main.ts b/src/main.ts index 31e8d416..2703c590 100644 --- a/src/main.ts +++ b/src/main.ts @@ -391,6 +391,18 @@ export default class SRPlugin extends Plugin { ) { continue; } + const fileCachedData = this.app.metadataCache.getFileCache(noteFile) || {}; + + const frontmatter: FrontMatterCache | Record = + fileCachedData.frontmatter || {}; + const tags = getAllTags(fileCachedData) || []; + if ( + this.data.settings.tagsToIgnore.some((igntag) => + tags.some((notetag) => notetag.startsWith(igntag)), + ) + ) { + continue; + } if (this.incomingLinks[noteFile.path] === undefined) { this.incomingLinks[noteFile.path] = []; @@ -424,11 +436,6 @@ export default class SRPlugin extends Plugin { this.easeByPath.setEaseForPath(note.filePath, flashcardsInNoteAvgEase); } } - const fileCachedData = this.app.metadataCache.getFileCache(noteFile) || {}; - - const frontmatter: FrontMatterCache | Record = - fileCachedData.frontmatter || {}; - const tags = getAllTags(fileCachedData) || []; let shouldIgnore = true; const matchedNoteTags = []; @@ -594,7 +601,14 @@ export default class SRPlugin extends Plugin { new Notice(t("NOTE_IN_IGNORED_FOLDER")); return; } - + if ( + this.data.settings.tagsToIgnore.some((igntag) => + tags.some((notetag) => notetag.startsWith(igntag)), + ) + ) { + new Notice(t("NOTE_IN_IGNORED_TAGS")); + return; + } let shouldIgnore = true; for (const tag of tags) { if ( diff --git a/src/settings.ts b/src/settings.ts index c2790ace..fd71aaa1 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -3,6 +3,7 @@ import type SRPlugin from "src/main"; import { t } from "src/lang/helpers"; import { TabStructure, createTabs } from "./gui/Tabs"; import { setDebugParser } from "./parser"; +import { addignoreSetting } from "./settings/ignoreSetting"; export interface SRSettings { // flashcards @@ -32,6 +33,7 @@ export interface SRSettings { enableNoteReviewPaneOnStartup: boolean; tagsToReview: string[]; noteFoldersToIgnore: string[]; + tagsToIgnore: string[]; openRandomNote: boolean; autoNextNote: boolean; disableFileMenuReviewOptions: boolean; @@ -78,6 +80,7 @@ export const DEFAULT_SETTINGS: SRSettings = { enableNoteReviewPaneOnStartup: true, tagsToReview: ["#review"], noteFoldersToIgnore: [], + tagsToIgnore: [], openRandomNote: false, autoNextNote: false, disableFileMenuReviewOptions: false, @@ -129,7 +132,7 @@ export class SettingsUtil { // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/Settings.ts let applyDebounceTimer = 0; -function applySettingsUpdate(callback: () => void): void { +export function applySettingsUpdate(callback: () => void): void { clearTimeout(applyDebounceTimer); applyDebounceTimer = window.setTimeout(callback, 512); } @@ -231,6 +234,7 @@ export class SRSettingTab extends PluginSettingTab { }), ); this.createSetting_FoldersToIgnore(containerEl); + addignoreSetting(containerEl.createDiv(), this.plugin); } containerEl.createEl("h3", { text: t("GROUP_FLASHCARD_REVIEW") }); @@ -515,6 +519,7 @@ export class SRSettingTab extends PluginSettingTab { ); this.createSetting_FoldersToIgnore(containerEl); + addignoreSetting(containerEl.createDiv(), this.plugin); new Setting(containerEl) .setName(t("OPEN_RANDOM_NOTE")) diff --git a/src/settings/ignoreSetting.ts b/src/settings/ignoreSetting.ts new file mode 100644 index 00000000..9b865e6d --- /dev/null +++ b/src/settings/ignoreSetting.ts @@ -0,0 +1,22 @@ +import { Setting } from "obsidian"; +import { t } from "src/lang/helpers"; +import SRPlugin from "src/main"; +import { applySettingsUpdate } from "src/settings"; + +export function addignoreSetting(containerEl: HTMLElement, plugin: SRPlugin) { + const settings = plugin.data.settings; + new Setting(containerEl) + .setName(t("TAGS_TO_IGNORE")) + .setDesc(t("TAGS_TO_IGNORE_DESC")) + .addTextArea((text) => + text.setValue(settings.tagsToIgnore.join("\n")).onChange((value) => { + applySettingsUpdate(async () => { + settings.tagsToIgnore = value + .split(/\n+/) + .map((v) => v.trim()) + .filter((v) => v); + await plugin.savePluginData(); + }); + }), + ); +} From c57f01138527e39d28b1731624927abaea4fb0c5 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 30 Aug 2024 19:57:42 +0800 Subject: [PATCH 146/155] update settings UX --- src/settings.ts | 42 ++++++++++++++++++-------------- src/settings/algorithmSetting.ts | 7 ++++-- styles.css | 7 ++++++ 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/settings.ts b/src/settings.ts index a4c2a0db..17e9ee87 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -297,14 +297,14 @@ export class SRSettingTab extends PluginSettingTab { }), ); this.createSetting_FoldersToIgnore(containerEl); - addignoreSetting(containerEl.createDiv(), this.plugin); + addignoreSetting(newSettingEl(containerEl), this.plugin); } containerEl.createEl("h3", { text: t("GROUP_FLASHCARD_REVIEW") }); { - addMultiClozeSetting(containerEl.createDiv(), this.plugin); - addburySiblingSetting(containerEl.createDiv(), this.plugin); - addcardBlockIDSetting(containerEl.createDiv(), this.plugin); + addMultiClozeSetting(newSettingEl(containerEl), this.plugin); + addburySiblingSetting(newSettingEl(containerEl), this.plugin); + addcardBlockIDSetting(newSettingEl(containerEl), this.plugin); new Setting(containerEl) .setName(t("BURY_SIBLINGS_TILL_NEXT_DAY")) .setDesc(t("BURY_SIBLINGS_TILL_NEXT_DAY_DESC")) @@ -369,7 +369,7 @@ export class SRSettingTab extends PluginSettingTab { await this.plugin.savePluginData(); }), ); - this.addIntervalShowHideSetting(containerEl.createDiv()); + this.addIntervalShowHideSetting(newSettingEl(containerEl)); } containerEl.createEl("h3", { text: t("GROUP_FLASHCARD_SEPARATORS") }); @@ -586,7 +586,7 @@ export class SRSettingTab extends PluginSettingTab { ); this.createSetting_FoldersToIgnore(containerEl); - addignoreSetting(containerEl.createDiv(), this.plugin); + addignoreSetting(newSettingEl(containerEl), this.plugin); new Setting(containerEl) .setName(t("OPEN_RANDOM_NOTE")) @@ -607,11 +607,11 @@ export class SRSettingTab extends PluginSettingTab { }), ); - addmixQueueSetting(containerEl.createDiv(), this.plugin); - addTrackedNoteToDecksSetting(containerEl.createDiv(), this.plugin); - addUntrackSetting(containerEl.createDiv(), this.plugin); - addResponseFloatBarSetting(containerEl.createDiv(), this.plugin); - this.addReviewNoteDirectlySetting(containerEl.createDiv()); + addmixQueueSetting(newSettingEl(containerEl), this.plugin); + addTrackedNoteToDecksSetting(newSettingEl(containerEl), this.plugin); + addUntrackSetting(newSettingEl(containerEl), this.plugin); + addResponseFloatBarSetting(newSettingEl(containerEl), this.plugin); + this.addReviewNoteDirectlySetting(newSettingEl(containerEl)); new Setting(containerEl) .setName(t("DISABLE_FILE_MENU_REVIEW_OPTIONS")) @@ -684,7 +684,7 @@ export class SRSettingTab extends PluginSettingTab { private async tabUiPreferences(containerEl: HTMLElement): Promise { containerEl.createEl("h3", { text: t("FLASHCARDS") }); - this.addIntervalShowHideSetting(containerEl.createDiv()); + this.addIntervalShowHideSetting(newSettingEl(containerEl)); new Setting(containerEl) .setName(t("INITIALLY_EXPAND_SUBDECKS_IN_TREE")) .setDesc(t("INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC")) @@ -760,7 +760,7 @@ export class SRSettingTab extends PluginSettingTab { }); containerEl.createEl("h3", { text: t("GROUP_FLASHCARDS_NOTES") }); - addResponseButtonTextSetting(containerEl.createDiv(), this.plugin); + addResponseButtonTextSetting(newSettingEl(containerEl), this.plugin); return; new Setting(containerEl) .setName(t("FLASHCARD_EASY_LABEL")) @@ -838,15 +838,15 @@ export class SRSettingTab extends PluginSettingTab { const issue_url = "https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues"; - containerEl.createEl("p").innerHTML = + newSettingEl(containerEl).createEl("p").innerHTML = `Post an issue about this modified sr-plugin .`; // trackfile_setting // https://github.com/martin-jw/obsidian-recall/blob/main/src/settings.ts - addDataLocationSettings(containerEl.createDiv(), this.plugin); + addDataLocationSettings(newSettingEl(containerEl), this.plugin); - addAlgorithmSetting(containerEl.createDiv(), this.plugin); - addAlgorithmSpecificDisplaySetting(containerEl.createDiv(), this.plugin); + addAlgorithmSetting(newSettingEl(containerEl), this.plugin); + addAlgorithmSpecificDisplaySetting(newSettingEl(containerEl), this.plugin); return; containerEl.createEl("p").insertAdjacentHTML( @@ -1050,7 +1050,7 @@ export class SRSettingTab extends PluginSettingTab { const issue_url = "https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues"; - containerEl.createEl("p").insertAdjacentHTML( + newSettingEl(containerEl).createEl("p").insertAdjacentHTML( "beforeend", t("GITHUB_ISSUES", { issues_url: "https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/", @@ -1104,3 +1104,9 @@ export class SRSettingTab extends PluginSettingTab { } } } + +export function newSettingEl(containerEl: HTMLElement) { + const el = containerEl.createDiv(); + el.addClass("sr-setting-tab-bg"); + return el; +} diff --git a/src/settings/algorithmSetting.ts b/src/settings/algorithmSetting.ts index a5417557..ea78d0f7 100644 --- a/src/settings/algorithmSetting.ts +++ b/src/settings/algorithmSetting.ts @@ -19,9 +19,13 @@ export const DEFAULT_responseOptionBtnsText: Record = { export function addAlgorithmSetting(containerEl: HTMLElement, plugin: SRPlugin) { // const plugin = this.plugin; const settings = plugin.data.settings; + const desc = createFragment((frag) => { + frag.createDiv().innerHTML = t("ALGORITHMS_DESC"); + }); new Setting(containerEl) .setName(t("ALGORITHM")) + .setDesc(desc) .addDropdown((dropdown) => { Object.keys(algorithms).forEach((val) => { dropdown.addOption(val, val); @@ -74,8 +78,7 @@ export function addAlgorithmSetting(containerEl: HTMLElement, plugin: SRPlugin) } }).open(); }); - }) - .settingEl.querySelector(".setting-item-description").innerHTML = t("ALGORITHMS_DESC"); + }); } export function addAlgorithmSpecificDisplaySetting(containerEl: HTMLElement, plugin: SRPlugin) { diff --git a/styles.css b/styles.css index 3f3343e6..25c29798 100644 --- a/styles.css +++ b/styles.css @@ -379,6 +379,13 @@ button.sr-tab-header-button:hover { display: block; } +.sr-setting-tab-bg { + /* background-color: var(--background-modifier-border); */ + /* background-color: var(--background-modifier-hover); + background-color: var(--background-secondary); */ + background-color: var(--text-selection); +} + /* https://img.shields.io/github/v/release/chetachiezikeuzor/cMenu-Plugin */ /*---------------------------------------------------------------- ResponseFloatBar TOOLBAR From 7e5d1a852d906583580dc9c4a301accd78c26b9f Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 30 Aug 2024 20:39:26 +0800 Subject: [PATCH 147/155] udpate to use fsrs v5 --- package.json | 2 +- pnpm-lock.yaml | 16 +++++----------- src/algorithms/fsrs.ts | 2 +- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 5e9861c5..70990bb2 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "moment": "^2.30.1", "obsidian": "^1.5.7", "prettier": "^3.3.2", - "ts-fsrs": "^3.5.7", + "ts-fsrs": "^4.1.2", "ts-jest": "^29.1.5", "tslib": "2.6.1", "typescript": "5.1.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41bce6f6..0eb659f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,8 +80,8 @@ devDependencies: specifier: ^3.3.2 version: 3.3.2 ts-fsrs: - specifier: ^3.5.7 - version: 3.5.7 + specifier: ^4.1.2 + version: 4.1.2 ts-jest: specifier: ^29.1.5 version: 29.1.5(@babel/core@7.24.7)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6) @@ -5383,10 +5383,6 @@ packages: xmlchars: 2.2.0 dev: true - /seedrandom@3.0.5: - resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} - dev: true - /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -5771,11 +5767,9 @@ packages: typescript: 5.1.6 dev: true - /ts-fsrs@3.5.7: - resolution: {integrity: sha512-xA18Igi1adkuCNgNjKkorjYgZq842+HdgRjatQPDERcrAWMlzM+3BwIbrF/Q0ijYEyw3NcTp3yJIMSO7agBLKQ==} - engines: {node: '>=16.0.0'} - dependencies: - seedrandom: 3.0.5 + /ts-fsrs@4.1.2: + resolution: {integrity: sha512-sHmx2m+RWG48zMbkwAfZ3NHJwuTNd2HvgtsrERJzGuQVeSTguN1V+rBeSCP47r0JusWK1Etu/+BJT63OIwMauw==} + engines: {node: '>=18.0.0'} dev: true /ts-jest@29.1.5(@babel/core@7.24.7)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6): diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index 43fea3fb..044dc76b 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -434,7 +434,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { }); }) .settingEl.querySelector(".setting-item-description").innerHTML = - '查阅 FSRS V4 WIKI 和\ + '查阅 FSRS V5 WIKI 和\ FSRS w参数可视化 \ 以对各参数进行设置.'; From dab5c4291d27351b91db2f1cc6c8c67553b67527 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 30 Aug 2024 21:39:48 +0800 Subject: [PATCH 148/155] fix deprecated var app --- src/algorithms/fsrs.ts | 7 +++-- src/algorithms/priorities/linkPageranks.ts | 3 +- src/dataStore/adapter.ts | 36 ++++++++++++++++++++++ src/dataStore/data.ts | 19 ++++++------ src/dataStore/location_switch.ts | 13 +++++--- src/main.ts | 3 ++ src/suggesters/FolderSuggester.ts | 3 +- src/suggesters/suggest.ts | 8 ++--- src/tags.ts | 3 +- 9 files changed, 71 insertions(+), 24 deletions(-) create mode 100644 src/dataStore/adapter.ts diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index 044dc76b..a3cbd2bf 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -9,6 +9,7 @@ import deepcopy from "deepcopy"; import { AnkiData } from "./anki"; import { Rating, ReviewLog } from "ts-fsrs"; import { RepetitionItem, ReviewResult } from "src/dataStore/repetitionItem"; +import { Iadapter } from "src/dataStore/adapter"; // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/Settings.ts let applyDebounceTimer = 0; @@ -208,7 +209,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { } } - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; const duration = this.review_duration > 0 ? new Date().getTime() - this.review_duration : 0; this.review_duration = 0; const rlog = new RevLog(item, reviewLog, duration); @@ -230,7 +231,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { * @param rating */ reWriteRevlog(data: string, withTitle = false) { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; if (withTitle) { data = this.REVLOG_TITLE + data; @@ -239,7 +240,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { } async readRevlog() { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; let data = ""; if (await adapter.exists(this.logfilepath)) { data = await adapter.read(this.logfilepath); diff --git a/src/algorithms/priorities/linkPageranks.ts b/src/algorithms/priorities/linkPageranks.ts index 7804f3f5..f8b068fe 100644 --- a/src/algorithms/priorities/linkPageranks.ts +++ b/src/algorithms/priorities/linkPageranks.ts @@ -2,6 +2,7 @@ import { MetadataCache, TFile } from "obsidian"; import { NoteEaseList } from "src/NoteEaseList"; import * as graph from "pagerank.js"; import { SRSettings } from "src/settings"; +import { Iadapter } from "src/dataStore/adapter"; export interface LinkStat { sourcePath: string; @@ -103,7 +104,7 @@ export class LinkRank { this.incomingLinks[noteFile.path] = []; } - const links = app.metadataCache.resolvedLinks[noteFile.path] || {}; + const links = Iadapter.instance.metadataCache.resolvedLinks[noteFile.path] || {}; for (const targetPath in links) { if (this.incomingLinks[targetPath] === undefined) this.incomingLinks[targetPath] = []; diff --git a/src/dataStore/adapter.ts b/src/dataStore/adapter.ts new file mode 100644 index 00000000..bf9fdcc2 --- /dev/null +++ b/src/dataStore/adapter.ts @@ -0,0 +1,36 @@ +import { App, DataAdapter, Keymap, MetadataCache, Vault } from "obsidian"; + +export abstract class Iadapter { + metadataCache: MetadataCache; + adapter: DataAdapter; + vault: Vault; + app: App; + + private static _instance: Iadapter; + + constructor(app: App) { + this.app = app; + Iadapter._instance = this; + } + + static get instance() { + if (Iadapter._instance) { + return Iadapter._instance; + } else { + throw Error("there is not Iadapter instance."); + } + } + + static create(app: App) { + return new ObAdapter(app); + } +} + +class ObAdapter extends Iadapter { + constructor(app: App) { + super(app); + this.metadataCache = app.metadataCache; + this.adapter = app.vault.adapter; + this.vault = app.vault; + } +} diff --git a/src/dataStore/data.ts b/src/dataStore/data.ts index 92ecec61..dbdcd3d4 100644 --- a/src/dataStore/data.ts +++ b/src/dataStore/data.ts @@ -12,6 +12,7 @@ import { SrsAlgorithm, algorithmNames } from "src/algorithms/algorithms"; import { CardInfo, TrackedFile } from "./trackedFile"; import { RPITEMTYPE, RepetitionItem, ReviewResult } from "./repetitionItem"; import { DEFAULT_QUEUE_DATA, Queue } from "./queue"; +import { Iadapter } from "./adapter"; /** * SrsData. @@ -109,7 +110,7 @@ export class DataStore { */ async load(path = this.dataPath) { try { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; if (await adapter.exists(path)) { const data = await adapter.read(path); @@ -156,7 +157,7 @@ export class DataStore { */ async save(path = this.dataPath) { try { - await app.vault.adapter.write(path, JSON.stringify(this.data)); + await Iadapter.instance.adapter.write(path, JSON.stringify(this.data)); this.data.mtime = await this.getmtime(); } catch (error) { MiscUtils.notice("Unable to save data file!"); @@ -171,7 +172,7 @@ export class DataStore { * @returns */ async getmtime(path = this.dataPath) { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; const stat = await adapter.stat(path.normalize()); if (stat != null) { return stat.mtime; @@ -356,7 +357,7 @@ export class DataStore { * @param {boolean} recursive */ untrackFilesInFolderPath(path: string, recursive?: boolean) { - const folder: TFolder = app.vault.getAbstractFileByPath(path) as TFolder; + const folder: TFolder = Iadapter.instance.vault.getAbstractFileByPath(path) as TFolder; if (folder != null) { this.untrackFilesInFolder(folder, recursive); @@ -404,7 +405,7 @@ export class DataStore { * @param {boolean} recursive */ trackFilesInFolderPath(path: string, recursive?: boolean) { - const folder: TFolder = app.vault.getAbstractFileByPath(path) as TFolder; + const folder: TFolder = Iadapter.instance.vault.getAbstractFileByPath(path) as TFolder; if (folder != null) { this.trackFilesInFolder(folder, recursive); @@ -489,11 +490,11 @@ export class DataStore { } const trackedFile = this.getTrackedFile(path); - const note = app.vault.getAbstractFileByPath(path) as TFile; + const note = Iadapter.instance.vault.getAbstractFileByPath(path) as TFile; let cardName: string = null; if (note != null && trackedFile.tags.length > 0) { - const fileCachedData = app.metadataCache.getFileCache(note) || {}; + const fileCachedData = Iadapter.instance.metadataCache.getFileCache(note) || {}; const tags = getAllTags(fileCachedData) || []; const deckname = Tags.getNoteDeckName(note, this.settings); cardName = Tags.getTagFromSettingTags(tags, this.settings.flashcardTags); @@ -762,7 +763,7 @@ export class DataStore { findMovedFile(path: string): string { const pathArr = path.split("/"); const name = pathArr.last().replace(".md", ""); - const notes: TFile[] = app.vault.getMarkdownFiles(); + const notes: TFile[] = Iadapter.instance.vault.getMarkdownFiles(); const result: string[] = []; notes.some((note: TFile) => { if (note.basename.includes(name) || name.includes(note.basename)) { @@ -791,7 +792,7 @@ export class DataStore { * @param {string}path */ async verify(path: string): Promise { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; if (path != null) { return await adapter.exists(path).catch((_reason) => { console.error("Unable to verify file: ", path); diff --git a/src/dataStore/location_switch.ts b/src/dataStore/location_switch.ts index 5ad694f2..52191699 100644 --- a/src/dataStore/location_switch.ts +++ b/src/dataStore/location_switch.ts @@ -23,6 +23,7 @@ import deepcopy from "deepcopy"; import { NoteCardScheduleParser } from "src/CardSchedule"; import { DataLocation, getStorePath } from "./dataLocation"; import { globalDateProvider } from "src/util/DateProvider"; +import { Iadapter } from "./adapter"; export class LocationSwitch { public plugin: SRPlugin; @@ -54,7 +55,7 @@ export class LocationSwitch { * @returns {boolean} */ async moveStoreLocation(): Promise { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; const store = DataStore.getInstance(); const newPath = this.getStorePath(); @@ -123,7 +124,7 @@ export class LocationSwitch { // await plugin.sync_Algo(); - let notes: TFile[] = app.vault.getMarkdownFiles(); + let notes: TFile[] = Iadapter.instance.vault.getMarkdownFiles(); notes = notes.filter( (noteFile) => !isIgnoredPath(settings.noteFoldersToIgnore, noteFile.path) && @@ -163,7 +164,7 @@ export class LocationSwitch { } if (deckname !== null) { - const fileCachedData = app.metadataCache.getFileCache(noteFile) || {}; + const fileCachedData = Iadapter.instance.metadataCache.getFileCache(noteFile) || {}; fileText = await _convertFrontMatter(noteFile, fileCachedData, deckname, fileText); if (fileText == null) { console.warn("_convertFrontMatter: fileText null: "); @@ -271,7 +272,7 @@ export class LocationSwitch { fileText: string, ) { // console.debug("_convertFrontMatter"); - // const fileCachedData = app.metadataCache.getFileCache(note) || {}; + // const fileCachedData = Iadapter.instance.metadataCache.getFileCache(note) || {}; const frontmatter: FrontMatterCache | Record = fileCachedData.frontmatter || {}; const sched = getReviewNoteHeaderData(frontmatter); @@ -312,7 +313,9 @@ export class LocationSwitch { .filter((tkfile) => !isIgnoredPath(this.settings.noteFoldersToIgnore, tkfile.path)) .map(async (tkfile) => { const item = store.getItembyID(tkfile.noteID); - const note = app.vault.getAbstractFileByPath(tkfile.path) as TFile; + const note = Iadapter.instance.vault.getAbstractFileByPath( + tkfile.path, + ) as TFile; if (!(note instanceof TFile)) { return; } diff --git a/src/main.ts b/src/main.ts index 8ca76033..0f47b12c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -73,6 +73,8 @@ import { RepetitionItem } from "./dataStore/repetitionItem"; import { IReviewNote } from "./reviewNote/review-note"; import { ReviewView } from "./gui/reviewView"; import { MixQueSet } from "./dataStore/mixQueSet"; +import { Tags } from "./tags"; +import { Iadapter } from "./dataStore/adapter"; interface PluginData { settings: SRSettings; @@ -155,6 +157,7 @@ export default class SRPlugin extends Plugin { if (isVersionNewerThanOther(PLUGIN_VERSION, this.data.settings.previousRelease)) { new ReleaseNotes(this.app, this, obsidianJustInstalled ? null : PLUGIN_VERSION).open(); } + Iadapter.create(this.app); const settings = this.data.settings; this.algorithm = algorithms[settings.algorithm]; diff --git a/src/suggesters/FolderSuggester.ts b/src/suggesters/FolderSuggester.ts index d21fd1a5..bc55e365 100644 --- a/src/suggesters/FolderSuggester.ts +++ b/src/suggesters/FolderSuggester.ts @@ -2,10 +2,11 @@ import { TAbstractFile, TFolder } from "obsidian"; import { TextInputSuggest } from "./suggest"; +import { Iadapter } from "src/dataStore/adapter"; export class FolderSuggest extends TextInputSuggest { getSuggestions(inputStr: string): TFolder[] { - const abstractFiles = app.vault.getAllLoadedFiles(); + const abstractFiles = Iadapter.instance.vault.getAllLoadedFiles(); const folders: TFolder[] = []; const lowerCaseInputStr = inputStr.toLowerCase(); diff --git a/src/suggesters/suggest.ts b/src/suggesters/suggest.ts index 0761ab09..84011600 100644 --- a/src/suggesters/suggest.ts +++ b/src/suggesters/suggest.ts @@ -2,6 +2,7 @@ import { ISuggestOwner, Scope } from "obsidian"; import { createPopper, Instance as PopperInstance } from "@popperjs/core"; +import { Iadapter } from "src/dataStore/adapter"; const wrapAround = (value: number, size: number): number => { return ((value % size) + size) % size; @@ -133,15 +134,14 @@ export abstract class TextInputSuggest implements ISuggestOwner { this.suggest.setSuggestions(suggestions); // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore - this.open(app.dom.appContainerEl, this.inputEl); + this.open(Iadapter.instance.app.dom.appContainerEl, this.inputEl); } else { this.close(); } } open(container: HTMLElement, inputEl: HTMLElement): void { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - app.keymap.pushScope(this.scope); + Iadapter.instance.app.keymap.pushScope(this.scope); container.appendChild(this.suggestEl); this.popper = createPopper(inputEl, this.suggestEl, { @@ -170,7 +170,7 @@ export abstract class TextInputSuggest implements ISuggestOwner { } close(): void { - app.keymap.popScope(this.scope); + Iadapter.instance.app.keymap.popScope(this.scope); this.suggest.setSuggestions([]); if (this.popper) this.popper.destroy(); diff --git a/src/tags.ts b/src/tags.ts index cc5fc9af..646d628f 100644 --- a/src/tags.ts +++ b/src/tags.ts @@ -1,6 +1,7 @@ import { TFile, getAllTags } from "obsidian"; import { SRSettings } from "./settings"; import { DEFAULT_DECKNAME } from "./constants"; +import { Iadapter } from "./dataStore/adapter"; export class Tags { static isDefaultDackName(tag: string) { @@ -8,7 +9,7 @@ export class Tags { } static getFileTags(note: TFile) { - const fileCachedData = app.metadataCache.getFileCache(note) || {}; + const fileCachedData = Iadapter.instance.metadataCache.getFileCache(note) || {}; const tags = getAllTags(fileCachedData) || []; return tags; } From 82a2ae76a472e312804dda3aed40200b0276f1aa Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:19:05 +0800 Subject: [PATCH 149/155] fix settings --- .github/workflows/pr.yml | 2 +- src/settings.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 27070694..880fc1f8 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -26,7 +26,7 @@ jobs: - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: - node-version: "20.x" + node-version: "22" cache: "pnpm" - run: pnpm i diff --git a/src/settings.ts b/src/settings.ts index 17e9ee87..69ebe456 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -839,7 +839,7 @@ export class SRSettingTab extends PluginSettingTab { const issue_url = "https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues"; newSettingEl(containerEl).createEl("p").innerHTML = - `Post an issue about this modified sr-plugin .`; + `Post an issue about this modified sr-plugin which has backgroud color for settings.`; // trackfile_setting // https://github.com/martin-jw/obsidian-recall/blob/main/src/settings.ts From a828d97b20b9bbe8ffd3778e5df9ce6363e9a207 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:24:37 +0800 Subject: [PATCH 150/155] update version and docs --- README.md | 8 ++++---- docs/README_ZH.md | 6 +++--- docs/docs/changelog.md | 11 ++++++++--- manifest.json | 4 ++-- package.json | 2 +- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index d9d77df1..92e56bcd 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ This is a modified version of [obsidian-spaced-repetition](https://github.com/st - save on note file, just as used do. - save on seperate tracked_files.json. - setting convert tracked note to decks - - switch Algorithm(only work on saving on seperate tracked_files.json.): Default, anki, [Fsrs](https://github.com/open-spaced-repetition/fsrs.js) + - switch Algorithm(only work on saving on seperate tracked_files.json.): Default, anki, [Fsrs](https://github.com/open-spaced-repetition/ts-fsrs) - file menu to tracknote/untracknote - show floatbar for reviewing response when reviewing note by click statusbar or review command or sidebar, and can set whether showing the interval or not; - Reviewing a Notes directly [#635]; @@ -30,14 +30,14 @@ This is a modified version of [obsidian-spaced-repetition](https://github.com/st ## Maintainers Wanted -Since I am not a programmer, I don't know much about typescript programming, so I can only do some bug fixes and small feature updates. I can only do some bug fixes and small feature updates, but it is difficult to realize some of the proposed features. Welcome to join us if you are interested in this plugin, and work together to maintain and update this plugin. +Since I am not a programmer, I don't know much about typescript programming, so I can only do some bug fixes and small feature updates. but it is difficult to realize some of the proposed features. Welcome to join us if you are interested in this plugin, and work together to maintain and update this plugin. You can join us by submitting an [issue](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues)/[PR](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/pulls)、或[论坛讨论](https://forum-zh.obsidian.md/t/topic/20551) directly. ## How to install the plugin 1. Download main.js, manifest.json, styles.css from the latest release (see [releases](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/releases/)) -2. Create a new folder in `Vault-name/.obsidian/plugins` and put the downloaded files in there +2. Create a new folder `obsidian-spaced-repetition-recall` in `Vault-name/.obsidian/plugins` and put the downloaded files in there 3. Reload your plugins and enable the plugin OR USE BRAT pulgin; @@ -67,5 +67,5 @@ Thank you to everyone who has created a plugin that inspired me and I took code - first, thanks to [@st3v3nmw's obsidian-spaced-repetition](https://github.com/st3v3nmw/obsidian-spaced-repetition) and [@martin-jw recall plugin](https://github.com/martin-jw/obsidian-recall) - floatbar(thanks to [@chetachi's cMenu](https://github.com/chetachiezikeuzor/cMenu-Plugin)) -- [Fsrs Algorithm](https://github.com/open-spaced-repetition/fsrs.js) +- [Fsrs Algorithm](https://github.com/open-spaced-repetition) - ReleaseNotes(thanks to [@Zsolt Viczian Excalidraw](https://zsolt.blog)) diff --git a/docs/README_ZH.md b/docs/README_ZH.md index 0f201028..284a8804 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -10,7 +10,7 @@ 2. 在复习笔记时可以显示悬浮栏(跟复习卡片时类似),方便选择记忆效果,且可显隐到下次重复的时间间隔; 3. 可以只转换复习笔记到卡片组,而不是全部库的笔记都转换; 4. 在有多个标签时,可不用选标签,直接打开笔记; -5. 算法可以切换:默认的 Anki 优化算法、Anki 算法、[Fsrs 算法](https://github.com/open-spaced-repetition/fsrs.js); +5. 算法可以切换:默认的 Anki 优化算法、Anki 算法、[Fsrs 算法](https://github.com/open-spaced-repetition/ts-fsrs); 6. 使用 Fsrs 算法时,可根据标签输出重复日志文件 `ob_revlog.csv`,以使用[optimizer](https://github.com/open-spaced-repetition/fsrs-optimizer) 优化算法参数,达到更好的复习效果; 7. 数据表中新增笔记复习情况、当天复习情况; 8. 延后笔记/卡片; @@ -50,7 +50,7 @@ github: https://github.com/open-spaced-repetition/obsidian-spaced-repetition-rec 或: 1. 从[最新发布](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/releases/)中下载压缩包(已包括 main.js, manifest.json, styles.css); -2. 在 `Vault-name/.obsidian/plugins` 中,把刚下的文件解压(应是`obsidian-spaced-repetition-recall`文件夹)放入`plugins`文件夹下,; +2. 在 `Vault-name/.obsidian/plugins` 中,把刚下的文件解压(应是`obsidian-spaced-repetition-recall`文件夹)放入`plugins`文件夹下; 3. 重启 Obsidan 开启插件,就可以使用了。 ## Thanks @@ -72,5 +72,5 @@ Thank you to everyone who has created a plugin that inspired me and I took code - first, thanks to [@st3v3nmw's obsidian-spaced-repetition](https://github.com/st3v3nmw/obsidian-spaced-repetition) and [@martin-jw recall plugin](https://github.com/martin-jw/obsidian-recall) - floatbar(thanks to [@chetachi's cMenu](https://github.com/chetachiezikeuzor/cMenu-Plugin)) -- [Fsrs Algorithm](https://github.com/open-spaced-repetition/fsrs.js) +- [Fsrs Algorithm](https://github.com/open-spaced-repetition) - ReleaseNotes(thanks to [@Zsolt Viczian Excalidraw](https://zsolt.blog)) diff --git a/docs/docs/changelog.md b/docs/docs/changelog.md index e9110ceb..01e7083a 100644 --- a/docs/docs/changelog.md +++ b/docs/docs/changelog.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.12.5.10] + +- 同步原插件最新分支sync upsteam branch; +- fix #72 add setting for ignored Tags; +- fix #73 use fsrs v5 algorithm; +- setting UX change; + ## [1.12.4.9] - 同步原插件最新分支sync upsteam branch; @@ -195,11 +202,9 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fixed open the next note automatically after reviewing another [#582](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/582) - fixed sidebar doesn't show/update some files. [#393](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/393) - - ### [Unreleased] -- [FIX] isEqualOrSubPath function [`#1048`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/1048) +- [FIX] isEqualOrSubPath function [`#1048`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/1048) #### [1.12.5](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.12.4...1.12.5) diff --git a/manifest.json b/manifest.json index 72392a08..a00b02e3 100644 --- a/manifest.json +++ b/manifest.json @@ -1,8 +1,8 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.12.5.9", - "minAppVersion": "0.15.4", + "version": "1.12.5.10", + "minAppVersion": "1.2.8", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", "authorUrl": "https://github.com/Newdea", diff --git a/package.json b/package.json index 74dbbe1a..3871ceaf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.12.5.9", + "version": "1.12.5.10", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { From cf4bebcd899c8664cd70c692e32d978eadb2a3da Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 30 Aug 2024 23:09:37 +0800 Subject: [PATCH 151/155] fix test errors --- src/dataStore/trackedFile.ts | 22 ++++++++++++---------- src/settings.ts | 14 ++++++++------ tests/unit/Note.test.ts | 20 ++++++++++---------- tests/unit/NoteQuestionParser.test.ts | 1 + 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/dataStore/trackedFile.ts b/src/dataStore/trackedFile.ts index 012ad7af..5fb58188 100644 --- a/src/dataStore/trackedFile.ts +++ b/src/dataStore/trackedFile.ts @@ -182,16 +182,18 @@ export class TrackedFile implements ITrackedFile { const lines: number[] = []; const cardHashList: Record = {}; - const parsedCards: ParsedQuestionInfo[] = parseEx( - fileText, - settings.singleLineCardSeparator, - settings.singleLineReversedCardSeparator, - settings.multilineCardSeparator, - settings.multilineReversedCardSeparator, - settings.convertHighlightsToClozes, - settings.convertBoldTextToClozes, - settings.convertCurlyBracketsToClozes, - ); + const parserOptions = { + singleLineCardSeparator: settings.singleLineCardSeparator, + singleLineReversedCardSeparator: settings.singleLineReversedCardSeparator, + multilineCardSeparator: settings.multilineCardSeparator, + multilineReversedCardSeparator: settings.multilineReversedCardSeparator, + multilineCardEndMarker: settings.multilineCardEndMarker, + convertHighlightsToClozes: settings.convertHighlightsToClozes, + convertBoldTextToClozes: settings.convertBoldTextToClozes, + convertCurlyBracketsToClozes: settings.convertCurlyBracketsToClozes, + }; + + const parsedCards: ParsedQuestionInfo[] = parseEx(fileText, parserOptions); if (!this.hasCards && parsedCards.length === 0) { return false; } diff --git a/src/settings.ts b/src/settings.ts index 69ebe456..fd2e6e7a 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1050,12 +1050,14 @@ export class SRSettingTab extends PluginSettingTab { const issue_url = "https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues"; - newSettingEl(containerEl).createEl("p").insertAdjacentHTML( - "beforeend", - t("GITHUB_ISSUES", { - issues_url: "https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/", - }) + `about this modified sr-plugin `, - ); + newSettingEl(containerEl) + .createEl("p") + .insertAdjacentHTML( + "beforeend", + t("GITHUB_ISSUES", { + issues_url: "https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/", + }) + `about this modified sr-plugin `, + ); /* // Documentation link & GitHub links diff --git a/tests/unit/Note.test.ts b/tests/unit/Note.test.ts index 5bf66027..878974fb 100644 --- a/tests/unit/Note.test.ts +++ b/tests/unit/Note.test.ts @@ -52,8 +52,8 @@ Q3:::A3 describe("create Multiple Cloze", () => { test("Multiple cloze, some with schedule details", async () => { let originalText: string = `#flashcards/test -Q1::A1 -#flashcards "This is a really very {{interesting}} and ==fascinating== and **great** test" + +This is a really very {{interesting}} and ==fascinating== and **great** test `; let settings2 = DEFAULT_SETTINGS; @@ -65,31 +65,31 @@ Q1::A1 var noteFileLoader: NoteFileLoader = new NoteFileLoader(settings2); let file: UnitTestSRFile = new UnitTestSRFile(originalText); - let note: Note = await noteFileLoader.load(file, TopicPath.emptyPath); + let note: Note = await noteFileLoader.load(file, TextDirection.Ltr, TopicPath.emptyPath); note.createMultiCloze(settings2); let deck: Deck = Deck.emptyDeck; note.appendCardsToDeck(deck); - let subdeck: Deck = deck.getDeck(new TopicPath(["flashcards"])); + let subdeck: Deck = deck.getDeck(new TopicPath(["flashcards", "test"])); expect(subdeck.newFlashcards[0].front).toEqual( - `"This is a really very {{interesting}} and ==fascinating== and [......] test"\n`, + "This is a really very {{interesting}} and ==fascinating== and [......] test", ); expect(subdeck.newFlashcards[0].back).toEqual( - `"This is a really very interesting and fascinating and great test"\n`, + "This is a really very interesting and fascinating and great test", ); expect(subdeck.dueFlashcards[0].front).toEqual( - `"This is a really very [.........] and [.........] and [......] test"\n`, + "This is a really very [.........] and [.........] and [......] test", ); expect(subdeck.dueFlashcards[0].back).toEqual( - `"This is a really very interesting and [.........] and [......] test"\n`, + "This is a really very interesting and [.........] and [......] test", ); expect(subdeck.dueFlashcards[1].front).toEqual( - `"This is a really very {{interesting}} and [.........] and [......] test"\n`, + "This is a really very {{interesting}} and [.........] and [......] test", ); expect(subdeck.dueFlashcards[1].back).toEqual( - `"This is a really very interesting and fascinating and [......] test"\n`, + "This is a really very interesting and fascinating and [......] test", ); }); }); diff --git a/tests/unit/NoteQuestionParser.test.ts b/tests/unit/NoteQuestionParser.test.ts index ffcddb4f..62627a6d 100644 --- a/tests/unit/NoteQuestionParser.test.ts +++ b/tests/unit/NoteQuestionParser.test.ts @@ -439,6 +439,7 @@ Q3::A3 ); let questionList: Question[] = await parser_trackedNoteToDecks.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); From 0244787ed0f27ae7cdef947d093dc29d9f8c84b7 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Fri, 30 Aug 2024 23:15:44 +0800 Subject: [PATCH 152/155] ## [1.12.5.10] (#74) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Carlos Galdino Co-authored-by: 4Source <38220764+4Source@users.noreply.github.com> Co-authored-by: Stephen Mwangi Co-authored-by: Anna Zubenko Co-authored-by: Ronny Zulaikha <75528127+ronzulu@users.noreply.github.com> Co-authored-by: Andrea Alberti ## [1.12.5.10] - 同步原插件最新分支sync upsteam branch; - fix #72 add setting for ignored Tags; - fix #73 use fsrs v5 algorithm; - setting UX change; --- .github/ISSUE_TEMPLATE/bug_report.yml | 4 +- .github/workflows/e2e.yml | 2 +- .github/workflows/pr.yml | 4 +- .github/workflows/release.yml | 6 +- .gitignore | 4 + .npmrc | 2 +- .prettierignore | 1 + CHANGELOG.md | 2 +- CONTRIBUTING.md | 2 +- README.md | 8 +- docs/README_ZH.md | 6 +- docs/{ => docs}/assets/favicon.ico | Bin docs/{ => docs}/changelog.md | 30 +- docs/docs/en/algorithms.md | 64 + docs/{ => docs}/en/contributing.md | 28 +- docs/docs/en/data-storage.md | 63 + docs/docs/en/flashcards/basic-cloze-cards.md | 110 + .../en/flashcards/cards-with-blank-lines.md | 60 + docs/docs/en/flashcards/decks.md | 79 + .../docs/en/flashcards/flashcards-overview.md | 97 + docs/docs/en/flashcards/qanda-cards.md | 167 + docs/docs/en/flashcards/reviewing.md | 116 + docs/docs/en/flashcards/statistics.md | 21 + docs/docs/en/index.md | 78 + docs/docs/en/notes.md | 87 + docs/docs/en/plugin-commands.md | 4 + docs/docs/en/resources.md | 46 + docs/docs/en/user-options.md | 32 + docs/{ => docs}/license.md | 2 +- docs/docs/stylesheets/extra.css | 16 + docs/{ => docs}/zh/algorithms.md | 0 docs/{ => docs}/zh/contributing.md | 4 +- docs/{ => docs}/zh/flashcards.md | 0 docs/{ => docs}/zh/index.md | 0 docs/{ => docs}/zh/notes.md | 0 docs/en/algorithms.md | 30 - docs/en/flashcards.md | 241 - docs/en/index.md | 53 - docs/en/notes.md | 71 - .../en/cloze-with-blank-lines-answer.jpg | Bin 0 -> 84870 bytes .../en/cloze-with-blank-lines-front1.jpg | Bin 0 -> 68207 bytes docs/media/en/cloze-with-blank-lines.jpg | Bin 0 -> 139578 bytes docs/media/en/file-three-dots-menu.jpg | Bin 0 -> 15667 bytes docs/media/en/flashcard-cloze-example.jpg | Bin 0 -> 60522 bytes docs/media/en/flashcard-decks-1.jpg | Bin 0 -> 51265 bytes docs/media/en/flashcard-qanda-example.jpg | Bin 0 -> 48368 bytes docs/media/en/flashcard-settings-review.jpg | Bin 0 -> 43303 bytes .../en/flashcard-settings-scheduling-data.jpg | Bin 0 -> 27845 bytes .../en/flashcard-settings-separators.jpg | Bin 0 -> 105951 bytes .../en/flashcard-settings-tag-folders.jpg | Bin 0 -> 44260 bytes docs/media/en/image-annotation.docx | Bin 0 -> 1000990 bytes docs/media/en/note-frontmatter.jpg | Bin 0 -> 10786 bytes .../en/note-review-queue-context-menu.jpg | Bin 0 -> 30723 bytes docs/media/en/note-review-queue.jpg | Bin 0 -> 27494 bytes docs/media/en/plugin-commands.jpg | Bin 0 -> 46505 bytes docs/media/en/review-deck.jpg | Bin 0 -> 41635 bytes docs/media/en/review-operation.jpg | Bin 0 -> 25958 bytes docs/media/en/reviewing-context.jpg | Bin 0 -> 63495 bytes docs/media/en/settings-notes.jpg | Bin 0 -> 53816 bytes docs/media/en/settings-ui-preferences.jpg | Bin 0 -> 57800 bytes .../en/table-with-no-preceding-blank-line.jpg | Bin 0 -> 72706 bytes .../en/table-with-preceding-blank-line+++.jpg | Bin 0 -> 53759 bytes ...table-with-preceding-blank-line-review.jpg | Bin 0 -> 58262 bytes .../en/table-with-preceding-blank-line.jpg | Bin 0 -> 68121 bytes docs/media/en/user-interface-overview.jpg | Bin 0 -> 150201 bytes docs/user-doco-vault/en/.obsidian/app.json | 4 + .../en/.obsidian/appearance.json | 3 + .../en/.obsidian/community-plugins.json | 3 + .../en/.obsidian/core-plugins-migration.json | 30 + .../en/.obsidian/core-plugins.json | 20 + docs/user-doco-vault/en/.obsidian/graph.json | 22 + .../obsidian-spaced-repetition/data.json | 47 + .../obsidian-spaced-repetition/main.js | 22802 ++++++++++++++++ .../obsidian-spaced-repetition/manifest.json | 12 + .../obsidian-spaced-repetition/styles.css | 284 + .../en/.obsidian/workspace.json | 207 + .../Amazon DynamoDB Accelerator (DAX).md | 49 + .../DynamoDB/Amazon DynamoDB Global Tables.md | 20 + .../AWS/DynamoDB/Amazon DynamoDB Streams.md | 39 + .../Computing/AWS/DynamoDB/Amazon DynamoDB.md | 9 + .../DynamoDB Capacity Units (RCU-WCU).md | 212 + ...oDB Consistency Models and Transactions.md | 57 + .../AWS/DynamoDB/DynamoDB LSI and GSI.md | 56 + ...imistic Locking and Conditional Updates.md | 34 + .../DynamoDB Partitions and Primary Keys.md | 116 + .../DynamoDB Performance and Throttling.md | 33 + .../DynamoDB/DynamoDB Scan and Query API.md | 52 + .../files/Pasted image 20240504223518.png | Bin 0 -> 57247 bytes .../files/Pasted image 20240506143842.png | Bin 0 -> 74738 bytes .../files/Pasted image 20240506145524.png | Bin 0 -> 30165 bytes .../files/Pasted image 20240506150447.png | Bin 0 -> 27720 bytes .../files/Pasted image 20240506155555.png | Bin 0 -> 38754 bytes .../files/Pasted image 20240507170722.png | Bin 0 -> 73206 bytes .../files/Pasted image 20240507215621.png | Bin 0 -> 23762 bytes .../files/Pasted image 20240507215928.png | Bin 0 -> 49674 bytes .../files/Pasted image 20240507224507.png | Bin 0 -> 34729 bytes .../files/Pasted image 20240508132354.png | Bin 0 -> 26294 bytes .../files/Pasted image 20240508134406.png | Bin 0 -> 52825 bytes .../en/Math/Ellipse/Ellipse Equation.md | 29 + .../en/Math/Ellipse/Ellipse.md | 22 + docs/user-doco-vault/en/Math/Ellipse/Focus.md | 7 + .../en/Math/Ellipse/Major Axis.md | 3 + .../en/Math/Ellipse/Minor Axis.md | 1 + .../en/Math/Ellipse/Semi-Major Axis.md | 1 + .../en/Math/Ellipse/Semi-Minor Axis.md | 1 + .../files/Pasted image 20230828144739.png | Bin 0 -> 46642 bytes .../en/Math/Singular Matrix.md | 18 + .../Electric Field/Electric Field Diagram.md | 10 + .../Electric Field Simulation.md | 10 + ...tric Field Strength and Charge Equation.md | 12 + ...ctric Field Strength and Force Equation.md | 18 + .../Physics/Electric Field/Electric Field.md | 27 + .../Electric Field/Obsidian Testing.md | 0 .../files/Pasted image 20230828112605.png | Bin 0 -> 59490 bytes .../files/Pasted image 20230828112824.png | Bin 0 -> 73565 bytes .../files/Pasted image 20230919225731.png | Bin 0 -> 109059 bytes .../files/charges-and-fields_en.html | 672 + .../en/User Guide/Cloze with blank lines.md | 9 + .../User Guide/Cloze with table using+++.md | 13 + docs/user-doco-vault/en/User Guide/Context.md | 15 + .../Multiline with blank lines in answer.md | 28 + .../Table with preceding blank line and+++.md | 14 + docs/user-doco-vault/en/Welcome.md | 5 + manifest.json | 4 +- mkdocs.yml | 43 +- package.json | 27 +- pnpm-lock.yaml | 1420 +- requirements.txt | 4 +- src/NoteFileLoader.ts | 8 +- src/NoteParser.ts | 14 +- src/NoteQuestionParser.ts | 39 +- src/Question.ts | 28 +- src/SRFile.ts | 20 +- src/algorithms/fsrs.ts | 9 +- src/algorithms/priorities/linkPageranks.ts | 3 +- src/constants.ts | 2 +- src/dataStore/adapter.ts | 36 + src/dataStore/data.ts | 19 +- src/dataStore/location_switch.ts | 13 +- src/dataStore/trackedFile.ts | 22 +- src/generateParser.ts | 271 + src/gui/EditModal.tsx | 18 +- src/gui/FlashcardModal.tsx | 8 +- src/gui/FlashcardReviewView.tsx | 12 +- src/gui/ReleaseNotes.ts | 2 +- src/gui/Sidebar.tsx | 71 +- src/gui/Tabs.ts | 184 + src/lang/locale/ar.ts | 31 +- src/lang/locale/cz.ts | 33 +- src/lang/locale/de.ts | 34 +- src/lang/locale/en.ts | 32 +- src/lang/locale/es.ts | 32 +- src/lang/locale/it.ts | 32 +- src/lang/locale/ja.ts | 33 +- src/lang/locale/ko.ts | 33 +- src/lang/locale/pl.ts | 31 +- src/lang/locale/pt-br.ts | 33 +- src/lang/locale/ru.ts | 31 +- src/lang/locale/zh-cn.ts | 32 +- src/lang/locale/zh-tw.ts | 32 +- src/main.ts | 86 +- src/parser.ts | 187 +- src/settings.ts | 971 +- src/settings/algorithmSetting.ts | 7 +- src/settings/ignoreSetting.ts | 22 + src/suggesters/FolderSuggester.ts | 3 +- src/suggesters/suggest.ts | 8 +- src/tags.ts | 3 +- src/util/RenderMarkdownWrapper.ts | 16 +- src/util/TextDirection.ts | 5 + src/util/utils.ts | 138 +- styles.css | 106 +- tests/unit/FlashcardReviewSequencer.test.ts | 39 +- tests/unit/Note.test.ts | 28 +- tests/unit/NoteFileLoader.test.ts | 5 +- tests/unit/NoteParser.test.ts | 3 +- tests/unit/NoteQuestionParser.test.ts | 134 +- tests/unit/Question.test.ts | 5 +- tests/unit/SampleItems.ts | 3 +- tests/unit/helpers/UnitTestSRFile.ts | 5 + tests/unit/parser.test.ts | 339 +- tests/unit/util/utils.test.ts | 216 + 182 files changed, 29634 insertions(+), 1957 deletions(-) rename docs/{ => docs}/assets/favicon.ico (100%) rename docs/{ => docs}/changelog.md (96%) create mode 100644 docs/docs/en/algorithms.md rename docs/{ => docs}/en/contributing.md (93%) create mode 100644 docs/docs/en/data-storage.md create mode 100644 docs/docs/en/flashcards/basic-cloze-cards.md create mode 100644 docs/docs/en/flashcards/cards-with-blank-lines.md create mode 100644 docs/docs/en/flashcards/decks.md create mode 100644 docs/docs/en/flashcards/flashcards-overview.md create mode 100644 docs/docs/en/flashcards/qanda-cards.md create mode 100644 docs/docs/en/flashcards/reviewing.md create mode 100644 docs/docs/en/flashcards/statistics.md create mode 100644 docs/docs/en/index.md create mode 100644 docs/docs/en/notes.md create mode 100644 docs/docs/en/plugin-commands.md create mode 100644 docs/docs/en/resources.md create mode 100644 docs/docs/en/user-options.md rename docs/{ => docs}/license.md (96%) create mode 100644 docs/docs/stylesheets/extra.css rename docs/{ => docs}/zh/algorithms.md (100%) rename docs/{ => docs}/zh/contributing.md (97%) rename docs/{ => docs}/zh/flashcards.md (100%) rename docs/{ => docs}/zh/index.md (100%) rename docs/{ => docs}/zh/notes.md (100%) delete mode 100644 docs/en/algorithms.md delete mode 100644 docs/en/flashcards.md delete mode 100644 docs/en/index.md delete mode 100644 docs/en/notes.md create mode 100644 docs/media/en/cloze-with-blank-lines-answer.jpg create mode 100644 docs/media/en/cloze-with-blank-lines-front1.jpg create mode 100644 docs/media/en/cloze-with-blank-lines.jpg create mode 100644 docs/media/en/file-three-dots-menu.jpg create mode 100644 docs/media/en/flashcard-cloze-example.jpg create mode 100644 docs/media/en/flashcard-decks-1.jpg create mode 100644 docs/media/en/flashcard-qanda-example.jpg create mode 100644 docs/media/en/flashcard-settings-review.jpg create mode 100644 docs/media/en/flashcard-settings-scheduling-data.jpg create mode 100644 docs/media/en/flashcard-settings-separators.jpg create mode 100644 docs/media/en/flashcard-settings-tag-folders.jpg create mode 100644 docs/media/en/image-annotation.docx create mode 100644 docs/media/en/note-frontmatter.jpg create mode 100644 docs/media/en/note-review-queue-context-menu.jpg create mode 100644 docs/media/en/note-review-queue.jpg create mode 100644 docs/media/en/plugin-commands.jpg create mode 100644 docs/media/en/review-deck.jpg create mode 100644 docs/media/en/review-operation.jpg create mode 100644 docs/media/en/reviewing-context.jpg create mode 100644 docs/media/en/settings-notes.jpg create mode 100644 docs/media/en/settings-ui-preferences.jpg create mode 100644 docs/media/en/table-with-no-preceding-blank-line.jpg create mode 100644 docs/media/en/table-with-preceding-blank-line+++.jpg create mode 100644 docs/media/en/table-with-preceding-blank-line-review.jpg create mode 100644 docs/media/en/table-with-preceding-blank-line.jpg create mode 100644 docs/media/en/user-interface-overview.jpg create mode 100644 docs/user-doco-vault/en/.obsidian/app.json create mode 100644 docs/user-doco-vault/en/.obsidian/appearance.json create mode 100644 docs/user-doco-vault/en/.obsidian/community-plugins.json create mode 100644 docs/user-doco-vault/en/.obsidian/core-plugins-migration.json create mode 100644 docs/user-doco-vault/en/.obsidian/core-plugins.json create mode 100644 docs/user-doco-vault/en/.obsidian/graph.json create mode 100644 docs/user-doco-vault/en/.obsidian/plugins/obsidian-spaced-repetition/data.json create mode 100644 docs/user-doco-vault/en/.obsidian/plugins/obsidian-spaced-repetition/main.js create mode 100644 docs/user-doco-vault/en/.obsidian/plugins/obsidian-spaced-repetition/manifest.json create mode 100644 docs/user-doco-vault/en/.obsidian/plugins/obsidian-spaced-repetition/styles.css create mode 100644 docs/user-doco-vault/en/.obsidian/workspace.json create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB Accelerator (DAX).md create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB Global Tables.md create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB Streams.md create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB.md create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Capacity Units (RCU-WCU).md create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Consistency Models and Transactions.md create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB LSI and GSI.md create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Optimistic Locking and Conditional Updates.md create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Partitions and Primary Keys.md create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Performance and Throttling.md create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Scan and Query API.md create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240504223518.png create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240506143842.png create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240506145524.png create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240506150447.png create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240506155555.png create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240507170722.png create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240507215621.png create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240507215928.png create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240507224507.png create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240508132354.png create mode 100644 docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240508134406.png create mode 100644 docs/user-doco-vault/en/Math/Ellipse/Ellipse Equation.md create mode 100644 docs/user-doco-vault/en/Math/Ellipse/Ellipse.md create mode 100644 docs/user-doco-vault/en/Math/Ellipse/Focus.md create mode 100644 docs/user-doco-vault/en/Math/Ellipse/Major Axis.md create mode 100644 docs/user-doco-vault/en/Math/Ellipse/Minor Axis.md create mode 100644 docs/user-doco-vault/en/Math/Ellipse/Semi-Major Axis.md create mode 100644 docs/user-doco-vault/en/Math/Ellipse/Semi-Minor Axis.md create mode 100644 docs/user-doco-vault/en/Math/Ellipse/files/Pasted image 20230828144739.png create mode 100644 docs/user-doco-vault/en/Math/Singular Matrix.md create mode 100644 docs/user-doco-vault/en/Physics/Electric Field/Electric Field Diagram.md create mode 100644 docs/user-doco-vault/en/Physics/Electric Field/Electric Field Simulation.md create mode 100644 docs/user-doco-vault/en/Physics/Electric Field/Electric Field Strength and Charge Equation.md create mode 100644 docs/user-doco-vault/en/Physics/Electric Field/Electric Field Strength and Force Equation.md create mode 100644 docs/user-doco-vault/en/Physics/Electric Field/Electric Field.md create mode 100644 docs/user-doco-vault/en/Physics/Electric Field/Obsidian Testing.md create mode 100644 docs/user-doco-vault/en/Physics/Electric Field/files/Pasted image 20230828112605.png create mode 100644 docs/user-doco-vault/en/Physics/Electric Field/files/Pasted image 20230828112824.png create mode 100644 docs/user-doco-vault/en/Physics/Electric Field/files/Pasted image 20230919225731.png create mode 100644 docs/user-doco-vault/en/Physics/Electric Field/files/charges-and-fields_en.html create mode 100644 docs/user-doco-vault/en/User Guide/Cloze with blank lines.md create mode 100644 docs/user-doco-vault/en/User Guide/Cloze with table using+++.md create mode 100644 docs/user-doco-vault/en/User Guide/Context.md create mode 100644 docs/user-doco-vault/en/User Guide/Multiline with blank lines in answer.md create mode 100644 docs/user-doco-vault/en/User Guide/Table with preceding blank line and+++.md create mode 100644 docs/user-doco-vault/en/Welcome.md create mode 100644 src/dataStore/adapter.ts create mode 100644 src/generateParser.ts create mode 100644 src/gui/Tabs.ts create mode 100644 src/settings/ignoreSetting.ts create mode 100644 src/util/TextDirection.ts diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index c5fefeba..7859c7c5 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -19,8 +19,8 @@ body: description: Steps to reproduce the behavior placeholder: | 1. Go to '...' - 2. Click on '...' - 3. Scroll down to '...' + 2. Click on '...' + 3. Scroll down to '...' 4. See error" validations: required: true diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index bd3c98fb..9a90a8c9 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -16,7 +16,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "22" - uses: actions/checkout@v3 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 10d14a81..880fc1f8 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -26,7 +26,7 @@ jobs: - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: - node-version: "20.x" + node-version: "22" cache: "pnpm" - run: pnpm i @@ -66,7 +66,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "22" - uses: actions/checkout@v3 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 87f498b8..02e418d4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "22" - name: Build id: build @@ -39,7 +39,7 @@ jobs: id: extract-release-notes uses: ffurrer2/extract-release-notes@v1 with: - changelog_file: docs/changelog.md + changelog_file: docs/docs/changelog.md - name: Create Release id: create-release @@ -101,7 +101,7 @@ jobs: - name: Use Python uses: actions/setup-python@v3 with: - python-version: "3.11" + python-version: "3.12" - name: Install dependencies run: pip install -r requirements.txt diff --git a/.gitignore b/.gitignore index ab06dab0..c5925a2b 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,10 @@ tests/e2e/vault/ site/ venv/ .venv/ +docs/docs/en/media/~* +.obsidian/plugins/obsidian-spaced-repetition-beta/* # env env.sh + + diff --git a/.npmrc b/.npmrc index 4ae152d7..e546ce77 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1 @@ -use-node-version=20.1.0 +use-node-version=22.2.0 diff --git a/.prettierignore b/.prettierignore index 29152bc6..27851a3c 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,3 +6,4 @@ node_modules .pnp.loader.mjs pnpm-lock.yaml tests/e2e/vault/ +docs diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cc39a66..cb4f94f7 120000 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1 @@ -docs/changelog.md +docs/docs/changelog.md \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9815d5bd..54cb9a6d 120000 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1 @@ -docs/en/contributing.md +docs/docs/en/contributing.md \ No newline at end of file diff --git a/README.md b/README.md index d9d77df1..92e56bcd 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ This is a modified version of [obsidian-spaced-repetition](https://github.com/st - save on note file, just as used do. - save on seperate tracked_files.json. - setting convert tracked note to decks - - switch Algorithm(only work on saving on seperate tracked_files.json.): Default, anki, [Fsrs](https://github.com/open-spaced-repetition/fsrs.js) + - switch Algorithm(only work on saving on seperate tracked_files.json.): Default, anki, [Fsrs](https://github.com/open-spaced-repetition/ts-fsrs) - file menu to tracknote/untracknote - show floatbar for reviewing response when reviewing note by click statusbar or review command or sidebar, and can set whether showing the interval or not; - Reviewing a Notes directly [#635]; @@ -30,14 +30,14 @@ This is a modified version of [obsidian-spaced-repetition](https://github.com/st ## Maintainers Wanted -Since I am not a programmer, I don't know much about typescript programming, so I can only do some bug fixes and small feature updates. I can only do some bug fixes and small feature updates, but it is difficult to realize some of the proposed features. Welcome to join us if you are interested in this plugin, and work together to maintain and update this plugin. +Since I am not a programmer, I don't know much about typescript programming, so I can only do some bug fixes and small feature updates. but it is difficult to realize some of the proposed features. Welcome to join us if you are interested in this plugin, and work together to maintain and update this plugin. You can join us by submitting an [issue](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/issues)/[PR](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/pulls)、或[论坛讨论](https://forum-zh.obsidian.md/t/topic/20551) directly. ## How to install the plugin 1. Download main.js, manifest.json, styles.css from the latest release (see [releases](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/releases/)) -2. Create a new folder in `Vault-name/.obsidian/plugins` and put the downloaded files in there +2. Create a new folder `obsidian-spaced-repetition-recall` in `Vault-name/.obsidian/plugins` and put the downloaded files in there 3. Reload your plugins and enable the plugin OR USE BRAT pulgin; @@ -67,5 +67,5 @@ Thank you to everyone who has created a plugin that inspired me and I took code - first, thanks to [@st3v3nmw's obsidian-spaced-repetition](https://github.com/st3v3nmw/obsidian-spaced-repetition) and [@martin-jw recall plugin](https://github.com/martin-jw/obsidian-recall) - floatbar(thanks to [@chetachi's cMenu](https://github.com/chetachiezikeuzor/cMenu-Plugin)) -- [Fsrs Algorithm](https://github.com/open-spaced-repetition/fsrs.js) +- [Fsrs Algorithm](https://github.com/open-spaced-repetition) - ReleaseNotes(thanks to [@Zsolt Viczian Excalidraw](https://zsolt.blog)) diff --git a/docs/README_ZH.md b/docs/README_ZH.md index 0f201028..284a8804 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -10,7 +10,7 @@ 2. 在复习笔记时可以显示悬浮栏(跟复习卡片时类似),方便选择记忆效果,且可显隐到下次重复的时间间隔; 3. 可以只转换复习笔记到卡片组,而不是全部库的笔记都转换; 4. 在有多个标签时,可不用选标签,直接打开笔记; -5. 算法可以切换:默认的 Anki 优化算法、Anki 算法、[Fsrs 算法](https://github.com/open-spaced-repetition/fsrs.js); +5. 算法可以切换:默认的 Anki 优化算法、Anki 算法、[Fsrs 算法](https://github.com/open-spaced-repetition/ts-fsrs); 6. 使用 Fsrs 算法时,可根据标签输出重复日志文件 `ob_revlog.csv`,以使用[optimizer](https://github.com/open-spaced-repetition/fsrs-optimizer) 优化算法参数,达到更好的复习效果; 7. 数据表中新增笔记复习情况、当天复习情况; 8. 延后笔记/卡片; @@ -50,7 +50,7 @@ github: https://github.com/open-spaced-repetition/obsidian-spaced-repetition-rec 或: 1. 从[最新发布](https://github.com/open-spaced-repetition/obsidian-spaced-repetition-recall/releases/)中下载压缩包(已包括 main.js, manifest.json, styles.css); -2. 在 `Vault-name/.obsidian/plugins` 中,把刚下的文件解压(应是`obsidian-spaced-repetition-recall`文件夹)放入`plugins`文件夹下,; +2. 在 `Vault-name/.obsidian/plugins` 中,把刚下的文件解压(应是`obsidian-spaced-repetition-recall`文件夹)放入`plugins`文件夹下; 3. 重启 Obsidan 开启插件,就可以使用了。 ## Thanks @@ -72,5 +72,5 @@ Thank you to everyone who has created a plugin that inspired me and I took code - first, thanks to [@st3v3nmw's obsidian-spaced-repetition](https://github.com/st3v3nmw/obsidian-spaced-repetition) and [@martin-jw recall plugin](https://github.com/martin-jw/obsidian-recall) - floatbar(thanks to [@chetachi's cMenu](https://github.com/chetachiezikeuzor/cMenu-Plugin)) -- [Fsrs Algorithm](https://github.com/open-spaced-repetition/fsrs.js) +- [Fsrs Algorithm](https://github.com/open-spaced-repetition) - ReleaseNotes(thanks to [@Zsolt Viczian Excalidraw](https://zsolt.blog)) diff --git a/docs/assets/favicon.ico b/docs/docs/assets/favicon.ico similarity index 100% rename from docs/assets/favicon.ico rename to docs/docs/assets/favicon.ico diff --git a/docs/changelog.md b/docs/docs/changelog.md similarity index 96% rename from docs/changelog.md rename to docs/docs/changelog.md index 317abef2..01e7083a 100644 --- a/docs/changelog.md +++ b/docs/docs/changelog.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.12.5.10] + +- 同步原插件最新分支sync upsteam branch; +- fix #72 add setting for ignored Tags; +- fix #73 use fsrs v5 algorithm; +- setting UX change; + ## [1.12.4.9] - 同步原插件最新分支sync upsteam branch; @@ -195,10 +202,31 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fixed open the next note automatically after reviewing another [#582](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/582) - fixed sidebar doesn't show/update some files. [#393](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/393) -#### [Unreleased] +### [Unreleased] + +- [FIX] isEqualOrSubPath function [`#1048`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/1048) + +#### [1.12.5](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.12.4...1.12.5) + +- Support RTL flashcards specified by frontmatter "direction" attribute [`#935`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/935) +- FEAT-990 Mobile landscape mode and functional size sliders [`#998`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/998) +- [FIX] Cards missing when horizontal rule present in document [`#970`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/970) +- Filter due notes when all are scheduled [`#947`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/947) +- fix #1000 sidebar indent [`#1001`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/1001) +- [FIX] Include link parsing for Review context [`#964`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/964) +- [FIX] Not scroll back to top after review [`#971`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/971) +- [FIX] Folder ignore sorts all folder starting with string [`#972`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/972) +- add translation: zh-cn [`#982`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/982) +- Improved issue templates [`#963`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/963) +- Update German localization [`#961`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/961) +- Filter due notes when all are scheduled (#947) [`#548`](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/548) +- fix #1000 sidebar indent (#1001) [`#1000`](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/1000) #### [1.12.4](https://github.com/st3v3nmw/obsidian-spaced-repetition/compare/1.12.3...1.12.4) +> 20 April 2024 + +- Bump version to v1.12.4 [`#940`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/940) - chore: fix package manager issue in CI [`#939`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/939) - Missing flashcards (bug introduced in 1.12.0) [`#927`](https://github.com/st3v3nmw/obsidian-spaced-repetition/pull/927) diff --git a/docs/docs/en/algorithms.md b/docs/docs/en/algorithms.md new file mode 100644 index 00000000..89368b11 --- /dev/null +++ b/docs/docs/en/algorithms.md @@ -0,0 +1,64 @@ +# Learning Algorithms + +A learning algorithm is a formula that determines when a note or flashcard should next be reviewed. + +Algorithm | Status +- | - +[SM-2-OSR](#sm-2-osr) | Implemented +[FSRS](#fsrs) | Planned +[User Defined Intervals](#user-specified-intervals) | Planned + +## SM-2-OSR + +- The `SM-2-OSR` algorithm is a variant of [Anki's algorithm](https://faqs.ankiweb.net/what-spaced-repetition-algorithm.html) which is based on the [SM-2 algorithm](https://www.supermemo.com/en/archives1990-2015/english/ol/sm2). +- It supports ternary reviews i.e. a concept is either hard, good, or easy at the time of review. +- initial ease is weighted (using max_link_factor) depending on the average ease of linked notes, note importance, and the base ease. +- Anki also applies a small amount of random “fuzz” to prevent cards that were introduced at the same time and given the same ratings from sticking together and always coming up for review on the same day." +- The algorithm is essentially the same for both notes and flashcards - apart from the PageRanks + +### Algorithm Details + +!!! warning + + Note that this hasn't been updated in a while, + please see the [code](https://github.com/st3v3nmw/obsidian-spaced-repetition/blob/master/src/scheduling.ts). + +- `if link_count > 0: initial_ease = (1 - link_contribution) * base_ease + link_contribution * average_ease` + - `link_contribution = max_link_factor * min(1.0, log(link_count + 0.5) / log(64))` (cater for uncertainty) + - The importance of the different concepts/notes is determined using the PageRank algorithm (not all notes are created equal xD) + - On most occasions, the most fundamental concepts/notes have higher importance +- If the user reviews a concept/note as: + - easy, the ease increases by `20` and the interval changes to `old_interval * new_ease / 100 * 1.3` (the 1.3 is the easy bonus) + - good, the ease remains unchanged and the interval changes to `old_interval * old_ease / 100` + - hard, the ease decreases by `20` and the interval changes to `old_interval * 0.5` + - The `0.5` can be modified in settings + - `minimum ease = 130` + - For `8` or more days: + - `interval += random_choice({-fuzz, 0, +fuzz})` + - where `fuzz = ceil(0.05 * interval)` + - [Anki docs](https://faqs.ankiweb.net/what-spaced-repetition-algorithm.html): + > "[...] Anki also applies a small amount of random “fuzz” to prevent cards that were introduced at the same time and given the same ratings from sticking together and always coming up for review on the same day." +- The scheduling information is stored in the YAML front matter + +--- + + +## FSRS + +The algorithm is detailed at: +[fsrs4anki](https://github.com/open-spaced-repetition/fsrs4anki/wiki) + +Incorporation of the FSRS algorithm into this plugin has not yet occurred. For progress see: +[ [FEAT] sm-2 is outdated, can you please replace it with the fsrs algorithm? #748 ](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/748) + +--- + + +## User Specified Intervals + +This is the simplest "algorithm" possible. There are fixed intervals configured by the user for each of the possible review outcomes. + +For example, `hard` might be configured for an interval of 1 day. + +Implementation of this technique has not yet occurred. For progress see: +[ [FEAT] user defined "Easy, Good, Hard" values instead of or in addition to the algorithm defined one. #741 ](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/741) \ No newline at end of file diff --git a/docs/en/contributing.md b/docs/docs/en/contributing.md similarity index 93% rename from docs/en/contributing.md rename to docs/docs/en/contributing.md index bc89ca07..e948791b 100644 --- a/docs/en/contributing.md +++ b/docs/docs/en/contributing.md @@ -10,6 +10,21 @@ First off, thanks for wanting to contribute to the Spaced Repetition plugin! ## Translating +The plugin has been translated into the following languages by the Obsidian community 😄. + +- Arabic / العربية +- Chinese (Simplified) / 简体中文 +- Chinese (Traditional) / 繁體中文 +- Czech / čeština +- German / Deutsch +- Italian / Italiano +- Korean / 한국어 +- Japanese / 日本語 +- Polish / Polski +- Portuguese (Brazil) / Português do Brasil +- Spanish / Español +- Russian / русский + ### Steps To help translate the plugin to your language: @@ -56,6 +71,9 @@ Please note that: 1. Only the strings(templates) on the right of the key should be translated. 2. Text inside `${}` isn't translated. This is used to replace variables in code. For instance, if interval = 4, it becomes `4 days` in English & `Siku 4` in Swahili. Quite nifty if you ask me. +--- + + ## Code 1. Make your changes. @@ -77,7 +95,7 @@ Please note that: 5. If your "business logic" is properly decoupled from Obsidian APIs, write some unit tests. - This project uses [jest](https://jestjs.io/), tests are stored in `tests/`. - `pnpm test` -6. Add your change to the `[Unreleased]` section of the changelog (`docs/changelog.md`). +6. Add your change to the `[Unreleased]` section of the changelog (`docs/docs/changelog.md`). - The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), TL;DR: - `Added` for new features. - `Changed` for changes in existing functionality. @@ -91,6 +109,9 @@ Please note that: - Format the code in case any warnings are raised: `pnpm format` 8. Open the pull request. +--- + + ## Documentation The documentation consists of Markdown files which [MkDocs](https://www.mkdocs.org/) converts to static web pages. @@ -126,6 +147,9 @@ For larger diffs, it's important that you check how your docs look like as expla 3. Copy the files from the English (`en`) folder into the new folder. 4. Translate then open a pull request. +--- + + ## Maintenance ### Releases @@ -152,5 +176,3 @@ Example using `v1.9.2`: 6. Locally, switch back to `master` and pull the changes: `git switch master && git pull` 7. Create a git tag with the version: `git tag 1.9.2` 8. Push the tag: `git push --tags`.
You're all set! [This GitHub action](https://github.com/st3v3nmw/obsidian-spaced-repetition/blob/master/.github/workflows/release.yml) should pick it up, create a release, publish it, and update the live documentation. - -[^1]: Check the Obsidian Tasks project which has [excellent contribution guidelines](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/CONTRIBUTING.md). diff --git a/docs/docs/en/data-storage.md b/docs/docs/en/data-storage.md new file mode 100644 index 00000000..7cca855f --- /dev/null +++ b/docs/docs/en/data-storage.md @@ -0,0 +1,63 @@ +# Data Storage + +## Scheduling Information + +### Individual Markdown Files + +This is the original method used for storing the scheduling information for cards and notes. + +For cards this is stored in an HTML comment for that card. For example with the card: +``` +The RCU and WCU limits for a single partition key value::3000 RCU, 1000 WCU +``` + +When the card is reviewed, an HTML comment will be added after the card's text, such as: +``` + +``` + +By default, the comment is stored on the line following the card text. +Alternatively, it can be stored on the same line by enabling the +[Save scheduling comment on the same line as the flashcard's last line?](user-options.md#storage-of-scheduling-data) option. + +Scheduling information for the note is kept at the beginning of the file, in YAML format within the frontmatter section. +For example: + +![note-frontmatter](https://github.com/user-attachments/assets/b9744f50-c897-46ad-ab34-1bbc55796b57) + +!!! note "Raw text format" + --- + sr-due: 2024-07-01 + sr-interval: 3 + sr-ease: 269 + --- + +### Single Scheduling File + +The scheduling information for all cards and notes is kept in a single dedicated file. + +Implementation of this has not yet occurred. For progress see: + +[[FEAT] Stop using YAML; Move plugin info and data to separate file #162](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/162) + +--- + +## User Options + +All user [options](user-options.md) are stored in `data.json` in the plugin folder. + +--- + + + +## Card Postponement List + +This records a list of cards reviewed today that have sibling cards that shouldn't be reviewed until tomorrow. + +Cards are only added to this list if the [Bury sibling cards until the next day](user-options.md#flashcard-review) setting is turned on. + +This information is also kept in the `data.json` file. + +!!! note + + To minimise the space required for this, a copy of the card is not stored. Rather a small numeric hash code ("fingerprint") is kept. \ No newline at end of file diff --git a/docs/docs/en/flashcards/basic-cloze-cards.md b/docs/docs/en/flashcards/basic-cloze-cards.md new file mode 100644 index 00000000..031ee016 --- /dev/null +++ b/docs/docs/en/flashcards/basic-cloze-cards.md @@ -0,0 +1,110 @@ +# Basic Cloze Cards + +With [Single & Multiline Cards](../flashcards/qanda-cards.md) the text of both the front and back of each card is specified. + +With `cloze` cards a single text is specified, together with an identification of which parts of the text should be obscured. + +The front of the card is displayed as the text with (one or more) `cloze deletions` obscured. + +## Cloze Deletions + +A part of the card text is identified as a cloze deletion by surrounding it with the `cloze delimiter`. + +### Single Cloze Deletion +By default, the cloze delimiter is `==`, and a simple cloze card would be: +``` +The first female prime minister of Australia was ==Julia Gillard== +``` + +!!! note "Displayed when reviewed" +
+ + !!! tip "Initial View" + + The first female prime minister of Australia was [...] + + !!! tip "After `Show Answer` Clicked" + + The first female prime minister of Australia was Julia Gillard + +
+ + + +### Multiple Cloze Deletions +If the card text identifies multiple parts as cloze deletions, then multiple cards will be shown for review, each one occluding one deletion, while leaving the other deletions visible. + +For instance, the following note: +``` +The first female ==prime minister== of Australia was ==Julia Gillard== +``` + +!!! note "" +
+ + !!! tip "Card 1 Initial View" + + The first female [...] of Australia was Julia Gillard + + !!! tip "Card 2 Initial View" + + The first female prime minister of Australia was [...] + +
+ +!!! tip "After `Show Answer` Clicked (same for both cards)" + + The first female prime minister of Australia was Julia Gillard + +These two cards are considered sibling cards. See [sibling cards](flashcards-overview.md#sibling-cards) regarding the +[Bury sibling cards until the next day](../user-options.md#flashcard-review) scheduling option. + +## Cloze Delimiter + +The cloze delimiter can be modified in [settings](../user-options.md#flashcard-review), e.g. to `**`, or curly braces `{{text in curly braces}}`. + + + + +## Anki style + +!!! warning + Anki style `{{c1:This text}} would {{c2:generate}} {{c1:2 cards}}` cloze deletions are not currently supported. This feature is being tracked [here](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/93/). + diff --git a/docs/docs/en/flashcards/cards-with-blank-lines.md b/docs/docs/en/flashcards/cards-with-blank-lines.md new file mode 100644 index 00000000..fbf6a8fd --- /dev/null +++ b/docs/docs/en/flashcards/cards-with-blank-lines.md @@ -0,0 +1,60 @@ +# Including Blank Lines in Flashcards + +By default, [Multi-line Basic](qanda-cards.md#multi-line-basic), [Multi-line Bidirectional](qanda-cards.md#multi-line-bidirectional) +and [Cloze](basic-cloze-cards.md) type flashcards recognize a blank line as the end of the flashcard text. +This means that blank lines can not be included within the text. + +If blank lines need to be included (e.g. on a card containing a markdown table), the +`Characters denoting the end of clozes and multiline flashcards` [setting](../user-options.md#flashcard-separators) +needs to be changed. + +For example, it could be changed to `+++`. + +!!! warning "Global Edit Required" + Note that after changing this you have to manually edit any flashcards you already have. + +## Including a Table in the Flashcard Answer + +!!! note "Obsidian requires a blank line before a table for it to be displayed correctly." + Without it, Obsidian displays it just as text and not correctly formatted. + + ![table-with-no-preceding-blank-line](https://github.com/user-attachments/assets/daed1309-3b38-4d14-bb42-b302efda96df) + + And with a blank line after the `?` and before the table, it is displays correctly. + ![table-with-preceding-blank-line](https://github.com/user-attachments/assets/beef90b7-324e-4876-b10b-055a4d23d41f) + +However, by default a blank line signifies the end of the multiline card. + +To include the blank line, the +`Characters denoting the end of clozes and multiline flashcards` [setting](../user-options.md#flashcard-separators) +needs to be changed. Then that character sequence added as a line after the end of the flashcard text. For example: + +![table-with-preceding-blank-line+++](https://github.com/user-attachments/assets/954fd7fc-6d5f-4315-b40e-2192664c3962) + +Now the card is displayed correctly during a review. + +![table-with-preceding-blank-line-review](https://github.com/user-attachments/assets/3bff8d25-f91f-4bc0-b922-7471d6b60869) + +## Including Blank Lines in a Cloze Flashcard + +With `Convert ==highlights== to clozes` enabled in [settings](../user-options.md#flashcard-separators) +and the `Characters denoting the end of clozes and multiline flashcards` set to `+++`, +we can have blank lines in a cloze flashcard. E.g. + +![cloze-with-blank-lines](https://github.com/user-attachments/assets/f9d6f123-3378-41cb-9c93-2b061856c81d) + +As there are 3 clozes defined, three separate cards will be generated for review. +One card, for example is: + +![cloze-with-blank-lines-front1](https://github.com/user-attachments/assets/6b939d46-b93a-4a67-96d4-6985ccafb76e) + +And after `Show Answer` is clicked, the following is displayed: + +![cloze-with-blank-lines-answer](https://github.com/user-attachments/assets/225abd90-20a4-4e29-abb3-36beb61388d7) + +## Limitation + +### Blank Lines in Answer Side Only + +Blank lines are only supported in the answer side of a multiline flashcard, and not in the question side. + diff --git a/docs/docs/en/flashcards/decks.md b/docs/docs/en/flashcards/decks.md new file mode 100644 index 00000000..b655d875 --- /dev/null +++ b/docs/docs/en/flashcards/decks.md @@ -0,0 +1,79 @@ +# Organizing into Decks + +![flashcard-decks-1](https://github.com/user-attachments/assets/a207b0f6-b064-443c-9c55-540681b10891) + + +## Using Obsidian Tags + +1. Specify flashcard tags in settings (`#flashcards` is the default). +2. Tag any notes that you'd like to put flashcards using said tags. + +### Hierarchical Tags + +Note that `#flashcards` will match nested tags like `#flashcards/subdeck/subdeck`. + +### Multiple Tags Within a Single File + +A single file can contain cards for multiple different decks. + +This is possible because a tag pertains to all subsequent cards in a file until any subsequent tag. + +For example: + +```markdown +#flashcards/deckA +Question1 (in deckA)::Answer1 +Question2 (also in deckA)::Answer2 +Question3 (also in deckA)::Answer3 + +#flashcards/deckB +Question4 (in deckB)::Answer4 +Question5 (also in deckB)::Answer5 + +#flashcards/deckC +Question6 (in deckC)::Answer6 +``` + +### A Single Card Within Multiple Decks + +Usually the content of a card is only relevant to a single deck. However, sometimes content doesn't fall neatly into a single deck of the hierarchy. + +In these cases, a card can be tagged as being part of multiple decks. The following card is specified as being in the three different decks listed. + +```markdown +#flashcards/language/words #flashcards/trivia #flashcards/learned-from-tv +A group of cats is called a::clowder +``` + +Note that as shown in the above example, all tags must be placed on the same line, separated by spaces. + +### Question Specific Tags + +A tag that is present at the start of the first line of a card is "question specific", and applies only to that card. + +For example: + +```markdown +#flashcards/deckA +Question1 (in deckA)::Answer1 +Question2 (also in deckA)::Answer2 +Question3 (also in deckA)::Answer3 + +#flashcards/deckB Question4 (in deckB)::Answer4 + +Question6 (in deckA)::Answer6 +``` + +Here `Question6` will be part of `deckA` and not `deckB` as `deckB` is specific to `Question4` only. + +--- + + +## Using Folder Structure + +The plugin will automatically search for folders that contain flashcards & use their paths to create decks & sub-decks + +e.g. `Folder/sub-folder/sub-sub-folder` ⇔ `Deck/sub-deck/sub-sub-deck`. + +This is an alternative to the tagging option and can be enabled in [settings](../user-options.md#tags--folders). + diff --git a/docs/docs/en/flashcards/flashcards-overview.md b/docs/docs/en/flashcards/flashcards-overview.md new file mode 100644 index 00000000..d2f4467e --- /dev/null +++ b/docs/docs/en/flashcards/flashcards-overview.md @@ -0,0 +1,97 @@ +# Flashcard Introduction + +Flashcards are defined within standard Obsidian markdown files. + +A markdown file containing flashcards must identify the [deck](decks.md) (or decks) into which the flashcards are placed. +However, the file does not need to be tagged as a [note](../notes.md) for it to have flashcards defined. + +Two types of flashcards are supported: + +
+ +!!! note "Question & Answer" + + [Question & Answer](qanda-cards.md) flashcards are ones where the flashcard text contains both the question text and answer text. + +
+ ![flashcard-qanda-example](https://github.com/user-attachments/assets/65639d80-b249-4b16-ae40-c2af011c6aab) + +!!! note "Cloze" + + [Cloze](basic-cloze-cards.md) flashcards are ones where the flashcard text identifies parts of the text (e.g. a word or phrase) that is hidden + when the front of the card is shown.
+ The hidden text is known as a `cloze deletion`. +
+ ![flashcard-cloze-example](https://github.com/user-attachments/assets/9fb12f2e-9b81-45d9-9097-7f1e3d97ae5a) +
+ +!!! tip + For guidelines on how to write and structure flashcards, see [Spaced Repetition Guides]( ../resources.md#flashcards) + +--- + +## Flashcard Text, Flashcards and Cards + +!!! note + For simplicity `flashcard text` is sometimes written just as `flashcard` +The `flashcard text` is text that defines the type and content of a card (or a set of related, `sibling` cards). + +### Single flashcard, multiple cards + +For some flashcard types, the flashcard text defines a single card. For other flashcard types, multiple +cards are defined. + +Flashcard Type | Cards Defined +- | - +[Single-line Basic](qanda-cards.md#single-line-basic) | flashcard defines the front and back of a single card. +[Single-line Bidirectional](qanda-cards.md#single-line-bidirectional) | flashcard defines two cards. +[Multi-line Basic](qanda-cards.md#multi-line-basic) | flashcard defines the front and back of a single card. +[Multi-line Bidirectional](qanda-cards.md#multi-line-bidirectional) | flashcard defines two cards. +[Cloze](basic-cloze-cards.md) | flashcard defines multiple cards, the number of cards based on the number of cloze deletions. + +### Sibling Cards + +If there are multiple cards defined by a single flashcard, those cards are known as `sibling` cards. + +A special scheduling option is available for the review of sibling cards. If the [Bury sibling cards until the next day]( ../user-options.md#flashcard-review) setting is turned on, +only one sibling card is available for review on a single day. + +### Including Blank Lines within Multiline and Cloze Flashcards + +By default, the end of a multiline flashcard is denoted by a blank line at the end of the flashcard text. +This means that blank lines can not be included within the text. + +See [Cards with Blank Lines](cards-with-blank-lines.md) if blank lines need to be included. + +--- + + +## RTL Support + +There are two ways that the plugin can be used with RTL languages, such as Arabic, Hebrew, Persian (Farsi). + +If all cards are in a RTL language, then simply enable the global Obsidian option `Editor → Right-to-left (RTL)`. + +If all cards within a single note have the same LTR/RTL direction, then frontmatter can be used to specify the text direction. For example: + +``` +--- +direction: rtl +--- +``` + +This is the same way text direction is specified to the `RTL Support` plugin. + +Note that there is no current support for cards with different text directions within the same note. + +--- + +## Card Maintenance + +### Deleting cards + +To delete a card, simply delete the scheduling information & the card text. + +### Ignoring cards + +You can wrap flashcards in HTML comments e.g. ` -->` to prevent it from showing up in your review queues. You can always remove the wrapping comment later. diff --git a/docs/docs/en/flashcards/qanda-cards.md b/docs/docs/en/flashcards/qanda-cards.md new file mode 100644 index 00000000..03dc6bfe --- /dev/null +++ b/docs/docs/en/flashcards/qanda-cards.md @@ -0,0 +1,167 @@ +# Question & Answer Cards + +!!! note + + Cards must be assigned to a deck, either using an Obsidian tag such as `#flashcard` or by using the + folder structure within the vault. + + See [Decks](decks.md) for further details. + + + +## Single-line Basic + +The prompt and the answer are separated by `::` (this can be configured in [settings]( ../user-options.md#flashcard-separators)). + +```markdown +the question goes on this side::answer goes here! +``` + +!!! note "Displayed when reviewed" + +
+ + !!! tip "Card Front" + + the question goes on this side + + !!! tip "Card Back" + + answer goes here! + +
+ +## Single-line Bidirectional + +Two cards are created from the single flashcard text. + +The two parts are separated by `:::` (this can be configured in [settings]( ../user-options.md#flashcard-separators)). + +For example: + +```markdown +info 1:::info 2 +``` + +!!! note "Card 1" +
+ + !!! tip "Front" + + info 1 + + !!! tip "Back" + + info 2 + +
+ +!!! note "Card 2" +
+ !!! tip "Front" + + info 2 + + !!! tip "Back" + + info 1 + +
+ +These two cards are considered sibling cards. See [sibling cards](flashcards-overview.md#sibling-cards) regarding the +[Bury sibling cards until the next day](../user-options.md#flashcard-review) scheduling option. + +--- + +## Multi-line Basic + +The front and the back of the card are separated by `?` (this can be configured in [settings]( ../user-options.md#flashcard-separators)). + +```markdown +As per the definition +of "multiline" the prompt +can be on multiple lines +? +same goes for +the answer +``` + +!!! note "Displayed when reviewed" +
+ + !!! tip "Card Front" + + As per the definition
+ of "multiline" the prompt
+ can be on multiple lines + + !!! tip "Card Back" + + same goes for
+ the answer + +
+ + +These can also span over multiple lines as long as both sides "touch" the `?`. + +See [Cards with Blank Lines](cards-with-blank-lines.md) if blank lines need to be included. + + + +--- + + +## Multi-line Bidirectional + +Two cards are created from the single flashcard text. + +The two parts are separated by `??` (this can be configured in [settings]( ../user-options.md#flashcard-separators)). + +For example: + +```markdown +info 1A +info 1B +info 1C +?? +info 2A +info 2B +``` + +These can also span over multiple lines as long as both sides "touch" the `??`: +To include blank lines, see the section below. + +!!! note "Card 1" +
+ + !!! tip "Front" + + info 1A
+ info 1B
+ info 1C + + !!! tip "Back" + + info 2A
+ info 2B + +
+ +!!! note "Card 2" +
+ !!! tip "Front" + + info 2A
+ info 2B + + !!! tip "Back" + + info 1A
+ info 1B
+ info 1C + +
+ +These two cards are considered sibling cards. See [sibling cards](flashcards-overview.md#sibling-cards) regarding the +[Bury sibling cards until the next day]( ../user-options.md#flashcard-review) scheduling option. diff --git a/docs/docs/en/flashcards/reviewing.md b/docs/docs/en/flashcards/reviewing.md new file mode 100644 index 00000000..fa134bb9 --- /dev/null +++ b/docs/docs/en/flashcards/reviewing.md @@ -0,0 +1,116 @@ +# Reviewing & Cramming + +A key part of spaced repetition learning is being shown the front of cards to test whether or not you recall the information on the back. There are two similar functions that perform this – [reviewing](#reviewing) & [cramming](#cramming). + +
+!!! tip "Reviewing" + + For the selected deck, you are only shown
+ :material-circle-medium: new cards (i.e. ones that have never been reviewed before) as well as
+ :material-circle-medium: due cards (those that the [algorithm](../algorithms.md) has decided it's time to review) + +!!! tip "Cramming" + + You are shown every single card in the selected deck/note, even those that have recently been reviewed. + +
+ +## Common Features of Reviewing & Cramming + +### Deck Selection + +Although you may want to review or cram all cards across all decks, you often may wish to do so on only a subset of decks. + +![flashcard-decks-1](https://github.com/user-attachments/assets/a207b0f6-b064-443c-9c55-540681b10891) + +!!! note "All subdecks included" + + For example, clicking on the `course` deck will also include all cards within the `aws` + and `developer-associate` decks. + +### Operation + + +![review-operation](https://github.com/user-attachments/assets/d8f438dc-f1f0-43c4-a752-a5eeb64346e4) + +!!! note "" + # | Name | Description + - | - | - + 1 | Edit | Edit the flashcard text + 2 | Reset | Reset the review schedule information - the review interval is set to 1 day, and the ease is set to the default value + 3 | Info | Shows the scheduling information for the card + 4 | Skip | Skip the current card without reviewing + +### Context + +If the parent note has heading(s), the flashcard will have a title containing the context. + + +Taking the following note: + +```markdown +#flashcards + +# Trivia + +## Capitals + +### Africa + +Kenya::Nairobi + +### North America + +Canada::Ottawa +``` +!!! tip "Context displayed" + ![reviewing-context](https://github.com/user-attachments/assets/2ccfc23a-a106-4133-91ec-8bd0efd0e372) + + + + +!!! note + Context is only shown if enabled in [UI Preferences](../user-options.md#ui-preferences) + +### Keyboard shortcuts + +To review faster, use the following keyboard shortcuts: + +- `Space/Enter` => Show answer +- `0` => Reset card's progress (Sorta like `Again` in Anki) +- `1` => Review as `Hard` +- `2` => Review as `Good` +- `3` => Review as `Easy` + +--- + +## Reviewing + +Once done creating cards, click on the flashcards button on the left ribbon to start reviewing the flashcards. After a card is reviewed, a HTML comment is added containing the next review day, the interval, and the card's ease. + +``` + +``` + +Wrapping in a HTML comment makes the scheduling information not visible in the notes preview. For single-line cards, you can choose whether you want the HTML comment on the same line or on a separate line in the settings. Putting them on the same line prevents breaking of list structures in the preview or after auto-formatting. + +Note that you can skip a card by simply pressing `S` (case doesn't matter). + +!!! tip + + If you're experiencing issues with the size of the modal on mobile devices, + go to [settings](../user-options.md#ui-preferences) and set the _Flashcard Height Percentage_ and _Flashcard Width Percentage_ + to 100% to maximize it. + +--- + +## Cramming + +You are shown every single card, even those that have recently been reviewed. +By using the appropriate [command](../plugin-commands.md) have the choice of cramming cards: + +Cards | Command +- | - +Within a single note | `Spaced Repetition: Cram flashcards in this note` +Within a deck (including all subdecks) | `Spaced Repetition: Select a deck to cram note` + diff --git a/docs/docs/en/flashcards/statistics.md b/docs/docs/en/flashcards/statistics.md new file mode 100644 index 00000000..7ed5fb82 --- /dev/null +++ b/docs/docs/en/flashcards/statistics.md @@ -0,0 +1,21 @@ +## Statistics + +The statistics section can be accessed using the `View Statistics` command. + +### Forecast + +Stats on the number of cards due in the future. + + + +### Intervals + +Stats on delays until cards are shown again. + +### Eases + +Stats on card eases. + +### Card Types + +Stats on card types: New, Young, Mature (Have intervals more than 1 month). diff --git a/docs/docs/en/index.md b/docs/docs/en/index.md new file mode 100644 index 00000000..30204ca6 --- /dev/null +++ b/docs/docs/en/index.md @@ -0,0 +1,78 @@ +# Obsidian Spaced Repetition + + + +Fight the forgetting curve by reviewing flashcards & notes using spaced repetition on Obsidian.md + + +
+ +!!! tip "Getting started" + + :material-circle-medium: View the [quick demo](index.md#quick-demo) below
+ :material-circle-medium: [Plugin installation](index.md#installation)
+ :material-circle-medium: General [guidelines & tips](resources.md) about spaced repetition learning. + +!!! tip "Features" + + :material-circle-medium: [Flashcards](flashcards/flashcards-overview.md)     :material-circle-medium: [Notes](notes.md)
+ :material-circle-medium: [User Options](user-options.md)     :material-circle-medium: [Commands](plugin-commands.md) +
+ :material-circle-medium: [Repetition Algorithms](algorithms.md)     :material-circle-medium: [Data Storage](data-storage.md) + + +!!! tip "Help & Support" + + :material-circle-medium: Visit the [discussions](https://github.com/st3v3nmw/obsidian-spaced-repetition/discussions/) section for Q&A help, feedback, and general discussion.
+ :material-circle-medium: Raise an issue [here](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/) if you have a feature request or a bug-report. + +!!! tip "Contributing" + :material-circle-medium: The plugin has been translated into over [10 languages](contributing.md#translating) by the Obsidian community 😄. To help translate this plugin to your language, check the [translation guide here](contributing.md#translating).
+ :material-circle-medium: Software developers can contribute [feature enhancements and bug fixes](contributing.md#code) +
+ + +--- + + +## Quick Demo + + +![user-interface-overview](https://github.com/user-attachments/assets/977bab30-cc5e-4b5c-849e-3881d82b3f8e) + + +!!! note "" + + 1. Display the [Note Review Queue](notes.md#note-review-queue)
+ 2. Note review queue
+ 3. Display the Obsidian command dialog to access the plugin [commands](plugin-commands.md)
+ 4. `Flashcard Review Icon` Select a flashcard [deck](flashcards/reviewing.md#deck-selection) to [review](flashcards/reviewing.md#reviewing)
+ 5. Identify that flashcards within this note are in the `#flashcards/science/physics` [deck](flashcards/decks.md#using-obsidian-tags)
+ 6. A [single line question](flashcards/qanda-cards.md#single-line-basic) (identified by the `::` separating the question and answer)
+ 7. The plugin stores scheduling info within this [HTML comment](data-storage.md#individual-markdown-files)
+ 8. `Spaced Repetition Status Area` The number of notes and flashcards currently due for review. Click to [open a note for review](notes.md#selecting-a-note-for-review). + + + + +--- + + +## Installation + +You can easily install the plugin from Obsidian's community plugin section in the Obsidian app (Search for `Spaced Repetition`). + +### Manual Installation + +!!! note "Advanced" + Create an `obsidian-spaced-repetition` folder under `.obsidian/plugins` in your vault. Add the `main.js`, `manifest.json`, and the `styles.css` files from the [latest release](https://github.com/st3v3nmw/obsidian-spaced-repetition/releases) to the folder. + +--- + +## Support + +Buy Me a Coffee at ko-fi.com + +JetBrains Logo (Main) logo. diff --git a/docs/docs/en/notes.md b/docs/docs/en/notes.md new file mode 100644 index 00000000..b702460e --- /dev/null +++ b/docs/docs/en/notes.md @@ -0,0 +1,87 @@ +# Notes + +!!! tip + For guidelines on how to write and structure notes, see [Spaced Repetition Guides](resources.md#notes) + +## Getting started + + +Tag any markdown files for review with the `note review` tag, which by default is `#review`. + +The note will appear under `New` in the `Note Review Queue` in the right pane. + +!!! note + When you tag a note with `#review` the note doesn't immediately appear in the review queue. + You will need to first click on the `Flashcard Review Icon` or the `Spaced Repetition Status Area` + for the queue to update + +## Note Review Queue + +![note-review-queue](https://github.com/user-attachments/assets/c0e1d09c-610f-4775-b532-ab78369b117a) + +!!! note "" + + 1. The Note Review Queue
+ 2. The `Note Review Deck` for tag `#review`
+ 3. The new notes - i.e. those tagged with `#review` but have yet to be reviewed
+ 4. The notes scheduled for review on August 1
+ 5. The notes scheduled for review on August 31
+ +### Displaying the Note Review Queue + +By default, the Note Review Queue is displayed when the plugin starts. This can be changed with +the `Enable note review pane on startup` [setting](user-options.md#note-settings). + +The Note Review Queue can also be shown by using the `Open Notes Review Queue in sidebar` +[command](plugin-commands.md). + +## Reviewing + +Open a file, read & review it. Once done, choose either the `Review: Easy`, `Review: Good`, or the `Review: Hard` option on the file menu (the three dots). Select `Easy`, `Good`, or `Hard` depend on how well you comprehend the material being reviewed. + +![file-three-dots-menu](https://github.com/user-attachments/assets/5f37ab88-30f9-477d-b39c-eb86ba15abdb) + +Alternatively, you can right click on the file within the note review queue, and access the same options: + +![note-review-queue-context-menu](https://github.com/user-attachments/assets/d4affa19-5126-45f8-bf3c-0079d2a8a597) + +The note will then be scheduled appropriately by the [learning algorithm](algorithms.md), and the markdown file updated: + +![note-frontmatter](https://github.com/user-attachments/assets/b9744f50-c897-46ad-ab34-1bbc55796b57) + +### Keyboard Shortcuts + +The `Easy`, `Good`, and `Hard` review result can also be selected from the plugin's [command list](plugin-commands.md). + +This is less practical than the methods described above, but does enable the definition of keyboard shortcuts. +You can create custom hotkeys for the review result in `Settings -> HotKeys`. + +### Selecting a Note for Review + +There are a few ways to open a note for review: + +- Open a note via the standard Obsidian features +- Double click on a note title from the Note Review Queue +- Click on the `Spaced Repetition Status Area` in the status bar at the bottom of the screen +- Select the command [Open a note to review review](plugin-commands.md) + +There are also the following relevant options: + +- [Open a random note for review](user-options.md) +- [Open next note automatically after a review](user-options.md) + +## Multiple Note Review Decks + +By default, there is a single review deck called `#review`. + +This default tag can be changed in the [settings](user-options.md#note-settings). Multiple review decks can also be specified. + +## Spaced Repetition Status Area + +`Review: N note(s)` on the status bar at the bottom of the screen shows how many notes one has to review today (Today's notes + overdue notes). + +Clicking on that opens one of the notes for review. + + + + diff --git a/docs/docs/en/plugin-commands.md b/docs/docs/en/plugin-commands.md new file mode 100644 index 00000000..790947f9 --- /dev/null +++ b/docs/docs/en/plugin-commands.md @@ -0,0 +1,4 @@ +# Plugin Commands + +![plugin-commands](https://github.com/user-attachments/assets/4838812c-121b-4bd1-82b3-46138b2ae67f) + diff --git a/docs/docs/en/resources.md b/docs/docs/en/resources.md new file mode 100644 index 00000000..160a9395 --- /dev/null +++ b/docs/docs/en/resources.md @@ -0,0 +1,46 @@ +# Spaced Repetition Resources + +## General + +- [How to Remember Anything Forever-Ish by Nicky Case](https://ncase.me/remember/) +- [Spaced Repetition for Efficient Learning by Gwern](https://www.gwern.net/Spaced-repetition/) +- [20 rules of knowledge formulation by Dr. Piotr Wozniak](https://supermemo.guru/wiki/20_rules_of_knowledge_formulation) is a great introduction on proper flashcard creation. + +--- + +## Flashcards + +- [PRODUCTIVELY Learning New Things Using Obsidian by @FromSergio :fontawesome-brands-youtube:{ .youtube } ](https://youtu.be/DwSNZEW6jCU) + +--- + +## Notes +- Notes should be atomic i.e. focus on a single concept. +- Notes should be highly linked. +- Reviews should start only after properly understanding a concept. +- Reviews should be [Feynman-technique](https://fs.blog/2021/02/feynman-learning-technique/)-esque. + +### Incremental Writing + + +- English: [Obsidian: inbox review with spaced repetition by @aviskase :fontawesome-brands-youtube:{ .youtube } ](https://youtu.be/zG5r7QIY_TM) +- Russian / русский: [Разгребатель инбокса заметок как у Andy Matuschak в Obsidian by @YuliyaBagriy_ru :fontawesome-brands-youtube:{ .youtube } ](https://youtu.be/CF6SSHB74cs) + +!!! bug "Improvement Needed" + Extract anything important from the reference and include here instead + +This was introduced [here](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/15) by `@aviskase`. + +### Brief summary + +Andy Matuschak uses [spaced repetition system for working on writing inbox](https://notes.andymatuschak.org/z7iCjRziX6V6unNWL81yc2dJicpRw2Cpp9MfQ). + +!!! bug "Improvement Needed" + What does this mean? + +In short, there are four possible actions (where `x < y`): + +- skip note (increase interval for `x`) == mark as `good` +- work on it, mark as fruitful work (decrease interval) == mark as `hard` +- work on it, mark as unfruitful work (increase interval for `y`) == mark as `easy` +- convert to evergreen note (stop using the space-repetition prompts) diff --git a/docs/docs/en/user-options.md b/docs/docs/en/user-options.md new file mode 100644 index 00000000..2b23dcf2 --- /dev/null +++ b/docs/docs/en/user-options.md @@ -0,0 +1,32 @@ +# User Options + +## Flashcard Settings + +### Tags & Folders + +![flashcard-settings-tag-folders.jpg](https://github.com/user-attachments/assets/34baba63-8439-4f31-b07b-e8f62671b621) + +### Flashcard Review + +![flashcard-settings-review.jpg](https://github.com/user-attachments/assets/fe81f6a8-e333-4894-b6cd-db68e1ae6f86) + +### Flashcard Separators + +![flashcard-settings-separators](https://github.com/user-attachments/assets/744aea85-fdb3-4508-b532-7a551253f97d) + +### Storage of Scheduling Data + +![flashcard-settings-scheduling-data](https://github.com/user-attachments/assets/200bb976-c631-4d73-82a5-12ba7e140339) + +--- + +## Note Settings + +![settings-notes](https://github.com/user-attachments/assets/75f7a55a-933f-436f-868a-efb622cc0f9c) + +--- + +## UI Preferences + +![settings-ui-preferences](https://github.com/user-attachments/assets/c0740fa0-02b5-4db9-9d81-94f0ae29ab6c) + diff --git a/docs/license.md b/docs/docs/license.md similarity index 96% rename from docs/license.md rename to docs/docs/license.md index 679a294e..2c2a211a 100644 --- a/docs/license.md +++ b/docs/docs/license.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 - 2023 Stephen Mwangi +Copyright (c) 2021 - 2024 Stephen Mwangi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/docs/docs/stylesheets/extra.css b/docs/docs/stylesheets/extra.css new file mode 100644 index 00000000..b0367f12 --- /dev/null +++ b/docs/docs/stylesheets/extra.css @@ -0,0 +1,16 @@ +.youtube { + color: #EE0F0F; +} + + +hr { + border: none !important; + height: 4px; + background-color: #333; +} + +.thin { + border: none !important; + height: 1px; +} + diff --git a/docs/zh/algorithms.md b/docs/docs/zh/algorithms.md similarity index 100% rename from docs/zh/algorithms.md rename to docs/docs/zh/algorithms.md diff --git a/docs/zh/contributing.md b/docs/docs/zh/contributing.md similarity index 97% rename from docs/zh/contributing.md rename to docs/docs/zh/contributing.md index bc89ca07..1bdd584a 100644 --- a/docs/zh/contributing.md +++ b/docs/docs/zh/contributing.md @@ -77,7 +77,7 @@ Please note that: 5. If your "business logic" is properly decoupled from Obsidian APIs, write some unit tests. - This project uses [jest](https://jestjs.io/), tests are stored in `tests/`. - `pnpm test` -6. Add your change to the `[Unreleased]` section of the changelog (`docs/changelog.md`). +6. Add your change to the `[Unreleased]` section of the changelog (`docs/docs/changelog.md`). - The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), TL;DR: - `Added` for new features. - `Changed` for changes in existing functionality. @@ -152,5 +152,3 @@ Example using `v1.9.2`: 6. Locally, switch back to `master` and pull the changes: `git switch master && git pull` 7. Create a git tag with the version: `git tag 1.9.2` 8. Push the tag: `git push --tags`.
You're all set! [This GitHub action](https://github.com/st3v3nmw/obsidian-spaced-repetition/blob/master/.github/workflows/release.yml) should pick it up, create a release, publish it, and update the live documentation. - -[^1]: Check the Obsidian Tasks project which has [excellent contribution guidelines](https://github.com/obsidian-tasks-group/obsidian-tasks/blob/main/CONTRIBUTING.md). diff --git a/docs/zh/flashcards.md b/docs/docs/zh/flashcards.md similarity index 100% rename from docs/zh/flashcards.md rename to docs/docs/zh/flashcards.md diff --git a/docs/zh/index.md b/docs/docs/zh/index.md similarity index 100% rename from docs/zh/index.md rename to docs/docs/zh/index.md diff --git a/docs/zh/notes.md b/docs/docs/zh/notes.md similarity index 100% rename from docs/zh/notes.md rename to docs/docs/zh/notes.md diff --git a/docs/en/algorithms.md b/docs/en/algorithms.md deleted file mode 100644 index e2fcc8e9..00000000 --- a/docs/en/algorithms.md +++ /dev/null @@ -1,30 +0,0 @@ -# Algorithms - -## SM-2 - -!!! warning - - Note that this hasn't been updated in a while, - please see the [code](https://github.com/st3v3nmw/obsidian-spaced-repetition/blob/master/src/scheduling.ts). - -(It's the same as that used for flashcards - apart from the PageRanks) - -- The algorithm is a variant of [Anki's algorithm](https://faqs.ankiweb.net/what-spaced-repetition-algorithm.html) which is based on the [SM-2 algorithm](https://www.supermemo.com/en/archives1990-2015/english/ol/sm2). -- It supports ternary reviews i.e. a concept is either hard, good, or easy at the time of review. -- initial ease is weighted (using max_link_factor) depending on the average ease of linked notes, note importance, and the base ease. - - `if link_count > 0: initial_ease = (1 - link_contribution) * base_ease + link_contribution * average_ease` - - `link_contribution = max_link_factor * min(1.0, log(link_count + 0.5) / log(64))` (cater for uncertainty) - - The importance of the different concepts/notes is determined using the PageRank algorithm (not all notes are created equal xD) - - On most occasions, the most fundamental concepts/notes have higher importance -- If the user reviews a concept/note as: - - easy, the ease increases by `20` and the interval changes to `old_interval * new_ease / 100 * 1.3` (the 1.3 is the easy bonus) - - good, the ease remains unchanged and the interval changes to `old_interval * old_ease / 100` - - hard, the ease decreases by `20` and the interval changes to `old_interval * 0.5` - - The `0.5` can be modified in settings - - `minimum ease = 130` - - For `8` or more days: - - `interval += random_choice({-fuzz, 0, +fuzz})` - - where `fuzz = ceil(0.05 * interval)` - - [Anki docs](https://faqs.ankiweb.net/what-spaced-repetition-algorithm.html): - > "[...] Anki also applies a small amount of random “fuzz” to prevent cards that were introduced at the same time and given the same ratings from sticking together and always coming up for review on the same day." -- The scheduling information is stored in the YAML front matter diff --git a/docs/en/flashcards.md b/docs/en/flashcards.md deleted file mode 100644 index afabfdc2..00000000 --- a/docs/en/flashcards.md +++ /dev/null @@ -1,241 +0,0 @@ -# Flashcards - -## Creating - -[Piotr Wozniak's 20 rules of knowledge formulation](https://supermemo.guru/wiki/20_rules_of_knowledge_formulation) is a great introduction on proper flashcard creation. - -### Single-line Basic (Remnote style) - -The prompt and the answer are separated by `::` (this can be configured in settings). - -```markdown -the question goes on this side::answer goes here! -``` - -### Single-line Reversed - -Creates two cards `side1:::side2` & the reversed version `side2:::side1`. - -The prompt and the answer are separated by `:::` (this can be configured in settings). - -```markdown -the question goes on this side:::answer goes here! -``` - -Note: In the first review, the plugin will show non-reversed card and reversed card. -If **Bury sibling cards until the next day?** turn on, only non-reversed card will appear. - -### Multi-line Basic - -The front and the back of the card are separated by `?` (this can be configured in settings). - -```markdown -Front of multiline -? -Backside of multiline card -``` - -These can also span over multiple lines as long as both sides "touch" the `?`: - -```markdown -As per the definition -of "multiline" the prompt -can be on multiple lines -? -same goes for -the answer -``` - -### Multi-line Reversed - -Creates two cards `side1??side2` & the reversed version `side2??side1`. - -The front and the back of the card are separated by `??` (this can be configured in settings). - -```markdown -Front of multiline -?? -Backside of multiline card -``` - -These can also span over multiple lines as long as both sides "touch" the `??`: - -```markdown -As per the definition -of "multiline" the prompt -can be on multiple lines -?? -same goes for -the answer -``` - -Note: The behaviour is same as single line reversed. - -### Cloze cards - -You can easily add cloze deletion cards using `==highlights==`, `**bolded text**`, or `{{text in curly braces}}`. - -These can be turned on or off in settings. - -Anki style `{{c1:This text}} would {{c2:generate}} {{c1:2 cards}}` cloze deletions are not currently supported. This feature is being tracked [here](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/93/). - -## Decks - -![Screenshot from 2021-06-05 19-28-24](https://user-images.githubusercontent.com/43380836/120922211-78603400-c6d0-11eb-9d09-bdd5df1c9112.png) - -The green and blue counts on the right of each deck name represent due and new cards respectively. - -### Using Obsidian Tags - -1. Specify flashcard tags in settings (`#flashcards` is the default). -2. Tag any notes that you'd like to put flashcards using said tags. - -#### Hierarchical Tags - -Note that `#flashcards` will match nested tags like `#flashcards/subdeck/subdeck`. - -#### Multiple Tags Within a Single File - -A single file can contain cards for multiple different decks. - -This is possible because a tag pertains to all subsequent cards in a file until any subsequent tag. - -For example: - -```markdown -#flashcards/deckA -Question1 (in deckA)::Answer1 -Question2 (also in deckA)::Answer2 -Question3 (also in deckA)::Answer3 - -#flashcards/deckB -Question4 (in deckB)::Answer4 -Question5 (also in deckB)::Answer5 - -#flashcards/deckC -Question6 (in deckC)::Answer6 -``` - -#### A Single Card Within Multiple Decks - -Usually the content of a card is only relevant to a single deck. However, sometimes content doesn't fall neatly into a single deck of the hierarchy. - -In these cases, a card can be tagged as being part of multiple decks. The following card is specified as being in the three different decks listed. - -```markdown -#flashcards/language/words #flashcards/trivia #flashcards/learned-from-tv -A group of cats is called a::clowder -``` - -Note that as shown in the above example, all tags must be placed on the same line, separated by spaces. - -#### Question Specific Tags - -A tag that is present at the start of the first line of a card is "question specific", and applies only to that card. - -For example: - -```markdown -#flashcards/deckA -Question1 (in deckA)::Answer1 -Question2 (also in deckA)::Answer2 -Question3 (also in deckA)::Answer3 - -#flashcards/deckB Question4 (in deckB)::Answer4 - -Question6 (in deckA)::Answer6 -``` - -Here `Question6` will be part of `deckA` and not `deckB` as `deckB` is specific to `Question4` only. - -### Using Folder Structure - -The plugin will automatically search for folders that contain flashcards & use their paths to create decks & sub-decks i.e. `Folder/sub-folder/sub-sub-folder` ⇔ `Deck/sub-deck/sub-sub-deck`. - -This is an alternative to the tagging option and can be enabled in settings. - -## Reviewing - -Once done creating cards, click on the flashcards button on the left ribbon to start reviewing the flashcards. After a card is reviewed, a HTML comment is added containing the next review day, the interval, and the card's ease. - -``` - -``` - -Wrapping in a HTML comment makes the scheduling information not visible in the notes preview. For single-line cards, you can choose whether you want the HTML comment on the same line or on a separate line in the settings. Putting them on the same line prevents breaking of list structures in the preview or after auto-formatting. - -Note that you can skip a card by simply pressing `S` (case doesn't matter). - -!!! tip - - If you're experiencing issues with the size of the modal on mobile devices, - go to settings and set the _Flashcard Height Percentage_ and _Flashcard Width Percentage_ - to 100% to maximize it. - -### Faster Review - -To review faster, use the following keyboard shortcuts: - -- `Space/Enter` => Show answer -- `0` => Reset card's progress (Sorta like `Again` in Anki) -- `1` => Review as `Hard` -- `2` or `Space` => Review as `Good` -- `3` => Review as `Easy` - -### Context - -If the parent note has heading(s), the flashcard will have a title containing the context. - -Taking the following note: - -```markdown -#flashcards - -# Trivia - -## Capitals - -### Africa - -Kenya::Nairobi - -### North America - -Canada::Ottawa -``` - -The flashcard for `Kenya::Nairobi` will have `Trivia > Capitals > Africa` as the context/title whereas the flashcard for `Canada::Ottawa` will have `Trivia > Capitals > North America` as the context/title. - -### Deleting cards - -To delete a card, simply delete the scheduling information & the card text. - -### Ignoring cards - -You can wrap flashcards in HTML comments e.g. ` -->` to prevent it from showing up in your review queues. You can always remove the wrapping comment later. - -## Cramming - -Currently, the only supported method is "cramming" all cards in a note using the Cram flashcards in this note command. Will work on a per-deck across-all-notes method. - -## Statistics - -The statistics section can be accessed using the `View Statistics` command. - -### Forecast - -Stats on the number of cards due in the future. - - - -### Intervals - -Stats on delays until cards are shown again. - -### Eases - -Stats on card eases. - -### Card Types - -Stats on card types: New, Young, Mature (Have intervals more than 1 month). diff --git a/docs/en/index.md b/docs/en/index.md deleted file mode 100644 index 87dbd1f0..00000000 --- a/docs/en/index.md +++ /dev/null @@ -1,53 +0,0 @@ -# Obsidian Spaced Repetition - - - -Fight the forgetting curve & note aging by reviewing flashcards & notes using spaced repetition on Obsidian.md - -- Check the documentation [here](https://www.stephenmwangi.com/obsidian-spaced-repetition/). -- Check the [roadmap](https://github.com/st3v3nmw/obsidian-spaced-repetition/projects/2/) for upcoming features & fixes. -- Raise an issue [here](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/) if you have a feature request or a bug-report. -- Visit the [discussions](https://github.com/st3v3nmw/obsidian-spaced-repetition/discussions/) section for Q&A help, feedback, and general discussion. -- The plugin has been translated into _Arabic / العربية, Chinese (Simplified) / 简体中文, Chinese (Traditional) / 繁體中文, Czech / čeština, German / Deutsch, Italian / Italiano, Korean / 한국어, Japanese / 日本語, Polish / Polski, Portuguese (Brazil) / Português do Brasil, Spanish / Español, and Russian / русский_ by the Obsidian community 😄. - - To help translate this plugin to your language, check the [translation guide here](https://www.stephenmwangi.com/obsidian-spaced-repetition/contributing/#translating_1). - -## Quick Demo - - - -## Installation - -You can easily install the plugin from Obsidian's community plugin section in the Obsidian app (Search for `Spaced Repetition`). - -### Manual Installation - -Create an `obsidian-spaced-repetition` folder under `.obsidian/plugins` in your vault. Add the `main.js`, `manifest.json`, and the `styles.css` files from the [latest release](https://github.com/st3v3nmw/obsidian-spaced-repetition/releases) to the folder. - -## Resources - -### YouTube Tutorials - -#### Flashcards - -- [PRODUCTIVELY Learning New Things Using Obsidian by @FromSergio](https://youtu.be/DwSNZEW6jCU) - -#### Notes - -##### Incremental Writing - -- [Obsidian: inbox review with spaced repetition by @aviskase](https://youtu.be/zG5r7QIY_TM) -- [Разгребатель инбокса заметок как у Andy Matuschak в Obsidian by @YuliyaBagriy_ru](https://youtu.be/CF6SSHB74cs) - -### On Spaced Repetition - -- [How to Remember Anything Forever-Ish by Nicky Case](https://ncase.me/remember/) -- [Spaced Repetition for Efficient Learning by Gwern](https://www.gwern.net/Spaced-repetition/) -- [20 rules of knowledge formulation by Dr. Piotr Wozniak](https://supermemo.guru/wiki/20_rules_of_knowledge_formulation) - -### Supported By - -Buy Me a Coffee at ko-fi.com - -JetBrains Logo (Main) logo. diff --git a/docs/en/notes.md b/docs/en/notes.md deleted file mode 100644 index 4e383e8c..00000000 --- a/docs/en/notes.md +++ /dev/null @@ -1,71 +0,0 @@ -# Notes - -- Notes should be atomic i.e. focus on a single concept. -- Notes should be highly linked. -- Reviews should start only after properly understanding a concept. -- Reviews should be [Feynman-technique](https://fs.blog/2021/02/feynman-learning-technique/)-esque. - -## Getting started - -Tag any notes that you'd like to review as `#review`. This default tag can be changed in the settings. (You can also use multiple tags) - -## New Notes - -All "new" notes are listed under `New` on the right pane (Review Queue). Like so: - - - -## Reviewing - -Open the file & review it. Once done, choose either the `Review: Easy`, `Review: Good`, or the `Review: Hard` option on the file menu (the three dots). The `Easy`, `Good`, or `Hard` depend on how well you comprehend the material being reviewed. - - - -Alternatively, you can right click on the file and access the same options: - - - -The note will then be scheduled appropriately: - - - -### Faster Review - -Commands to open a note for review, and making review responses are provided. You can create custom hotkeys for them in `Settings -> HotKeys`. This allows for much faster review. - -### Review Settings - -Available settings are: - -- Choosing whether to open a note at random or the most important note -- Choosing whether to open the next note automatically after reviewing another - -## Scheduled notes - -`Review: N due` on the status bar at the bottom of the screen shows how many notes one has to review today (Today's notes + overdue notes). Clicking on that opens one of the notes for review. - -Alternatively, one can use the `Open a note for review` command. - -## Review Queue - -- Daily review entries are sorted by importance (PageRank) - -## Incremental Writing - -This was introduced [here](https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/15) by `@aviskase`. - -Here are the YouTube videos: - -- English: [Obsidian: inbox review with spaced repetition](https://youtu.be/zG5r7QIY_TM) -- Russian / русский: [Yuliya Bagriy - Разгребатель инбокса заметок как у Andy Matuschak в Obsidian](https://www.youtube.com/watch?v=CF6SSHB74cs) - -### Brief summary - -Andy Matuschak uses [spaced repetition system for working on writing inbox](https://notes.andymatuschak.org/z7iCjRziX6V6unNWL81yc2dJicpRw2Cpp9MfQ). - -In short, there are four possible actions (where `x < y`): - -- skip note (increase interval for `x`) == mark as `good` -- work on it, mark as fruitful work (decrease interval) == mark as `hard` -- work on it, mark as unfruitful work (increase interval for `y`) == mark as `easy` -- convert to evergreen note (stop using the space-repetition prompts) diff --git a/docs/media/en/cloze-with-blank-lines-answer.jpg b/docs/media/en/cloze-with-blank-lines-answer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bcf3594ca4685e84a0d5db8a6ef2f00c596636d8 GIT binary patch literal 84870 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 literal 0 HcmV?d00001 diff --git a/docs/media/en/cloze-with-blank-lines.jpg b/docs/media/en/cloze-with-blank-lines.jpg new file mode 100644 index 0000000000000000000000000000000000000000..42665314209179124a29cd0e9b00f7e9ad383a99 GIT binary patch literal 139578 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 HTK+!(18FxG literal 0 HcmV?d00001 diff --git a/docs/media/en/flashcard-qanda-example.jpg b/docs/media/en/flashcard-qanda-example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..590e6bb017f863a25f36583faee5b086630e71df GIT binary patch literal 48368 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 )3IRKhdn&nFeBw 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 literal 0 HcmV?d00001 diff --git a/docs/media/en/flashcard-settings-review.jpg b/docs/media/en/flashcard-settings-review.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e28f9552984d779049e4b49c49b88afb739087eb GIT binary patch literal 43303 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 K-B^jQ<9`Jzm(Ml; literal 0 HcmV?d00001 diff --git a/docs/media/en/flashcard-settings-scheduling-data.jpg b/docs/media/en/flashcard-settings-scheduling-data.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d4765a0f9df7a826e698b3a8b7c652790cbc503 GIT binary patch literal 27845 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%0D}`;ccJ$$J|DlSp8C9~`nTcAbkzvotBI*H+ zCSM=;+%^`>s@hVv)G!T^l z_vUtGq3@51yaj(n}}&Z+;i%3 z2U`Y1!u$ep@tkZR*EC&Y`G{N+PG?Fy7$d?9f;$}%-1%_iZ+|__M3SR zeMa93u?u{Aa3OnYj+CEq((!YGU;nJ)tkTwMKkRD^Ij(PpL3J8aD$<9RR`yYUA=uE6 zDzeX!8K#m?XiJY;&Li=G_t_5wh+HoOf7I`YmgaSubJ6YUQj<8;VVEkLTeyePk4@L+ zQmS+7;{RODFLNjz7?yDL*}xgm3xYD>bqFqt>>QZ(ov`y2ywfJ=_1)Nq`JVFUi(mEh zDmZ@YRiDS_Pc%4^A|w+Ot4H zhvfC_!kGBiFxw`8X_l#1N}5oNaiG3arwD?^KfSCp_{J(ofjU|SC|rZ=rRne0Yz+lT z_(rCg4YF{<4~IX*yfDkN7;-`|0%e`p@sFqRtD_cK=yGEVEVs9A<_X7Nt{K;K4XNsf z2?pw+3&BCAda{~;H!t4>VTFG0+kmZ)1;C&0BUMv%q_{-v>m4{0`vAt(<$4z zTR7Q*?L=ur@}zWnfu5*}i;K5jOZsc$Py$COzxknKMmb4>m1EGb1m_g9MXPUUlW$eW!_sr9j>ikG3%`o=jU?(f%;pRK>F)*;*>_l@ zUx6`Zg-=YCOl)EK7dQRkFh8RFLqW$c2Q6Q6uQ^?zN`j9p4*P6388e)tS~d2R!RaAK zJH6kRSxada)WYo}!Yc?e0)fr4PGJhjUNi;*y9P>(O}f5CpRQ?sb|vXftnox-P1uw; z6o*?FXCI4XPuBM48Vt^KN=YX4_binEdYvBmDC&*<=54U&Z>=@5IX-#*>+Zea%VhyQ zp4t3YKh}Fsd8XLE{tbYaCELa@Gzdpd?67Mm%CI4HiZb0u5;p-SETGOeAUv!Egi|P zD*%o(OZLk$vz}3kk&zu;UM~c6G2BYHZ0=-*>~Tt}jsA2pe{du$*}}qnea+pDY0z}x zqnoa-SzMIs{;{JwsM^9#$oHkTv$io!Y0+^^`x@OX*0T$#)78~AtjJzbRsA}5(b*{; zi(=$9n?r08dof3$fv6`X+`C?>dE;5Wom-K^cZ_j9CH3ms)~?JOQvc*2^@(ci)E^6o zo_oZL#(C;Ozhi|w06AKza2K}TPGCa;ezwo&BD18g z9sLcRh9`CQk%Q$F?HF$|)niSggMt7LAZC?j?&hbI8+Wo}+`7VLN~P0gHD`u%?aX9f~t*j%eFlxF=C4jBQ@r1OmQgeP4WT2pvX)d zkgGa(@PKsigun=;3S zh{Tc;4ycBv5KUGWHM|}=ou@paGtNuJpK!D{Owj06nJs#Hib^mPb(y3;79kAs?XSas zbk|D#E0xVP`V4A@@fPwl9!5$gXThzr<$De4Dr>5)j97dR6HO_#wF`4@E0vzgV2Orm zET&c97poV1!Xk_Yfy;4l4;hV|w8C`nq{?aWDjr5;-#`Zc`wm;ri_i5s6(pSjP^F`M z_vrWmoE8ftdHSz{e7pPtW^D3%=@YS-58bnR_9q+(TjP4)2xg>x#TIWH>kfJDk}G5? zU||ax|5!RTYOSJ_r^1ZmrJY~6omgeQd9Z{?Y5qcavl2K^X2?cCgLe1^)D+Pb+Yr~{G=N^ zs@Ys9!S>s#32OX2TAoSpM$#Ys2fH)k}4Ka8#pgx>kd5-`5;y?T2 z|L5j#LqJ5+8mR&h+?SQeIJkLkonu+FOn6P&>x6?7a9notEal*dfsjzlVaC!z*70?K(C3ChUZcfVs946>#f_9f>;#Oqo z#S<%-a<_3qaE;W+g!Q7&Uuo6xv4*}Q11w^x67W@4Uw1|Kmb(*O{Gqa^kX4deGrqY* zPCtwjV3N~VqB75BxyI-qf5oMWL%i14j5Is&2=zgE*#RL(WYc`FW!=wV;9~FNLTgbh z^^xI)`ikG0BvRHjKEVejDxFz^Koz|7%FW#5S*89cVKTe(1E*35d=!@s?wHaf=$addxG7S%aSqE-J ze@hUfDG8D_t(nE^)&6~iUA4V*V_ldR!@-xnV@)E@_2u`6#XZbtx162IffIcf--%6I z2u2xd{?uXXRCLJU*Pit6{ZduCg%oRd+>4{C&E0vu`&yonaTPGhsPuCW;>jM zN`0fFaDnSk8V{{3m4u9r-*X=4lv!9bnJAGNNvVBdZ10F&jFG5tV-yw7MaOS$!WrxB zZL!sMkYEeXkmr<&8oiYzjsjb&&H<}9Te(!0T^Cc%N`xJG{lO)?#K<6BVI{mXc2-QK1tz&XMn`X1 z{{wZwN4CY(&duo21>-yF>&5V8`ipkkr~rvdG(XkzV+KgV8K>c##uNSJ8-i{Idj@mm zLAh{AWT#?!gv^|$bEL|wG&ZNCm>u^g@oBLXtV(GaLenQngTm^n*gWBQKJ|!voC=jO z7i;qzvUL0$z2ZCjaVq(aCjY4^{LR2o^2HUnld-I^V&4!2Uy8RNSZ&+af@IU2rj`=y zq+q-G=hT!nmb9U$XBt~UmKn2iR^}Yk=o2LSgs$u3#f7f3QLc=vAI1rM1_n=chau)Qn+UznRM2Lkc z&Y19HdxY(oY@9fS9u4V_R8$spcXG}j!RKQR(!SY{2rb(gasA-@H3rXo_N_LjT&12) z%AG@*ji4ZO-LZ{24K}nQ^z~DHkV?N|Y}(4>0{dR;5?2TYLn%b&3v-XWQe2U!Yc*fv z$$;d8yBm__wOd`ZJxn3@se*<2JJP)Ua~Lq2;ERx&x}laYkSMdJ{Cdq|naPB;!ranz zspYzgTCECvQqTXODFAW10FHnkypvg6!Ao3f(EL6wf#cc3!sXaRds4US6tTC$&7v97z)>zc5_b@`g<7E{4w-q3R|1YK{RF zU*C00o;-D)oF+OGx`<6x*?&GX1?jrn^0GP}uo_X9w`(1j+em#1V&f!8*N< zIN|WUKqOM|O+vE^<3RI7`$OV`<_rw*{`_zq+R6^qUJb0$U|9vTM2%TaUXO|t$6S%U zUaVxVHc|=N<=&IT1z2d5cuKu%j7?$fAb(2Z)1)gi-3}ur<_jTxKYhwwA-jkvEo819 z%SQS(an++Cv;D#JWNF$Yk=3(HHB%8ajzf}ln2}(HbZ(Zv#c0lBCzj~7!)9ffj1!LE zL#|b_hJjgA+)Jvu{3?t|`fjpo_vN+0=as}4CmeimLab@GTQqyM=Xa*tCs_{%eI+G< z#Mr4UTJX!UJIQ?=aX#PG_6-+DSyuKtUY0>`c+I=FvwSlwhdi-U68(`fAK~aoL7_du zg=9CJ1l2wf>-ecHTdsgzyXgz~wfx0*t@Za^Ok#d>K65TgHh7jb1I0A@=a;L`r$!Dz z@7ua}Ri1DdjXf>A#C16pwPH#x%=V7{nyeKZ|FKr0wkJU5VF>gRVZ9p&s8!1cu@)QY z_)yKSqt3M|+3IUrS_SD=9Zac(!_FwD!Iwq`dFL4hKrOo4<&U|QV&9#`xGH2e7rKr4*c#gXUc-?^pOh800}YbtA% z!hil6pIte%i3XVGJ7)HsHt^Ec#9p>FoDfV$Dh>=<$HLHbi}f|8cZqUF9FsZ7XE!I) zgY$9DXNr6wBI`zxv$e0=tO$P?-5zKHvL^6^u_gmn$bi(J(HhbiQlrQMA$vmY5H;ufI@gwr?}%MAgH-3 znc5-C_x(~WOH277rewH3z}GK!a;IM?A(^y-I3&jVHe$MrXY12c`tVC1=yBqT-xNzE z7|&JBROa4}U&)Qeytmw~bkHR{Cl9Jqi+&{5=6@or;nxTGJ!9*G)ywDU#>Z=YMHdK# zU*2rls!tUbcz-YWBKHFhv7n&el&H#vI`8SbeE8N~u8ZqMS|#5R3<+t`DL5FlQ}3+z z#Aeo5fMK3skhE*?#6$&Ng3U_Mw;A##A~pe1ZkM^|M%3jlNZHkC)Vo6!w_0*;=N0!) zftx1_J0(vAAymis&yQ3X@zNyD2S4K_<5^inGY~LS_l0v#QGe=K>YwG>T62QH73|#y zEAbYsxJ?w*HPI&2%v|DE9nX}Hq23>A)n*mc3Q7myiHehm;U`%bFFUias~-&pcN@v{ z!0toU@9NAnH8qo0+;Bx0Tg||{D<02a)qf=kTwU}_!+mC|t<$@$x26h?c##=(b&rZn z{VJP$hum5sW`xGP2zTD0dbn#8rz_vRxH$Xdv#GA+>6{|gh37Bg-pdY1Vl8Xt2lf9o>Mf5MzFj4M>Q=o ztOf)1_A%6z?aFyX+Z;1hz+G8j-Qg$K)10D&E|7ez^_Ru8 z=dkCPEQa^}!+XZA>O3APcRW(zlh4g9TJ0RJ|LEn{@vd$Mrb-p@RCyliPQa6RI;W>l ztVS~|mlSzkcS)t9FoRR7BGw78^HNyz4!2KcvHlRx=Qml2JRfm|3G%>RDWJHR+D3uJ zGe%-Irb=283!v90yc#Ni-zFkDTvGrCB#?fv+IA6qC>IwhdKFq|yrmK9+VKJMq(`rI zYO|7rDEH)Q&uRv!5q^KpVtu1Y>+Q&)Ee(+R%Tm*6wE&XzRqaN$jgkGQ)SQI z9a2$E&;QBTb@esVY67qp%Atvl6j$pT7R$rd(3wt33BL0)63%JFxvK`B!C1#Lv zT&oEXt_2z-To1LHK*{?t<-aUq#9hb92rhmuJCYx}6b7ofD*=3D-9_Y_D$Y(_(|Z4~ z5+T9Uemxg+D!dWvw6QKAeXxBcXg%(wh}&Nt?O$>G5RvhV<;83aN=f2hnZqZ>GF?g- zCcpHf`Dz;9yS0aQjM(hl0@rc;9Pa5N{Qj;3rk%n=Nf9xUI9?E8r2y07fBHj|v=U*l z8AfR>fDK>UbQrV_pqA6i31}IBAy#R2x8{1Xo)=7o-X;V2+-+qyJIhoPzX%fDQze_9 zei#W&xAj0TSWaF=2yq#kRHh;%WGV`~^4C7yxGYm!r&E46MwQTTT{Evl~^rw89?8nz6e=H+jau*(w^%bjM~l3Y7O|gYBn>1BS-Nz(U7OBVd{VpGszS}h*lG_I z`L}eGWj&3@07WXZY+5Y?z6=Wcw`v+#bH%;r=G>IP>OV`wlS7Q* ze~#*r)WeEb*Ce*5nQup3>_v@TvH8zuEAP{<&bpQ(N2Oige;~adk7NZD6l8=9j8PU9 zUoVV`*nF}qvX~v|Fp9epcfD$6mfcFcPF46Kh-;Y?ShSvy)v|~{OUN46Pig}~l;iH$ z0#$zkTw(_K3Kp+uhtM0rzli$kmqhFCDy$P4=_F`NB#2PQ9FTmQw>_J0TgGOXewZz4 z1x`w4$XdtF)JN##4%A3ezDbk~o2op-SWgu0;o>7E2(oxM%`Tnko;H_KBEVW?GCyR5 z%lr1;kX0O4UX!dF#GCwq*v2P&4weMtf2bfdCE{M(l%+JLdpS~u6w*yCy3x-<)}3v{ z#HRCguVnD!eE4H0u|+7wvK)(0r8M07fE;T`Po2xA(X3ObR|D^xNGZu8Z}?>Q^!B;F z{8sID5Jr6tLar3Rd<7vyGYC(mdF}$z<`x9hB7}AKGSij7#ivD1$9Y*qP;?C`IfV@O zH^de|N&AR5XpAxHw94*n-ZhAunMzw-L9~L5Z7Ya+{YY}{$At^IPX{X1f%Io~RCapg z*<0RI@Xcw46c}dqp~|pbHsa?hK?IgDo6HZgX_rcMB2B`PDj0l+=ABY>C9Pt8$Lqa! zs;;h8M=oi@3r?Fg?F$l9El5Q^W^Ez+GXrbhMbyM9IM&E1H9!4xT2dP>*TV@|c{tZ_ zDY^Wgwj?Xr639w>+HO%|YPP5{*rEOBm-*1UFBV!0Mj0KBm=^s}>eFH)A4o{4IT;#!Vnwis42+np@d0(O|)J4JU5g($cG} za>C6(pEqtz@84YSL;A{_5@`uv?F%2e6;>q}%7yaI8a*y{1KK42HfF*($Qy}36I@R|53m~>e)gnzL*J=KOo|X1ij~0m6`%rByBzmA-(In#lGY?lnx(= zRfH}`{n|e-xGt1&4fFWJ6ufe{x~ag_W<%p!jLfNeBvm#QSL+hp@1P)QMen?1x|qFi%u0juq?+i){o{0`S8Q^6Dj6|RY>D4S1;+E~~{-3`L@Xwtu7p=0np zdsXLj17o0J#!~eI{~A(_lJJ|7+q}(v@jnzk6Jnwqrkv#Tg}$Yx%GXE%+PP~%yZ)09 zYl_!Fv7PrMVDt^sl1!;0%mw);YT75VK-(zEIKMGj_&18qU8qtl*O@J)3MQluYz5?O zp^YY+A}&VCrUJ6T+-fw99Z4$MKi@O`XZ8L8gRi9kXgcJ3ABt`;U=~Qv<1)aM(9P^ME?2e8 zY5>5i@zrF*1fuYC%Pl3&sw~1&TFD-jUz=U>98ea-J&~QV_o5je7y{|C_QH(&q*_@} z%qLC$2mIc-&0*KT<_Z=swQw~RSLPi4IU0E13whuAhvX{d-72y&Ku%KzB=5jExb(yFS^Jg_XAK@(iQwH|0p7F zI(%8zU0~ZiZj~#HUN9AIR?^}XkzcJY-u)ZLzo$6K3VL$|<#)aauSVh>aCkIL@7}sU zAS}L-+-#;Mm~QIna%We6;&kP=n>MlC3C=C=4a!pi73&;@>otfCP`B383VvC<92zJt z{60)JB7;GGMVX7}!o3NN_lACuKK`vt5;E0=vTm3yl24TQiC=Gvt$L6hAl$IL)Hf&L zbbg{RKL%jrAQxX*F^7_;S-J8L&3G>|q?ZaQov`=MK7n4&9LeZVjmu{Q<Y%IiB9Pwcu(77rD+?S?fwuQP*EnyW9&|%& znDr^WOkb41D~*wWRB?i~Nf=8OsFD3)O<}qMjDFIOClB%iCH9Kc)~&VMOu<5)3_5a3 zBCpD$u&_{Kae1}Grf0x3(R2cAppl(jnv#X;0HLx9s-Z?!2}2eY(qh8a%!{FSxP%x7 zRGmB*-8GV1e}|wGC(sXjIXOk0B&Wgxq|lU@yThHmKA+P^;o7k)`zIU_PuE41Mq61? zYSD!{eMtz(%uqJ*NpTiqraBF8r0^-r&~e{yuSgRlqpB)#{HPraXq%`e8Ur`L>g(&a zAgLuysBm61yM&*r!b-J!Ii)0NMm7e$EXUF^3~W)voy`Zoez~w}VhKE?`vas0FSItm z_u3K)w1l%XLDD%rT7a=)0YB}(2R~qffN0dft|uC|Cy#dZp8+l`kHQDvC+5?dn!Z#S@xS@trt8x{jg`fb`x=DJCGl`MEPm)u?)r)}ov5%^E(qeK0q zsD7JW@KH#%x^2oFcC=^FnzALa){5Dz$Xz$!JNlDme`@wm$p;!nLMwJwm}(rbSfmi8 zo1sPe`T1!D4n3kU;iestne6>F!$-NXl6=V=G%?pfw^f|tU0?(Hdv-VpWWf-ZS!B)& zdnL=Iu{-j3_v>lS1JuSLzmW#w<^#d~r^DZdZQIQTt~?T#RpB`v5SHSmmaCYfAgLkr zxxh+G{_Gd|qBjW9Ed^E809EQoa+_-Y;wg)q)|<;?zKwa5Ty!2CPHmx#wP_hxszsz z%q#8cFVbE#-MY3pTcz=sF}tW%lr2E?mGe#%wtFdGIhI;!=*;@opC%cgD`c9SA^t1X z1+OPqY`TgVaU`oFaO;>+Z!tz{zE(Bj$O5FcJ*ru52T+u@S^`Syl)D?3OKZCfyey09 zld$funv>12g+t(I^O(zODIXGQZ;6AwQ*;wecQCHta6en~5-@SAUNVX%S5VGu5hOlb zM-aMoT=5nF@?Jqs(GS)BJJoM=BBiq2iWIB;C?w|`&Y?q-SH4j^i)D8HA8f6Njpi7D zBHR77te~GBL1SZ8Rc(U}eoYf697*vn9Q+${WfwXp7m#LdGBW#tTFQHaG%s#j{kuY< zO@(uzZsuv>>815;!~XV%|AGPSA59&<1td!!XVOYN9d8YXH|gKKPt*4c-t)hDm#{KJ zhO<|phh?XNT+Cv{j1I=(mg$7U*yO36U3BK~=>roxB)?wW6+XGM+~!d}>fZO&2mQsp zge*e%G$~~!H5i(J((}WXAeCJQF5N<+^eDhceV9AkzBTD~{*?L_6-Sy>Tg;EgOD<;m z%#3_9F0!G(*He7q6$-33KYRz|l~k3gAwm)w6P2DnB-%{4Eul6{LJV_bErN2@Xd$IpCFC7^HVVc>uH}>$TE4^mT<*XjGj30Z z_h~6r&vw`79A= z?29TX8V;UvUW+j5jOB*xp#k+E33QucdB%}*nT{cSv@)m898o!dd%!U%_u0x|@9ur- zSIe@PuOr~oGZI_Fn%Je>kLd;364Vz3m9L0?)t=5kWiEK#5?-p*`BT2fuDeC|SF4WQ zF!=ZzJF7u?XFXw@8CtncrOLo$x8ajzIy)3zvb30`RUfu2xVq7@+*rR7u5YdB&B$Fd ziK4fE4ewoDw)%R!!gY1ec_yqJQrcKL62VUVq+L**Vq61z7yFhzoz?MS>cczVE8;+U zZS-~~-X!wR)c{>l55#J#(k<(3+aP!Tnys=E4xX|4e8%$-pefd}GGj7<>~Fy?^XaxW zx*I8%3j+P)+v<>M{xsv6$*Gf*Q!5*i&lI913y6yicS>u4O`(siZFZ5S1Jn2=E4!W6 zuY5fx+;3*?h)6x~&pCkRfo*VoW8=j56$|v?2gf2h*qL$)3i~114f!YptZ}O6YZiPZ_;dg+;aI z&)nWN{VfF%S(ojCCA^X7RFpk*8^I+f7e`lRW=h1Jw?^#Q^*-1hTdmW82FuruJJwPK z+T{bg-L`E4@uqlz3*z|muAUe^jZAkd0iy!rTs}D>w8sdPKBEE>66-X*EYtq*o*WR; zw=tT%ERwUp%4&)_SFBN4Spp|oNu*dcxngxv|D2LhB(&L9An@hT=3)Ql@vF5iU+dA9 zMOG@grg=l94+|bvEck6aNr6sPmsFBFLS2925&){IYUn3Px)mAstZ}CzehDP*npn*kST~P%Lci;a|@&06o*i3S~p zHcd=D2=6`!_n@~NZy0bN!d$_1;_BgZ!xek2p&)~p{MFJG&v1Iu`mtV8GSzRacxY3H zYXV_fA{Ht4m@&s@zI*4`+2bj2XHr9CQaWr(QsR5wh@-Jws+&3EU_nlC9ciFQUPHYg znU#Pr`=xLw%>9a&muWV9RJyzxPDtzP6YWPCgENqkLaQJ})fDhYS_d|&`;@bi1NYmY zyP|3SnS$#l9Og2%e@>2$z#5)Y1GehzTT!pcuwo|zTuNzU15xeo&4hJHntOk^N#z(I z-o?-oZH+KbNuT&3$675bk zhMK#h!M7_kpSb*rz3>U(7QvXOAk@V%!|T_Q&EwQ7h6CS=f#DlB18jts_-B>r~4&|E2!73EV$-%!_Q%o9*y4k@C31!q5?~RacV=P!Qzyx2t=us5Rj!>u(hhH=V0@x=A%_ zgNJ!dAxG7R#=5sA%me`j>NYrf!sGWY5VsCJSmM#k6will;_N83JpKNx&>Qz&!!VwD z^IwzyUN;$gTpj{bHqAMm9b^@&N;NG_K#B(3qTKx|34Un~)p*R7>qC!zw-RX5GTViPn>fxkvxWSu_}dHi&OprF`D|zs>bgGyr@^NL zaDRKbhR8z!$@JypN&fD&)@Q*$k?XX*?9zfQL; zd5M7Zc$mVDHOAi39C!nCs>!SOLl;{!6My(EHPCXOw2bivFP}>lf4%I?ews>i5$+d$ zDuTA&?-u;H7@5!$nBA#$7@>ZPLBb!jgVDIk{HDeX3EJpzJ-*h;F2Bj$KXs|r2S>V+ zp>WW_78WWubBlXUWvUGO4HLdQKX%S<40U^~F06tHV3}*=L3+E@6yoE*ZDglmMszlq z*%{sH>PP8$c{?C=8CHOq9HyAbC*$E!mzuJion43Vwa>I^OB1j~A@%CB0yT^tTHa1e zm;d}S@28p~5$0ej{8LVO2iipW|_rSI~C-F^ArOrDnO7t zosTd~P_^<5BQ|bfAaK*4>SY#!88sYy+<=Om`K_?-j|HetR$=a92v~rxE}N_7s@BRl zx;O8!MlOHK>iT;E4r500g48qZx?$D1{1zz=nm6_=91;$Aq^qCwNenE*GlvCT{6{SP z*%q?}B}UwGeg>TG<)Uw^u9_#yw1X9rHiwCCMYIWSZk z^fA<;YqMenfE(L0Zy~Tl5oJ^I$Z@l%G^8 zM`P9v&n~5dMDbSIu`L$~*5!Ch$7k~8B+L0Vl8carV_mCCX#LrQwwum*rZEt0l%%BL zbDhnIj0S>51w>Sb%VT!Dg1?Mq$LuDJFDxve+6V*!dv$a? znB7TwkbgjSzd>$jWCW!ROf}h6kA>cVIXoGcS^y>ag(Z0!7^7zA^~_49ihm_8>e?L| zsOs7cdz9A1Z?voDwuC7ztkEN1oC+Q-gr38JTx13D#Y)wv`sx%>bP^pZm*zqW=n#`J~1M#`t4Ov;|SGi!wp zb@@D1R!qegc3%~nb`H=hS`ly4 zb&MixLs=Vi^eXoL+PoQ;E^`A)bw9>^(pm3(wd?KoOu%&{?Fx+Hy3m8+DPMsE_lGYS z8|%7LLWEcEDqA#ZhA6Mj?B2`{aO@-A_59yNPR#B}r0#BAm2bzD$v(SdBiqo`PZf%B z*l}by%kd^?USSSVv zCG-;5TS1zLB#=mr0wE-!NG}0A0#XHp5YU8xF$N?^5eOZ8^1kn<^W}M-5AVnGac0)c zHP>2e?wR$!|Mzcx9`UmqE}t>dLmsMsi}jQP_qIum-%k0ET}fC_{W?PQxA^<#=ebHM z23Kl6y4veDP)=#8zaLQ6>RXmmXM3LXdWa#?xUc9gLffe?=|Y7*sq6#QWR3Kvy1;i4 z=Xx;>ZH%g7hlcBQ5QY8z{{Fso6|Sm*KGf00FSAyRxpeC>iIoVeu?>HY(nj@~<@roa zSl$LF)@U6hStdT;=p0(r+OvAsee<%&oY?Hml>^xyCPrLp8SaZ?QqPZuoi%D~ys(4K z!5$Ztq~eIe3kS_#xV(h1$tlJTqOSz()ge1UkYJmKMEm%K96X;*Ga_t5?1az%lq9pv zwm(eR@n_j3e;SPAT!{ay&@#<4gzAPV`c79oqmb>fnkH1RNUYH0?^!tp_=c8ksTJ86 zK6~jwu!-&Pr5WS{J1$YqD)B+R<12r^svqZEcpjJGkg2bwIY5kl)^;bBmFDBGO}|z# zHFm!>Fsy4})Xq{YI!7GCVxV_t=Z0k;K&$BYnHA1TCn|40pEiVid^YifrKa67(pK+E zA<6X=czc_>YJT+_4YhWS*Sl_&0J1WsYQzYZ8eR6aL`DdnbVrLjG4aM(llu4AzHw_G z+L)6-g|#m|5xb(Ez7~G*$qw1X8%mch*r|pFTO48$4HRB)f>DPa@Oi! z4Ci`Rjs&DrvSV9f&oAZ5oL$qW>1RERAzzIAi?nkv_ZI(&^h{^X=%ol>f;2h=0)9E! zvGB}00Ub%aVWe+&P4c)km-pxo!gdP^m`)2nki0*$vv7kYgJ=-S7_F7>@@Z_Tghkc^ z)c69y+Y(V#T^sE11?pjDryEkHzxGi&2iCzW*C zWCr=5uh6O)UDzl+=YtNS&!3!C_SGE+x; z$I*S%4QcnTrJ0x}d8oL#TaglNdGYMu1go@%NSIu8t2DP?y9RZBCw zZatNj`yS*lU?D2%Y7d-)S$sZ<+NtV=e5#|z?XTK&9_eHahKT*+wq?2+eH3;QX}CXO#8%DmR(0npR8#B zf>qseOYOwL-X?9fW~hj|Gnp8hT;4Q%k{Di+-q!5dT-J@6CwGpsuqoq}*gN>~huRfb zR~_Y0@6}?ijZln02r{^}@Xl`k88aMXe;s(8#(8Vq6dii#y@LNVz0tUV&JAOQ2$pQ| zw$MMnM^^&D4u!N=wiJ~I!2nQse?NV#VSWEe=52Z?12%iggIBEg^N4cBZtqG_EZVk( z<%(PzerL7VTeDZUnQgzMkFR8E*ioH;@9ssNmVCX}6DVFeF5VM*TwY#5r^=@|26D#> z52aimvP3_-|Cx2T(hJ5oK(}xfs_2*~dvKbFrCnPJ7o3loFse40m)tl(s%H5B zE7(A`>UDRQ1ubx%wBN5ofcx`DZ-`fu2Hmn2dVU_sP9Es)S^y`WJoFtbD97udsAlFy z$z)}@J6Y1f;JX6^`KAD#N?MJ9^7O1AwSO!*p*H@BtZNI>#JrP7WMmA@@?-kcm32bi z1(<-)6L*B2GMm+^^%$Cg)MU>1D|=8xvi`mizDPb-(*|g*Hy+rJ`Q@<#L{n^xqI|Qz zWkgw80W25Vd5Rm|pQeftp+Xy;5`D)L1ReB16JI+}Bu^=fa-~cAC z5cCgKeD$*IVDqNxyc}9xmbi#96d=uhvWZtaYFEnAh`@7Ftg-a;=>+eaZX%OHD+H`s z?^vl23$~g;T|>v*t;ce>)o#<8E^QuDDu|7MB6R(gG=D=i`xr8&d7k5A3LmMzVR+_M zXb%uB|4{58N# zB-($sd6>u0XICFeG;(5`O5@*T1-)o<9rjLRYEO3 zs;mxbl=W|3Z%MhTuQm6~eZFGxH;#xulXs0pG2L>nE_FyM1%-Ym>CbK`z$u|1G6TVv@C&33`I}CS z-lNyOetW-`SaI-$(q$ZyyINu4wdG?#R`)FxVn&dHhDM3{ch@|kOONZJ$sifs_J(` zjVS&#@YUSLPxJ)7Dp|KOuI)40_}y(m=)L~py*oc9kK&i#OLOaCab}6jale%bwY;|D-0f z(y<8){6-?%=854Pi{LnWoMQD`n@2p*y@sxtxNU#4{7mmc)J&oDeCXEc+4J!?(hz3Q zt#z;iX1tr9V!Pn-lCSrR;A;sz)KWDxDgzHUra1?Tl*_Z4Rnijw9 ze)pT$fU$C61j{lTszshut<9g5dOW*Il~Pu!qMZX6FCRimuV{LnUVWN<-g2%q`b(i# zrFdkAyN3$1vbLufH{ta!vXI-igKH13_Tvw0GYCrcZkcWs14`bYaX+(k!NeN$ky+_z z?B!o@_W9!vSye3x)0l3(o&z@1)mf^;eZqgIysRElpHdsneOu8`Fe>gjsEJ}u%E0uC zIBv8Xwr;wZlVfe99ko{)dEu8LY|p>ZC^puLy!l(%%IBC~YlU?zc={>%7r&Mo{3x`I z^3Ds1Y*mSDrwxHwm2(U%zS3u)*JVZ4;)3w&qO@!K%|=Z|$p-}4rm3xmB|$P|>-hOK z?LZt(94q09L#qvO?R6=d38B)`c!>&8$%Yh7s`blEu-^vMWIS3ey+cQJMm^V%)e%(G zFv-^Rjx`Ek0$MG~2Wb|SwNg0Hr+QgrXjT=~P%5V>2k43Hhoo6{Mr-Fu>B;Wqqx>Nn zEUgg1>~PbkHD=iC1;~rxDjkqYi$OTGGK`<_Vm3^(t2S^aDpL^=9y=~?)+${J`3r%` z%^|52YSU!?4#20o=2I-Im9ZkVPsQQ34#(p~c`tu};%ZTx~+VagmBDfKS z>q)zq?e*cP1Ytkj{swDsbK zJUpHGC&x7V7)>6sb$_zHDi$zee zFa<@j1f&#t<%jZOEHlCRI;#`fXnjRb`_N01>Q0(0$9>4BzN`{-KTHm}Lw!9Z?@ekO zI;&g$ffNdtGsuq@NxZaPhiLmlC&!5--awUsiqE0&p7KzqZvhD96uN*1Nd4~^trDtuW zp<=vr!qrnKa-k2Z$^14@+@IZH4U@zHh!OG(>=W-C6XaWyPN6OqlJ61YaShdKm?d$b z3Wk$t&2~EBsmrh4mY6Zv$GKx)|4HkRG8=r(TguZ%Vg-^NfN>}PY4@iSaSrB%a(XBI z0K)yOq3#R9H;ninjlS+@4N+hpTkCJ7S$&Ja#n<#2O_N=kDd+m{cZORhupg^XG^nb1 zAP0$@6>!02*Lj@VrgBXFsS_hN(Owr|L9_YiJ!+uV2|3i(0S>JsQ|_9q2{6MEx6-ZK zB#erwpps!$YO*?wOLTvlOWe@8m9<11H|I$KLe}5tS@vzMhg+9)FK__M3hHz^z5+SZ zpzXOFq`H*!a&rWJ;S@aWTA^dkrFDJ(j zU7qdWwk7AzSQyHGVOPuQ;9`|h$$l!cqE>O@Dhls6$?FXT>l7T72BVa;Riz!j#$^B= ztN6YUh|qt|m5nEK;>(%7ZQ4KHag=-0x*x;t>@{B}&u9d9FkC-5mMvXg#24IuUBFHb z7(&@swYfhT7Jng+3X1SDxU$yiKbnfjJq(_V3SJN2P8w%&%O**v0}+FW$KMz^xdH09 zJb&!x5%s<|pC34HOn&sO0q#8!X>$>*iAzR7@&V?{Q}>%X7Ts8|rM$O*)H-tuY_GXf zv=EP-ab&^|J^=~@?3hInD$$wNT_U{HbC0a##mYcMLTWouwoCWz8}3j0cHC;F_8|%! zXlk)I!$J{a>{;rv;U~a{^2wml<0nPmv^gKgkpR>9dunqXl5AZ)%HRPW`*OguOW0#mSl!=w@!>wVnK_wD_^? zpGQcB9j@wGKacEWy!o*%($;6^e;(N{I-u1mH5ew$ME>$1D_Gt`S0j%`lh|k*klxC> z8km23bnCa({opWn7+<$ zcN@N`<9q_37^aC&82}U|nb(@98B0E zPM|i(L(k--51VNgM>J1kH1XDm%wmLFuBeP7zJD|?!OU40%;CI&2ko*2{V?UmxCe4C zT)t=h0;i%V$%>__O7{o~4c@z{Y-C(Zs+}nqCj6R_y#kAS9~I}};5p>;jRJq=CsXjH zowFwtb`9tj(E?yZqkwLuFYM<-8XRZ01~jjZC6Sx|;5GF3{OJaTc4iX!=#1~BH|+r> zQB1CO?#4(co&dQ@j*UUg2dXSDRxgfqmKhd=O+NfElV(S=eSCiYxAjU(Y}1Fvms?jM z5S!FtMRRYz_fK2TvU?*V>87++IZ4!{fEdAGsO&eQoj=}63!>>Xv^2}Q*+hu(-&u&fj_ivYUAtASgo+6N3z zyAjR(`oiO@)rBjZ84P-zBRq9Eye9AgCQ57JN)q? z@cA9uy7h>f2%K`&D3Ua+*ipPVwk|;9pb-a&x)^^h_4T7$&IXxfIf8-f7;i+8WuM)f z4x~J!LtaJhcG&Xj8g-LiV?7+9!XsReoLk`p9>5*fA_mhYUQ`s_w4b=hEzsN^{L?X*$QbdB0d$BJ-%q8gW;1xP5J)^RC9{N?as6s9N9cScA~3X+o1 z{=CnyKYyP0X8k-;$IibdkjGG$oppds7q)Wtc&06`v&Tn0ejW*Hwa&6}?t?q)8vLI3 zB&gevZo(?46%9b{xoCr1mcUsT+`CGTgf3UlX8oc?Tq;8=S4pKTSuK!q%i|f zRZ2C09pjTC1ID(hiWnFrb1`%BgfnoUb=^05Bw#&in7zE)dGOwl^wz1`+1asTqTERd zqMi3XXLmY!7+{W@Db@OF?lM30i_sN@FHhtSza+M2onC7iwSD5m9_LaK*Gp;5sN)XWu?AkmmNC*~S?r*k~e3&Vz z_oC`p#YKq~r#(|NT#JFt4Iu2UyCVvngxH$3^Pri~M zKrR(t%ay^$YlWotErGmup^E$KV?EgDhCcE&a&;`P?6$+C-xR|g#S}hf)pp+dmE%EEeSb_(| z(eqxe6|x^EgM>B&=ujH+ZC;C30Z%jVb|zoqp)*l6-NEFm1L}zhWE{c7hxG$C1uJYD z)3@ERaDbupvhU{hjC{{NAJ+f$M%3B^41Gm7hqlg|8<~AFYis!~)23a1!q@3y+hX8o z{%xB)=!B-vj4V>VV7SMRGb&RtV-@_rf>CPLh3(VIosjrWJ`^Z_LKN{eOerY z&^PbAs@JT~elx=6(23EwAjIarq(r~)$zF1Mx)1*!eC05-4I77 z$!*J*J@raQ?02Ydz3Ev;i@8!b`uu)TP3dU$%`PzdFn33{5Ox3?s8UwFb z_C=(c))cOytq!jo6t7GJgAHbCI+VODlE;qnk=2OE`K&0vp-11VJ)YGqq3iEdwhcnh zsJ#LOQyR9oiuJ}9mam?b?BTm6*33l;l$5=rjl3vtCiQcrgCd?h?`9M2e;_P5sc=)I zZO`4TY?Q50s%y{kO3~iDX=}{#h>A1Xd5Q61lXyoqP-XDSSh7fgl_;_klWA8#Wxv8T;d5 zhQZ`GDw|^d6lgKW4=|4MfgF^Jt&^pFZY+4=P5uDu62)eB`3E+?1_<>;#d0zgLul+! z`Fe=NZf25xjDj0tWE`$FXHk52jS>Gkl>~R+(nM}$CS;rBeF(_C?&xy2R7cUc`EqDe z>T4*;+}j(gzDD@n1yvol#ZD~QRr{+?{0?#H_>OXlWbUU9maqic#E$>*y~(q0Axh_7AAU_xpRnNG| zos*s~NXD(xcZh#@x>dqB)zzID-%=Y$QNuvdIT?gosuzSK9H78W&9Dxcb@|Cx`N9Rw zde5k3%kOeagCo|(qCjG-!M#(dN&q74mE&#QXAZjcmWHqV)zu;xUX?GDYO)P)2_2R8 zF^vMqof=ki&v^bFOS~Wz{d%uDt9nHs&ZT}`ip0RfB=?HzLFQyCquAa!%>WIVh<7T( z5)6nlfb8?i?WwN;1r82~@>zQ1EDfp0e9q0t$h=q9ffw5Ve=cylG^F^UWC)oOu%?7P zvn3HUb#6cq)1}E%1L@?pxGE?(5@SGG%l~>(=Csjy(xv)}`BoK`5zyG&If?9)^~zA8 zzkxM1j~Xon9F5a_rBu>1rDQ$s#76p@jOlhIolpTDE&iH){``f|-w3)pb;j6*pGOkk zum1Z-^Z#<|*Z(GQRQA8T#{b7=|GAz2t~39=cVvsIh<=Lsiz8%MF!dlvkOHT!Mt^7c z^xitb)ntQMxqWUK!zjfV(f?|emyek3U2TY(MDTdr?SKBG?y?oer_~k6toK7GCu)i5Ntx*dR{DRLscgWwd7Gra^LHUV|q{T LMBP32^V5F;5(aIP literal 0 HcmV?d00001 diff --git a/docs/media/en/flashcard-settings-separators.jpg b/docs/media/en/flashcard-settings-separators.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43792f7852d5c6794cf5332a599a352c2c18e141 GIT binary patch literal 105951 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

_kzcK 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

$!VN*9^a17 zGK?e(x`2`TpKf{+69$;(7KKAzl?LJF85mcG{o;!uK4B#wUEnLp_Rd!o>wRL)Kas84CCOa? zvVj;g@dX>|MIm>f$?y1Jlk|`hg3K#F>y>S}2#fa@Z-3kDt&~gUYr^<)J{QZ37VnPi zv3L?ze~m%5o-IEbrdUSLh`DLNxBPOot}vIj6cLbmGL|`=<$y%xe4IrW3zXI76#`te zZy80ZIM=J0rGV!%an3&mu0K#7vxz30$=O#!5Wi5Pq;I`-pL>%W!I2}kuDg&Pivc+o zVcCWf1GJy7#KVII;6%-C&RWpCGR;;)xqT8i% zwE*RvTeK!VDJWDk<9g8Ksnv4VZc2Jts9vV%2manhd@Vr%ZfPyOxt%)ms&li6YhEDG zmm^c3%rFauc0NwwTb_D9ZbIX&I@kR)F~v*218GqD1=?LOU(Q2cT(&ATYHn#-?N?7f zs|M*}gS^U8SaEfwysVwH7i2xD6DdvchGz++_uGo*cE{P>skh3T@*rPA%}EL4zgV^#B?t@=g?xQI@ki5j=}vpSrarTd3K3Ni@(pk%+8wDD(P5_*ikxPe+%9|^ra`L{pWu5j*) zB#W2GIVuVBal?%>(s|a`lkv_uvLeZMI0q{2o*3c=O|F$(#9T0Nc?TQ}#hg>}nYDFv z#EH&(bitGOc;S%#P77VfHFHUm&;ii-^1nwh{Uf)IXYISaU3BYK16X2G)h>!{1avWJ9g_@+>C5Ivi#>h0gwKKK}CY||^m($?sN3r-@ z3JpSIsYZ12ksq7{h2-CHt|;E66>QD`D%Fl>89DmdOisTlS*{b^u#kl3rOFaaW8B5( zOIMGBb?t66-xYSO*(r@5cPP~B%C3fR;z)B385L2#;IA7fAdZ!U1UM&4L)j+ijf`S> z>$PIcm8HzRX#}oq#1g+VD^Ri`T8vJ+hU zbzaXOtW?`Z7D`hT*=%4`rV>d`kdD@@(9ng%OPIh;tO2dxbkr`&8Wrv6Jsaf~f8K2j4ajKWyM`;vccn>&yI*e60`!dE6ektB2{{ z6ZWGpS3t%NcG0$9%XLJd)AuVfu#%F6=2IzVdHH_f)f>YUcNI3<*ebhkUYsqVNWIn> z%>J+1wiGq~yvKn(U`7=anxs`U!{e0_Ez!T!WM&&@Zr-}px+^J?UlQxLwE?xQvCVWp zsbrMIT9UQ>RgL^h4TY>S7fd4nuA`E^xtgl|rfBqX$v)#mgj5t&;!xu%%E+Hw6RWD0g;WKO9IN4PH5S>lW5LVq&G*Pg0a4V zfsw1`G0NK9DwY6L7Hb-pZ(*@=pVRE}Z)&yk>pe63Rh{eE2qai9S_?J~_ab+4eEL4Y ztxzWUpE&4&%CCoOsQy;0_Y)GBMVrMELO(uC9!*9y2Bl_3#j*REWG2b!wpy`sR^{MB z+ocjJ8-7F@l)R~VDU9?Ur;Ozpf#Z0O;xIB4fDrnuxXA;5mx%7iEfOwlTnQF7Nrl zcgI$)c_{PRth)VB+wLx-&dK_R@&51q2|iu!OytIX12ZRX=~S}uOS_Uc^-qc)KUraD z>Z%*ymTwcKwO0TJ_D$vxPuW01^pqa(d#N~wQ%5#WJMHnb(J9A-#!@-gl+Wg7f=Y;} zI~T`<$oar{zSQ%KJ?7k9qr)*5phKEUQ4g``wOaJT(qh(t*I|FKLJ&*T`fOq0b#eKP z_h_&8rr9{tYUT9#R9hRo^%QI(LGbG7HTp^tV|X~6CPdK0q;cV8;QQz8h-RC#v#Va6p4b^t zm!1C5Y@YSkYrX3TwFD_yKx^yPSj2pblebr(>>;zuMa7 z)H5eYGEX<$zRJ@P&@EX{Xi`G5NgZ&pNq>9ytw88f1=<|cTV(9A-wcN?1gD#MgnRF$ zhS{20_#eOWZ^HgQSxluSV$G{%D9mS@DXNwxDDkhZb$%<^b#Hl;?D_IhvyhnAUG4Dp z>nN?WS^C_oI#7|(lk)Jl#iJZ)%)_xOhrw3lP&bKaQ;%ryA7FJ>!4=#~*$kmciH4wwWUb&>y3U6D(8j*B{{0oZHwsC?pGP?ZR-CV z-DrMXkh9P$pfA6aBp|!x@<33ew#IRFM0^O{jbH-NK{3_yF0eq8b97)(-HFQ%9GrntWYJ>ldjzl@@;tqhk3O*<8tNg`UFRtQ^@bS#SOV{K-u zc<&xdZ2hfj-TfrrjFbt=V44@=XBDp?T*5J$7EjD9iJ?!14}gk5aK&@|1eK*V{0y8?A_>bdbLUCyTQ*K>pl6QH zg(nKcDX5;{GXxz-eZ)3sO+~(3q^LbYSdbz_)kB(+@n<^SE;G$ub=uRS#j5)jgtBpo zgY`3{_2Wu>@8DLP&{KbeP&aZP%RkWNv%eLZ>j`6#PASUzqE4%Xx;mHzb9e5~@I7fL zMbAi7u=&KyGJz%uguNyw3ASrt#ggwVnZJBkcbejcHF=ktVeX@97r^zpJz%rfEEPJS zHv&m}P&2SA3a5_?S<6LMN`x)w@we^ zZ%~eJj^98H!4hlpc}dyytJjz7p9#7#ALwuJv$Z2tUK@H8wZOTANj#2dLl z{*@vZjK~2jKykI1N8|1xwB0!VtKw=!z73DJrU~P}-dT5~X3!)h|DmZ3olHN^@OmH1 z;>oCe%=(>UaYVWPMwLHmZ#llnmII^*sX-!1(VljX|KZ)o99;Q(|Z-7JYP;}` zR#0G}cSme)i|x$wTPbQUpPERIu<1rQYa@TX<}Vx)h&WgB`W#eocwGvruorkH9tD-6KTGKXEuhqvl|S_{Ve z1Me16VJXJ3b!XE7YAe;s6V+K)9IhOJWX)SeG1WqIN1)?iwKdaB6fRXwm*)0yfR!f ztjr3=2r%B171TDp^=b56F-M}z-Qr?xgxu&zKtKh^hFfkZ;IIO7!cixr@!F85Sbvd5 z1x>MnQkpHh^_6jHlaUllL6qaLr*guw(+6B;iaT<_-0ZU;9heym0@6^5P9Bx<3CeG3 zA!Fn1Ome1#e}Cy|RDa~IUe(tK!5Yt34Qtl(F@U@Rw6#*o_=Gil6pJ4r#>x98P1;^_ zYpWxnc}_4md8}e3-L6zCUfurh%Q(RYZoc|9No2Rmu@OXJ%exKn9gXuS?@Le4d;g(H zqy|g%tmV0{XN2Ygftrv#J3s9ysv&hkXRVrGmsu?O@q@(SXn;0oK0wS+S`k;_-1KgF z&jbide!HGC1(5uj-cVaXtf(n?V!}e>^5|rBC^i#iZU})ZOEZoM z2u`;9($^38s@7J13UAr_LzBfKoN*72Bj!?vnR?Bj9!Z2AH%GcV2r-fds5=lS`@WvB z!1=9!b(pj62@?+kBVD2mteokSVpczTcO+5y?5%GJ4-*D+*m@*(sm0}5W^1+k@hzWA zn&(bXn}!!i`Y8q38N^KQd1@-o7kCQNQcFdc>C2|CWi0fo*|CJCj~k;QhEG!foyd^> z9!=NAXq>PB6=@*u15bxTzr~fJ{-QWBPB=dlWB5`qQP9v^ohQQQ`V1KcQeV)yLOCg^ zLM9_^IPIuC<)tW{UcA9(^4W7ei~l$3YXJA482kX5w%0&yIz#TKhEcsi=D4hMIG_db zVz!|=i~CT)IxT~3yG8Spyrf+P!6D&8?3CWHwp!LqX?Ps02lRY@;ueYqG%bZ(yXpkLPFQ00NdfpJ6d-ih2x1-ht@KrE*> zK_YgHuzy#!c9z{4C@|wk9M@fcR}!ZAKT{6=NpX4|@rPzdD)iv}ujEJSgRDXPk}tUB zuCmEHFFwP|rWQWYIFKYN=5`TtNwwTM<4L1$zYH?<$+UASH3vU*A3tp&$fo7VF*B+} z`~R40wySXPq3XKM>Gwz}eDpbkO$Q*IK(>pQN9wN9(4Yi@X+e*4cnp~@+E9PWKcqZJ zC@X%=pTF*;ukgSF^R*W6PG6R#p>^!Gl{er{@i{uhtSgdmyh)E9^jH-(=t>b2V%cU& zV-Yy3M4nnwo^C6#d?-WA318D()xd&ZDDoA*#2NTUT0KG0WZUb$B&@oiS-3A3vrr{{ zk+CG4iGO$2*RGx6g1PkH;&$L-T;9IaXv)tGf#I|#Bp9%;*8u+z(ooxR$%kdRLg`gN zrzlq@hA#c)TF)y9MHB4%LOZQ2$~BQu?+on{87$1AS+lgtv?u`Xi9~o;eef42j`@qT z;S3ReA45~*!FH>VVjC-0Iisd0b1>X~JK9Q|>0VZPL)A@j{k+9-e&z25I=I0+2i}xR z$XXZ}IajxjD)-yIG3TlvA!mh+$r26{$R?SU3st6=Ys?m)a?*=W2)*61V++&fH^!GE ztPNrvJF8-Yy8!_+93x1fz=Ltcw!uB)p<8t#8i^XLDP@=^UW%`Qr9I{%1L=|I5UjZ7 zK}9fU@lGK#`^Tu!l^4>Yw2OPWWzu09Oti$~c8Xu$%r(NT|px?;s zoturg`uGWq_lBwPV}^Xrk&qX+3;ohFGwOSNOs16xCa&UGu%5r497maWUF@tZ(kC6i z8M4h8W?RUBq;=O>y3>pUj*GX1r=d)L%EE=uFj8H5!&Kqq)o}7zKPc zBhquPyh!9sdAGOcq9H}kZrZ-M1od?>X*(KrLk^q9DeHCw@94X zgnt*AXv7HA4KJ@`MweTKVYmaGq<>qDhD!X>^G<*&^#C1GN`Ym9)=A-M5gv9A-^T6- zZ%4rZLOTtIxsX?po$c{}FBONv1?o@JI-u`s?QStX4pWMzO2pq_0N3bWOVbY0`4nQOdEB@s4_S}hzEitce3_7~$4qB*1($sF&jV=LQD zqwWb=g7U8B$qiEs9xH7e%R`(lS4oE0*~$f`!5=16kC@;D^2y(dedinpDgKw@>0N2UB!W2w)(`@0UKiq2mgH9yHl zT*T$(iyGQ#nRpMH1$@P@$u%}>gEw&l2~9HZ+apGoM=XnGMVtaAnfz8a4*fRGUs-m1 z8GEY#*)0d90*iO+;kVAIZ+H&4(Lv`{Bq#z(^eq?lz*u=L$(V~06;VPnw?<9ZM9Nz- zH*Hf-WT_@AWoB|B)O;t?ii)(M;r<&9TvoAuHPuUx{Sl_bf~~3y<8pCL98YAp7F0m^ zNj{o#-cW&mRcE+ZpoO#IV;kTQ<^u0sTdWWLwwW9@4p$Q$)e8_s`jCIl?<_>kb=h4J z>GGUC&E4QcKVvt=lh(0)al@P-Fj|JM)?0#`hOZjUP0Oipfg|eQ*Z!*iNRm zunRE8--}rs`hEgCeC4}1)M~Qp&TWIY^@3GvcDS26r_LX1%;~rAbv=%F+9B#B_8qIs zP=0Cd#$7`(t%IYetIef-(reK!+Bbe95y&;LDar}ACpWfQ6xb!zC>A`Idud(iqOKBFU;TS3aMK>T){^9qv26^!}fO46=X z`R3*QXz&a>Ddg@Gjs*@VtJc3&ecUl=AlwKkPa~7T8#Nm?R@4o z-WNGtGX99dg`_F+E(E}8aX_I|C+2y<1UXG&>#TbTeRC4w&t@Y6 zRxkLf-X)vEwL02H@b+qtF7tf-Z-78@*<5vXx_hbLa^}N6(`TJEx@rf}Yv-{Z87s_O z!QzT@chtc*o}}Ew)Hm}c6@-U9k|E;N=mF(lfpT|N(dip$xJ_)DLt<Omw0*IPezbnNah&seu9p*uC@l^*MA`*=#1(&}57rnro< zW8BsC+1%T8ROss*r)y@R(3u=TT>f&XBP`C8R!m-q9r6tFVyyFR%j>W&t!mUbi^RiJa(BT_z^Vq))tqP(yLX<(g5_Ge<78ryO8C zpVe&oUN&a&WMR_Q!|KBCJ^b^Oca1e@YYy1q38^QE?|W;ZZ5)buLkS4dNa+Qwz;9+Q zGH^yMUPQ0aHh-0TSdg*j1Wt})K2i9!c#PO$4|1m1TLP5gajw30v}U@bJWD~Rib)Bm z!^0xo!A!V_?N8%I9V6Y7`T_7c-o#`Jb>SNk#UD0CO-H1%I}bd|98R8-jTcaJR8~w) zK?N$C+5n8f9`Ap(jzZ0CT7GDd z>^?@JOEauTor3sm8+(F(SO)?kVeDN0y`bFq9*5T~EN<1AZ_EcFj)3DGUV7LhSf4IMznQd%YT@3d6ALnG zSZL&ri#8^sa7(Ibv7Q)tB*bG+lmP=U7w^lWTrt^YNr($!NFIspvv2jD8n+a)EnlWj z89T+635=&GV|&s~vhR%R-Sdn?+X`))67n{k;)X}!W-<|Xel1cRmWN~?LOlQ&`8C(X z!gC_yp+%LbuwYx?x4_QU6dssMJFY%sgj383r^*_b4 z^6Rf1xhJUHH-m>Vz|>T~3!FN#+fc)!s&{Rm)#qnXk6%RYR^KK?mn%JFt!u1&?VwnB zFpCX$gLXqkR&MYHv&2}%J_ae~D9>}xEG(XoCwNTReH10sc)*6X7Qi0)vi@P)6fp8k zD5uGt?p0pDcmhe>OR{>l(^c#ZHM_!u;#$Iw$T9+{Uxd?VwG4xkb4Sub7Dk!z+D5^1 zs8E&Zv7?%|Zh8CGo{d_qlbBgjp=SgY6fb(ShXJVaNSwx}h zqua$VTr}!wtOd1gWOyBghDRpM*$Rj!@|!IU`k=g;JLObX*66-Z!BO()JZpNOYus<_ zVh2H>R7kJ$2nK4N%3T~5d~WQ9y&v%;05Uk&QtUa#bo~od;=w8(amD8_) zX(?~ik<#^KjJ}t48>TO)xn-S2Ff%Szj;tRu+SS%wn31!#O6&RM*cW9d^RfHqW-r;i zPewR$+Kao1yIfhNN<9J z3&H9{klGza3VUZEQB$)p*j>h`(+~a4hj+2ClzF4)p#iZTTA>ZBzelFHC1|t8FFAwO z{O7+f9J<>dz$In)95m|$`;rnlVIUCLv_a}qDzP;?!!@JLHdETR;%Q&VZqayt39>M5 zek9*?bBu@zK<6Em;Z99Sa1gm{Ij3wqn$!acn!)URanvA~U)ipg< z{1r|BEicuH{lahSWJ~$46lmc$PwR@01ix{K^gTUQ$2{awY6B+wj`S$hT-Rh|ABy=V zd>tVGIih0vx^yOS8U~Qs@<&D9I~m66ccvlMu=>}3Xb#}PK0{@sVXy^EMfJOXC?(+! zP1&3mrBg-wa#KS_w*_AJcVDNP&MBsFTVmvU^%w#^SgrKZSz1}`Q}AVhj=cavuJ$8o zD{C(dsE639q2dHBO;2d;IBtcqYo4te;|ExHCN?bmf>>fudnhN-z~`88FKFq0ql}Wj zH6n?v<98HChJ7!K%a;!XP|E^rDm`Y@lD<6BS7%h-8U~oW_UR@vcP}g?;d!R?-d^MP z#q5uyvxhW(2#jW-R-3mVZ_-Ht?rrQ?Y)Fx|N`z(hcW7Fn~Dzxe$^}Dh)^}Y|Y871Xt6?J=k8yaSbAL0rK>t1C@_;F}-QB*9$k}HPdi`z!+51_n~XvD=Stp+)CC{B`BTI4fH&{ zPV3(ah30huwd1$jCQE7I-BvwWFP1#w;L{w0-d(YsgN>YGW$wpibfl| zkNF#y|3tnkt&>9p8`EX)XZTPG(UalDpo^~PVQ9`)V9IpL|9D9uj_1+QzL zDJwN>)7f<1;)!;D>lR6f=vr2BdHO0&_>oz2G>nn zwzM98WW3D$6J#gn9Ql^9~v8DNelfyG!<)<<3v-zzmTMhwUhd5@UHTY7vD8==Pm7idy+KF zyBF*FLPz#(19X`GBMrB|Yi==;G#qSN;p)2o^qovmp~x9)-YF-fbbUR#NWhSlT*x3W z;lZh8thxq^i~a0r_RCUI)H*W516Qv#)(h3KGLeQv8l9kWF)&nr!>^N)r@a>eCX#|77%8G%@`<9G3crUmdU*b5x&MgtDS-P ztoSLEK;lx#RvBPaD&zdyagF4HKA%BKp`u=piZL)YMxqw5KAkGjQc|&= ze)c4@g|*eSd%Ks|a|*?gE4Br7!{?`*p6}fNyIf!?GxMdlG@m!Eb$ZK>HqezHYnaQqP|I2) zIvRA7o-aO-J}bzc2yVEKoPFe%MVgU;flYUfrDwg%lx|lo z0Gmi#zOKDH7Ewavk@(KA*VW)%y&`%uno-v;J6v^rxb#>PQY)t64~^IXwn6+-%R`jy z-BCM2!q!RP$#V?x-Ms?|9&5yP9+95>W){}p{zkU|g=U{tzeN;ZUHKdEibgUPjW}@C zGni;&3IgeiO^MIA+}Z_pdYd0(e)n`zE9X+|)z5{?BiIMxTUt(EWGBqEucrWbYulYV z!#9BY@2))Z=J=&k>{7d2JPeTAcTp?VG)W#C9$G6ps0eUZd(yMZxYQ7wdg4sNPnIm>(9`Oj}b|7gD0%f8f{`S^z1vv%jav!A0mXBpw69 z%I{CATe{n1R|n$@^<2%_RA`H}evk~(n;M#&Wc0dhc&tbI>RO~%b;b5vYicQlJ@v!m zkL*8a$-Hx_mlJ2@EPt=s;6Rtbb|c!8esTkO0^^2@_2X8_RBe;B26Kcms{9eR&Ryh= zwwa=Me>|8Hd zLoL$1xYay=JQ{Kb2unlI7Jc-~u98XO9@l=fj;R~VNr>kkvrBa$i<1&tN1zbX@non>FVs*qxmSo)aXNj z)J)OmI(~WX0Z5i2&>)>UEq@YL1v=ImV}tmBmZD=ieSMZ|gR) zI;u7~DNnOGAb2+vx?V3oxnG|=mC-JVs8EQs=MiWIvW0hKqae8(Aa*NwtS1AzsAuI^ zSEl$0`XVF7JftAgrf~V1tNepx85=Ng)&9ybB zv((g}Ut0G4v2~4uFey>f5bWOj{P7nuWg5Z!3K}A;G5VU83U-)vlCG*_zF)QhUX(!BT-=6C z$@E)0+AdSmde`^KaW)&S<>Vlp`~cS_w$g6yYO#BS%(SwDarT=Vi|xekq6rgV z2oh8~y7p~cHpUpW&!be(l97%fM?ev~Uy(4V#z23I`pcflt>M+1lssc|zbx0iTfrQ&fnJmjGbH6q#g2St8d3Ek8e z%4D9_i>);VYH?US$d=A7OU;{Ak-4oH+J-S}08JsDwPk$^{cS7P`OsIv?u?Jj;><1y zB;A#0-G(UI4PTbq4?X34Gx9-(_+y%yA$Ys3ew~Ov?RyVjT_c1{O}pSfXJb!W1lNKH zj`cA!jhiKBcU*Y@13}PUcXoH?t<9-TDPbQ-+`A!&e;ZoMNm9~PPax|i$!7tza><|P zJ0hU+C%*a^{b`1f-`e%{H;}TYH~hO|YPi1F-?zVfu8;*$3is*@5aw;7t-=Yod$tdER)-*&NTv0PEQO)@CU%e~aCys)z{&+Z&WkP+ea{M;e2uJKQyBW!TZdnr%5%jj&jP6SwD;W zeSkwY^`0qMWxqQVW}mb*1dVKfYWYpFt}4H~c+29|$F6{B@z10q4zblb?uz{O{iow? z1x@a+>;BN}-k=5;Q*q3x7jON-{hC_&KCTd@OuP2Ix{<|YApZ%5W)`W$^-sfG0;s49 ziWlF0=*(`!COmfL7Cs*zqJamAQv+aQ@BYGV=RA=gk+fH z6)KNL_}m|wBc}U*Xiloda=Jp-j&i8L?$4QDNfgOHG(JD6dn}Tt;aHy3=^Hmy?s)7C z_%u0hyyGLpS6#d;EZEVbfjkLLc+DsqvC0Sp3?lXMGqpMIM$&lbgE@xv$6r95oRQYg zcBL^tm4#Aq*@D|nIR-H)flj9r#SykVT@AtQg&vt|!o5}743GW3<6H?w9QvN!(wV6b`yZ?ZB(QUAb#N(#G3I=M z)7yUg9pj%JUyYT@bkDcb`s}?@e2rX3XS8pk5s9YpLz!hDB1(qg`H@>xMxdD)Ck#E! znV$oK%oek^Wya7XnXj=^@R%btKixI)oSYT#Er-;Ud zw~$ZIo7uXl`U>EfQS$18F1gvZIEu*g!9hYU!kcHIjAzg7GOc9sIYI0TBx1h9a zcxYrK)?y6V@N<>TGdRn5YbmzQk0>cUT0Gtk10a&q(cAqn$H;VDTHtfq98Z(A18J_% z*u$rnyA`=U;C;ixmKFvAs65#oTO53hWTj(QO`cjwa4HT84S zi${nI1>U)_I3J!LNONMBcX^9dm=CPpX1JVziTo<<+=RlV9XL!)81V}p;az9BSWjo- zoDmmMBeZmq;Te2Gs~Slz1_436v2+~fT5%4G`Pb#Yeyu+;l`jU|gC}=tZI(+)r$5+M zn$FHQ=)3I?KF(^C(feI`LtF_iPfE(|g#13^{u!kj5wGjV6LZK6zi-V-WMv`ZTV>Vt z!+BR^bQT_6nCNNnZeh*)sTd-x2$z~#MGc1>x!)*P1*?SKT;vXh>9oqNPwnH->bfK691k^Mh3&6D0!WqPZje%q2A zzc(!oj$+|6KPIfHV#7Wz+gl<>?=SG&*dev<_4;lST7+!39`^p&O}LjY()g1P42QP< z!2NQAJm*X37qLNZB2la}^&%I;2}PdcHxp+Ek=6$V74zVnXautVaPgG~RA1HhCn&En zAN70M%($&V{HnG=e2&y_2pY3=Cg&G4TafCWTA~~CF9?ADuFZ3*;o;R^xT3V)ZtGAp z9*RGyz5F*9pAVkun6Pu~4xU$ArfL~S9%&ddja_FwMs+-meR@SWLidS4ZnmogH85du zkG{xAR5>!U@0^-&n8IVD8EbFICipfGGFUz?B=FVk2E07ii8{M(kG;;lsm>dJ^@RTK z?IntPa_DkyduvlDL&_sn@Qv)KTdJGC6~)i>NmEx=tk!a>4bQd_TD%Y0NA1etRstVs z!7=PsgVpGlxp{Rk<^FsPe`E857VaZx5Y{lQ{4?pq@9atEMtb_9-BS9QlS}x2hPBea z2nSM8i@NooQC?sDA@6@<@2!K{?BBLe>ZO#@Qlwa0iu(;kiWex7Pyz%G3EagBp}}1% zNYO%&6fY7yXc8RmqQ#v6L5fRo_imo&x3jae@B9AV-Pw6&XJ_8OlE1FG{Q92fc^t>5 zJ*(;Z4F@jLWbUuGKe?9U*~{6mf>I?%V>rf#(LnSjB+;Vck|X%re3d2|XU93QOn>Wta8a&Bn_sDEUk(1DaIw8Bb7SO{dy2W! z49j9E(HP%X#s9(Py=n>@NWlK9D?IGp4I9knb5c+EjXsl_Utz9V%^V?gIkLl&)veiC zhP6?(zT#)RRPUdRYnpWTGw3nv|8nN;j*j1?*6@&ZkP$zVcjx^>G4?TMfP51FO^fgP zQu7t7Kp4t2p`k9$kg%YnpR2#`8?)cQfym5qXOZG-jhZ?*E3`@;O3dmuh&~?lIfB6i zA12Ra?WC>XxVMQ+2jbA54%Y_}{<&6)t|=~Y9~kfp`SmDfO`g|x#InqW9g;t1gTZjJ!b8j;qiG!(K$+Cf~KU2_AL)`P3;F4pIWo0 zK$3=xJq~(m2u{|CKh?EU)U-bU&FDi#0xY})@ZSy*svM}KOZwnZNmF%lv1GeVZM zI#Df4Zx=mZb5`IKm2+0ONHY*nSYMCfdsh~hKmhs6yeEC02;Ko-qLj*}Wf-%@x2lvr zkmg@T-v$-1u`kl<=r{b>TF%M$r}t#T@VQ6kG84fJ+*E!Ms&J(RhqJug|j ze&U*twfS`7GO3;=D6xBY{>ZmMp!eHuCW|{baKxpMlL)V4QL1PYwd@dZGB7B`?C_7<&Lu!dIu%wyy57I)}KiL?3SDpF1#mTPa(h}+VRKn=G9d#AeC%Z8z!cO|6`m8H?J(R!rokeI zT^l)YiiO%66)BD1p6~$t3>du=2o+7eL+F&L%DDb^#+VeSKukIGT*f~0Yo$y|+Wk<< z=j^z(tay#*6o5terUcjRiW68@ZYmT-m7(o=|H5n^Uei&fh3yM>WM?DZ5qC zYcOMkiyXf4ohf67*NPyzdaEb?Px5Ly3PrnH#O^XUd&F7PsN-lq^2k!RmU-szJ*{E! zw<_RtUB1gf)Ki?mG0oM#uWdRBw0Yy#S-l*!+Y%W~m*NRus3Q7Fmtwn~ZdB1#$*8P{ zATgP34*aC{k>Dk$czP{He4)OY1@ zi>fAhOczr79;72tljx2T$J&_?Z%>AUnw74mxlo;>~nL%zn<>0 zE;rV6G(MGXA;+d|2EKhy6i~<~*8c4+5e?>mIumh?zzJwjB|jAgqxGB?_c7-)IEIpE zoMJ^6KDminO+g22KV2%QJ#0QadXZiQ4F6sj%Qn8*r4DSK{uet7sZF8=XXc+NJyUfg z57i|sb9RWD+Xkny0s*k@Zzn<~rT0ot0)Us56j11p8{hfjy7d{`D*3Q2xBD;Bncv?-c_Jx(fPvEx&6&fbDQ5Jufx%H%o^2qtg>6K z7|`?c9C4kx5uXQwuJ?CUDF~GowwSHWWtGDnKe((ZX3w1~r1hr04>j6oZ1Jm`{2?#Q zm4=n&$+B)k()|zzjl|~P%wJav1AZF>oQhuwR@YvnG+CQ$Om4j~yVMS5t!?V%Y?xkX zP-qYCplLGMd?Z}CfqEiY8F_;PU_AC0^`-+)O!PtGb%&Kof;$;H6{e0432TIO;6sOG`(fgn&(koK!3Sa z`-wq7z1ePc6$_%h6VV8O%h{*q3*Rh@}HEX?3hh-g49_ro_om^h4OX9dw?Y^CDDfr%3t9)OYDwL4z{8-j7aI1*S zxBwqbp@=mYeuM&x_Uigo&g%|`!iI>y@NcC)Z>vnq%baxpu0Y?kh)u&<@Ywx}q?Nsu z&5@ks&miO4i<9#iS>&S=?*w37H%=nTjIE~iwaZ)1*KYOApddb5%25tw>DYsCEN!|Y zqt=1hABv1|R7m#dPTe^}hZmDuQZlezaN1)@I?ToLFu`=}YoUq|+FHpD-1mpV_YLh27LDiz z!+&m~UJoZz0K;^a*3Sx06J)+d+^|4X6YsaFgRTVIR%NM2lU9d_2$oS1(E?>id zUc#V&f1I|Y-fVMek4b8ShfwSIP{l0VU0tS}-B+=G*pcLNbna~kz-Pl#s}GN4aBf#m za}I_ZFr`(i+K?03IL%Ep8xw~yVvz0i560TWv!z;-aXWLDQuv>JE z&UI7w)~OWUb@0io=D@s(|HwLQC-YgHFv+Lw_HGO+e1tLbH8~R8t^GqmqmU5lUt!l( zKJ|ANc#*iI{#N}A8!Xd>Wbz%mWIlXa*kIt3mr)pyZBPe^r9U2K1!bZ7MWI|R!$xr=?(qC3jl>=w9wl_^0 z+mRuojMM5{L+;!0jnn=0_94g6CI<2aZ%=YdVz3vzReN8xaefFtZQ?pQ@-aO^OPq{C z$J+IKtF}MN@Sg<|&$h0L+r>cO2zP*@uj8|XSj0OMsxdo8j}0j)A>A=kAD4I4#&)ki zg7YLdZ_?flx|C2&U}$1|S``f2{M{hMr{q!tD-u4paPH3BjKRkzoK&eTf~;MN85_KKyL{m%jTaI zqcpY;HP~}{+-tT6p&4iTeB6`TpCR^0h2q!$(sKNtt$L8#N+Y5qOkO2oPgdzeX{m;# zTmCeY?qC9G{g%U^ib}r5Ss`~-zOZCn2UJ44wwK`Z?p@Wi(Q?}Pd_&3$`2W7e|EBgA z?fygYtCJk}s<@?f?apiMxrxX~vOZQy zeE-|f(^r`g`qpPr-p06g>dWpE^8pVoY{5SYXaVh#kJ)C9kHx5p>k@t*0#o?fWcG`W z3f`;-lD`0|*Yf^nBW@~TmN>PJcUBv}RJvh(Bl&_1AK8T&la2XDqHafJ*pNZkV66uE za2FXlHBSMSAT?y#bWOJN}m)Ohr^OL9@$~{*GnAe zuyok8Od$WV6kMpFO3%-bgO^Y_+pxgMa0+{DA5;?K64KEf0rL(A2}pNo(@2LqO4_!} ztBKye>E|yDo2itrNkVL@vx{>%`Y+byTjowaM5bN$F^9*O<{>OGjF^Uc3rhC}B)Fg6 zTQeEp0#U4VE?(9;a|r1P&_)x_uHHjUgX1kq)V>Iv&~mAS(ZZ_A*l)gia+l(8F<(Ki z$W8}{bWrGyB8WaaV#8t%04 zb?hx<^jp@v@C#VVb4E9APPbQ~DSUSP0B|Zm`QwM!&e!X=3ywyo3U!m0)SUlNfLqS@ z*D{ou9bSH!t5!Uy`j5bj60KCruMKHu{y z9PspdS&5YaB>GqT6Syc;7#Rm|&?{Q9LFpN8xyBiyxz7WbFYO5W6=%=;XHVN%kZ-W=*noAKqA6xELi9 zEb?1-zLJ5&mhm(_J2(~4x|6~IbD)cd{Y(rKupuz(CWe}e%vV`YfWQoCkV(u`wbk%Op#cb9Yaxx7JvFf!tdzZvT3*#~apfGE-mg43PD!m8W9 zUh%dCcYKc~mas4K;pl@HY3V+j4j+D6DalZM|EfmF;JlAIFi}+h+*Dh7?enC|IN6gN z>O)rWci@+ZC4h-kXMCq*n3hJu-5*3fg|X4k52Ca9lX(C?0p2PHN&sNoud~`!iIS>< z0G|1MM)~O?)G&3CogBntzn_0NaQcdIUe~$Nal38EF?DyS;K`By)6q81iZG4D3!^1~ zvpwQ(pt2d2w#H|7wih>2Lh`gaS+A1kcg`HOTl}ciQEZsAQK{kdhGD;#RS>w(EQ3H8 zALk_-`qZB$cP~O%Hr(1nR-9DaYIai|$=UkGd@B`_n1B|M?oPhD?9TC>nc6M!xXK<= z0ba?9M9oZ|!)ETOWlM?7*{@Fp@@pyj{66ryaB5Cznku!Jl@HsSNzCiQ=vvhXJ?NmW zI`d?meg=;SRx0!S(hEJH9}U^0hVfdujFiML@re_ca#9W6aiPv5$ZPsu{uXNlg*EJbCC5H7Nb_$TWuU zr)gqg@-}dnAgx&dXr}>+Ch|Xy2%MkZjLbb*7<~H4xAx84h2!R}!PH#-E$JNDiK^M( zS)9S_B?%6RDZ)?VK(Um6$~^RHY_oi)vApCV=$|I~>Sa zbLf}{a0uWrHZ^dqd+OHDkog?KWSpKKv)dh<`GF06YwfnuJ<8eK*&&JQJ%zloRROK8 z`bvNvNIv) zp};PV{Nf}^WgQG-Im=`0Lm)}Wdgo{jR#m{0kz8mvxt7E^OO1m*Srad)#F5!5H|Zmexdn9Qx_9knH1KBHgINSTeL`JV z4xQgbc#^X{SbXLm{;EbDOcTa?Ikrs}fdq0$M1=3m8=v7?pH(aAdU6B zjX>lZhh8Sq(%3N9X5?XN+Ue~OnltiPM0~jK-F#<$Dx#qOSGm5*@gH2@% z%cy=ZZffJ%u1kRX86dVIa?gaOeegN^n!&U551uc2nEumlF+M6k?h#=dR8?}H9mQr2 zA_Xhmh5Yj@hqdb2`{7M_8AzQUn2_8|e%Hb^Pw4>a0J{Gt~`yYY+2?ST?0 zQ`O-Y-`wB4$LFI%2HCIi-|}&|HimsItDywYVK#hdfW8~RyX|R|#09E7O~9TW3QoCd zepePjZ#vf>G$XYW{HZ(TtlF%miU+w>lH58{a5auKnGDtVB?X^Okk5bEv|(r=m&NfZ?Pb_)D*{HE z>ak7ln|8s!N|c7KhJTo@1IGtGr|B3Jdh8u~FYpF*D#^lyg?GK<@MC_&w1rWZ0kT{O zPzVBQV!*(H1r`HYSS`1XQ+@OVyqs(zOh#iPiX~I5S0mB$C{zCjIeh#Od4mtn^J&#; zHzf#cTCrLJ&hb_#bs#XqF{SdQ&ShbWS8m2=+w8elhg@Q6N0=cM_H84qp}Qv~UEf&j z1=RF|`j>J$XH!TLS52y9$6SYi2g&b>i-f8rHX1Rt$GVNo^2^%i zy}dGqoh>N73T1q;V0fXRKnkZ$s4LYR{Y6p3MaD^H6Ig$8fZd+^N)(K0gI{Wvq_=I? zYF&yoPQ81SeJ;&?GLv(O3_qVEG!=@JIeDNu&Dkvx2nr|Y2#dtPr|#%PJGA#Rivg95oyWT?CL(;v#AK_dsXHC zNW^CWSK?u5Tl27!V$xCoY)j=vb)%#u2|#!bU}3?r=>>2_7nL#sN> zGS@&YJ#fk+=DsPb?4J0?2NRXs@MlS4I*BERL1@W_yxKSzU+zzg#P2jrH--xWXlT$E`;=%tgQH6nvbzjO7) zWep?0I=5s}j^!CTP?7{CD&L=s=s&9k)F^5cWzE1$E_l9o_6O#0xtv$gp-N~J=T;u+ zMlTasMwbLolg?;Su7h?saG+|)-80kkz`>^@nVt+$gi91-7ue)^vRU~7?sK^{E8$x; zOVpYpqtQjHMEhtxPzDI`uH@UTthF{4ZuJkb?`vmDm028H12{>DXilz8YvGU0+2UuW zKqXffLplwa^|)@$X4Cg<>OEGoa+9B%=Ijyt^@^EB^x*J$-I7=PQXTW!t_Vn%+QydD zxXrTjRvKjS`{z@aYUvvM$g0g-n&qGx@{qs8w4HSHA=yEUS{t zN7j6>allC*ZN)zni1!K&qUl(j9ofE@(X(68Q?W1fEt)6sy)NUeII%g1oBOZmYGxCm zZ5Dmp&4lYx52+oQ0(#r#L6vrH>sv3f8BU}y&)TXOPok{YCpRNi7IMJ*Y)>qwwn#W_bf5) zyw77qJyAP3)zglq#}2_79__|hMO5t+oPQa7`o*cX3w3?S>bWEiGUF`9s-ry=)9~va z>$kVR?~F?HVQ114ql0EMK6tvfia6qzhmE?1VGr^OcHQ0GQQbAwyZf5mB3J{3KC?E{ z&{UNw3mqZBw>EkaVR1_J#brS;Ce{K}8lx%%*^n<2o67Ljy`KCmA@{Ah~!C+qX|uG1f`y4e6bdEP>!J21IA%&`$X z5nK$;0i`05>Dg7wYlH2m2H9R7D6unor8Uw~pi&Dv&025D;$H;mIdM*jStx1y`UJv? z(0;14H@IxY<~$}Nt2nK| z$M}nW1%jGPGF&IsNciQqh9-f7oCLJD5u&&ya9%$A^fJ?CQ~1=u!A#k)e91IfrBwFp zx8$l`KBdmRTLQOC0Y)78C4u+SgWOmv4$j;Vn@y#tbo^BVbLl)B-WUh)<(%eUFW9vY zJ|Ol~XGAUyxWq}+9N*#UOAzaSbV7~&TWH18k;EJ5f@2+-OaYT+JaHsLbLxC0ktF^m ztzI0-V|_2Br3iE$m)6J!S)TkHH6tL9%S@KHb`4z_Fp~%;|30zVb z8V}6o^f}jgSeaX=KO`~igsE4RfA#ZXsJe7V#>Jh;qPLw-lC(w#KEmx4I$r3WGBzc3 z)#e}3R_DFbwl%Y4sU&nB86v3gK-!mLj5Mrl5|)G_EE!z7wUb&~t_+<2~+;_N{{BZjvWT zSK*}=j`gM--K0KB--smNsmeD(^Y?Iu!gP5^yi3+ndJWOIUt@)PH=zau?GiN@B1j(| zbrhucx2A%6Taxf!2XZ=UdMj(Ls{nBA#x4LaK?NH=f63m0*Q=kEm6-QA^c-m$1zFi= zsNFCn!cf-$IAVUiDBL!n&lG)Oo^0o9fR46nEbd1-H{K*JWzAg|BrtzL7M|rJfu<^* z)T%&QH*f>O#K}H$K+vuv$8gd`cT5lU40~+4B5gU!CsMeHWY$)Oz#yN=tv5(uO2?k$ zlCvp8l83y*+oIrdzW4)i>90hShg>qI*OtVHnKf@RZ}H?zN>CaGeY_)QsYCPzaGn_u zO}&f;mx>9J2zhmBDdRYN>5xG>OzMy{e$jbS8NRf)CDeF$H2g^K?|uu_MwV-Y#8&-^ z91ONLNUB#hCdYwTV^&&5JttpVJ{A}PPJrdrX$b!y+^=bh7CZEBHYibhC|YJ z;RWxpAzEqf^(uT_&|rRk2Tv2s0;mTFo=-yMe}6r)br*P@67XDTzaO#^&y|PHL!YD- z1b&iub-6h034%p`@72`pb*5*$a;Hu`*Kd$i-5Xr~zU&h5;E_yEa5r2(rJir;16#gO z1(0%DH$|=XKa}p6U{^x?VaPJ=8~F% zTHHdlA55x(V90suT!BJ=ux8r5Q7#Z8GdW!1I?+;DNhVE0P8Kpq#tDBg@PGrV{OZtv zIk)*fOeaYQAk21*!xz@dPHhY2X%DLncSN|?&P9R@@XBZ|C8J|yoop`K$oyhVSr#}e zaRe7rc0CbyqdU#92oje(F9u#s1KRhI!m&kzo$jK+Yt4M*M9@+}YiF~xl&dF=@dhtb zYX{@iR#7e)PJd;EY}z?=+#Bi^&?BY+C*Q$uadEwQ=sx8gCBehP5|=UGyt0E9>6C|9(Azk0A8}!hhSe<+V&K3ZF1Ao{Up2lwJfY;tBKCr_KrPn znlS%Oh~mF;6JtqEV!GvbR|hwrr;+oyG1m(IZ|Rx;b-e#6SNZ?q@Bajc$Az{Z!q}eS zp9`3i722H@B8|R3$&SJQ_4~ih!~c)(gBxaKU(F44BY6s%9{S*F_d>>i;#5PyhxN^Q z-OeiZj`+ZTg|O@YiM!+9W%9evg+6%P%EU-OL)&r(E%37L)f$NCGBP0Ub9_)m-{Q6j zctE;|*zxI5|s{IzmQO!-wG_;!qSNI-oRo>x`Xq z4g|zVHh}8_y3)>HvR<(*c@#%WDoQcct2A{{3PLhIu5-!I=Y!hAJq2J7k{|dms~knO zGubDvMO?nzL{{2s@o7^YAG$SeKRtQb)V$FrbTaX@)e&PB$J!;iL^ON*vA=$`%ku*n z5}h0WEe*#y_H3+Z+kUGqOyb^j#KJzgC3|G!aiW+mC#+h}!(oi)&GI0={W41TkU^y} zFW=)KhCc5FO-23+{hj>T1T!DY)HC-Dm}*xbwTPrBLC%tpS>ydX-P~dhoh_SS8=va4 zh(ptS?SByb{0DmnozBDfSI}$sraW!kjtmYJ-}APchnbVU`53{Ht;I9iBA1>ulV%z1 z2j!&B$Jw``uewF+1Wns!8S5uE#lqis?<2OwTG{~opbom21bB?b!2S(LWn{Ku5FsU; z6wumo6gzvr1mR@)>m)G#-R}3;fcC8;jctq;cC-CP`M`YKStkJUn$!Qep>Gx%zn{@L zd@iR51|uAxmivZ{B!ODt(`OVV<9SrOsabQ(XTs8tla)S>#@fh$4Rt1=G3d{1PMjEO zG|mAuT$g57%4B=;^~9<~KjqkS30lQF1lBJ+8?(?;iR@}$`2%~V@| zUqH#a*KUT*3VBi?&tBhuUD!!*1Z3t4Tlp*#we2 zra$4>yAM1K(}-@{>vgJBr zXCREaG!V>M7cLm*@9UT4mAy@fZ#;<{bQxr4@6ayCu1CXVp6RlL@tWxqcNp62BgFwt5&(aTq$r zUjk5Cms-*iSaYN__t-&!&#jUT`iu&%;sjZx=QuCc^@BR~Q^Xb8t6}p!9?XeT<@7i{ zjSt8eB{1;bCt2+Q{{*`c_5z-s7igGWr>Z|&t-oza#-^NhD7m?PX|mBc?nr8GD**&{ z5`=KAEn7x)T&G298VLmnkPrQuiG#QP31ToBcgu#wGI#XERaX4i1 zILiAEh3Cju#jq?KcG9`2yIXr=3n)_bGpdjJB@0uVh;UzBkLnrGsoLG%;5)!W#K0So zwvem6`b!C%`iFwz55+y~SS7(x9pWP(>vpi>FLxYr#$`|^Wq+3dca5Z9cAz(V50FzY zuH2hdN0vVePRgm1+3K-iT)}9yKW3D!vs`~C_%Mr2fO7ItmI28=uh4r>!p@t%o9e3n zfc&f_DP5@JnF7)e&vF|EG4JQDbYsSs%`nE(Gb`_d>o8FEf85765E|gB>iGD)H!+|b z+Xq+_k{{e0cqBx(A{5)bp*|sco~tR|f;F{)S%-|QSv;ol{wF9(A5(C1^^RCTcts?- z`KqMJ5LL&!^aPu;PM#{CabE>(2tRsnB!Fq3cue)n8j7it*^m^{#;n%0=dbBJDwKL) z>BRia+Gxj5yCwCYL;7IdWNyV*LL~0kGwn+w8|q!{A_k#^eAgof&H1noh5PO!+;$1!KPt5Y<@2xc#R)N-!StfkEF((F)5cyioz zo=um|Y8|s@Bii|-VJR~BAXviIWoFO1`YtCOR&B(#!}PB8$1Mk$v^gc{P};Sp)9!_i z+IklK35xY-<}<{_B_&`Jaa`I(9==XN%QDocqSZs^QKW1_iXM~1bdePg$2j4|OCijd zDJ`d59t$;EbzyLmYDPz`;3#@ip8Bk8$RRbG&!09^im?yH%0UuN4kun7$HO|3|X%I8Hv^!RNf6y>I-Xfb3l; zRJHHa25@V_Q}r83jUwd}^4z$kOq!RV^6p+ipV+c$|M;o$8m9Yl@NNE|&pfr`>h~YH#&d4N$FA>yer7IupL^>A@;O(6{!lD8 zL4D)smM5bje<;Ww%MGh~r(uzfAOEDdw>f(JA}2}CYa}^%=Pnkg=%aCb&jn+9u9ak! z;xO7@$oHhLbH8Bsyvm%Py(#}T+SRkoP%HG6dYXi5D8h^}CTl?oyt~bQASPX1kESr5Qz`Qu+pIqnbsc72H9)cmBcy;# zJlnnKGB|%)J6~mlK^0kb%Xg;97`rZDLQ_VrOR@j`DF1nsI+?%=hl;U6;RH^9fbRcM zb^Y5loMg6XDl+OEIjLP%Y8FUgdw)8zai{;h9($u4HN!-HxsuCDvGW$iEpl1eZtnH| zat3m3ynFjTdH2Y5C6oVL#xc3Bv=pg-d9^J>v0;525;#pRP5)~*!o2sRhVDAh@JqLg z#4zMPSF!(6X8gP5qTla@B=P%5)&57FnCj`Rn*j;8ms~CGSwF{6>M3c*SFDg6gsR=Z z;1b|4aFl0fac6iBOXABL+$%poC>o?9U83^r`Ht*ItpgJ5_O)j>CK#v?^)r~&Z=o$c zrQ_aF^4|&9+dk=inQLJad*Y21heZbkyE&lKu5#-~9_Z;hkA{4%p5nyRtsl}Nh(N7Z zJf2k*VY!h|p6mjQaB{30NU)i8b3sZ0)jSb*V;FHlCsUzLZ z&q)_9v6JH_hb_Z0R~X)!&3k#-a(B*eSqGBSxY?iK0EpzFPmS21dy1gIN={gF;4e#K2E-dF>9CWA0z zmbu5|FMrsVO&GhG)=RvwvB^tG? zy8_K$mUa~lMLKroJsk``YHsS=9_v?{YxMnQa_3Imi}QQaqQxGE4q87!w~pR)(sFUj zmfl3>9tZ%Y+y(?ZE7Lr@`X^7mJ$m9Q&&HcKG}JXcINH{TN;P>1e>9L<`2^kthE933 zIg{J3#K`X_?-ZWh-~5gU<@{A#(&PD+f!Km*u2)NL1_VEV>hRnN_L` zl1^4e(5RL-x;Uc<2ua#Ds2VD8RtumfL=3vPKUve9(6q4gkte`BeUi(>&V`nAh3>H9 zULb~p@+-tIIydoM+?jj7qe+Fb5VQ7!Yt1nd8Y6IlytV?bG@3_w&yxC8z{C}ckZo`4 zOTEgJ7WoXy{=8N*VtSStF5#fF?(bUTvL4_2l|5a~r;p#glNPswfmXYFE7`9Sw925s zaQ({aYuK3VGqj4b_r;sUlG5<_$9dUk`e>-lG1pAf+nwGEv5EN$I&=_jDkJN}9kGKd z^^=>FcqQ*w`KIPfZYF1u!8oQkEr6{DQ2ST+Agk#fRLL1#EchG^81z9b->!|JF$#m5 ziRkJ2Rgfc1uXxvbC04g1mPbwcWivu_pdAK)b18JfY^b}tRwL74s7>_&RE5%-bXbnc zp7Yi>N^!BY)6uxD$#laJLKWr9;$G?2Bxh92;3E+ zDhM!`x8^?M-6(RbD!uJz{uLi`Qog$JtaDDv2D`v(VFx|n`U)!6(9Cz+8pQF*KhZG^ ziu!R$pPQGW*UHn1JvvjI*d;BmozLVYSE>A559j(f}*1o&BCiRN)gFuIfABWb-`9>8uT75cud?3FXI%D`Fs zHaK*Y$)A>mUlCLHI<|mwZBrs8%1g*!0RJ0Rw6AtTGTc$NH#*mDhWGKQ&lA_^@ckQ= zs@PraM zbJ?_AGXuX$bZNvqPiE2A&UR3>qc*KkTb~4>XM3vCdfvrmVd}46&h1X#QXc|1dir7$ z%ripyZ#M6ZolnDFGSlGqpj2G=H1MU>Lk&vI;X7)EB|5yHc*6U84}|Fx$!uz9-dIRGbAgb>owlNsRi3&xhAY zF7w&eS*;BJl~z?K{$+f68m6GouH$Q!9T6ehZ3y0F4&cz$uj-s!ow5TV5wh6zN&O+s zs8>uw=^et~-*i4v;PLQeNVwg)gxs^L7;pizd2kG;l5v749pb0w^|Ub!^tr$J-7R+y z4h3E|$kszGmV!>*o!#Sy08T?C5kAZVDW{CB9lJnLpw|LlNtA4y0cyq1*;Mk1b_e-S zefUH`9prlrx20isgsUEn@2V++J`(^u5JGmHi@U)>KBb}b_O)$Tg0Ldw=j9ay1svi%2zyNDU(AG=CX3;#+?t@5nKv4DZN5T-JV| zcBNlo=S(KEw&PRq!}!>Vd1N}i7(3k*o?$y=R|DxuF~j0>hPBdNo_+HBy#vzps8HIl zXIU$Q2_{{?xkO(-x3Ok;xejR_Ss|gZH_^`v?6oWNTA>%c-XwD9Akvii5Ja~(X-epJ zn;|?4<5ddi)z&SE7TPkbD*!h)36>3Ep?e?>lPy2bdBIQ@FWTaMr$eHZl!5%c==rk< zPW2C4lLo_%vUlXq_6U&1N|$dD(5JzKFdn4+|Ttv z&pXxXg}d)AkOK!yAC}k(T|=@`z_5>;j6>Cz}9G(g&|UP33%V=hQ@ zLA}UIZxWy`cMXeS@><>6N#~adKuikpj9%cFTlRJmEWcK1#V|d!z9Zgq`9dhB!rs!T zINB0`om!e=wvhW33E*-buvuV4NjU5?3bxIzMk+_!pDeXEQ#tW&hGDq3o zyZODZ8M)z2jX_PCAlj#x`R?6OzI%38{I(2v-~WB2~5jF_93 zt$b#@4%W}{`Db$^lShBm+t(jUrcR~@H5xAPA4XI+WuGZz{);DA7#PRC`advR|G%2~ zF3s~q#vbPkN z004vcZu_Z#2Xqpl7i9R>y@*-oE2-3CG-6U$E&XX`;mUa<{Bi?L_K-Yq9b9_X)!*}n zLZKcsCoF1J14{F8@Ck0KS`l0L@LE%z(@HgjF6QIM*c!OwC}*b3^~rF|yhlIG%qnqt zwr2(nILj~0FJaLt2J8MvOb<$~AFkZZ)(I0>diIr%BS-g zOik7dyGIM9cSuvbwTDk0F@Jf!=m2|fx~KvfNSu7@F>a!(JHYuM!CDiH5Blg$0f+>s zIn8yr)*B^jN_9}`^)93`zuH8|)d370wu&0|igLA5p555?RCkE#igoz>g2?FdZr|l= z^&T=I$TsxL&kBhtx*u5&^|G*>hLE@krp9t&w1Q2+S)oS}YRSYJ?4S$d@;=hKJn7(* zpL)^YG`Dm{u#oZ=Wqu=$##IM(TWeQ@D%P1s-a@e`_>^dWjMjJG*If7=WES*Zpq0b`f%cuMNH3 z?KvUfWtR||4%W=lo|e1H@Ql`Ac|haQ`2&bTyp_H#1BEOk?GADQl%XggYtN4SAGfsh zJ+rZHl!b0nN*#bOo+eO}0+G<;ac|RCLz$VRg(B*^&Q{nnWQ7K=iSk$FkWeSxTQWYA zhC0ZRhNgr0t&_r~oyv)1EqTS1v$fL$m@_o1+w%8D9XgH+oDsA%H2y*etzNGJ{VUWE zn_qk4gin*Ckbro{NF#4OT{CQRbcr}?*Jhi}Dfc&$W3a|ukpkb-pGnT*c9f->H=;Tj zZKn;zcpzi@E7xz0 zVlio`?sE-=N`Xq#Q?n&_u}fZn#&J-}5zLqN#^+PjTDPZ7wr>(yYsk1fIoV>fcnzmC zj{IPeOsAlHpS8olR)ui2lA6})g)YnrA3>o>UsKy2MHlDU1uDSxIkH_v4w+L{xQ`q7 zJB-IeM%g-}9Fu=~zm=>=zzA(q87n<42YUO0K8E+sB=7I*lGiAD#X}y2XY-pc0qRH5 zRCJU5UeiU*2)%{bLIq*+VSVrb7@6RYlENP0VezpN!HQ30z|3nV!0xC72WBq79b$Lv z(D0rN%IB;IcaUe}>^oZWpSG~DsXJft1aJ#gVNwh%Ra1@|lTRZ@av!q`6=>YDy=S6p zRN@Z{`Y08EF%zw6mtT-N4A=5MJL=ee5v^^LgPJQP+hrF>$#bz4UV45N{k+u>Bd$=6 z9`{Vzg=hMSEc~uMpNxSii-v=g=7Z}1|>x#ZPyxR74ZuE^q$QoTha z%`~vR7g$xYGBzO4!TGnoMzFbn6LMwV|Fy6g%*pE(#cqwDrF#$o)Rw6;kjfi{9AMX0 zqW#}mE=M1BT##4!3(>1ne<)g5Q~NTg8PE;P!>hD=x;XV5fjhdDoonmMrbdWz~3#W!P@6=*V|8;%mbEH^BTFf8}< zDiS`b-U_i(Z9Ik56k#)#U(dXYk|(rcFEnttF&nnWG#7 zbf0v)qos!TNE6>0n%f&&IyTV`?cg+8ot?b$P*zfg z&E57jWT5L_b2?aw1v##J^W$r|0`6=^p5~@b>}-YIN~GLeLWG{3Fm7$1bEw}ixkK8x zOVk1?8;7!#7Mcz#Tc8pUsx^t@N{k?;0yS8s0L<4lp0jCCvX1Z%fn@CUQrux)j{KCNObNtBCG@7a}5 z{Hs&Plu!7PGF<#e0Oie3{S$q~W0PdJWNp<1Pq!DemYlAsRT7=i0Q1G})c6V5edl!Q zI)AX!i+_z*^FL{}6jAgF`PwgTfaRk>sc0_W9pvYUUHUb|*I8X+5MU<(+acVl<#Y2q zeRux9vG<-qO|@~qF7^j~L_vyxfC!-%MS4|~mIz4b2?3QRB|zvM3q`sD3DR3afKUVy z5<+_f0Rd4Vgh&ZUFEMnGB0MMWoIQK?ytDUvKAkh?oY~(p>q929veugW{;%Kfx~zlL zX8bIbNHRbO9w76~t7!qSlA>%4z{g2vovRK^9=i9U02q(aTn@wqT}d3y+r@;WAzKdnKGa@&)b6<1=x2Gco-WxN&)Aztai4O>jG*QJ0*?&8 z0pdBt16VBCzi`a)1^(z?kni@SB z-~C4`s{c%4v~`kXLIG(U?G*i?}Sfw z4~%0)Wq!;Koz1_s)mmtyd#jj!tLBrjk)3audl?Na8xmreg?&(!)Rf9m-tZdojxMaV zxk78{T=%RUGUfz9&-D)^M=WaL>oaX;{l104{U+|E-CFGpooaqH zm9^1AhZ?w0#%LQ(zU<3S=W7bK*c$IP--oEASNZS!QwA=0d}l`aoTr}TN-=i4phjP6 zVm@ZI*07*fde~h`M(?FpVaU#hC{i-Fo0-l-XK00!eO1PodQR$7X@EHClcrnA#o3)d!R&NM-p25Nk zg9B~KOjT}L;4`DR%vWTp)+4foj=OdG9^3=ne>6NVVyNvnv;9gfG?xUybuIvV8 z1y!`-wAgR|s9dFs@rm&WhvqGNlyD=XDW^!N&)A%Gt5?iKNeO1Xt2E62xF^sr1Ag4& z3R>NF%x2IoxV1WCaFu5_c@KV(k9lF?d#-7NAHDJuH301~)&}ErxK&S1YS5cmL5NEO z<&}O00Z^P(;}Vy}NdyO;$6hh{s+b_+8A0Bdx?^6|W04P@=FygHnHquGEx6UvqJPAi zU-Y*OXuj_+{yYu(+6_ce;C!E!_SVPOX!Iu>N*UC$3Sl!IIb-q3p-`H%#6caeh1r^$ zE!U~o6GHo|-9|O*zJI)ypf7(z*W+GQPAuY;_uH2 zuv-9mazil+IM5RAT<=s$i&3QFo=bTGwTh7Vwte!t$qqR*OkV3XA`;^}1cOG3AFB2D zf6UgMc{B-OylvrDP3CEzli&_<|CTnA&;=R?3V<_+#w=ak&D5a7wEUr>45e&`IrXMG ziuCr6(Z}VbEfU9*R=I!nm(u3X;m)-?QrxYs>+Aar-$=fSS^NiD6N|(^a3kO4C9Rj0 zHIFn#2jNTC{SRe{JJ@4o=TKj&B5rP-!Whf@woxaU>dANErn12DJJCn%Dg06%p6m~B zPZTjAmr6}}6ZRn!&1J);F?ohr!+3gQq~zG4=2s2Cj7FeIM_{uTxvRfbVqeVXz3Xg0 zb!hDEAvaX=l6T{935@%7$3uTfr#0FaPmPGMq(S95{#roL4(`|jUKfyVl^Ol*wYax1 zQ|-pP$h7zVH+zkMTLMKwV2I&H>S`L_Fh(ou{A{Ym>tC891D`XquN-VLcNwqhw^g%u zX^ga~wj9sF&^tkRM}?|J1AiDwdB*qY7+229bYux3(Ad|ivik(731Amb4ZQFGW5fKa zSdGrEN?8#6)3EPAHa%x1cM3!6Bd z;hpDp7tJd$=fbLyDR3xM{zMPhJ?MCzP+rsd-8Ej`6#VT2lEN7KZxb48YCdgv5VXD%2tV|1;Ewz~`a9A5w5h6?OE1rT@h!1N=7Q_aHb zn(}0a^Aexk&Jskyx0+TnDBWkXc+f)JU=xay8y1)d5YK8fW2u!047@y$KRQ_=cIu&wN z>VG=wd4>vnEqM&S!1596Kj!+;Zi(nxt0X~TKo)BiL416}WAPh9b@mEC{P^a-Y=4$7 z`KvbzOcFqiPlGS%{M_a{|CWJ4#^jVwLf*z*DP9gN);@WZ?ba9kFu`Vft(r8KCS*mp zRw;fgo_j`!HBkx=&>4> z-hEtf;#$0CYEC#oAWni|(76P=rnyZ8Rb{hPi-iXy?HmAMQXs5+?84(Bi%+Vn%l2V)o?bq(=v;GdTz$MEFZ?aUZKV4Z z7*Wp5sG(ciisyJLlCpVcVu~kfEAE{sr93=#sroRI&^_H!m1Irv&Z2II$hK=>tQ=J? z@Cm098DuTp_f<=3(;_)o0rAE6Ey1+>&tlqQy=n7-PF6Tb*L~@WtFG-2W5u@uOviEN zrFg2Zt;K3c@VZ7M&3iKhbk+laDaX$Zf%jHeD%$QX&nK-Gsc)e2oYRdhx&~ESikt;L zPh7>bnvhL+)QGWYeaSh^YhPr?Y0yX zC2{=O{a}hH)#$F(RxU5^eCLmEGs(=FX zDvVD(Sdclu1pdp`Nuz6H>3-3Rtxr?)@4h1{4N41@&rAQUF%A<;X%W_Ze=!L7Jp0wF zr1Vvxm``3BlcgEx-#`cFFVw0-XZ2rw$rEWd)EnFJ;~~3W?+&M?2_c$W&)o2tOnyXd zjWdyT5X4$NdlL5H1wdKABBE?JNyp`7UE>7qlVW=5PAG}=+h+X>>TXuS6xZBkO9Od% z^TgGnT3NmcN=ww|k*EwCy21#}hv#>X2w&f$ zdUwOVqUMYsZWE6swDdA45F23*c#b&bte;um%~q@-#8G76|Jo-M z4_a2gLWE@`DCEdhfVHKc9wuj*8k&KsAxESZR_`)8I-%5HC)-E4vfP*d^( zg1T$nrM+7yv!f(mo9tN5lLpH(t3N!}h}`MG4fvWLw(d?a1-7WBy#Wq{bIeA!C|_UU zHc)>Affs|&03F+=W42(8TE~^4hED$3yf@_1C03t$B)(-O52%<=UA1OgJ#pb@2w$ z;K{eX|N0Fl_V^+SJfFB~4SkR&pqpwwni#%#RlrUg-LpYuresT-MoDBGRhe(?%FKBp zB25&@^nckFda;s=dff`0^~oV_frm27;g0phf7vwn|Bg^C8X0SuU1jf0JQAzCMk9mt z+L{-%sRn<}nW5>m_%cbU@%9Ed{!nVe5VGI$yjRd|+Pw#J=LurW>}#UJvT)Q%u4Y+Q z$Zd_rQ^}H6LU>o z8egAYkc1`T;FSz3!H1mZ%F!S$2fqsrel?)W#h##qx5hU*menX!zs*aI_ShRSaezN> z(D)O9wdrX<;RQi~WTfNT`rP0n&y^^*or-khvuYoVg{}k6vWTgi74|ohPK^f**C%9~ z350B|_jfgmXTtJ5X5p=DitJ2X?0~D0%hdGpD~uV z?Z4wUXBR~HU{x;pFLO>?<#=R2YnPcGuG!*lFA(DD%9Y|$9uEY^w+~87DaHw@pIm3! zBJDkC)G2=);Y}MkGw%3p!>r*!F(zy4S+KI0ND}@{K4@xIV35b{h9GoxI9P6 zh$1-dm5O1U=IQ(MB`{fwPFeRaXmk+>2$HQEq;p$1ahmRV9H|x!9oWV^i;$R2C2w95 zg>{JdPlS9Pa9aWN9cx`MNU;5`GK40!jbI!bCcj@kpUbdQAKv%-q`=5dHgUY2RRjwC zrWV?io4Fw0@kp^N(_ix#~RV9)YM!^Iy$`+yYK3 zDF1%go+2gJgnnTnGAr;7#x*jzAl^K2@`H)B8uuxH^uto-E?O|49g_!+xY#4L$-#)Z zlGcSL+)M-N%Z)hO*}nHS4wLWaN+&H?;IDy`X4>v?e)9rrl@gul#8PG)_|!pGLdSih z^YKR&vj4LE4f(S+7}^RWs=0#v?<`HVsktJZeLNLJ{|01Rtz44Zd5FYf#9%+K>b%(I zLH5hbL6Txvo{RAj>+KPf%GF524(|DmZ)D24nQ65GNFWLz@H9EV+fJgSqVdV#)$CCE z<-+O=RYT{JQ(1Lja}}W|G<8?_K7lOcWS9-*^(nZ zzT6Zd?d>|a-Qo`A)l#(bkxQ(!%#^qVMt6hx1>|B$=(U^Nv6%1*pW)nw2!P7APL)bO zBI$KD#-IF=K-A^(1uIL&AyG&ag+XRzee-nvL?WyJI8Ks{0{R@U3mX^gmF8<1q+;=aIzLO z*Eq1Tb`~zFCP$)+B2_6cTtJtp+hC4E$fN2~oiQ7s)Y5g$Mbb*npm9c*cV%&Dnt^D8 z{u}KP9Y=?4zm$@ONcFFJ4F8ZF`fizR#W2*5LScct>Q16IS8YCMuW?+CA)7s;t2YAT zdXs)ZlkAGl@}T1gVx^BSjc2?n{y~+s$qTA+mcUPnK>B-ybc(E(TlmRSXcW)P64I6; zi~LdVG8v@7vnKz~7;5O*Z{cmiST|L%^eKw0)R1ao`=BLkG&tP* zO{%|579IsO)52phF-l3q>;aZQV^<6OLW0 zK4I)bGD8mefSXcYuZH&_;kqIP^)`$GVto{gTa;IoI=?*KVQK3WCmBaoOVn#f@vZV9 zBdaA7MSd&?FKTJk>}u_Rrq+twPF~6i@vRo9`5yb0nLn+iYEGna(+-E7kWo<_M%ak$ zZK=AZby~>0eKBIJLfx{7mwD~S6)5f0$itSv$D>y3CZms{->jbGij!=@IPUqMkvEDF#ltwXSFihG#;>yrX10uqSHED3uT_w?Cbc3K=#=D$hRwj*DUip&4E~^o zHJ#@UriD9T3j5zBne)^T2cS*3MZH_r9|&j4uKL{4Vzvp~PVWfMfmk8Y*FKb?T9Hhe zsT;vndgC_`^oQ#4d&bggbJbl$#spz?l983kx|po<=JOI)PJj8^Ob4Zt5dd%cBmp|j zMBgkIfe){WoxcZ4;}&AbSO6Zf{My7%$5m9ORDTP&D*gFx_3@*Hb5g)dycm&Pm>L}e z+>Gm7f%zud;9mJYa=Nord$oLuC+sPSc#7YfT=UVi#uc;k<|g{;X>(kKn5A9lb5^!H zE!7PYskcL~+p7Ckn7gWTn42+UUbvc96|)#wPU?+1`ptjK>4~eUj!V`yvDtUPBPa9w zAN5O!!HKcwA9xe)?S^1Jtt~W*UnZC*9I1D1k#`qYg3YV?!y>8npl{@Q6Y$IkH+&mz zjqUGj_g%Ww$GZEzB=%wqlomBn%)f5|twpnK68JOL4UswqoVzGY^+LSx{wcip5Y?!HYqh3>w^2@CH`9ZO=5 z6uUk*-bj8GS$P>9fG`oLh)sidE{>LsP`U?Acl%L?4&VTjMf$VDoGvpN&R8nbOtxIQ z+o>wK+QvW9JrYbf{zeoSU+q zilDS`9l7MWB-rIL$sCZ9r}W;|Zk=QEo?7u{GwFtQ2)`#qC1bZHn8wvjDSJhb9z1rn zc;MK02sg2}A7Nd)!;$*?n-jf#45)*nx(SP-0S$@7nsVb|tkMFbStWb4PB>A~5_)sa zCAns8EGW^-M;sTm8PfE+j_p2r^UcNK3ed9TrT2KuO_V|{DR1x!3trOt@ghHqq+3^ zfNw@3%Tbcd^%ye7lZ^Je{i()4`$?fVJ{i$TL&W0gWKsO5eztaVToM?~5RMd$2{`81)A z4txrJZ)@RcB^}YT=Fm=mTv@!}wJj)a4f<5&j^gK6U7vP4KNLQ{xIE_V%Pw=y<+8@8 zWjtL+N1Tc4*qC(XnOOW*4wqF)$;`)EWh6PxTKExY3qI3Pc>3M1HDNJsv;N)%mgtpQ zM6HgVNqGU6kl7$PN=Jdr81VhT7^pM1b=ko>iTO_L9k)AuS@I)PbVRE#QQv?u!x~ul z?;hxf!8a|%%@-iaAX`(2LZcc4#7n@zPbo$zjzF;!Ys(C}xufj4*j*BUD2 zoz{HcFMEpTzxq?T_Q@_#+SBB+>P4$}M2{PZGPEDEI#mtc08&@k)L-)aZG`c<&rz;HSZn1t zN0OlmSx6co(e=a=p{c~~K=bfEDp3{3%GV5WPnKNxf~*~cK_XQ`@yipiE>llWg9EYO z)da6R%mgL#ZtI!Bp@0wnxQ%f|(E32HeS;^0666!mV*2IDgPP^vKX7wUD})2nbAgw# z`2Y+a)@m6W6q74mHTufek_W)IA~9@IYZ*d2xVxu#>aKK1m@3`~f6LpQ|LNk?XL)9< z_KKhAD~#?n3Ku1}vCdd^+Zbo4V4}WAS9DZg@1H$@eHy16Y|_SC_6~D-eK;0~&9rt2E2WhwrjlJA3zENF-YswEcQsEwF?s2ebWFfE>-a0a6?EeS?*Xom zv7G`4;5=%ynDE@#ge|u=4^j!_H$}HWTNRj=_(oyE^VZUztDr*`N4s)k{c={b-Qcjq zqdn~kGp%q>Nbz-xoiNWxMR&u3+_-|S`$SlDs^_=~156oYWk=2H&bdBrqhB#ESl;&Q z-nY$l3A_4$PgZ%^&zayue)#@7!VBUA-{{YmLI{XaEldOo?jPP69T~^-7CNFQBdW%v zWg^wQTDs<>QLiQ!i;SnMB1#*Y9ooa|3~kmX|N1J2+E#Kczyml8Js$>|r_8_ie0Tgg zqtijbh+c691JroS5&IIxnT#qOPJ>2RyE=KXP`*1+IVrnhSd6>}ImKq_7nvsSiij)< zOJ{4WK0g*v5ZS20lLuw?l0L($MUkUt-~0JNQcmCdE@YF3S2dpRYeURt@v5`r8I9k<9yQEI2HIN43qE6 zK%cM`o4ugU=ZCG8MO}-O*f-}vHKzHwi)eyj{%zpZmO7uDpQOPZZ;~^y6?iw%S%EpB z(HwM1D@Z)o{{VGy zMXd@y-@#o)?zo!-Y7DHQOmy|x62i3*r+3|(9A? zP{l=Lj%J!nX}Y?n<(ETQJ%rntl$ine22s-52PeJ#?U6ue z`k8I*#j*2IrK4T%)~?hlpHi3+5X;Or%%cbq^Yy33txhd>;l>A29w822PT&eKTD+dLQZS|BmBcj8Xxl?m8Ak(ISL<`_9!VAa|E2QIV zw|q)Gspw+aEaq|@S2fLOWngb%v(KDQBNV1%LhzBEWysQETiW>)FMLoOGTpni3E@(Z zo2;|Tf1lbJm7K3ys@^{xMs&z3oz3{j?iJikdi5&MhMcq%z#5sYcp=C>3R7GYo<+QL z0G({FxpXV8+s~UG6m^6?hhkkuU8fTdKY_r#O{o|MYmQ0 z{gebBvoa^g>^D!F%TQg-%msyMq1Zr_mtyHcb+tiIZ>s*A7Zb*>nIz)KO*#( zN>Ot5Z>P(%Du8W|k9`XMNQ}%J1I8!MOJN}))fE8Z?P~=g)tf=)joM}WJqpbQheD{n zQw-$rvqM#}+XYr-<>=#kZ0s_cY^TIuu-8~Yi9-Qn3d|kHYFwa`w{E(FA;WmZx*{97)N-zYMpzp=zuynqWBfngaLEG za((Z-nkFU6x$*bNUH*aAH3`D{H(X^A-WBm#frv9djGD-ZC2SxTiS#q0RzDpM(+HB7 z`)g3af!A-?i?haO$!MmwC$1B!2I(AC`uCIDr`+ZT#GGLpp z?LuOgB+otzCguk$XI77aZ|Vu{Ao%8yK67W=y{9+*(UXf}fh=H^)a2$`Me? z$XrdZci#NaHrX_XY4UWO_m+WFzyP^GS!Q%_bYujbXhK`6rwUs;wsc;-Bx7PT2A^_rV#lE(3Q) ze|lUA0xy{lReBm<8pE&tr77fPYTPF6oh^+%q2)Bs{k^p&GM1e!U3YcxK zwUg$@=h82Y&nOtUG@|>s&~`KC?(m|^ZvY@cOZv(5c zw`INTJ$*M=@isgWe^=t+{uPH=Eshz1hhdz#7Zqx*G|lGP(37a5&}I&Y9#TK>lEr`s zhYWa)RW%+k+q4b)^*O!paf<)qUY&jLPSh{tPxo{5SsUj>La5IpZ=2nK@KN^%Vdxf$ zYA+CtmXdmP`fZRjrSNr8qrK70Y$VAHv1?)eFI%&1H2n(!Ak`Zf4&;nk3_5h$R?A-A z)RjLA+pTxD>cvyAI+D(~$aU2TJb zu$w$;LRZw|bn7dq@^M$KF5r`LB(MA8tfrL49q`De=6-vu!(G|R{wo~v22)&_GpZXb z33S(LYV>u#-4oGGh2BK~g8aZ|Y1s+G;6Oo(-b z|K^yb{PQ9EYI{!n_t+ZXa9m&KFV>rE$Eb zU(iV9xyC3%!D1G*6bcQ<3tgsZ&!JMh2HIR<&Klh^_QcTj@5HBtsWe$;+1*D|i6P1G zg5;VH6FwV7@moA{O0)E+OVIo5K$!SW;=~8!)pL#(UWS$ql?GZY>Mw8`h72JONMits z{8z5%0xp|47Yt!|XsDH{j%WGnX9Ely77>l^7n|G8I(#o*yiKZ#x9F(eecSNu0ba;q z8vp#h=2n%0OQGs^XkEl_>nW-~th@=3tu5X#(Nu+O!EcT^@#_x#^QS(9Z#K{-HeO6c zK7cRg#rr71Bx&zNz)73|5ctB_-nJ^tUpav(J|mK&BEaxZo6lI73`mys;>k1p-5CMf z!=|vhfqo+Dq(^QdR!Ai$j?T;Kz!+e&It`bzz9wX*IxEf0pKL zSESQc&%AswqkVK7w^sD`H`6~(nYavCUQ)C8K3trsAYBWDo80=(4LTEpCRGSVc!*iTxjJ=HJyA$$vf&V_J z{4eRGR}6nHdbxeb&lc*l+VKvNCME~w#kz&NKap1`8Fe|oD|8Etzx??uS4Q9>n_31W zS83R%pvUB}d*k?qLv3cHh4B=sVUyEl#8qG?1H0Slb?7UtB4qmK8dBhiBHcP zM=LK9piA6F?j?3p4cnJ1Dk@D*N$LN~_Q}NTHKY=pQR}R-i$G_$_-thKs;-g`Bjy%D z!3ixun`u{*5Mrp^-HidQfB0u`>Wgki4Y&02dYiw*Qha@^MEQG0W*}_y-00P;3c1w4 z!_~l5Sp(%-t%Di0>lH*gbS^4Lllrw?4kYBwx1X~TIP3Mf3ZqZ=TE z&*odsz%%8XB$FxA7#$rstd2wrGbJx1B#R8)fj4F6Y!u0LGDnm1D`~RwSUK1(*Nx_R zRa=FU2@k=n_cf>jxZ=7Qnv})G%ZAV;1nxt=JBp}W?@)5OTQy<6(VI8EHXJFQHq8`j zm;AJ!UyXs$sXMZzCQ|{l!ysznB`8^PHM*v{@oK>5|xD*v=NUX31sQJy&#ANOCT`Z0#Nc3y{LAJ|S`Rk;$IMqWV`9{W+(mx$ z7YV;%uI%}8sJO_ou&}!-awB7^eEx8)8_Y6+4)=vr5VUO*Ho?{#n z)cZRDwb3G(nbFA48)zq6vMRzOU?9}M0??Lx$I(BOEk~cNU1%UF>wv%hAF_ko*)*JrAti{b`%6HIL z0!FnXZne{7`i2Cf2n6tB|3Twxn7Y(3YA_b!-~)cr=4{2!(IR*28Cvz%vk6aM+9gp} zDzWjY_CHISGOdq-4z}*=u5>ChTjAC%ysN8pvG1GP30(KOFDj0=N0l2+bGbx;Qs{{B1KT&K;?-hQq}QlhguEScVP zsquCTpcUrJ`@kPixC(8BHr^9RAL6lPCQe6 zVO1Mf{@Ro)7WuB(v^c|Do=s9mLw&W)kX#!On9{q4(MP&h+lMY*us|?9&oJq;Ou~khm(HcZK{u#|X8YK*-#yxzF@krGmRl04 zX^*4_9;#7!m_k`kl)n3V7|t9%l=8VLi6XCjt-~!kN_5=FbL_yUbQpvwmMl1)GEY@z z!9bL0bvlZf{)3+)PcQXcin&(HpJ{`x`t(dIy_PQR?>u1IW}$jcv~##0Y(bAq8Q0!GG9hqp@3wf;2- zw{vt>Ynlq?sonI*agF}j1(W%ic$v3rMwogwL*-148B;~`3_*Iu(?bo4(t>0lH3v28 zDvc*qc7kXu_Z77M+vTUN617y;upBfcm^vkAfH%=y4^^GzB}(dKi7MAIV@3h( ziK+{re955a+wXJmf|57#2Hp-eL!Y_mFQfh$ck)mQzo-0op+dy?FpO4ooF0AUfxhO@ zmnWGslnEO$B+P!nKadrWo@jH5E1V2ceZfU-=8f%hu_NeFqZLC zzt2(GhBG6-Wx2IAYA%QF7v*LN1(6Kon=z&svyD9FgYK@Qp7^@hlu95ZJ>((*5Mo6~ zZ%-jD8w^qgI9u!jCU#qt8lR1!-~n0UDgnvbRTJI_s{Es-@>}GLxlb<$XNvEA4*=um zAU?t(psw*MGwaBzit5P9g-tlXRIFrGIy8|%Re2NDDETe-LyJSf0+%nM;o`4-*Us+z zxzNFHHyX-^kCf`gzZTBD>l{vaX6#_#nVn&nh!}0ks0kd&ZO3COc2%533ZxQ$_mKzWI9D(U0LM8^*^zs-*yFe%Hk(m-eNlI`HH7?2N8c zSm?@cfN*04#p9;DKql|y_{j;app(X@i|B{j2>3IG;m?L?}7z7hdi8EXtlykXuMTIBrsPOyLIp15|4 ze82p-i?oDtg7XB0XMZhz99k(YUMX`qtDtI8;`kDnbH z-IJC_t{mYCpA3EDW5#yX#afk%M!0DY$_HZ{UbgH;7X&WBgvIs>#f}USb2c8mRLAUz zg-Duk4Z@(m5(WGwVfVHRolQ~aW*p*7#P(c=G(-& zVrT8mjiWg4jjxxQ^Y~oH{XK}#>Iy%=n_o@89xA_@+5;2PAD>x0&C`PV&JCZH*bP$N zt2P3GMHVv&2joL&DS%~N5^P$+0GPaM$F{nI)-AHv%cGKlulyyF{kG93J7NACu;|== z1NU4#JzMDeHV{s@8H>3z$ubA+h5;a{;o91BWi=QLZSV185vFhy6A^htZ3XYwePaFr z`=?iV$}Vrxu+Wb|z56S#KYqQf_4;?)TV@XGeh_NODssodg}Hp=yO?FmgVh&Sx^HE_ z4JF5?rHI`5o+Ywh_$S&+J3P@%SX!~S4y(erj?Oy_4*Qj4N=yo+aJ7kmvh@YJeK z^I)BOQ->i0*^|e!`tiv#O7i27=ZD?jynKK*p)t?5U*6#E2wQrYZD}e&7qbeC zhUP;sXpbGw?KPqa?q7 z*_6|-rS0!QqYBIT`B@xnO16lHG()uahP*0Af~nca8SDoy$D+N!l9?4yf0j78m86_a zryhUN28UNg1jK-JK%BEi9OBPDROh(7RyvcjgKK?XaArZr0&xkh-S$$vSPNgtZnO0^ z@CGA6UnxF4E{%Io4`GMfUJGLw!E_GpH|z{S~@lMRq?uynr!XYLiHu4Xv8c5 z+enHLpnkgHPmLj%we&|XxpmWo$FAxK;Txv!-9nS&nDUhdNGTsp%>A3VFvGi^^5c*Q z$6u9da^)moUZ~ahj9RRNb4e9>0L*0q!SDdSDHQlmRJ&EAbs(-KH2sQs^G;6b=0~y< z;zxZEuX;uf5mZFWV6@qDU?WU-G*9yinpHjq-VSSs|0zP;Eb~kQz@NtxvX|J z>!dzGc{a=1s&UE!k=#kPmhaC?_AHN_K$*f2_-f(@>C3#y z;xF*kaySEVZVp$qO-68f8fADp^7%Jk^E_Rz)y5kTa)?d;zOT5pLjDJQljL}rEUA_b z@ojUwhAET$RK5{p(^_4L8mCUEMm{n3;^HK_dGs-yp@!g((D0(XFxje2!7FDxqIsil{PO~r4?cibi6>n6`- zeUc`F1Oi4FO!U8O9*IlSlvmFtg_oZqbN?4r(Es5?{9kn;ie6hTuQhE(U`V#wIK?3kJ*FfyF|D}HT zV>q~=pv7}So_oj1-d?Zj0zR{t`z)5H_V&`Eg34*2yTMCddD5eM3pYP>3Ru2ooHN!G zL3`Y@`j6lJU-70_w6B`JyXIf1b_BKc^7ax-Mj(r&pP$>iiou(&lDG))$CL*<)bg?o zfKN@glUGoTnOBYFRnygO#o3^#GD-8P_WbJ15Mj={0z=*}{(Rn?Ers{{uc!9NS|x|y z`V>aIT4)fCalxE@!Hqd>`DHlTI{dv~dXC&dyI2x)08!2uF#q0w2x?3u*bc!nL(&qp zO#CbU^n}6^o4rZ&a#-!%>S4Kz@_UicjLCRM*Ll?$sJAQH3edFG#TVwg zk!w=*OiYcIndTx4isu!lg!J^?6jq$}>o= z7g`!f6XjqTymsIkM1K>Cqeb-zMC`zr*4=y_ELO?=C{n#R;rV+ZP|Q9hq3#1}AtdT}cl z%KL6ABCqMdwA};tN0Wf%kCta1tL-lF#Ko>SDO7#i;C%B=KJ|0|PnFP&U*gSYFe#X` zCSbPZVR61J`~|L3WW$f|vIbXA**f4Eu;Ycr5nRyT`Yw*~r032rRY##*G7e3J&IyJY^c&=~lg6{= zN{l^<4-<5*RVrW~Um0doMOmq7Ze!M(%nJwV9QnZSzKlDOrW@&37UI^2plY`cwQG*z zPNtYMh=tB@&|_FoykNSvG7YGjEe;qiRh~qR2e{3zhEd&ha+RnVUqT@NvYqj?raz^4 zNSbSpbP`m!Z*A-?{qayPdbm|1Fj1JcAoQxGsf zqV$$v2nmW1I;aQ;2ucV<63PMu5<;&M1P^Cs&;GIJ%>H-g%$eCg-|y%5eeW~Rd%xFn z-@Z^Z!xgGES2j!XBgWM#(*GC9~xe-?ebF6cR}Y4G@a zZ*cyNi)KPymm%+^iy>*`k2Jgj8WH&x=2Y=Eznz((+rR<&nQAr0UCUy&O{Oi~bj+!o zX1fIi!Cn^j9cNKAL1il|V)d6>1lqCG^z8~7K0c2+7*8g zF-Lf7T~32ZHa|;G0{k3wq&@w^=Qcs|509o$nJ_E0%4wzQEQg2}8=pW7+OIOt?pv1r z?_g_bNq}%~t_0+8j9&kbPkF(g)yrzO!QdxnN(2tNry~Z2GLDweyql7&=&;N-pSnw5 zIzmdXX-H03E6>duPn-z)?Kpj}oni<5ozk4zkSuh4!MH(k_?a&jM`}beOUO|-K-yu0 z!(=aakyEZ-6%#w2#64xn#r^r_pA+pvfdnRRY0sYnZa^1bN({1(2DirhelUv!w-np^3{++icyRAr$=3uA&4+ zW4k?VI_<=4Wc#mQXzGB1>Q2P{a`o)jeeJjJ%ELwM6Wt*s&Y34*`)t4o{?H?^*J_eJ z?q*DY z?G0?@1d9~IbNd%hZ*ZaWBEfXDRm7dOkEoE%`udv2r91OJ4fRBmkkWl3#PeW`S#kd? z@6}WgmJvtQMZdiVy~;Xo@wxFQ%QuaUPVULb_~)Xt91LpU_^;tH`&~6s?K$;#jxF@k zvxR;W=lll$9YJDC2Cda`V<1A)@2VWm2GM;rZsE5M$~JTO=(w=k$iO1I&4LS8qc81q zT_Yb-b3*7_Y(r%+L3wW%{n5<*u=@pz%Fnoft&f~M<4N6$>D-AlP0gL7d8zPw%zv4f z$LDoip;4_AzJCo6h|7r|ae1cGu7nhh2!%o!%ezB#|uJ^gie_u2xo}`Tvu26lBdy^(S$RK#za_xWO&v~C&Ju2 zhf${hORY%vW@_tetFa84?f9?t*r}|XKYWlt_E2zi@N>Ga6j$&$i z;H?jbKD}MYx^}rfJV8APbOicW(S`A{hvM`^q^7bn%XYH?IYp9pS2KqfbSn@tH^TB7 z@V2d}F`Zy^s<1>?)pIwPhO0hm(e z@R98-UN7!$uxt*=y#R$qNVOQ!{qY`+Q?*x`>zo+sgOqRno6{GD2P|vP^*U{|?+$Lw z>A1~GecVMsJgXtunF=hemDd&N67PG-MW!GaefseS1NjS7yqOye(N9*d84N6o&`0)Z zEv+yo^(3588Dm60MQv)8BOSKoBvXijMuH^b&+g!SC6CUBQpKpnp_bi2UT+D9A}tnU zbb*5E8pQ?|U(JIJ`16l$smXUfAUAMkK~S@~Sr4Q|dX<$%-R zEBe%Yl@Z#Lil`2(a=uH@Z7YZL1O6t~Ia0FtrCe_q4hDmy4T_0Yelx-f>&RS+=*Mog znDq-@Sn4;^(cdS0IgEKeH+xsJNM*e@mR28bKTb#)Z6p*BTBZ@ zN7ZqkvNY6R3n>SZ7SPn5Cy$RX|H445pf2T-Ci8iBnM;{-WCAg(?OA!F63KrXj_GQl zWDU-xJZ}!_uFMtfaC?7NtQmcL@`t&H+zpY9oxj6o?#_c9z8B341Ii153f}yiC6tn_ zt31;UdKF6~kVR)gSptodeHAnGiq>b-v|lCUw3V^ca@~d>!pSG-7x6^pTyC0$dnW&iY4FDV1#7A}zMspnuGjoe(?| zlY(p=zxTEvu%u3KjA0VkLZv|n_V8Y3Qm?XIePDXuR7`T6(zDc9?$Gc}8{qITt&EsV zz9np)O>HS?Ef!~=&@E_8{+Y=tmG7Q0fk&BryS%~S64Msjl%PaEeGC3B~VJ763^WNA6@*s2Y91J;}Z!64?mvEJ! z5@B&k4`$^hvamTjtQ?5WM|__f90cof=(|u-3WTh^>2#mBq!9-Fng(4TSha2o@cW)D z*c_94)X`}F+WN0UZ2XPw+g^v-UPI~q&*@Q=r*+tD6QUU6xAO}9LTto-wq0wm#JvBz zF1yL@88C>4bc$6P1O?Bc=NEqq)lM&Yg>TPP)0+2|GwzGcjp+5vqV+eH3niUe)atnI zCA~!duUR+=yKkCECx-|zbcNd+W^Is;>$~%eurar1!235wpQ0 zW`BZt+g=!O5ymc#${1|*KHp|K^oI{r!$dIDvNq3nXad%VYV!wqNz*wsIeuTAgw9Tf zJ5j7Hdu9o&6Eh=+Z(sWej)F#U~*eSvGQ_yVb${7*X;LyIXO5r3p`6rryK3 z_*{_iGx-#nWDa<^*a&GVTVjGLEZ0D*Mv3a|^-wrnOz5T1IxwEOup)te1q6)!L*&=W zzMkM$gpq(+jj1s*ex_16AJ=2uPktS83rztHjo(5B(6X|e%)7>RuCOX${qANFwD}+D zf3tdl)NXdu@c}0VqjPHHM^R6aHwTZ!xid~6mDob#$d^@vt~cM9g-!<)9t=n?jTYg4 zwTOMq&15#zQ=-7@8-$5_RTLTACppC%ivw%N+`dd2nDkiOJQ8rPrYPY|@qT7V9{2({ z85lo*=5X3m*E1S^zg1TVMH3`!CnJo&Rb}>xM!oz|9(N-ooyq{j=00zB)pF`H_P(I8 z-}kx4eevSE9}zVp)D4L!q)}Jdo>$#&;m{m!eB5OvwGM%pf4H}&c%ali z+cM-BsYNSEi!V)vKQgD=?KfC6YLWu6@s0mDj&LP!B*y2D@tG2#5q=8jiI2}S_a&C< zv|M?$eI86s7;TS)h+_EE!uP~G=7iomR_?}QdlQ|cY$$@vnbGBv-hf&azQ42#MnhXr zM;|fut-l$+;SwIro4+z_sF&@fKYXr2&-sn{G)+*s#|8O8l0TgrYd9cN)T{RbWn5a1 z!C_6G(of4-_9#AH2L|=EFg);YF_J-7gAsyqBwu)1(Yz{)XjKcfRz8v0<~Uzy{Hp@> z%VbW#NH~jAxfKZ}58bEX3ys{?KQ^JH)u)=a!1Y_5-d)c`EaU{Th=5^{U(hFR$H5{A zrNLlEpW7Ro1Jzt|xLFDi65`jWOO_3Pn@_>v{KdLwG?lYWmGL`OCsmom`?OE}Ad5eI z@fr8#&UI(Z)gJB~<-WtdS`|5sn(tA7APk&OjAvJ$;x#h}d9^yW*fHI{2`qyY!m6th zB*irjQj#n%S;eBi1$K4SWR4gXLE(jx8&H0ZIi!EN{_G0gC5$DHXL`GVnP@fw~vvolI6;GT6NtAM@Iu6rKO;Z zi5g~CT#yR+12?!9Qm=_ARpx}}Wyf&5idn3EhG~LPLEcMDR4_fZggKvucRIKZU$n|` zRW1!&EGRVP= zZR76W+_vW0lCu7TtFl&oyAW<);N@xehtGyj_1MsV74rVmm;EoXUcpZf6kj?ESo87? z|L`poN%;yB+(NY9pz*{yo1!w{F%y||k7I1rqXpa!i_RT?hsKANVK@O0^T5uy`obk> z1FwBQ>bt1l|JJbnTbfI7*L4g1I`^r~1lv|m<(W(XxY6`ErljC5hbtv(TRa1bEPc0% z*sFeK*$IZ^?IX%})GZCB5^V!sc%@&QuTk;l#Gj=P`a=-WyL7oT`D~}R_~=YRsiokZ zZYryfOj-ATzwD~*S#JWxL&Tsw3aM_rZ|!U0FA^ptM^?ZVT4v&Mro*!FdNTGb82ckt zf?cDaolg9^zO`OCYF~%ypKtmm>cAvAIK=kC*A6~(5gowCv7}e#ZQL>FQ0Nelk*zF9{ zY$YpO+Zd?(eI}1E9{J64Yg^L|-bQv}&)4fMHQRJ6KWidPsy#zACPvX*<3IA(JYj(i zMtEuf{_+s@d|@gP(5USmzK0x)oKvkToj=WT7;wUeQ&a})jJOx42$m_Z+&Z|=b^3is z2WI2^vQ`&3180P~l>mHOq$(wIi?Up;O0ROHRVTr~Aq`U1L{T zzkEEIJi;&Liy7_AgCRM!0WVMCa_#LowYBOsXWj@F%^PYxLJwC=<>bUYuVQ1Y2g||itTR6wu>Jgv4=~GM9 z8JMO9aWzhKY&!P%CU6nmr{a=Sf|uAa-4@sn$I4_d zVS~4Y%Fb|#`JbrH+~JsNU55oZgGqS~jQk5hCRVs+GBZlFBT z7<-vj`We}u{HACTQS-yB77AQ|FLU?^)fPIfYodn|O0WX!gA%lze0v z$%8#&_jo272)0X;w4%Qd*6JLesf8Z+`d}VRdj6W_A&o0dL31IXUD=p5p2KS4xKClJ zc587k_BB&M=Ny@QF`>;-yG7PKeQ2%Zj>bh=w0%6Qu7u6icmo=X3QZVaKv} zekX4DWGAGfe*LXP_DfP0Yjn5h`RHrAYXf(Q$L}QwF4fdF0HW}GK-%#`ZnRQ7x(xxS zd(m&XiX^l;B!sgf29y>EIIQMuMU%H)B;Fn?s&D+xo6b>RxaRT2 z4A>OQTS@x5bXA%0gX`y$6O?_eHWO{~=f59h_!RgQ-ZX<2aN?Ld_%0Jx!ibm&GHr;n zoI;A(j0=gDosws(C_dD@@h{y1QL7*`A`ej}Z`Qlm<%;0>`NHwiAq~>5k!;zR)|q1db~vSm4hg$|UJt%vOFqpC}0Ev8yp4m^m3YIHa7LHx#tQmb}^HGYis$e&n*SEPho8j zuc~t{vf=saQ7EY7-)cONfDm7aI){*c>qHpycJk%5ib_MHlIGBLg}5+CW^5E-BgHZ{ z&xs=VwBvWB8#%&}a_#eLfA23Vyu9-Z>h1nx4f06AcwaC*&WVZMqN_zOuL7$^f?D&n zy{fOQln!X~8V^MA*63Jd7>TfgxXr9Jm2TMFj zs+h7rbi!Q9;OJq^Q;x{`1x^IlZ>YRyW_2_kgDG^_bE^2%-YEdtKD}mMH*0%_U4Vi)kyM^jU?6&^Uh!gNvOnoj+icwMRThi}qU zWLo*1EWxDphHLP!=?mac;<8myAEhbDoRkZn^BaWeFGopuoi8MWSLN+n6pA?%z3 z-%a}fPaW&fO9?mZU%z*2dgm8D;OC8n8(pK$)A2ymVbO{+wer#kZEAkIuc&xytfon* z!hs7K+DVcH3ABLse)Of*dTIQEV>UCJ+DsybnHA>c(+z;GGmTd!{a+5v08R#EtK8 zZUnrIk6m2)F?EL>rCNz{qGTn6>acUug~_{GmEn`Yt~-LVJsj)zPGJmT-G!Zq=R0SRS#olzSPpHX9cBZy$$%PKJzASZSAY~M?c71?Ode|&mxTvd?sNa} zne`T0elrAYhNOIh}Kd^t6iIuHJ|g+2S^`ymjBPu8$#5S*R7z}cQo zDrjw9A0>Uw;!%Fg*iEX7_O4cRg6X!HSZu6QzwA=qAes4K!@Duy}pv&3v zvov<>?y?QZ^&hv?*hZX^!Jj+U4${Au<9=_XCGuNtToSQs>dWh^7P}YQJMP6G~@`f)sjof(0lt^51;SFev@9rnUYTb#y2Soa{C3WFgy>KMD z!eygNFbC8ChQ=JYeI8I+O)-wHYyM-mUT2Jzw1|$Vyh_~gHg<8gk?!y*wM$0B)CUpf zws1>K(c!cY0^bp4*|n?bJ>1O))4)uzTla6xt;5}0RXE>w6FPJ-!dCoW*6ze6ua2f` z@kd(7|9x4#o1Kp|AI*Akcw=mF?(0E6GViv)3gNZF7GwR|WE?z6B~|#P@(Imvl7cTg zb!yei;DbSFuh_`Mh^rIlb;_>Skh6&6=}}KkoGyYU^C1>yEWbt3o0)O;M2#_CwMc`wjLqaOuC?NL>QDpbHz^0_MpbZMBF%{ z4WDteA3*>!W=2uICZb&71<5bLBd%|*HMF3&8raYf7#S16sgrz{-WKjtecv{?^`blZ zpRrd>_|4>lB|uUyKf&TIU)HJ-ByQSQ>)NmV zRG^_k#>bJ6+S>TB5Jp7qH_ds(-CpT{qXxka6k zjn~_{0x;Mp4Ojz!I6l8jG|t@MIv_M2?x*NXrzY=+Ds@NECf#qbC8h`#!&(8)^15tQ z1e=LAUbwHG)vZb8a-49KR{YZUkii2_^72Io>m;{AAo9UH(T92~z-S9K&D|N>TijdD zbX@$b^L%SpxwoOdeB>4BsZ~w9YK=J*4hmK<;FlB&99dw!`JPEGl@%bH^tAO`Sue5T zVADrdboE{U_Ol@ig}*V7X(5ZI-1j^P^j<3~^^4rQk6;51EJXyRN+=$(F4ac_Z-ZnU7 z27jr98_PX8(5oD-U>hP4uL!|*-V1p06HAaMKhtXb0kt8UGcsTe{>6+}TaNGOSuQdK zo{LcjLE@=-c2M_b;_lgq2aH#3XT5|*e*{4+uw&@(Umc5>GkBf&diZ!e5n{{4@X6X7 z^_d4ZNy?sz!6!Dxhg zWI+n{MAzL%p(&cMc@YlQH_oY;PI7Cp*uqPuq_mOx_STmRtaGuk4;tQUX1_Y+oYy1W z?Kctd;*^k-(6Q4MFr>6ikY`{A$|hf1f4IQyJE3E=R-;lRxD58tBOn5K7l*?(l1 z>oGI9{Mb?Wz1?uR=SP%%dzO_SBt8mHrL1iy`yTs$y!^!N*CF=II zEiIaZBW~4*DjMVE#S07$ZP=V@%e-{#VfRYh$d|a@qD%j?_@8(1KmWo1?1lf|>VeF= w)}uiT!4|V-=UdUwe=M!mg`Hlcnh#9)hkzYwKVO#D!h=EI*ZI>4kN%AOFZ+`O(EtDd literal 0 HcmV?d00001 diff --git a/docs/media/en/flashcard-settings-tag-folders.jpg b/docs/media/en/flashcard-settings-tag-folders.jpg new file mode 100644 index 0000000000000000000000000000000000000000..967e563c4104e282af97f953fb37ab84b1638216 GIT binary patch literal 44260 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 E1%mEX3jhEB literal 0 HcmV?d00001 diff --git a/docs/media/en/image-annotation.docx b/docs/media/en/image-annotation.docx new file mode 100644 index 0000000000000000000000000000000000000000..d781941e5adfb6e0f6ba7fe1a603442e20155a28 GIT binary patch literal 1000990 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

JQ|FPMA2XBB$?FB8>yBFKw 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 z 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
LR@M%TSPwCO&!?=3)UR4OBd+!M2pk-c>9N8ZI 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%0AL`~OL1x*-5 zjDUa9kZ-yqko1WP<1q=a;(1KcDJ!dUE z_i-j-W^Ay9Nh%swPC7+IiC_+CQi6N_Z{a`=QjH)fh&J#rOVSF;Hc*Vp)ZGc>OTgu! z8vxj8DwV{EK7~|;<-=$K29~h%8^Q(=6AoI&Bq82q_M6|OV=ef0J9&4SP`QD(GFcK? zz`%aQpZ_oQ{Kj#*v%v$^@wF>T%;QW{>wM) zS71Q|sBg>;S9XV|^-KLC#LmSr3=ZeR_D^FWSl87sT68^7oG7qC02mxEmCAqdNoE@MkL$hEEfx-*iCt?tb@el+D7@lD6mVV1Ec)_d&cAKgQ!e6mTTq zFT!76pu6mbBeCOj-5pg`SN}eL{f9Y}@6?Ucwm-~CP1hm59HgaTzD%j#+Ft$hM<+S; z_e{1RISM-#@)ExF)ld5oeHguITXtMr*`PWZnOq$A`u`z*KggB@Kkx=4%J3cLq zeS_kCuAUuiTcc_|bmPLGsgn6{`I^44IWan(%+zmR{0C}0>{o}?NANc+@k`vWfCv9v z;rPjMj{AH!T^&%PJ?+~7!-JU&A6^Lk&h~8n7xDcpdpD}D*VL3zMrQXf-ZzKBzVB#G zj(3dy?`{`^ePs$<`91m6LsH>_zxX;~k-4B2>#+WW1QYq<$VhbKNhTE7W`7(D_un;N za&3XuZyWT|TF7rU*?F{O2@A0EQwf2gVoEyjw{!I24b(@Yl#z*&jZ{!@)YzD zNYuqk3a}}Rq!8d0BqsQGhfirJB-xE31BcKOk0F+FE(7b>g%shZz)iVKksT=<$)95X zN+PO44jraO8x#9R%+A2Zt9l0}#j;;(%pvfKa1(DFLX2`0xbycqm#Q`q(r!=+5S=2( z(f3vnemin@ym1?C|m($Zed7Xn#5Hn}UPcVu?lZpgd zjX^L1L`wERhUyCMJvdr`+L#sV(RdLuW)yn-Vk*AegTiH=7ZK@G(wDiQXu$Mu;^s^5`%S1$0V8NBk9(k%(T3L99&Q;4Dp z$Q=%`4S7QZ!wN1>(?KytQhJy(rII|!z{vU%k}JZVAqoZsOC-xwSJ8Z+JeO*v+-j$` zLJU*sb#ERKIrx6laCMc0U#2ExW*OtJ_gAQW>{0E%_m%zA=un)aT znMcaEv8<=k zlz|+9I)JzjeWh3_z;KOjLSg}VWS6r^6%1EKo~L9CVV{LCNe^)~c}QfzroF z4Bt`0PY}(;Byl__EROVobmd{32nO+z2J~wp&VFz^^au~kHB&0n8_SMWMJP&1#=M}^jj>;~s zf-`~paU^prRnr@NI)4DasCYU)-) zzG-+taSz)WUxxNr-36Bi*T@S~)R?zYVSqBO~2oVVxoo-g27I63jwIC%9Ac7*ns)~DqDJH;A7^(v|P$LBKjFz6K-K-!cR17MW0IGv-_;^v?G7XW`tV!30_$V`~%$C8&#ey3M>VZ2=q@#yM(1QI%0y(7d!{ zD#BnGg!YXBW+F~5JtaUHDDW-_O(1VH3>q$JCI(%?k>llgNw`2)7|O7(Jr#=3fT{su z=Sk!j$}CcHU|P-+7=0VY6n^cDF!i*6f|d7N+isUu~;z4SDI0Eo=P z2zv~M6XVLjFBMz_Ntf;&ObiSeXb}*F*zp6Fi!~$(hA~h+Mr{#=PFbUYFMKT@FIiArj^hO zTGZx%f2c;X7Bq^X7czt3-3(L}7Zh=|(vcA|Z+S8dAwv~Kl-Ur9q2W0S44Ehok$?*B zhn(05vJd!G!zf6~d=)DwFa$y!Lj@{h9(yE7>M|C@LB{bb6dhb}T!@dnhC!B4l%h1B zA|{|?p~LKmLp~F2%h2^A_qi_WHlb*=JT}Zix7mM<5*hJEVq0PoJ@Vt zUW!3ZfpkIAg8)zz!rBGT1_=XsksiSz%o#nOrVo@?5=2>SCv;GHJct+hjssoc!FWKG zVF(5o$`Qmo^ex0#dJr1ULU}Cmh%p;78m>X{8XHm^e$0pZ2|aH##2$t8gRdk|mpo-dRg7}r9)p;1oUP(P z$Q(%DB!ukNHeBFm#5p975AKgZa%o6Fs6Es}ChVWi|C_+M^Uyn&UIq!#!!Hupun$y zUj#-U91roWR5N)BOcSzzIn+??NNz!qa0ML*wTzqL9OWUYLFGUd0UZOm4etmkEle(s z3m!-xSLEC*D7m6WS!Eez1NT7o!8=1Lp7{fohuU)2;N7qdZ{P<7;A!oW&uUlt5j2N1 zEBZJ>2#hd4FWm=b^Fx@2Arz@HweYr-8r|>-5$v3|TrCCASL4|>d z43YxaY>*|1h=uXf6RaqQfPoNCy(Pn75Mhe0?|X% zfZhPB5Yil6MqomM1=!g$vp61%9sG_o5QYNTP81AgvMLoW0$ea?SkN;h41jYTf;D9d zL?q#0*o_E+D%%E?pj8;@IPaz>MuIJ|nQ&SD%vnnwXhM%hC?krwFcpMhz5)Yjote!6lK{aE%EPb- zTM|Tn`q@yKU=Uoc1qSJ+`I+-a1xO|X3dV5>@dT(Nfk^BH6^vC%uum5nToW;x2+-yh zmepX&iCY=O!iK6QqrjJ-5y7ncK>P5DW5JL?+CXp(}2}>^>_#O#n;_7s6fVof~p;X3>&I*|nbY7kZQbJM3R|TjF2>K7Y zoQsHRxSkrStynxp6>5?VVHm+!q4_Pr=*5duml>bR{Ggv4!R(6F`YY)X|o5p|}vQ3Ni{9 zow-3#!ABbvxF8gKQi6g4tZEB4owkq&>N1cV6V}<82`IZ@7a*On%z>BnO))jQ+683; z>`Kyk@oahyt_;DM2@TaGM-Z?`DH;64z0;okUWCB*W!VsTYw-Q4Z7Xm}P!08bT6A!T z*x!eKT9XN)P`L~bpyWZZ!MqAQqQ#j&6~>RjK1!O-A=K{rYOqCsq zH8DjJK$%TVC#W3ZfL_3E#y5!#+SZeSssVGK_CR`t3pu&ItJ78 zAb7a684C~vH&5VF7zVXVp>Rh^K@i49THv*@fZ&5d93lzV4+6_blyO-A@hBkJ;fjG& zpv53^z|`6}gx(1~55z2nuJE8$)C)<;;*R4($N}%1k9m}~4?^A{Hu4pzfIcU=^rUD? zbKuKMA_PVxByW=}HU*mTxz2h~$s%P)6!>}L(HLYk=yL2=Y7~Sr0k3Znh;~M#4lt+y z#ocuFi#VF6zlA|_MAKLAKi2Z<-0B<%To(c#bVIfff+9;Smdx4O*7EAF3k<}Q6%Wbh zvw_YJ6>)($gNRk6LooA6MEuEX4m2L!yD$uy1Ro;&$^;8cKnp_Q0MS#_6l_SSjP3c@ z&y}FIoS7wJP*^|^OB^E^6Qv?SA^(8y{CV3?_HBP81QR9w*}Hq%_s-xR$juqA^>rS2 zaWb?Ge0X3SFQ^oQ5^Aa#F97kS6MN@nq#fp6L#tV69Lxd&_Q*{;7ODu0BItJ&h)`6? zNb-w{=}gzaoK`85=Q9p;s8%4$2&$G|1d)}>YcEVl3;}XJssODcR5>7c-nPT7um2`U zZ>B<^>yYUSHH}>cGM^&{ypR#nfnah-XcH#gfi#zpLI8CXxuCFt$Q3mO6=GMzJ4oU| z&_WjYmODsVvbsiD#OBB+)CyR&iTp4CT>=G_`ylSqfp(Q=gIsbWGG+CluD3Rhj6qj{ zN{v+l0+gu?hv*{U*g!uFg}29S096$M8REGR$G+$0jf;Gqh75QQ1Y*zk($mP(iRn1> z5+w=+&l9vFPgN1;-1Ihl=t7l+;8ZA_yScmZy`|%lP`ga_xwy>ZsgozX@{5sk>aY(UCDtL7-C;l9aL4#3f9g?R1b%VeT~l7W z|CZMtylulTCT*KC<}S_Bnhx>;Q^ZQhx2iE=iYJoZb=S>1=ijjHt~=M=cgyBGZhvjc zPp28<0>hLPu&D6zV2&;9l{t;T-GcwKok}7qrLN(um`W=!^ISl|0Ov=6oJfLGPepWk zp9Rc4xO8Zv2qjc18eF#Y-s!7<$SknO#p>VRKXKpOX{+yS=#=JgEhLB`gwzPNX6W+kR3&RWctz zhlAQn1rsoUKv3cXmCh%DPsdltH)Li zh%Siv6YF|Td~l@w)XBcC#t+^*I$K~Ki?2Ze<)k`{6qtA@^d%a4p`Fh5pu|;DJB2K8 zEat9PFf2*u6vnbc&8?5PemQft`lo1FH^#O!y$2vE{jO zJUD$m@C!{Vgi4#o$99qd;`aG57zfC`wce%imFt;C^-%+I}-xIppez&p{%ehWi%2B=0wjNWk0fFc zS3vU|v^=qWnrJSZVtVUGxdN(?u$f~}D!4U9>CHEm-XkIr5Vd0x7{bs^Z-4q(I{{@A zX;7lXK=hYMi8Zu`TWzk(E#=!5bA^7mOiD`wR@zpg`NXRA1%-1ws?l zgftLap_E=$Nf;Mr^om2hZ)_Zcu|kIWVd?{YtsRIZN5mn|+k%7g6AFgL^Bj~eyuw=O z3O`+WmLB;D*PImNY(95pqRva#Q-w*Mx`rV51PKF&5~2&rRw`XngRwUd|MtDU&Ucqz z%|VnDyzsN)9F$z*8V}fni3@S2`nIk1rnQ&PSh$&rO|Z0o4+OETc?mFk2$y z2`?!z(sfD?|H;yO z?|5taWk8b!&-W$vhg3g$%Qe4*t0J_{;0trY4xwmk;QQDQ;KK7DaiGphlNNf=C7ePU z1?f#<0lq&1>4PDsK|`ez7YK9%6)|ElXcVy84krHBUc77amY>lmFc$J3yKmCY>uL+c zH|2afPjl%{mOnCa|D9J~P0nOsQTm8`PMpDk8#C7r|z6eBId5`|rKxntZwx zrCd#1TNF*8!GZuOn=lWi1l~le5Gd(vZ+{lfJsQ}gSKd9={lfUL7C~#>F{_T$H^2Gv zgjzz~5Mv|@N`TACBqDNS4y_I(1x)~&(qT{w3}`GUZUJ@uMO#iZ@0sh@FqTd4R#b&N z%z`C?>IniO4<4&DBwhBH-nk|PlvS(<3a3g}2DuQ-cFx?ht+jpgqnbLPP@;nJK&j** zm}HTm%Jk@CEWmVvTM~h*eSw?=G^AkJ09%^pnewS$lcikv>54y1@?cCYUNByc61R$l z3*t}(=0{(NfSL51OE@|yJzIhxMg$X;}Z8^E|aT6$KpmA#H1Dm$b;OZYi z*%Fq)2rejNbPU1FoQ$Py-^a#PjMT*@a>I1VZR8URny3ot8VPKJ*F2+7sb+2!(m;1H z7;jL`p~~_w3N0|LjxtK<7*sonDX^n&r|YYEQX?%BKq{fpzj&j$L!0@x-<}nD{CuAlQp@cQ&8i zHpg*`PLLF^M=}FV#KR#D1+@X94kDRq&>_?Yilx#xepI7#!pecTPD2SkOZVOu)R77~p`pyfcvSRP4*4yb?S z&_J?e;`0aFkH0v*kj|WtkdgB&llF~~*H!IFE!e!BXBNh=<_W%KAuhcN0w zQFH12H{Nw%!f+R&|Eg>D-1n`qP;7PzrQ#BSyS zaAuH2kfSWLp=k#BF;sEkLPol@CUuB|{>QMgX#$S)yIKGBtgzpgWONQfOy8P3e4=E>USs(<&t;zVwnS-S%Mp5ae9{>T&1cx+uNUobB~5#^eabCcB~o;?u(Gzg+xx;+S>Zwl8I2z zh^pgArpxx7fH$FTqvmYN>v2T+m0KBa4T7w_n4-n9VCy{HUaD^wRVy8z{q zTRBhyz$@6!c@g+5scGn{0=S%*#;D{KWsI^^m7mz!c5=((jvwRL{VK>Emk(lI$zoI# zN+HUC_4E*kU*)jv)aX>wz2fFg~SJwR_R@{r2gc_`=>2F&~|j`)FHO?1WCrNI{I$=Z*OBc&^l$~ zvzdEOwKu(W_`s2u#v4|QB+mGkuWmbe;Dw)q=$W+iX!p)VmLNk0fhZNA5`Y)AEOPM4 zQNlr3Lpjo5pFRY)tDfY z0mAoymfU-Is$_AS$yvPy&MY{N_)*bGpApj4s&VJGkN0(b)|i&^Su zzg9ppvb-H7IYk39v?%h_%AL_w0*tbTWTXVhJFk2L4GHT;EIZLszv)(#g;CU29?jm_ z(zRo*GC>YTQdd>iIrtySER*mMjE56bN7@DDM!qwPd8p8!ks}z#~ zZfLUUYOYD!+W+~@b)&T#Xr43FBE)3jYCzIza6P@7udZIJXzAcbV; zaD^;Smb7nIg6hc!=_0upQ4sE7YAy<6mLBeDc=mds!SlGnN@$P|0t{+fs6dQ<{#a}0 z+7VRvhB`j8XKwB3*ftwvWwn4Z#43y|IXV}m_b(%EO1JzW4q|FJ1E$P%7!56uv_hOIKadVw}&wcVK*Tl#O4}^YPKAuXZZ) z9Q(eHGU4p_9WWh?(G@vvn&vbk5F*VbKixWW%F=H$hG-eA#t%mAz5AyNCym*1 z)6cF+ADfh+zVzAIw?6$7&$XlI$D=mRn()XaP@7a99D6FtQ2{&wa1eNL;w3;2gY>mG zP26zHH4`Jdn8-TILp}wCUJFcLrLx9%0&n`b$=k30o-sI|&OqwomEU>x_HjF-C@r7? zz2(ju-TaeDQNLZ+!dL6Ms`3NQC*d*E})v zp5ymT-TBD0KYs1&t7qQ1^v9k7jb+vR;r2VWjE;kV)>KfTjm?l(rN`VndBv?i9#vv~ zbm`N#-?;EHTrRjQYXUpG@9wFuj{P>)(c&4?-n`@1jWege_Q15a@4Ec9t48g<>xTO< zbxq_rc2pL>ntJ_)QPKSXgdv`rCe@|ok@%P%6-7)Z+!VJ1?$y-N0`ae5ckNuCPUG2ghe>&XNv~BSv+LISXVyH`5Q2FSlQ}sKZN>??4u}hz)82`q; z?zKB7h9+aIA@?kO`^}T5JGwgmrS0gkozFzxSAjvYLSMbA^Mh@-Mmo;AZc%x9v5tub)Eh?#pVqH6W?K^E-pZ2}*ncZFQEE!3KQ}&ACoK=mz2bYf?su6Xm zH{q3I9ed|IzWYee*59Nt$dnwty`lNNjpM?M&^IhQ(Dd>4CvYl^aQbk&QtVqE$v}3b z!~lwur3i zx?xqIV{Ux$y$@RVA9??un>t$hHqXu_mn3LVM1Q-X{nSTY2O8TNK4^dMcQ@AB;a3v- z($b8hr;a}U!*HPFs$eNQx@ULqzwCNQdBv)7cFfD~{m(bH{Aj_Jw*Pjl>-dK)O-EK; z8-tS_xAtJu2i=XQ8e1A$J6et}AI;10=-=+?{kXOB!+&XM|6u=1--)wj7ISWaq;up2 ze8I;5+R*-Mja(j<%>_3sJ<{C%)~v|qc``(?J6`KOx&<>e@jnm z&#AU!&Fv5XYsYCnn7yO1XT@U^H@(&U;i&>@T2@V%ceuV~--mDfzgzy#eQQQwOp}Rg54Rm}=seNU+0xt5*Ro=q z2iie8cP#BWeXOOi_y6eZes9CWNv=>`B6+pw?S}SkGt3}H{b2Flu7bu@(XzOcl>1^xks(=3529^2wNDe{aFWziy zZEru_(%RL2YU?Z)LT~8eZU5BS+1T1v-`3sI*}V6jVl~kj9+K(`C)FET2+T*k((pk~ z&+(qaE%i+s7Opzp_0}Jz`T+`1oR5CItgEHt_^JKfZM_}a7v_Ag=uBPJaJ2E{$KA~* zj`y5CeSF1@6gf_%Kk=nwtz9kcCp$aeKKSkuLkB^YDKnUfD_0-+rz7nLdV9K>JGyr+ z#EZ6neCkMF=gF?lj#F)|OBc|DE`F=2d&6`2BnH*Nz0ZnsHR9#=_Se@=cy4W1--)j7 z?#|;)E3frLa<M`@vF)JUs zaz2wtsl={%{GOYa{J7dgGIq&>)2HqjTlbHb{b1vRW0nk+Hsj{9t5(h(`G=uy)>9$! zAG&AC_J?j;@EvVy&;jXo4N09y@5@@!0uvxc#~UYvB*ZxD7k@lv%OhhKUWAw} zTyx2b58b+F=JhiaNi2ab=HmM!R^310fuUhQ;LZ8GU;KLO%o|_)t}qIWe)9a?(^rlz z;j&Z6E6WOT0_Tb%O;71F0C^qkEd4Q(4ArLhT_$45Qi+1UN| zswtjt$2o8I#^rb(GRKa)@YPeFbv=`pG#=kK%Miqj5ylQjtbMod!0OSgNKMtF>sopmPw!q-$sDl1 zzRT0wC1AKAdP}}0cElcfqvieei+nKIWX|5xZMzn`n#S0bGxoLqk6jBWLP0LMZsoh( zZ!KcE$Jey9Y+4N6$0?BXzZ`k}KHs;(g4APQICi4#WaG4q8UI*Gtj zQdhuV!I&lcUY_bo82`LGZ*yno>3yRIRryhZ=50Q8q<6>DpoAz5<5}Bw&xTku^LKV0 z@7nMLcPN-ovheL)izGkao3OpJwdK%~QPMZkChp>WeI0#k=3f{ZntOcPzrM3&oXa#P z=_*wH;LeVg_4BdL$3l!>cJ#fb-p=Ju=z?Q2vT#H9`|mBCz#<+wbnJ^gjqR%^I8n~z z4WIK~$H#kSS-oN!0d+14LnFONoH+rY1{o+DP1uwM!a(5WKa9a_a0yw zZTV!*nzoj0i-qu~tUT1yu;O|`rKW}JH@@8k!W4rKHb@J$U`ub)>C=b*Fo8xikykE% z>rY*KW{`AUFxU@=SV}V+1m4({_3cfo#^M2mpmfcP4JQw`Ht$=={eT#I;ilHE=9h20 z&_hKQj$L)I{_wJi1U3>|pcZXU7BgvXYwc)S;deyB7NhD02R;rp9fL@}kk) zn!l~1ef5)C*_zDS+1t76;n1s+Ccb*bfm4lJ=1Zd)#%95u))UPibT64eB&(#OcOC0{ z_vMj(gnbWBU3#Rk{ng)tn$hTnt;gCAcK2+auON91eqvK+L&Mq$RWx5s3nNy()pmH* zc#%E`hA72b>jJJl`3*F{e}9*<2xQN z(0q)enY+3_YH#20J2EWeQDSmt@t(%E*XA3be@pAfUu$kWxO{>L94T&kY1_*aEKq6S zte)NarvnX-j}zE~5M22Bsm{%d(&y4i!A)(cSiso9dgal?Cu+qXO=Rp8>;+q&D^H$N1cDjyH2n!j)R@=!Dgu73bFYmrryx_I2*QkK3G;y+@w|dA(xf|IHk8KmIy6 zcRu=5d~WK5DIZ<|M@4wvgn8iOZ(qOW*CTF)BusBn41I3SE$e>lsY=I_;go4(UVrE( z(-gMMxBvL~jjO%~b-480UAJx=Q*tPue#4~IxBdK{h^9-g96Jb5bj8nKd+^rn58k%o z2Og<389%aYyTTX4(tSrlt)saQ-~7UNX}TSf4;4<#zkTxN`|sF0s(P@`tUx_r_IY zOUyDEDr#N+)Gu$|KW=c8BTzW~QdnD6c

8wq0*L?on3v^4(K5j;R(}J9%0x25vFS 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࣭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%0D8n$E$VIO; ze7hFSMsw}tRf0q+V-t_nFV{yDcHlG1Tf`jm?;VfSCmD@1hr8RHhM*@Fr2Uem-LFD{ ze_{0VC^;^s!7}tWni9bf9E1zEaUjWiBN4t?IN2?FL?P;F9vf0SZv}OEV@Rq)D zXQuIwJHhGIcaW|pt>rEYZu6;YXyaI;^TwO!dHp{L@Qhw4xRKkI4Gck9?Tn=q4lc{> z_s`3xSHj3IOjW}E*Nj<0nNOaScPPK_P;_!$a$lc}R<7T7;lBKReKfjvIvneR^=6Xi z&xW>^m92L26i*99wrkdvPSjwrF5a=4WCu;alMjP*f z-lJXP(r+*?yhZiBmLY}^=HfCj!>_K#h2duz&G8d&M-7Yz%>e0Pbkg(IS^foW`9YS!Tv4o zE#Lm;8zRR$DMOGdIY>*38!rcciyg$RlG4@T-&ZU(rUF|0Gt8C!nT)zRsWW7c|l~0%lME*=Y^!8LV*&%smNQ2Jnrv)HFufh%(lwUdZ%wp1-x@?Z|gw_e0d~Mnr zVngHBul!FQZtg@P@LyOQMM6YsCyAaAC%OELh0u;fi~r9N3&QBX6`n?I`FmwP?eL1k z{LdjDh#tyb1aop;0!m3lcZ|@*x8KUe;eb+#l2ziy!OHT8NdKD-P>DE%R)iG}?!WE- z3R=PU{{XFc!>NF$L49L@g#+}$Q@kDif1nlr*J5>+ng3O+o*k96rqQ~88o*9Hiq9xV zScm#02o45_hog+rk(G6p)CorY7|o(;f+TmNfkf5v-@Lfy3?4c^DiCNtqZx{-l!Dvb z?aKD%c()ZmCO^M9t(ITHZuy?iuI``Ln%7T$+r4(?^8a>E-51>F+xHxAo~Uk@cwG&s zIHw53HeE4!uzWHo!xN8miSAcKRiTuo^YB5Zlyr($FSU^-Y~N{VUX(zcdN&P!%CR_0!<$rN3-cb^gs;J z_H7^{Ryx1?p|CjWlm@M0R^;ed24}>l1soaDAby%2bbtzmFTi6MP-EN^Oe3EPxP3b> zDbIV5^qazYbXuW9B*3H81=aSzcT(()@Aa*-Pa%UN%yV)$iH;8KQ}5LnJyH8?xz;5@ z<_apMq)3hLy{kG~=>j&b3p>3>sUxakAj-RUs!o)l2Y7GQ6K=<~gS3>NdXuqSYq!Z; z>=)~1G*BrYqC>Fwtv7qafaBq^rfG8AHw$KQZ^A2O@qW2}v#7sWPcX7tu_CBI^OxlD z&6>~Y+l(BreU)EPA!$ZnYY`>wM;iUO013R$g!@Jf6m�TJI(((o`=EQcET^`abI!UE&isS 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 z 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

)T=( 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 Mh$HhO|NZfQ0Ci23!~g&Q literal 0 HcmV?d00001 diff --git a/docs/media/en/note-review-queue.jpg b/docs/media/en/note-review-queue.jpg new file mode 100644 index 0000000000000000000000000000000000000000..deed81dc144b26027599290372f2f6681fa5bf53 GIT binary patch literal 27494 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 literal 0 HcmV?d00001 diff --git a/docs/media/en/plugin-commands.jpg b/docs/media/en/plugin-commands.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b63fc8273fab1209c9d075dbc43659b175715c02 GIT binary patch literal 46505 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 vy*RAFC+ literal 0 HcmV?d00001 diff --git a/docs/media/en/review-deck.jpg b/docs/media/en/review-deck.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab244ac8c2fa1462e544454fac90d2c2bdbf9e8a GIT binary patch literal 41635 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 literal 0 HcmV?d00001 diff --git a/docs/media/en/review-operation.jpg b/docs/media/en/review-operation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53db66f657b14b2cd45e3981ee915544bc37c22b GIT binary patch literal 25958 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�my_6SnnnEHZqla+ZMf)XJ51C1 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

m9Tek+UW?Wle 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 SE^QG*9*I#hbd@vzzX<>&+>zn{ literal 0 HcmV?d00001 diff --git a/docs/media/en/settings-notes.jpg b/docs/media/en/settings-notes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6632b2ff494e92b2984e5fce136dcc243d06dabc GIT binary patch literal 53816 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 R2Rk_{9NZjGj{9r=-vD2=1l<4t literal 0 HcmV?d00001 diff --git a/docs/media/en/settings-ui-preferences.jpg b/docs/media/en/settings-ui-preferences.jpg new file mode 100644 index 0000000000000000000000000000000000000000..536af0be59709e7cc0ab17411f072fe609485a30 GIT binary patch literal 57800 zcmeFZ2T+qi+b$fWOBbbuDovz@79bQON|7ok(xoFMKnT4H0wNH4uSydH=@6Qf(0h{_ zdI>0mDjht$Xa4{EbN)HsJKs6yJ2T(Rd9UnbGP9fe+H7`r?!E78pT9GImjTo-lvI@f zczAdKv)dQo?>s;efPd%CKgul#ZVMp^At3<);ay^4A`oB|I<6Xe~{CFi0*MfU&3k4Ki_{S`o41i0o_ww*DvFL=K$olw(ij2(*P6z*M~EQ zGi%BuS49%p3FAH^Rc<#5#qRe0DKDI2@(T#ckJdwnAuTw$^$QP{c>*SdCHBL}t1kha zJ%O6<_hP-D-@H_?uxu@Qa@s5V5Qbv?n}}3pXmikbdFAh)Y_QYZ>An&<*y4*YYJQD>Kq>c#!af3 zR~NDM4Q;G{0Y}h?T=xH9To~ZQZooH1H{QhJm-%dA;WYB!Z&+Rvi|5YWyioYyO!XIV zHLh@dm*R3mH&^!aV|yoddy*=qFd=4A?v$kT=r8rJ*zd@oasqT4n45F+FoK_ZhWAfY>h#!cL z+z~-xekdsYVtMPSqg}}?P@VV*Kc-F^ZSCe4Ma7)wDqXkav^xs($6L=q3kh@~7z^`P zU;FNUxqKiY^yUGxzL6+Ea^nd9gzJ=8IzPzwM!V-YFd>}cu{T6_)uwsa{;`nF3m?4_ z^9B6Dt9W@yQKBF6*n6XDnX8hNIN&KE)d^V#j0~-=S3i9|WWXY*Ve@7g{5qQo)>mP-qUg@F*_A7Czh(DhDzrIQr5Varr|I}}x>Mmo;9-8~5pH4q3k--97 z-mT;XFTt-dO36t16=~uZTQr>uF9!vO3$#0R_v0rwOIJTooRW!vsP_witY1Kh8G8 zAS?BwtG=T!>8tO@P6^Y^4+kwB`?7l0#2eaeErOfl`rc+L4-Jev6L~cvM z$(gn-n!fn=uR+S@UI#o@i&|98{C+ibtc};9(6L$t-)c6q4FGJI_wU}4QDoeZ>zHG9 zXelj&$3WscmP)qlx9csPdX(vWL`V_dD!vg;=%g%6XS{DLVz_#ZC~m-;eRNDhbU~;n z^5uyCu}=;99gD!Q!})+T1Uu(RY3P!yN_LVycKal|PftT!qx{Ej1@# zz?3hZ{Ko=%T#d24a=zBOI;6BaRZ*azeCTg-B~wCa_aDpi|Fia=juwjJWPoooVe6e0 zS^5KyA3Z+$dBNChexfb?>zaH~N$F))I40p^|F>PC z|6rf%zc=@9(++w;(VK9skEvxKp64^ExQNW(QRNefbiIo)uAJ~_#cye9lSf$p=gQJG4iG&3G24(KA{whd1&$xe;Y(JDkx z+s#U=i5_Yv)v`3qz(CF%m{ZEXfET1NvG#>GIRTWIi$F0&%?+V9C79#XSq-HKYe$$@ zY*3G96AD2w;<3f|dzjw(*ao3H{izI-O;4DRKrabPTqsWtuh&F1$GDH za`4@g6+?%of4bD|m>D_#VXK>z?BC_6*yLsJ_ z6vrAA@a)0Em4K=ooq;0Daf4Y2f|tkR7Dmyj^OlepP-IFfxY={J-U~_**J0&yZdd8K zWtf)`rupfGp1B(W^cNs8$W9#yB9W92JM@^m2sivWF&D#D}L`t~3^k3ZaZ!-WpmRvo++cbY1h-?zjW zOPFrz#v4d8aUByi`JdRa$B$E6F{K2{B!^Q=n5IskO23z1X4hRz30i`x`l_Mqa=W$) z?6O7U0h~*i;GR#+Qhxz9R~mhGlw-TBMFKC~heN(#vC%P032F1Nk@})ls94txp1tXP zZ1qbIr#F0s2US&Ujq(G@Os>*H&YlXHZQfaZ_0oH6!mi|M*V(_y8v+~OHe~i-uzvx* ze@K0bIyU|SfGG(po<9C^y|UY7QiHqX8{uL?rBwL^8#5@j`yFzb}h>`OqAWNoV-&Pia z80WRM(LIS7HT&aJemFSpQ?;dNg!lUeBzN<&)Q;pHxkV58;lv4{u@b$`x)`HMLEy^- zlC$##;76BI!_!8OdRqh}DKj5dMG6yaXZ~SmVrL{Z(D;_Kup)l*tuhC6CtbT^Ay3fT z&Q`?ZYM$-zku2Odgi(mjrtmx30rV;CZcKu}oX{sCHCe&LXC_VQ%y^JHyS>02YO`~7 zAw^OF(E2-ro<3QDN?O6ETZ3`3PCYeJ6mu(!B)CVCbi6@K$r`l9e}oV$NfWQ(`e%ES zyX3}|)$A<%j5W@Ik7kI&oupehHx>w957XEKFS0i|)$Ll|WG3f>G{nWsxWX_RzEHw_ zrEPCR&m&_KEJcjRC3{upevFCj+BPU%SbN=aQR!&1OY6}h*tHkzK-KP<9-xTPR?%5` z9*NLAZ3b`!fV5dt%>$m@0OlL5Jy8{LfYkk0fA*TJZNnBJP zS(|Bm(0i5#?A;%4Q!^yNAXg4@!+W+JrwnU-@5AYF?KY!%1hv2Al?Kd$R>)L$=7bf7Q;E=sRPMjAIgi__+~NVVTTky zDR`iCAB?d0iHR6K+A)c!oAj^i`~hl^ah1x|-+m!k7PfY6Ihg zQ-cBli@c?MpwKQ0qh}{erNTW@nP%qcX~)JEf2v{ueTNX1`}!G_UT|9#JiH8?zIWX@ z%%#zP-!QYbyzX3y<$RF!}3-;B6IWDi5Eq) zgpq_ss-kywDZkpJCurC(eqGuZ!F_&Iw+GH>WHm)>2K%!jk7+SaSLoEj=H95TA5qk+ zac9yE&SXqx8QLo`Dgrz~n4>!^i&Hx!#~0dWDkT4tkWcoF`U{Bu3n=~z$c7HdZxgS4 z?$r9$8vYtO^hmNO9;br@B7IyJU;I&rN!HE3wf_?aB_k_QpE{CTmuPBeb5hykAi#x{ zE51LYc$+xM=qRrUN=46fSXQ9?vi#y=)%Cg3?f4s2RxORTC|wZ9OR(7sih?d7Zrv2Y z;y*lDWw|grzeS?QuKGC;vkf-=9-xNi7a@O~UPDpJJA7b2%OIqm9AT=CSz@;Py%SK| zuJByHDZ=kTw<`k{`OPN8ex&g2xX4pOW5qcJe6sgTR&3dCm}00pKjshEX{bdp$jZO? z=^z8Ex3~wSO6yz-a-v99CsRduM@r5wp9ZxbXHFje(4+^!H{eN!Ue`vHhK6sP(T28D z4@?;SG~$LtV{te=r@g@t7o%0Dtkw-kmnzS|%Axw;a#mEwx+^2S7|Y1$Gap`qPf84_ z`_t8F3VXLv`>UUYmHxWsBhhh7$&*o{&o+-7xx6U62$6dL z3Bv8i+k20`=8qee{LpC;XcqdMJxNFUzAH4Jabw1*O_|RNKn(`op>~dD%o)G1{A7rD zrIpjQ-2!z@wiwoWp!>2buIE+N#k!=Itz(R%X8IGYXV$*&DfZ^gg8AP!znn;AWpg>d z2v^XN&4MW>Qlw9I7*uZhWLC~1z`~CHVhxdX^Zq0G?3F7vMW5T5Op1IgB9UM*XN)+ipVVi zuaM4?_yJqpZ6-g33<`uQnCbk`yCLl9BOglS3%Mu8tbq`}MZ>GCUASjKulQd8-Vq8T zAG?YHA3m_t@Kx(GE%mT*bgJY_7iDDNLO{$k(FjZk0xK04Isl*6$zUoBjUvdD3lQaP zVn-Vsy7REUFUm-4%HKSalbt_x3Z6Up+Gbk?u1s>LyKm6iQIh(V&61lyBm;&p-eTd$ zF!V_h5BUa@8LM9?OXQ)vV|ss)Tg?h+CiZoTU=>)HPIiIH_I0IoN@1WKAx}PE={BGg zegkQl+PC8&dujWjLA&%5U`HQF?k#O19e>q;E#&nlRW9G`WjXw;PUODIOm2gREq+&k z*e?yhRV}2^S;q|Ino(pXUq>$CHdD z!&Zd(VcMZPjs6!-!-ux%H+Y9-D!X^T9Eq|#EuAyWq0fjs5o8Tn`-jNO=HS<;o=;n zzXHnP z!Tm{pF#k3+WB#P1@vD zv|L5Q3@zTBH|ibIayXVj9G6EYsm}+_uAg^YD!$xwaVO%WGDnfuYIjTZ*;<6u3LT9!N6ab2oQN_P;q|b zXk%oWrrYr+k<^P>wN{sJY{;IjukrJ7W(+F&P+fF`l^HtGj{F)f!X zB9C`1m(UKcB~GKVCm+947{c% zQ0K2zhRVjjD0Gg}(7%i~!BihRB@2xdW>ZU>E5#+dQq;LW&d{L1iKI-LUFcLtYSV+B zk2BK8F^n8&d&gIGq9-D^u6hdkVvW(5Gz1Lyi?#zm{CnqZJ#+t*yL(U>Y-hcB-|;I- z+%QM1aG%P3z(C*3dW=k^+F;7`0BA)}kt~M}FsZ{qxrS^D?Vb~5)Mrn~#Ko4^zQYWA07liL9U6=pHaK0ni+>*lKFA(7AoJl>$F7eP(}(1crHDcA z`&;JwOFOGs=+9v*^Ql^0gOLeQd*G=%QJ&8=z2`Qc zn)XPy3_&P$4867Z*xASb{muaQF*3dK+aC(q*OvX~3s~6;hOtF#V4G9v$pWRuz-tXj z`MRUy7-`P}o0C-*>jE$T&~dlC;OIveN-;8>(UeKp4WaoP)6ip~kauIdGpnh5%oigD zr#Tow{ukp?AFWJ`{oWg&>c{~5*7|IOxGjNS|1eKXbV%c@?SHm8CfDJFHz9}B{yi?3 z9e<#c-%*WR;SDfhr%^wm4=XkCl2Ed z!|1^vmCbHdE{Zz2&I?0B!_9=H%Dp{8Gu#Ealss#>s_e=Db5E&OmhJ2`w}n)#kD5*y zoOat5HFCCek#oMzJb{Z1U}AoD(RAkiig`Tfe~b{W3EAf(TRWO>SV9}<V0xD^2pW7-x~=a2QHHnA!-7XrRzY zZAj|JWN^ec@TGU9EexKs`g0}HJ^HWyAPZAu^Tx=fe*UyxSR9X^-lVj6v z^juld&SG<9>E`iZ1m2JNc*r#&ky)rS1I%I4$p z1VoLkf24ArS#Uu%q4m4L8JJB)ZK+zals<=FHNBP@L;D8B$DOh9nj?ra^z4LyLn4Ku zYzyNDHc9NZ{w;&4;SP{AVCA2Q5^n^jR5oR0k|3nhJs|gi`1I{%kiP(ByP#<6UQxdkg>Fr5B2S=J%*6QyNATM8>gnX5hkk*uu*R~ zEgworsSKMBR4Z+XG+ijYbAP2z?%#j@t!i*?P{Kf5Lrfae!bsZ#Ojm4*5qrY+nEWr` zxr=7mwRPC1&0O@RNI1`L^m4V(rWlZb_ z6LaqrKArIX3gK*i*{MG|^Xw9w(CX=yIlQozxI==cCf1%FH{CuGJ&774I8(B&k`$8h zsQN05kZx@wsA)=yc2Hb2Y4w=D&)|_edb)3r86X!w-S3h3Qse0my;PT7JWIO4@Dz&G z%uq3XoCNZL)^$Hw|8V+||AblQj+>5JVy1l0^O$uPJ4d9*^+6Yo{0Uca?Vo{fgB=HJrSmGoi#Sv1E~R8 z;^|)}=sZiFt&{C6s;8@9yN!D(umk7DyY*7|=^?yAqIH&}as6*0ZsZ4-agYc9_$ z9&XKzFAP98gb?0A?5yi-sit@~e^{OQV!D=!17yt|Jq4$W{CC4_rH5!3LY*=)hTyz; z8$eH#5A~BZ)Z3KS?|XK9T*ZofYNc*_4InFlEkmqqN{|Ooe8=M)JWFsRcDo3)ZAB>} z8C{cgS$_%ig87tyx}BDY1%^93Pi%#-4)0m$Jvy_(eeN>FygxSq>i9B+@JFLXA>Y5W zLj)BHd=;6E$z7zxU2h%lWK@vfLU*sIaZbYXtFY>!HMedh$XTi1*tBGhDF%mp6W!@d zqsPVap8KkWfxv0^GS*=KGT3+yP4(urarbLjqzC(s-OdYvIY;in*qZL~DWnIA(zd24 z_Hb_jWhSGmq*h|lJL{o@WMe@_R~fX#xdltoLz1E?qGNnB*M78@$p>q;vClDT@self zPR6$vrV;4R{rURrx4QMWmufbKgT9gKFZ(xZ;!OtkrvS=cI1-UGl#zT^3fn0(u1C8; zE@*1S%5At-+`^JJlZ+Eob8mWg@Fbo|<*c4OMR)(+fP1!2meCAG!hWO{UIUXEte(na z&XBaNlgjtxBW&_9R?buw&I}r*VJ-sIci`kUwEb}QLk(RwATZNdONE#Z$O`KqBXR+Xr3_4lkb1JD zmBFTd+y;Zh2Im&=SolrH=ph4&^Yu#8M^4gev5MF;<*bRuJ;nlok4?(lqfAxORZn~B zbgPYx_!&7Nrv%bL(J`KRE-mPN3taA$-tm-zgwp2IYH%!C`QiR__@OlNU5V-VMBT;^ z1u#aMa6_2)Y9m=`wrb`Dy>&7M^s?SYX@K*abVuMb>s)d1Y+I>2a>N1atRT#tk&BePC`Se%)v0hykW&8XtzWASyG@7wWK0Ed(q-9$@+46c>_uimb0=W)D?X zdkxrlRjlDIln#orYfXwl1h7_DQaSGSZ-z$@OZuXtGfYiI6_~VSqW1?FaZi%#^+ED&b}ejsYBW zvH&B;FCfZ>pPjNb{X$@kexdY(7MY^jQ;xHS)8aMvNCfQ8E-yckY`eTN>M)%BOnhy1 zg{fIkfHbXAEA20uoSbR$`q%Fr=k}jPcQC-g?nHXgC0>3M{Gf?o(u={7WQ3`-I!plh zWZb){QCXbj64|zMPd|spaZ?Obv_AR$Q?}5sQtj=cmCOUVwX6gyQgMaO(;Yp-*4zWL zd*;5M#0X??l=8KQ2Qak=)EoQrjK@zu>DI$iEfo>n9>(`Hud%Bn0`5Zb#YPIBi!JS+ z&WfV?#a;~DQ?X3;HdT!5l^wFfEv3N1^Q`X8Ej>3suBTXOsN*=FPm4?{a1?HQYf#Y= zy|uDACpy-E=^I>SUWkC~Q2#jtWjEO9f75v3@o93Wo!{EUI=g0h#()u_oT=(@g~@eu z#+Wm79w8i zrQ=V3o!h8!QCLR!K67PQ7$gCB-p=|{_8GsI%f}4HKlG-698ochI`(lRPo;~JeKfK{ zk`A5FC?SHK9yxUCov|OioPXW`YUvVshFm*;7DguyZ7Olp5>$218r=`A93gi;BAd}% zzB7G?bZ>?WzNqelel(!e@J;yX>C=h(9@bXzweLq_@{#nSqT|cs)(GGbieTpjIqi$B zzCVhhVvT=fl^`rYtNK88tF14ap8UWXM_&w9Y6suYpCBuUn*aw6X;9yc8?+ZN`PFcj zp^|?S^cpp~siZ8H!N2VImLQxcC4Bb=cik&g<#(?(v?)G>qeT3V%0aN?LdCW~qZC){ zHBMOa4z>mD>DabBIx%Qe*UNR5(mvxNd6XuT0zWH#z{p-q%jF(1ctW94fY9GmW@qkN z58+IwyzVjcAU9HSsTThJdm;lUAz9UR6vN}qycpWSDXhvf1QAOr-`j)KoU-@t8#7vp z>wT%uYKZPKiH_|v9O~P+llQ!sBO$A@whPlO%7kwkAQ$cpW%Uxwd{-IiCKYEv-c+m> zC&^71ZH*Ai)@s|50gVg|jBMerLp_66^w=cwM76?o%obb)YF|`ra`~fvC-*Vu_>jAC zY;?7^T(h>_@eab|eq6!5kKyPvMy3ySktCNn>;$SwBc(P!F_IaZk{lVHgtX?FFQK5` z5zCZ;+J-@^LgNFgnSZ(^jULk2e8)kV9FfAaw|34qMQzWbYtRllbITXKTMI6 zkzd8{>64SAn!{wzU}^6NJmO*$Z)~BXhNnWv=SXM02Zsp*V5s8=n=183Nlsp0Pp+0| ziW%HfqQsR~9;hzXk0a}!zj9Vx9Lh-KDs}NFWaWix^ekPgG1jE2b2vszJeC())yPJ1JlQLWQw}>G9dP}ZzhAEL| zF%$@iK(2e|It8$6xsvYu1rSvExL3QKXUawJn*=AJO60xY>JJTC#I-%gO0+la-o~$% z=|V7f_Bhv1zk;NZ1s*5zQF3WK`U{N%5_ygSu}aso0)mNB_b9uv)|PQ91cE{?5NU#A z%Q8=vc#VY+h9@?+GGr1-P2Ii`j;~^I=)w#W)Y&8L?eEV9^j6b5E5hl;pWlz6 z@bqoSoT{N*HQIuP%&x$i2|Y$~`YbEOfI8FRK=TRtuDttM%%NG#PL|3FVo=|-2D^Eb zQ^@0=nS`}BqlfyLuulwM7vze+S(eIoR(EN#V@Wfoluqel7t$e%w>d~7EPK1#_taez zr@`lZptK4gB#o=P)7^$VbdMJ$`Vup)w9>NdB)LFPut;TPXE$vPF`^OQ?S7sr)ms=l z_rOZ<&QlqAXryO9Ue4QP5 zV;QwmuFNg0bb=DEsI4VC-CIfpCpe$BkO$&@@cWIJ09fUv6Pj1 zwuAaM{N$kPl*An79of^SjbN1-vaawwjOvUJCD#8k)*}7)dzqZ@boaEVQgz2WHgB>) zgkcO;2(_Tic%CXKMp<0b*ON8-0Oe3aKtRuM6&m$=OXyY7sKNVHm38NWe4qO>2&;+p z?~b}%-())*B2u%>$I`X>A*8NR>cgVO?o&Zre( zdilDzi4F1~(>*18rpKs2`jaxO!i6Jq$YY5C!g8y!qpNOqXp(MzrfEDuk4$(_FTWHX z5rg6Ab2N|{ke?3t&7~(&g)RccjyG>Q3V_P9c0K#YI2p$N0&urk_lGt8+b1mIr+eA6 zsGHQ%=^XED`KSPpa@2@$HuKZzb4@OL2ZPMg@9}n-SfYk5OjEq(`h_Z2e1Pa{p$*hJ zrrJ+U*`tzKuX4PSg@a`moUK1z?B*|U%6OZh{R`0j3y=*-_aCQ1D}Ky*6G&MSlCEuR z>8u*r`?HDKp`eVP$INRXza|(wzlwtU*<~yW~ z^-fbnVkCvwLn;>t9eWs#44S)`6aTyu_3;khTyuQcEHb#pD9D+!?7!WDwp{eR1`@F9 z8ZHhjZ+2-s@R&~F6?#2vY0Ng>J31|XZ&ljk-3+W13l$jVw_^Ml7TdiRRk_OD0W7FG z9w|MgcT`sGYf^EtEZtmflZ|`XF(DeIQcP7h_a5Y}&0l@MxwIn^qnZH~+rj z5yw&b9%tIHr7K+d?fo5N`16>u=ig~wIohVZ&%_}jHWxY@hPe_NpyD@z(z6cr83k@v zik$aj*GsA(aumy_#7-w^Hz$g7%;Y?BF`GE(ZnOPhmzahR!`#n@@sZzjK1s_w-u-$i zFDd3t_EE?;GBOi;Pb-sJulJybKe2PJSRP2}IGcNAbSQ{4mnz*>Z;oaWR+5CD8E0fQ z^+EYMhlM8w>>ZCpW}?(*nnP3H+Rq>dxci>7c2y2Ehr~6vIgizWS+!Lkak?_Q_HHr? z8Y9W5;?RvX4>BTaVDeI(Lh$IJl%nnPaFv54J|F~E2LN>Lr`P#IGV9}eCcfcS5`J2( zyeIQ0FCDD3ys&73nP!R1^vCxf)wGnVkIVZQLSsuG)o;Q0OxvG7DpAyibV1A%tITQ2 zI^8l)*U+-idH?=4TvA;L2tjt4!BgvOINj*DgN>XYK7?+exw6J$At#7*EJYvXlEocm zj_z*;DeFYK8fH}z9AK|M1rKHpUe)wxiJH$*tRfu%%vBZqHe=Nh&`$>s51ZxtNFU``;TP1qB)vF1w5 zpchCk#v$EvCY%yW?YTgt8nH(Qg?V8N(XG57p?A0?GXS}d5Xbu3&vO$M%aW@w)#NlW zbt@%;9R#Z(9?P=qZiC!4HsHFWc9F+g_@qdc5IQH-e^%_RzbE;~M@ShwjDv3(H9(L@ z75SADe-}-EFnMB>d2>C7rv6CtjnK1(%CGnA?@966`xGjIt7W##Z z*X1iC?s^TwL1%=c=m5j4Wxxn=%DXwJox}UR1tJAc3C%?({xLJq~;JsE-s>uA`7gR=yc^Xjl*l z=XZFyw5OmE`vvMi!qbX*stz2MfXFDoAg+wDDeJf;xBH+g!`{gv3LwLvjTXb81Kf42 zp1FnjK=RFt9;qs&X1Q{Y<;tOB%DopPQA*VrTJ}>|xc4XNCjjwU6tfP<18X@~MkD$=Ly$KP2xsU^?4w`4cZ3WRK_i1->2gvxA& zr9T}M3GOvd-&5&h;bh^8@s!`0zfDUZ!uu)=wgcEzi(DpF1y(A3Lg)pPjbX-l)*DEh z;6;zr{OE;U2(_vmz>_`UTeoqoL)umN%g;P-#rrIB9;)y9KJ-;o*NCY4s0P3{J6otj zuLFrAuM8?wTR95-0gF&IgPWZi*RZCcWM90UG^enZitm`u4Rm zE-2qAd!WD0?$=GxDOlEpUVXA&O^kFWLZTDF@`*fPs;SjkxTs1vtRjb)(C1J3R8!J! zC}vRjsGciFvoin|DDpD;OPRlBf@LblXc#{Bw?vm-Fe#Z7J6i9Lshju^- zr4<{=0-zgvONc}2;2J-- z{)v8b*eKfkV03jTkL8g8WF@B*HXh-lYK#qjqCnPk6$E%_(D_@k;?S~M-_a(|)*yXd zY~9CWh@fi6TF_6lTLli-xiLpUS@Qqn&*_mTDO+xBg3=gf240B@#&#a|AVACACvxBI zmMo_Kv4s#4JzErCj3L;u(kB;qqFo&s)(Z;}cwmFb+?s9fYU#q-HWXZ=Jz1|iX0J?I zJ^6BK6VR(wKdW84mzj)=_MJ;k7QtH_ReqMtZx zSWR}Lv=C(@_@90AQkhnpz97^t*W4_deLNw-kUA1IX2q21rKe%^j32-J9<`Eb(KTOI zqct9@On%d3IqV6%%5V%h1$H)vK}^;q-s*g|*}xiz{mcfZ<7jJ#;+lxVVb#NnuB4Li zpfkZesKpb#~JVOQkQ1*`s{33ZOHH1dBX6;j*Y1uhTGdU>2;@3RxMiWbn0xddw z_A(6HM!5b3)c$Uqet^%k7VF=*KWCe6)Bunbk5TjI$cMGUp>Nr`fl{b#cYjC-EXrZS zm`;o8#D|VL&r?EUXZ&(gf@Xp2f)M2O z9C#^Uchq`PYWFK>F8IWP35Bb5T`-E57?Z7#A(D=M$9x%NxYio*7r-D0g~hHBUb@MI z8cXuhKeM#$s%lXhR(zPO*MEvo<;T1oTvFv7_iX_ZEat2h_iUFA&A%zBe{}VX;W5Ln zeYN4mD5AQF#g$$%eJgxhC*!?fVjpr&)!))Jr3R0C*wloPy`3{<+P$PQeA33uJXmKztWm25O38&GG7)QW92rMsS}htL|6JCkZHp7seKv@YeBw=NchsxE0HwTn z*w}ryPIQWx)0SAn#y@ow|&x_c;Mj%8Ux?+ zn9n{^ha%Qy{*}VwbPt!3hSuY9gGmXbq+nY!r@22m;NhThrIFWoEVqw#zp)iMe*6RdIiRN%!Bw8nI_lwdHP1er z(=(WeI*3fsTCwerta)t^l{z0UDJe}JHK(jEy2I?7YN`*IPa-VKmbQi2Zf`8;GR;f4 zA~y89JNMB7gO<$W(l;dJK!E4*X(AniDgS!KS>tU8;b4~B#0N1NpM_c%sJ>ryoG)9u z>%wtK*ASZT8lx4kLZSPb*|fYUr+bahGDoM=!#s~P?a$mM^^?nWq&GqI@ZQ<*JbOlX zWJCJdibkvs`GfC2sn!EUU}*&LY~kC4c_~dOA1L%Pc{K%QJ)c}(Ab!g7ZGL1Y!XJ+KR;g?Lx$V!mAK`KwyL$ED^Tl4GHZ1@W5vkH{$lMHULmxTK=%@6Igo zTxEYrF2dZDPB48cZBW@i5gg6#MP@~Sw;G{b^#SJ zj_R*U84obnpe@Atg$EoijPO0p$?XM?z;#7|d)u*Kw$$)q0Nu}a3Q z`=?<$ZA@4MH6(0H)V>+NI;n{t#5AC`2|r$`wB$`HmWwlDWaiHO;S^8Q9G((199@oO zKisQ?x_>-;Hz||way!$8RxEg6V$x+Mg(aeXtzq7kP*I&Rfybobx-V9_p-p8;Gn9_+g&v zo3vW7`YZI{xN4!8;_IEEW*|Z2I9JGIS^u#sE70!P$$Y?TT>af^q zs)q{*FO6YBx*L`$jh>l_Nt-UU*&2N46=O^)|5(kxktf#Bpm@G&X$-b=I%rsCX`czH zc(R3Lz)b09*4Y>rf;E>x{y>3^DqN!Cc=JxL{!CuHDi^!d&J;_CDwn4dBT?3}Kx2{g z%*-x4-?o3q#<1pbj}v+rIv8EP89fwK8|?|^SMQd?FiYZ~tMvec?mKn)q7=c8C77Xx z$}`NXn5=2o98xo?V@i}){NA2o=JN1C(|dOI!GmnAnL$?Ms&7?86y4`ZeJ1VNB#_+Sv zjiN^b3m7o8M4S458@``Nc_GTcd<9PEBYqF-kyklr`A*8ghF=M1wll$*wY)*jT%t zKjg($Boi(3v^~Z1PZKZK1Aohgs#w&?4Dv|63FCmEIh@lq53~BX@G1z{z0@{nqE?c_ zC%lR*olF}PU+VYHTdLivqZ3|9EKaEo4RSGe#(-}xmIt$47ucDyZtc{uK{YaajR&lL znI_-3X1^pxuoDlPLu}u|*d@&L%5?fu{g^pg2Tl zrXN3|`NX3`Oke~PY*N9pn8<`5a;0&5@uyj(xLD|Cz>Dg6ar)0lO{6ME8qz8hd6rY% z$Ck-HDE^~qr8}bNtJ^g{QxR`btsLKDD<}QWrY$AbF^)+lB zO`aQ1bf<>WZpN90#gHPHQ~zN+9?+s?>dWzPWc61b@1KTMFfH4!HZW`{ zXiAe^$)LX{f=Yb7DQ9>FoK#B5=}F!0dVy7ayWE3u6tl@|h#c1MU9*i(u}3nhPyW7^)rK)TGyZ~UnFqZo@7TdRIix} z9@Dvkthd(>9?aUPINpYZ(zt|^*-xZD?0C031l_8wEW=D+rc;H*ZI{es7!FWGqu*A_ zHG2K3P2IU<-fNM^eDR3YA72@x;gkdrgPU{Pb`KV#)rlz>ql)a#HFz@{k`oOafaF8T z1J;&I%UG5ZJIaMT*kwHwrlm|#<}(F33XgY6pcHX( z4N?y`(ZDWH`xn4ivw157t*kBoC8(R+vteML9Qg8O*@G*8NqQQ6^;vHBxTgBc6$hh! zX??sIqMFt0yn=6M;n_oLrB<+sR=X)id6U?xiSs(H-kB#+ET_14_@g0o|INGqU;O~( zE)vmm7jjJ&&D6>sDmJuZT00X0oYG6(^H@T$#J)ZZIwTzRgHF&pZeis7`ATx54}b0)jJ>Yf2h*ss zwZG$SO3S7BalPyqvhjMyKgxRk{_fL@lW)CS1rckupk0V`zF+RG>`|V5843v5CM2RQ zt|af#cdS6_TQ3cr7Z5!Dw;wz5f97E)v$r{P-Oe1JLgU~F`& zlsVf0^qSPHI#EKB4rxSh4?)e3R&_amSmwE$0JZ3=cIbK5u=a$M(X3y=*KNypZI_ac z{T`0+8hYuTtDr~nbZ}yAbg9Hi;Ruvokw}-<{usVn&uN`Bg6|w@w$5-)0)oLH1P@l0 zMuf2Q>j2naKqI;8Kao6Yp_>I7FvovZvhVI8Lz|dS9*YjBAc>pn`SCE_|tX+L)L2FO+@!7FSSa@BtoL0XE<_ z{p8X`hb*AL)5D4F4HrRQ&Bb66&Q)k*^{T&W!UXEqpM9yqk%D0hZ-?!E+3^=MJct`| z4bD`s`BJs!Fun`5UM)IH>@UD@?fA;M(tawvXAm7%GDT99?$h?7$1R@PWEf{ANr8Dk zc$XX)k;z|xz5uDd)zuj=g4It{Yf67(v_vSQ9n35FwoWO5y__x(r?FNSLvt@rx`NSq zvBVt>WCjz8Sr^fMxzb zUP&)div-IY<=Z|J*JP*_*w;v2B1EG->E$nMnvJ+;-yYNCb7PYy!@+N42FeARyiIFs zD7#!s9R<%W2Hi%~g2azx;)f*#HG9TIp%liYcQTXmll6|=guPL~@%l9@9$VNV9uC9* z4##NjB8^Yv@KDgUu+5|we1FF!z8d&*1C*UMvXl=Xj?SC$^q$ZC9QZ;1bjV`SQ#Z=* zr3Ny8`11#wLzyl(rGxoM$FwXit9n0V#@% zXJliOjS;P>&l+n@Bx)K33ofBVaQ8-ZrmzONSB@Xxgn+Cu%y{b1On+@_@O@8I|W zSOmDWrGP;53$j+@Z9?>Db`i_Ap?T295%$>gG6?k|ZUyt?{4VL@LzmyU$IR|CWwMjK z;qs3e8M+*kJYt~f4P0SOtx3Dw-|++1Fd^(6^4W+mG+R+F8UoTOD0Zz8mD-fwC=3~z z;x|C3GRN)sNVbIUIdN3o(KcR|dQQpzQS!Gz3+vM#RFKFbE}fsu$@8*JtY*ef0ALF$ z$;&GhUbiChn(J)NH?3+MbZ_quc4fN%@`QhRWab_GrlNb%_BiewIg?z8j`a?431RJa zkwkhHzwNO%yM{>c;naLKyzF0~?|0CPh#FBu;jk6K+lC~(qsn|_&ESL$<0&VcJcR~x zYy{&2=BS4mzh>gb5XaB29i2ISL()i6W3;?DU9QHjAnnV)HXrs`$(-cM=nbn?=l2jp z-)6IVo!baw`lpg1jUq%?+jvMv*$;Bd9sOXxsp9(-k%^VJeWA&aSN-;!-`KE^VU&rj zI%{#QUUHc010BN;qVWJ_#_)k(Z`P`3IjsNuYDaFb&~$7Ao8uXo3{5Q(5{Xcbcw9~) z|AoD`4r;4!_r0NLZ?w>230Aa4id)dqqD4wu++BkNhhk}g76|SHDb^NuQoKlTEt=pE zq!6@dX;1F6_ntFz&VKIw+Z_;lElM! zg_JFVS}A|nAM%0k`*(?>Hm*Uxh0!d&k*MNg0^*;269iej=K|LU{_cH~lq>wFbu}^$ z7JAnoB4tY+rq-gKeZ-6b3yR_vl%clZYvv~W?v{{K#@zA=x*voFB9o?HHRH?PC9`XC zg!k2!8_dn47;V;EY_^xCxRJi@XnE?n{Dhb&nNX7M;j+3+RYg{AZq%dMK8YZH+Ah9f zey7B?r3m#PCGur!Us6uYN*{ZMt9Ew3-FiW0x&rvENkh$|a8s+U3`=6~K7afuD zd_>+8KUTeS=H=v_jY?;kS0}WS^xxNp8=5kUQ4$hROKm$3!pLYc^*PAFHrZZO^7_LZ z+lejopoqF%CcSYLer}W!X_~fU*BulcB&_pcw!ehMwO8K(X^ zkad2W>4+odQkhC<(;dUiRBgEr$H!V|3&$JjOZTQ$#m)@tMWt>*mfK|HL65%R}6Y@9Me z>YR~Mx70!IOA+U>A?85E^+?%u(M$CQtEK^Y?|Z)T&8D|fbDj(p;e{y%MH3P<-fWA_ zF19`TQ1dJ8TK9QP#VWZRMF8+1rihK|5)7q7c$wf@C`K_s9lES+N>Bgs%ZTU~Jt#;U z^}0Ox#@w%4z)vBua!H!O@Te}FdEXOorE=3R!h3=E%rtao#H)ClM_BsMR=C0K2{X`| zTe>_=QoNEJzjXvJ0W_c#Z!da&@-?ANDnqYwA+8VfXpVL02IyR7m+pPygpnrZeds*7{KlAP-k$>#M=eDyXNm#>G} znDH61U|#?vIFlsinBOV6e{NW^FqWjp z)c1J$%a8or;VC7f;)JK1Z%5u0rBjawW!>i7lNX6tr_XJRgtAjeUojlain}%?R_@#v zbU_4lq1q}yaq(WapGi`mTo6y%@r~HNV#})c7%+ce?X3sjfT_q8*NP)M9HJ;!j|pk~ zD@C2lIVaU0kII+IMWS3it#+bUGb=V}o{Yw%@p#3>WH9LTWEhakZ1IKB=aM%w zes0_HxQ2*oZwH`R#M^n<5@W26(13v9`|z(Xgd3fj(2c91nzX?6VT?*AmH(+!3R5zD zQeEW0xBeH&1xj@$7#}9rfPR1gD z@bfzV$R$>$c5ydtRE2@3LM+W_+R-4qGE3!H-iWEc+cu#-arDq^DQMitsyX#z^}U_h z;@5FydW_$Z=FSsZw1pW_Y6A>sY5kLmAX%wf#3>YVQcW)&)d)oqjZ{sHuH+Krr&GOHcQKNe=ylN#jh%~dnB1zCk;#S6LTB3w!)rz zox35>!X>r>sw&3M>O`Fe&jz@B`=7W6DN%U3=O+O7<9iX8y05zJ1y)3Sj_=x0qr%a{ zK^e30Dm`?~bj{RiY!RfK)KE@$dU0hDYLwkzqW3G?qQS&<=h}=&RfyVXImfn|=K-kB zOOa=s+KfeF_k0X&ofRu22zV~Gs?Rb5oKw5bmZk*8(m-_9{1rBnKt-6 z2}~=*TW$#!sCD}qgmZC}ZCNjui-@UZ1+0wBOe}6Q@xX=S*5k7z=20r4Q*6W(Pj8$~ zTE%o}8==orb;rgw<9pwG`Z_Lh0yxeU}EUz4pq?AgtR;_;|><;X!GGz$Z_inu25XK?%3O z&0$CUmUOUY4D8yK+U3okaKit_#;PgT7utslt$*WZqI2Q1MVHkVkDA0D42?OYBOk*NQT*Uwf2{ks~||6F- z7e^(Iw!BjVuTqQ!D-t55Ed$()a+ZAi$w(>jE*HDq#$5$jttz(~xJ#jiHmCZ^pSSla zzQlDJbgKis#LE{{eejG~rVcfKt|B&3UQmke0NFad!#b`qPb2v1<`n=U$?O^)J4m6GJLQoB6z9nU0t&r~>vCYuOU z>qJ789(y2}?04cv(BZE-fBXt3>6R}TmXIAG7g&51L=S^%IW=v}n@jDS|VWaac;zTL(nhQx-R>snjLF?Vo5v?G4hhS4JA76v0qNJe;{3&%-?u{owZ8$pV zAHkw4?TIbvlYxa)pX{cktja!F@vnQ$Nlfnq40w9FYw?*ex~O!X!$((J{N6G{x+r)A z4GbNQj6Vd__{*s+FuuQ6{egQL=43we!))u8eM5KQTyz^Cyb)L6*yJm$Z;V*OLT(o` zd!{&RFkGcsZn*h*)gL3-vsBeU=NP{S=>4WXXg=(nZGe_ErOi_-$HNjcdZO~mKsN>R zW>|L_?WAh3$~-y7JeK(OZ9idPsW;QiSYmEqCGk{Ih^vE(mA2jfbzXwC8U+p0NW1Oa zNWUMda05fsdVQW>J$flL-skdJM!T{)Y4HeV@4^RuW}s>SQ0$)UKVB8h(%oqPl(Zyo+m|H4BXY7hWWjNvmcNYIXV*JoH(UK z^J8T&C2&Sn`jfk*hqsW=NqI7RgtvkD0GDw4Z9c{*RZ&w?0{DpU{z({T7-B+R=Zi>g zapN%7f<3!)L(KIm=8iMaL7BS?hVf2}5!g)PkwoN-*_sZC;k45F|-9}kLpE$pkgQz>pme8`zG@i+POXVTwY=XlCe0##1(SEFngwFr% zY%AIOi|@X37DP@Zjv$CCqsQ_uQeHV&+-4Q7lXb44+nPG$Kfrze7}+<}tl2|#W>$5S zmHp8-PtSFKw@vct*yQ7jc6z=>R9>jkvRj7?8SI`X-%X~)H@YBDeTxB^3)RrnsTut< zydB9+KS{x5l9tdEwmAgrgI06xT;t&d5x-sjvX_Jw(ayF}Y=0gwf=k z9aKt^nqFUky0v$^0$J?TmC7kYY)ByacgIag-*>(*_jR7WI3V9NSUdb&uCe%%W`kK^DasBe0$foXX zfY?czfV%aHulEaA|tt zr4jEFluz@e=_Mz%7zqIaYf0!TLE@!MIvM<;=jH0r#FsLyv5y{y8Xp#Npz;H{iYWP?Pu+Bg z?O)vG_gFIVS>HB72)G#Hd*C5ZSm+B-+~^+VeH)WV{Dl?)V%=x1*oO>T!RVaUyx`?* zw{!Qx*X^8lWNp`26y9eo%#?nLta;lKEPh^)cH-J|scbyC9ro^RoNUW+b1OE4hAf2V zi1wz)wtD7Tp{@l)_2S;Zly@7C;;4CYi2nY_&gKDXlUGE`vv(iV;~4n@R3xBN9weM` zzELpj?Y)s0yJ45EPYpQ@FKGK}`PKL~xF>?fptXn-(VHnAK2_bp>VAiXiv4YkZCm5# zQ;JBH)9|qRX2}fdsX^Zh6Ti2)x$DHKlc}{AuHe{q?{)}_lby5asDx&6tNIxE#OT6^ zEjV_+dfSwAIs5f>#7sK9kg=b(3qM`%WE!vTH^aeGGOXQ~;fZ$XFE2#V>^A0R=q3F| zAv~631iN(9apL>8a6tj5bmPMJlP5bty2ym>jfT6eKPPK$?%a`rP=vc6{kE{TY_-OVQJ_t%etw!X;hMOq(?Uc3#Jv7Fu8!FMrN+02cDK3pX(>#@j=yoxur zInz(M%ysjvvy(-d%th-*!oGfIiuvjrTaBq$*7P&XOw9W#=mdg9O-cJYWoduRW z;`7Bk904{La9Gv|ryf2dr#Y!_>F_<40xR;0{TL{$0S8!xH&_RuF^Wif35n!pM?ua6 zIY1Jw4d(CW(&SWWF@F56ki}y$u&(~zck>F#NL`T3Y?;<-3gu|S?v%eBL0v^){Su?% zfBGdc^4Mpk=cn7ce8xl_;aa`~3)nMzdcznzRGzLMt zV^mgf{y_dEWPYa2*quDz*QZK9yPH>_pDjV9Cs>VCva)(6OF_%#eoN6h60RvG{x)r+ z8k=~uPX;(I;0TmL`U%SxHRBMMN-?j7_18wo{XUix}ZwMSJv8XuIK&iw8ElI)QuGjrR?X!%1ofi4~5VdB;itNs|Gs zVolclR<(C+i~HR~MhyBaw=RIIon9xwCi@*d5fAW*dWU^lgZCq+jmn;3Bvg=Mb}#{) zs60&J4k2}j(BnTA!;|+7))nm=CXyuant0)*jF-ttg;AcarEVFaqK!(-5LOqK?YEz&^hKY{7t*R2 zjR7L}{g)>vL0!zfxQRW4g!h)?8<-g?+v`V4`4)k`%#3&1_VEw}OA(3?KUTW+O(idH z>`Og*N|BWktM9jv2B9j}TN_xcjeGF0VeDdo;KsetYi+8pV6Cg(W?+|p`?UZMTndyjGM0E9boa2FT<6Ta7XF!M!))9;UC5)cPcxJPdN1g1FwGp*P<@Zz9?Cj<@ zUMVgHTDB%}U%m?c8F$9!`!{z{yxq7)k_FSR3#QGyXqbJt?nYu59wt8awzF1os;M+} zRO$Rh6xwPcM{g>@L9DM3xhZ^%oJ>~*DX+0IB)&NjicjohTT}2J8k~IwiaJ<@r4H$j z*n80;xiy^i-dUI3wUrfW22XBDNjBp$z#XCa^49Q4@@OnNSl`aq=&RAZ$!S@F|owM_# zu#}&}W^U1st-dG6^R9|#bc1s-!PpQzwN1iv_Zq+(fJ(3&C96|~>re{+=5CHJx9=(> zxh+}mQRcNlPLJXKT=0JOL=tdP5&h=go<}yVs00+%RlPm224i`oUEi7BS1+MN$@zGtexI+=g2IVmi;>k_^SNQ%br=;WhsjiS zl9X5I7bnu}C;L=I?+${kZ*p+M1u(-XRbz0Fc&sY9OzxJrf1$-OIVK6d>E;T#RZ`dI zDA}Q|?8SSE9xWL>p11LmSWmLJ;*m~>cr8LF>O|#FcngohsrR+GfldoPTleeX&B_-d z%UzJcz``Dw3*{tYQWPFuxf%2h@beAZJd=ZDkhmnd>r(%iyQm9&dX@g-z)+C{aHlW~ z(tOY%$!D^>h^97;r87d`mwEEM5%>N9dp?%*nRroka%#rQ@2#L+hr04{eZi1ncX?ZB+@-%tRP5@Qj(;S4RdsHRNsz+ zGn$+!_Z#i}cabz3OK+bm)y(@4MSc)0aieY+1nuxpw5|`y>$N=S(nmgp^{+%3_n$@` z#4<+qPWdGP&Kv8`@jz{)!oNU{Z3;yXm54>3*&m*9v~db=2#hEFk#0$V7)d>|r|Ixu z9$|`8wl!sR;$L5nTjv<} zu6hC=Gw`d>0qtbKZ{ve_vefzMYb9xp&l7M$VB&Ce(7D{U2=|0~Ln}#&0%i0tBZlqFZ$wJR{ zx_h0KyBhvt{@~JnOM>0>g+aJ)2ovIlNer%!SwpTbbG5Mk=y^nQD~!ejkUlugO=mZ}&V$7E*;{5hm{rfj4=ese}4@iN~jzZ0=M+ zjAUK?1AQPbw^y0z^hXe3sgv)Iq?77F393VE7Xp;Pq7&vb{Oixn>LmqDZ;*95W08Xn z>>ZEmeJyKr(l(w(w#L0T5e21gq=C0wR}KSAc9gbsJl2&pEqM54{P;fS#dWYeTnrXB zs?s1}cUQL*PqXrV%?TGA^9Z&{!0TFWc9Cb=-qUX#z?`l#xNMZ%GBq30ftWGC6zyyl zs2&A#VdaoEte%(3HrA)|;e$>w0fRCYl34|EWeLqzpS66S1$&0Ed-~TgL^r!V5JB>S z5+n$0sb}i-vqv00Of;hj??ULRU%5^8|M;}X*~Co#LavfBIYE462M^d1@mfAELi9Q5IwU|MyI*H`dyH+p&gf*7KBankAFR5n^#@d@nF_!b{^SDXlDy(Gr$$>`- zUE6hYCTpwmhYNx>BCK*GlO$~^gf6pGG@vmiK+U%9U9mv>u+ZSy6Qmk{O$~9q%E@Fe zy9X!qn3$?-pZ4vvSbj2}W`*=Z4D(ZDagb!hb4j%^v3MPhpc@YG8nvBNo9Ks=8cT*n zb|O{#NMizyNAr*}A4BwZk^Ql&EvP9wgO0^QJPw`T{;A7NexKm6>j=w84v3!bq`@jz zW=h#wzhOm(D+f(Y+q{XS&R=)_Ih$u|Y zD}pG8bG5h+0?(5woo(F|18J;Nanz2&j$HXQ)vW!|{Y%O%kAK3S!8tr6YkyQ5*Sx$# zl$lR5$&pac`Yj?2m88yvoYX1GzxnqzyZ?@sMhOI;o)PtT)#hq=xPCM@(~2Zg>2Tr- zS>zmh1c}MT>i@LF8)w2(BK)_kZ-k$^^EH!1Z<)9At7LXg!AP>Ys4p5hBLa{${I1sC zN)A79RG zY+!UYhgXokt*BwHswOAw6fp`)3LQ?lt4sZ|iqER%Zv4A61|*5h12U*N{sm78wC2>0 zI^;36t#Q0*2Pm>E`cpL0(otEByCsPk$9* zu&hO@qfLO|#7_4*;!Ps+eh;n11dVo#qQWwmz$)nPUVWVYJgk_>>kqUJ_Fuj?qVpmcz@34<4qQ zu9Q-5)Y}&zhg}97RbA+1wS|yP>fEE2CxGE4hd|=>P!00uM13G;_eX(k55?_Ue7k#e zXQ~*J)XlZKDjd;CIz80>O?ttv5uX<#HD)Y>KBO^b7+x$KdbS2HZ_fz{Q4BRbx4TrXHOD>_D* zJvDEpBt}7%CHv}u>lcaSYC&?RIohKXI-^!P&1akZHlhsQ{mWCm2)`XDZrjHukW$)& zad;>lutZQB=Kn{g`~Qp2f1E8xv#6~`4N_^o17cK+{4$5#g$X{5AqYGXKT&TORg-Vz zBwy&cgqIx8o7M|XFxrS7H#dJoz&7o>3evbSfMDDBV_r_D!ys)?)E6jg&exU0tR_Iw zsIS!SMwQ`ERL$^xb=0y}V*hOD8;QhbZ>6@h5}pMU}Nd4HRP3~E``0%^f`F!zF4EB!z7|@AD)K>gluj^^C*W8GM0Ta61&mr?{ zy}{|Q-`+M}I0^zjnrMKwO1j5JQvQ_4`j%so{di}IValU#(}J|dMjU**w8Bu0#|Ocg z(ASC8PVAFVF~-M1{Gql^xuk~&FPzPpOka~f-2+=?Mti+FooQf$$YV*5Ycrbkl{R;!t;d ze=f83L4o5kE*gi(=$~}?BLXabd>?J0eDc=4W&BB>lDy^$D`#Y%)(2;|6xqH-C1TFm zN;AivM?vTNSxbe}xMa1Gnj1LN-b5$^VYFfM&_I=VF-mi-Hh!Kq!Y$w_HhK2yHy*5E zG}{h1lU;-^m!2_&PmS@JF(k&vc6``iUoA`x?@ssHqJh3TBmr1F`Z_A|sv))XO~f-d z7MIz1Q5;XjP2M9?nss>_>x9dl^b!vyrBhvmf8ZW9>0hs_-jVznP@U zXu2>g5$nogYZ(bv$IRhTKVF>7VgFQc5ne82=p0xpYs-*qp5K)CK2;NfIGTG`jA1N_ zrUsI=Vh^R;c!gQmR_fy^KTLgb+`cm6FLA$3`8as*e7|P8w0_chch5CK6bOnxVmiKw z79 z(5=l}r+?(4v3mN9Vb%#K>UDao$^}+0PK49q+VsBYbpzhK%_okEYuZAelT>o8IlEvv zoOq22#c)_Fq~qrRzDDo{c={6|vqfqfsAn`Fl1I8oLWnE0FasL_(}~C;CQI1O`1q>d zs?4!;SK4DPM$$xMKW*3wKR(Ze{|!86Ma^SwPw_x;91R?Aeg5_EH=fLmf`#T&uxu~7 z*tiKSPv%xKL#Hx%uF2`jnF}`e+aIf0PEQe+q<1f$$7UJd zhb+l%j-VJ$Cnr|SA5^5Ie<>v8I!&t>a&*0MU7}pp8(|AD1$zpaUmE3>nGDWt)J%9+QLsd8CCT5X4rtpXt9oQuCOtG$CJ?kYaG*@D_c3b< zG%xm*H;czZ9?Bz$JkF1Bzbg)U;LKD$*e(S*=jce>UW=>D@>R37>4y4QQF+Q+IVvTp zZ?g8#Z+zc~w68bfEp>}Bhtg_;=xlM-8~}|3^>-GVCDN2u7Mo^X*^a?S7TNwTcQ7u~ zzKnHstoNRosj+{a&m7=0qP>GBV8tS10sPJibkIsq=#(rqu%Qg0`Nm>YELdpskRG`K1+dKXC z5vRB?D<_Y}N6xvux+8vvCJf7Pp zQ}J$x9=^nuWeDfg@;q&TQGnpc05k{hk>4wuqkvdfzm+tY@s^`;wyMQSQvJ+vZ( zDAyu;O{^e#*JC-V(B_N1@ai5QLDScRWQ3gv^L|Y*G^)-bgmS|JnE)*_t#B@v_&y)+ z5nvl>FE6>LvhE9Sf22W%?x6o+4`Iwi8V{(>UwRrf?kZ`JS_@SDBCxSxn4mQ|v7sR8 z@bFX8XAyJW_AWQ}ng3%(IAJ<1mUu~~{LHe7js57U)lsI66(LMt79TNB6kN(IUgAPK zf9~Z|PFZ%3$IMscW9tQn0ROwQ9y3rjM$%&|L2(XCZH!uHscy^phIn`U^O9LzcYJVU zx`5gG789AYvV;Q!u+&NAS2`K-tCY2&R~WW2_%iXEFt(@fn&C4eg^lyQUX9CSXgEMxI*F0YC)f;$%W_cW zmYHh`DLyTe+xkvq=Vh8jJ(FFjxo?drlbiwqpbwQs$c4o#Hn+PxJRmVm7+&$*sx?7~ zX|EozD8p-81#$W0o7ll1&wWX^TZ4yLKDPye(Yxw|!dryH4r}c^_iyL2l=s zb8HFM=?$j|xQEI$wfyG(Yfgn-`5x9N%>{y=YN6j=N6XJ$l6XAA|H^X9Y3TG*&mJ}; zCjf9sGj5lnMv&2Ypl0d*DEk$P<#0$5^v-V^e@afcZKRp%lB)VD{^wUPoyI|LBkzEH1{sH8l=yf7>c< zGGjP5UFEE%Gm5r`?F~~K{y%QSCrrzoLQuR&u~%TUC^rr=y~#Q2>l4pUmpkyJuu&vT zmkPr*uK&j4$rsJY@DkNArk_RDGV<#fZ;18)9xO^WhH>lM}N%@B28;E4iHY>z@Th_53UQ25p%{-#!l#*d-9u2s(kP zsk9GJEgcg}5jCq4rC{CXyRQ&&+HEtDk83`SyAMtJGrmetj` z_Wbyzb8`?vo$*E8uHkMKyy-ilRz3aoIbD|KE*BQN8O+yPqM1jW z(yh5A(4@08fQ``q#nm* z%<<-@&=NfxnK8ppKlyM!E>HQ=YiK@LZ9u#ol`Z1xVj}#M_`y-)d>m!YB9p9yumE!WeRRO6JH`XVHlJ*F`YZhFcb48gNwWr3 zMvfY<5ju@>xq)1R`_sA-zv z8lym7=LwI=vZcxOm1+&UjV9AhDx&V(t##P=ygmP_evb1F;~0-rVvDTg0o1CgFXDb$ z(B0rqUX1eNeK{}FD!ouyo%evu<|<7Ak{6r_I2P7#yi~%OdshbKjll}YkBm(2P!$+!ByANz)Nb@^FzhQ(^2+RMo#-@>ce_I4@@}@ zxVw!PMhGu^h>r;{$NQN4xw$?kesfi6USIgP%Ps+f+S_*B>+Eh`NctYKwY0*eSuYZq z`#?XmR6rN;ogS^HbPjKujhinH>vtyxEo_@FY(H^*9`TM9YN*1~U90j>7Ck>2Yvmu0>L?P)#C(EX z{a+LufBV?fQ{%w)_-kYEh$t7 z$xcgL1{z*o^(}{NZhz5EFF%I_%5yUK(bitbo@KTOXf!|cbK2#*_gOVMf&sWIn_ZtU zdI=bws9Qvw#D@lwM+!VIIa=^($VcuN*;N#?H394ND)`3+yyKiOknl(TPMke{ByQ-* zh_&_VEox*Q=!^7h3K)#H;y!`S2Kyl11YNQ}QdN z3tk^C+^F=-q#EHVZx8QCV(kC~(1hnftaq-9vQDW-SZTue=@D%&QI@U^|LPM+O_F#c zm%9rN2|y)1d5Xu}PS49qLkb2NcQGaCcdrWlSb?2JR_ZXOBj>zR&*sa$#XrDQ;vaECnhIL+`H5STKf0Kduxc zmzBcR<*GsS#tiHJ{IUJ!XA~PJi1s@mzwo94VlABXCpILu<4yO_Te0lVkK`E~XDdb* ze%53xA;nv}im(LX2L$O}cz6mATQpS*JZ17Y;){?QjFh(m_bQi#Cp4I?r;GvU6A~5a zDEJ6RG$?}N5Vp`1>QI(o=0Idh1kn=$Ip7rFU}uEGu>|l0Xlt=CK!5Bi9$@A#+|}!1}+;Z z;$prrJz_5r*w}H3y*IG8&@5` zB>d++dxH**oLg$(Mp8_0d}hTKXPO)gh{8=$zQ!_~WqfNk@?ZHGr$5zgnaSMD z=O;qiV_j6!XBreG`g2nKK+vyGgZ$)<^3&;w=DDb`nqLRPYF4ZXLr7{x0OZv_0;&V5bL~3tVsH4T%CkO z{YlS$BeAq?+*oY9+J?v6IqcUdwTRkfQE-ynSmFj^)DxYAo8!guXWdG5VEvGh^1 z+y@o$eNN`v6FTsGo@l%|JTczS*@{rG9?9z2)PK=5S;qH+VU_EtQ}Q*=VLzM%#}R(P)I zzB)dO2cIDqRV3>J8X@Z#=4rK{aF-s_xI}#!Q)neesjhW&xj$zJ%U>xj4ANO>Gb+C7Frb{aO`r{T`(AsG2Be%z?%#q(Sokq$T70A&l{gBgR*K960B z>mqmjf21I9*-ANKwyoe5Fq%NsE2gd;(3LN0T`8zc$|+*{C()W+ESBVLsyH3I-0fR> z6x;33I2aewHhhPx$ko*E080oC&z_WW@aSMnS~;L>4(-trpyP9`!J()eRx_$kWD!W; zW< zY?)&LQjRQ~p65{#D_u(Ao%Y_{4aBMxFvkc+^5AUYf)+2Vouh0E7;r?RLFv1u%5;cU zPi8L?0^XnWH{4r}B!3nA^bVz(*B}YUCM$Wr>|z)gy_5tklM4EpWB&1*WW9aExGCq< zkCMJtjk&)84IkO6fcDa0(-Q z)X(Xs#fP60#>`>d>1*YSioB8_<^KWJ)bOB+kl}cN?0(JjNnF0w8{r~2yx#NULC+c| zwLwhwftw?);hCgavcn5%=?Pw@{2~AG*acDk3HfG1;_!^;u514jYFcKQ!CUh zoqkE|B60C?%M{}tah6NTYU7(er+|ZZ!p3z^rfsd&8bkSCNYSW6G_^Oxz)SnT*gAt@ zVj)4|eKImJcYG@!rlmOz+SW=kS=<%x6bK4XBI+Fx!~@HVc6d=1&oEiX(@TZ&2a{F3 zbgBq~lTRarSh*I!k4PW{(HrrTYm%&_Zq>N4T~upnab?}3>|3YP{4J1%BYpTwTSlrU z+>jtR1_E+}H(#iZLlM=o))ik_@I06=qfOj3Fe`QMhi4KXVzbFNH|_E-mVcRcuPa&6 z6T`dYsV<+cm8s8E(|i6nSQ8XGk#Mfs+B|6&Svt#0w+s3gazg=}CEAS1?JKFJbX;q$2ccO+l*5<-VQdO)viZbZ|1E#)zZOJV@ zbf_BD%H=;_^gyZGHB$L)u*@o^a8YKvR17{?5=+}|h1A*LPT3|oh6M%Go zSETu$+W&=elW$d}6-S!`s!Ux~eLPFIU2x0&H05n3h`Mb3S-E+7<;x2+n9bW)h+crc z`oS`?@1k8dEdx&fuoURo-F{r9 z$9>@m*0u+J@(&VJeN=FvpsMAJs$bNa*GAf)*${;}R?vz7OIrEQbdw zMCo+>Fxa`)GxmK^aq=Sxo80nY8_9E#n`^WEb6cdfD$U%{ITyH9EoFE_FBZvbZ9cFM zxU+Geyg_ z2}1w?lnh?eb@2ar*P&te{O!&a#=RK>yxKm^1|Sg299Qx&g)FdSFxWi?msAXW7VyH_;%kn|+u5Ho zrByptoPxbZ$y{8Fd`)XMv2I)|ff9@PVff2#<7zIy@%VBc(Vj4gyjJagNMB<}?vq7p zZIbBiF-OxV#C*rqYTU~^1l-%>zJo-rRXDoSuve{-{@9;oMksyQPZ}~7^C)hmP@?_K~!G(1m$F;*eYZ$!a#O3800Btj` z#OT}OsVOvD^>4hhpszAa;D-5(pN0IGJ+s#zQ5_jbx%{U)r+cfH36Rl_F>7)8ssTF> ze&1wfFZ5E_70wMS0W>@u5TBAi(j0{hZ5gH5)*_jEt%|iM`i)mEv#dT7 z5H)d3snu~HO>7r&+&?&R>^d+^T{Uu|B}Wn$sJEf0-VyQB zr^*9(@`ad8-pNXq_DDGW#uKFvxRiF(Ay=d*#8D-@q0JO6;dtQNfc*E<=C2lFUU+6d z``#5-timi|WB=$j<&8NhU?)CQos&7Hk(I8~t(H8^o!___CdB-@Sd7S&C^lBF`y;R6 zzyKInolu{oWb@>S7aU=%vVo=YXOG$aCGN4#1IuL=?{c-zX>vwO@Ehkn5?JpacmjLR zEf-!xvOgH0+Qo@GY|^8L`@%&+OdpykFJ8QOy4i5g;Uyx$7aUaX3SJI@(Kl3Boxo7c zQGT8Tw!o$T^uGSPJOA->;O`#kZ`uD}w=5K`_l2HbObp(5G6z(^P`~;<89WzE97HX1 znkT`EpW8#(#xoMt=}<#ZrG8>{$hfEYFN1%bhyUlV2Ntf{%Pgi<2EYMEWhU>E@NUBY zr2(^R2lowo%xsS1R5Sl5sG(-&%b2=mu8MbWYH<*t73}hh*5pu)XFQ_4Y{Cc-Fl;X= zS#XpCbWPMzFdbA)skl3A6Y%c-aB|y*D-(d0?43V=xv$IcQfdpN6$^$C{^Y2R(!Cjf z=jtQ;j79I4c~mI|a}ppU==MvXW&G*Z1y@SX&cfv|*oNw}XWb@awC$X_UGlGli)=o8 z8kMgE(6fUBN|$iFH{=c!*&Wt;;)Tf@rY5S+vH)^>Nv@z*JBteOL+GS5mOedA zEynxEV@4YnwxCRUVS-#Mh69`@P_3?iZ2OIR6>D2Jzo<}D_HDR@fOps^JI4gSNQ~4v zIkN~9V%3aCPd7Tg0r`o@(JZ z)O&Z4Ao|; zQdVdiWlH*UWu-RTF_RI>*m;WbLnc67PG2(jD7gD|Cj~2*PQOV^cnvu)V*Fp5|W ze@?of6J)ak2n)LI{Iiwx?`}lK4I`N-29P^~X9Ewct0@83kNeVMc8T7?B~|Z3&p*HV zVITTw=^N!IgXzp)r9rwf#TNPwSMYts-PG4cdAoiM1poh;gfOK>|Hi8m3QdOZD=`Ls zEEB>@LQ>iv?4VwEoGF3-e9iykw>MO7MgL3R;p}^Vv!@v_bn`+)x4jz!iW8-7t`_cM zih<%#9$4ni{6T-Wa$LQ3QOkxyneSum3qzz~8L_sToIamaHYLS&d1tqmO8;tI_~JwY zbBoy*@}}nj%9fC<^k=ra&R8~UFGGF~&;4(5gmhrz9K#);!@C*9B%ZoSq&nJ{B!}{F z#NVmMn0iAhrgC)>VvUoOJ74}mRRefvP?K3PI2R~|Ixpa?grK+AmeV&ux1j0X=H(3L zT$T;;FGrjjL=J5$GCD>20iw1coe5+xBu>S6^_Zd|DDF!0nZdN)j-NxFK?7YuSyphs zdymP8WXoDtF(HwF*d&?&vN2wY<>o7D{TW%?)y-C&dqrKyPbEX&(|d)$kBj~Di%dXv z-oe9}eTq8rWAp8iF!N(w{k(Xlhs$>zrbSfqV3iKf1|kM#-K2n5dQ9bE>i9dI@RoWw ze1cm3CBwn><8hfn&HvHfcZW5#?POWh0v>@U+&yzo^Q^4bI;s!pPBjQkGucb+1YFDy|c6GyWZdX z+F!|k%6at~8ix><;J4ya^h0zyxGywKnYzP)h}I6}K`_ z8Rds4+0Js;1MX}p(^ zpDOM+H~%KnKCP!RjZiY4COU%&zi=1-wz&>+V}=uz08+}-4LWuQ*Qt0qNJ8<@o1PZX zfntOj;#T9+8@iJCVQKm5Ox>X@OQ1d(Px z3CMpE6!&qBx(MjPSAIlwKTq#bdOrmKJvZ~ESvTu{iJ?)d3l(MM6r{qNZ4oSi&EO>5 z=i+D72h#Lw!eb6)Dlw(sTTKfp0^T5mA?ie?##@WiAb#(r-DBW<^7M*z(4aX zeQM5khyt$tCqZIvW^XHE-LbJ-;-g-?+ALv%;uKRGzo}VF6iP96?9z#Ko(e%y)b04_ zRB+DqU9!YMKiFVdkjvuXd$?7j+6Acw)^p8#GF{J6n#qu*6km1%^|=HakrZVdATUyl zPl;jM2-8aGCLqXqjl-)`|GM(k;)E&}nwRnGo0ZlD7=23Rro0CBbT=5~w&!EriNm5p z2wib}(lTo7;?eOc(tB=#kW4S`95tSs|1Knm`Xc85KQ~@^dm>HjOPQ5ER@aaglb17| z11Qt{3ngpFb5ra0T-vLBxH@1TKxT=@2-qrJ(8W*%l*5%0M^ z=d_J8VdqN;1Gbq@>J4JDLa$eJ zQlP3!{P3yK#S7!YW+ZARym$GE9Zrk^Q#;JdwB2ejjt+#kK=UK1B~~0I`}WTl54epH zFq(A3dY`}_Ie<|j_6Zii_+@rmcD{33lyWX=0Yv*L`AQebZ=Rjp`R>U~Z9&L1l@~oQ zqb2k#^kH`&=f#a<2FlXzMt*bz; zSET!Mw+xO7MIdvbWerN3kb>Z$ISeUsjB-tvtsta>%1B5wxO(DFCgWX4X~#l09k^PQXB#-p_br|>7Cp8 zfqUBd9?ZZO`}Nw}rL~~<@1$vsu9&V4!O-Vpg4W%G+!=2I7y}A*(EfIbp z(waKoR{pa$eHQz-yS3xflfJQX?}}(~a%V0vKQarfP>Y%u%nPtlej8{m#W z<&nh!y+rG6elXSzQYhfF&g^~$xf4|1CHF9@!}^3a6q^&n&?L>2ik-(t*nw2f2k|3V zrF3%X`Q={Rxa?Tl7MD1!G5PtMVrP>cO}ocb>XDDp)(6!eH@78c88UGu^BO^}*dxD% zx^=PZmtQcz?r82!X60!OR?nu4&x_fEY5eXV7{%Z9FdGhiq0q9wF|y?97n2Tq<;F!` zfS|ELB@MQ7j*F~rc(ob&HqY+?9JtGjn^W0URM19#s1=gI(H6u0uit$0x#C*|vpp$p z1P#uTW=-GUtf%R>_ZUXwR^^%f+RUQ3JnAXkGM`p>@uUt~W7`t}Ha*sRM)&<%iJzl9 zk`^cyLkQdgLVf){EVKxS_=}7;?tocm=Um><=h2!af|UiMDH2xv@+)|B3F6?QVu=b_ z!>-4`fDY2Dr2u@+?&*8pHi)ew0kj&kcbl0GAxi>-bfldiILuw_yDQ5 zOIJJcUwS{d$WUg==ulF`3I`cBR2dpSn@hi-pADZV?X6N{W?mR0;`l{gMV)N~UxIeS zeWtF&$In{?eNy{HuPefkqkS3@jjNtM&#u{Jovo~>SXv*ey16a2(823DKac)hYp2Fm zSZ6$Jt+Gtn#kg*0n1>ctTXFmy!6R9eM#uTo3h&Qs{WYrdY z+b)ueTQScljo8NQO@d^C!lVF>V)zs|c+e`JE`YBsE zKjMR@HZFPbB$!;!|Ay1B{h36{As3i~xQ>DWE~EO z1%{CB5#t-noh#+3r%CjG2ojIAB42^opbzIrY)qn79twJX{ zmd+-x5kpNy#UNUvq?A6`qafll_Qb2t0>w^nmFO6@fpplz*Qu*VYL%F{kYeanuP`gt zrEw|6`AqTYkCNdH+hz%L&-Zu?zhnWzVb3#KJ9zxAKh7*N;PgD!7hI028r%U$#L}@# z)oed6md+9;CL>#N-zQ^P%svb`#QTuXAzrR=Pe~W8Sy4DWY~~bspI1N^gmMn;{sq`v zhhLVWsz80+wnzYG^kEC$(RE+FZ{!t$ZBq*I;yofnZ@|s68>1qbw}4!{BI6QN zqysm7fxHWtotQMm&}dDSv?yH;Fcot)OP^4=w63^DR9wxZw^p{|USD~d*~MIx zXR|L`6RV+-s<_|^Y!@XH>Bg9I)peGL1t%|BS1pcZIAlI?fFJ>xss!LbjytC2-bt|) z3Ei5X1#CQdD1aFP6do6VItCkC3_ApNYCikRbZ9&f7DC}9mRy}Zi0LlK|F5L zZ|p(-u(^TFo;HH1d0dBO_FMP{ylc$?tIBBBFJ#2RPtliwztV~@?Y-JQ=U0lHlr{!Q zT5sD$XU$oHDlSlzu2_Z4+yf1xuPipcp4*#Mo*acD2t7VQ)!xpB#Ec9?bxz@KXn2gz zh0d=Dre7W0^xRw~4ei$WTgSE4W(tJ|&VXqsh;*Hs;2wAM(PBuivtnZPw6AeezwZzz zG|*?!S5FMA+zi{Ks76w) zATD>W8m+4M2lhe#V72)BviM_w)g&wHx&7k2sWLJPaTq49@QK&;wjk2_mOt5; zgeNvVCED<-W$nbc19c6U4S15UIJGs9;UY`#6li=hY zbEL6eLU_6p=ez!|MQ#*uA7V+N9$8$9)>OJK>4)f=-uAt);khV}C&+DHYo_cGk{T@F zVK23%abbk-gCWgg7ARM=26cudJsF#&E0%xBl8Hd>J2e{Swk|$HVYwDq-h17pb-yH^ z-7C*#zN~!a*30&EsivGXp||H5IY2Mxr2*K>=Ur^<+q2@rlVy{7{NIEwZJ?HicZ4mA z+pJjRc;&o2(}0m#^-qCy?2pI>uZTvkWG7g?3=Ae2jf1A@#AlwrufAcAVetu9d+mPLBb&yaHg zo@vqQj7m{HK}fH)jj3Y=Kg4H#OcHmjFgy!~C2fi{`B3otyQbXjRbAecXg>Sp33FDP zT-XIM+ut=R|6L-zLV{|WxP)r0_1!}P?H_#)jQZv!@AOn&Sm9T<(?}JdcB5S@fZ5<` z`A~MUwrZe-&%=mmnsNzpW&YJf2=5kat4Mf}>jd zY~!F%5Yojo_2K&}X;^IE zEbNrmk_>ZmSAlQmL~l({EwpoCN@{>LOXJtsP&;eRaPitO3%>UwR;&Ya>@=AKtn2Vm zzwyOa(!=7zLj30}Bz_M+kugM-8<8zpR+Be2$)$-gaw!VV_93NPx@%wv!uOUEr%IIF zMwcj3C*VU8jap_3xLeTRxJSkv7S_S`p5eA7CW?F@vgMN!t8X?t5p3MK&)RBWDTA6d zY!K|dXvXMQs`-%8so&Mg=S}1By}L~L1G+-RmGf0FkG8b#_SXzcDUC5@K)Y%#wwW;8 zMJ9vSO=t~CwjG-ZYFU>3AA+9LVd?A50=>%N(46X$-)-+V4_$Xw%puot9AdqdqK*D?rl5sr?<^z#Xo zT&UPRKQnH9-?{Or8umS>FT+iXO1*Mp!vhy>+gxDp^u&*xs>7wNPr~?6(qY~2zBMHz z^4-gLqYmv{u-a^(yY{By%HP-T{F_uau)IIeBj52#p&NV;igociNVjV9J*Ii%5YL$d z1R>EKw~u&8dMD8m<3^HGJA!6LbGE+~5{LRu31cJ}b|nfTdXZXeCJmH=AfDVDH6jmc zI&X=RuMVh%6nbXITT0yK-)e_@rvxc!(m!gYK5u06u@l66-(7^AiF5{71$AhownjuV zRd&**tvJu`)tWwpZmlO*TZ?wjfPsr0K;!_7yJw%ASNHihip7t?lRVw4E6q3Th4lT$ z`nlsmC5I>>1!3uc6p|LD9_hnJB<7E0Sf3!@s z(@7i+Mf`Jd5MenF+{Y=1m@atn7NzYUtujrzwK*`dfFSEWlukwfJlB_yI6HUTXP8%9 zcvE?#pEr66{HmJ1qFq)QUsKi%{q*iNen`yMEM@~nsH$cCGuNx zhVHzC7$g5;EyEhlWqIp%H|@8z-8U7s-j6lKY17$d@i7~->8kdET#dQ$B%5n|d>j>T z*d5m;Z7Pf$R!dRwUPwlWrR_=!ifb9($D9-O?v}xK!-rY4>Jvsur5^8Nl}(p>LpFgH z2LxoitAsa*X}`eU z&?taZu0I-0Adibasi&JM{TfeZ%aI)0yW1SS9K9C>f}wK9(^`2gWiE!~uEY=Pv*N5D zwcV6!-fg%|5ZB%tB5*_fWTW1akK@CU_G1`Vgk*{|4zC-_x}I>r(N_Bja?e42BlGpw z6NVq~qd`MFzYh!X(FmVqvz2u|tceNFtuTA;$n4E17HjSfv9Mao;bE0#HEd>$J|sDW z$9NSIi~hc3{p}<2A?@qNoHP8I%7BixWtFZ)RpKFSHH#l)A7;>vFLd8SZg8H4XBaIa(FOI$Tf!lZPPyqSj4N3Qfdp0 zE@GO#HE@O}(29$sQx8~xNGudIP=;gmsn0Cg+|J)J-5yr#-F20QoTNaY-(g}3|*{8a~D#mGaNPz5hf-q7aJZuN0T zs}Ur=FnO$IF?%RnLx8ubCVKiWz2IMZ!oP0+Zs7>@Ej6OWC@;Dd-v6?&*l{8>2@O>q zbUG>j5F&+*P>G$n+gl@D5JI}ta_<&CC3jw2Yh1rhYq7I#dJ;cWW)S3QniMMiAX)kD zbSzRzA~#;69!E%mc=ERe&pmic&II!7Q&o@KBTDWbWUe+cckH9W+v7 zmhL1jPhQarbP!`GQw-^U9+yB5UgTo5SEK#lEZj46zJiusuLNF?vkp8#*EfjCdXb78 zm;`d+l+_>sF)>+3)*qWL?_vGH9@iEp>rT0D93YeCn~#GjnPX{Pw&ySFlH+r5k}Po* z1w*NqCpJ}#akVTJP9;ZV+G=ApO}Z@4RJFY%7l^56j!jc18lu|FcnU0S_1YBJ#piwf zpoXmEG}_!?r@Dkf!Xb*cTuVdaD@*n6WNO|{`7Vz2mdg{v#ipU3!|rZMuI~kW=8jNl zP}MjkmWEk&EaKLN{Q3+X%IU^ygC_VVnP_J(FPvUN9B+kudt+K8`9-b3{}aJQR`nCY zT&f>9+Z_gdrWzcVmQgoSNdxOKTtxOfyvlpqp-YO2r952C)(hy|=XQHT9^B!DW7c?S z{b**Q(Z8&W>(@2zaj7oSyGGXZr169Urq(>e@CC|zh{=KU!dY&<_IoBlva0$wpF}TC znO`>|7$U08lHop%Dw4Yt)ievuIb6@;J<5&<1eOBLr)9-+2OEBHjF;jfq}>j>Xv$+z zIxbHLW23RVnD+ifn5WgbVdR8#sr6J1CL)cOqE56&Qc+HIFLd0ED)JKoIB1MBpS#H` ztU%OA!Wq5-&1y}_-Kk57L)}V%6X%Q z0t%q*@~cG{WM)&9cye2>9ZqGL+M7E3vNG1B#xkAIXb(X{x!eQzcx`&EYN0~v&oB@5 z1rmx1E~ofS{OF9njgt#GSo~sY7h0cfs(N9nDtFb|!6jw{&~#`K%o|u3->-lChA}$( z1#P6>8#bAtak&_)pjfrV4&|4)4hJ(#Pl58~W}RF5-Ky&B?)-?mfi#KMe{62BVw+t!Qw&-qwUUrnoo%WN+I087PpF6+p*YxA@kIfiv7m}<9*G%@UCX7M z`V|Omn~kY(RPMqoW#6w?7ai5(W*_XghxMOwCXGC2yt>35n%C7oL#^_wA8g_k(jT$~D6nJk5i_^l zVh~?;1sqa$-kIwRKe>Lw+DZX28y>Q=dw>#T9bQz1qpm7Ah#A(-^_4%-ofa_poVrpw zM5Nt1wTTCp34GalSGMWY$s3p`9TaUA>vfM2TU(CKYUBMiK~+BjA9w@GaI0JKNFs}s zSzdfKKHIx4OQoH8i^7WQ%aE*(@^rub(Whc$PQD7W{aht(zJj}@ip{PC|Ihi&UG0Yw z4%hceQgDTzzaShBC=UA~c9X~Wq*T#b&nBbjLzGqOSsIJ~K_j|8spxIUUzD!@j*Yfh z>#?ErJMdTo(ElAZ-tw3%xeY+sJw|=8PW0nh?lmSy^LE6NBgxLCy}#af9e~}0(rW#D zaI<_mJ8jz}<=pY;dD&?$c;r)9k4r5PG(cSbalmKh>g~LPH@i>%D>Dbu3se5}8J^=+ zz`J+X_nepqZVxVM{UkV2bo^sh&Yz;@{@KKTKn6nV^aCTU;Nw!1r{?I~lHYp?ux2?; zecB(mX=ile&>|ZA&y)Xr3IBs7K~_W0n~9ZMRCyeV+2#0OXrLCdM-$eb)AwA7UKyo+ zoYyNe#pzMio>YjMD9Mx5y_$II52}DbIx8Az$afiy=Kh z?*K;)IXGG}$YU!a$`X>_ry}aC{dJ7}1@8=;;%#zT;F-#6uD78p#CRxDuXd^-KcRE$ z>W3W@3pOM5%KGRFdElK*D^;|Az?O)|Us_T|aLx)z^Hgd>mA4%2=W3}rjdxxm=f#`v z*YC0r&3>WkzTQybYg!&$A{OrDp{RSA@iCV(Msw)org$Nmn> z`g;%bY?y`YAx;C>97PIlj+6iY?S%rB{3vt!1mRDDP@R8q!1$vz)N>~8RRh+O8tyo{bAx8VzZ@ziOLv9mByba&P% zZi5{gvcB)4rPAfBt0ETGu~HjNqxn3A`epwjBFQ><2s5p?nDK_or2QGDz#QVWx2Gsk z;%(NI=|XcN&r}Bwl~sDPQV8(c}4wEuN6t;h8(Y)(KWVbJO_ zxwKKvc6Gbz<>Rhg4mGYqhY!u6IHP{5g&oW(nzLb{%eP@yLf+*uyqF5nSRwSXPwlA> zD_MALm82w~!5w$q)o8TV?n^OZI5CkaK6>RbagJe+%wdcgUR{k~P8Muvkd=zIlkC#k z0VeO(7aT#nKG4+67H8LhK&$uBRuIE82ju3uRaLt5&B7> zwEp&DMG=wFWqNn3^g$f*>rUw1o3=GaqREE|8p(lL5ACd?v`YK#d+IW?5X@^??q;=N zI&Xxkgchb$mb2Qa`8SMr)lUzrM@b2nq*01_|3C#ZUgHAQ8_ZC4P(hJL z;yKr`8u4oAtdY(CKzT`#ImH}w&_H!oowk&TQ~A-yuVc-CVs`|g)QtmJXuo^ix8jcH zGlxVu`zfWGR30f3Q@0O<%)E5qpN^{;m@9qVVmxwV$oaD|%I&ZwNA+rjSp5%_j>rOd zO5Ep}72W_~^^;ZjwHV!FP(q?yv{lPY$V9X8%A&kN(hW^u8AL`a+40k(&DRxapY2WU zo*|D%>2K13vGI$i(Wg6pt$d=*fjaY-r@!FX{3nHqd?Q8bxp(G2_WZU(SZZAz-ef5K zgn(WuZV9o+$Mut7L96C_lMJ#BEkTn}ACP16t4V`0naKg@0o4uX&~g5`!I7>((NOvYUylK??z>g?Lrd?LaBVYgSlZc<%y| zN$R^`qh`J9WVw6|jw6jL-rn>S2(7`5OU{CVgVwU^CtR)Xm!yGqTfJ=_NHcljn#&0* zE0NmFL+(Eb&Z9UnUF{7Vnn(c$M_f^@(__kQ2@$KRAw1|St7kkC^aFm7EHZqa*+F_7 z0y~tK`esnJJ?MsIrrlMbaat=!syBm>G>Y~g4#O`tVk}kgp5n7{^}e^-cQ@aNJr3#9 z8_+{)z|u}d_N@?}kMu(HDYJO>BOY{bQlpKr2^XVQNYhP|!YU@$MLe;!ViBx93=UOj zGq4x9jorYqqU1V)m$npLiafz@)S_~G-h9n}sQkjYy%ljS;6tu4w@FlYRkp{>hFgVk z_qrhsS3R!z#Tg%s>*n37e3d*cS{5n3mJkT-v{cRFe}W4n>RmVk!G@zHziDXJvNVP^ z)n@7nSLuFry@kL;-|5X{IVDUZNmI zt9u6)Xnbhcr?YBXgf!^<>MahH%o>!ael-cPitQmPi1CRsVWe^;YM{I(vV{H8wXcQC zn}{B;JYmb}GYDlm6|h`JJgnA}E}*U*c_0|$x(P@t^UK8auB|Haq#SzpnODu>0|HDl zL)(aKH>x;KmrOIuy+N+=^Bd!;xI<#+z|L~40GBl#i_e(UFj0wH>X5GamPu%#rJ!(pSbRcxx9Kgu+5S<(ioA!?udb+R#&vT@3iTuehDOyW3;Nn zabob&F_h3h0CGdLHMa-nt3{~9SbF7$@=(}hWh4v8NhABLwVR~2j5uC9m!qOsd>2Ij z#BuY$XKP*1DF-e_1s`5$98Qm02+u|=2r%;UT> zjYn~-&^@Q-Xk;^<2y(-hHop7IASqm|!&SV0)q2gHq&^v*S=y&2MTH?nom)Ym}-B_sb>~s%5`E zhlQi7@cTL%*F#3%NS(Jf7ifx0wKUnRDTf^B0|zR$wH0Vu0wlfcwgKw zdbRZSId_=%TIQ2wfca5l^xEpe+EOD4PuxVETdJ}0EB)@T7m@>8Mqf1Mx!!U$hAvPY zU=VVB_eX7vfMJYs&ToqHB~1&8ux-XK%u<@T|7cSJO;P0bC?9qx~<3toA-UqZh%NK0RL=^t_B@;|d%|(|DA56Z#{O0!wn5(Z^)S zAk&)1;(qME>y>_r*Nz-l@iV@CrDO1~i0gl{Z|TN&2WdYEJbw~g6%zLtUe?k;cBAvMr*oZY zeA0`ckYTmd!z~O8mc9m_c^YfAhxV1+qp*vVRf2u+O|R1`XE86)&oh1Z>w-Cosn4+Q zwun;zhkv+m&F>MA-*e%EwRIg@P2S~2PxYRVpU*xwN{jN)%t$BD=7&66#asa9${m)R zgYm&SCX<&gsw<)lyZ2od+vDF&)u;7!&uW-+L!MJ;3eGAxXKu2dq6wFpC1|U zl0PEN#irK=ojs=PK_KZT>y$$4Lm8FYJ#%k?55sn<`!fyV zxrr%oZ~o8{k2453g;DocB|o+q{gn7ttq4Upqw|rsl?5#5^aAs#UX^gdYd*UDB)DuaU169#-05wIc5Wr$!00u!7W7=H$&|N# zDAtURE>}BPFYl-HaXfZS)BMzsLLZtUDj7<&#g@qMgDavzM%wo#&u4Sg*GK0LU*Y=B zDNQ24Pq*Qpls%xQApf0hCZaI;1-cLz&1%>k2gg3PwAf$2jE4Y z2|IiVXJu_08efId>(tYK#^$^li9+foNSnkXA3U{R_eoc79lp)1jIGYPDtC3b(6PLd zpD~H+%6b_bSdc*hnk}<^)N^zUHCS{LH&>paM3a+@%oSNQ;uI^*dUr_7^w#+uDPYx7 z-V(CfZ&+Cc9G>yhc#E`s`vHwcF z*I*UJ(F->PY7d8RX)IIzY)-7v%`CQAJ_l38Bbjufrn$WeiIol4-z-&GkP{7N-^xYJ zGu)|YI{u6Ez}Fiozdb3#9tFxxqZQVyD)Hqf1IkBzMX~aFDEHM zxJb|r&}JBQ-7qQxn#Lo+}tAQX;*`f45|#>Z#k)6(7)1(A({l!&eyrMT&6SjYD+8blqa#qN<7ti!Dc6sfs`dfF z`@Dl60C~NrwH`65Ex7IVw!+O3gnm{+QGH4=vYgAii~g%2*&6V~1BqQA(dP$|0)i?G z-+W~D<$0H=pJHbbjrJUJ-@#NUZ{Ad|SeVwg!5UGcB?XszMmx@tM}r24_d&gz@tE`{ z93U0E(86B?g#YtRu2ZaJXpVWCo%(!K9l&bZ;u zVT;IVEKt2-5D+Rqe$(Ogh3!6a{>kp6cK$_%@2aeY`WqQt><&aVzg<;(TkUc{lgyG` zC;|$o{u?e4$dYB!9EI=Q(CiMxp3M&?Th`rcDASi>IX?ccgp>a)F#V^}|7{fePhIBE zCjK|KWfmGxLJ$8W*uB{ce~zb(%&V9~+y6r3YbGx}Hlel8#Y>-+R%Zl8W-P-S>-HAh znI;zPu7!T!ZO6QW_r!jr{3L+BZFzErAF62lBxqJx@<*?sT6?UQrd{=NEo^=8Y+rP=k|j{~BAUhkjp@1N!6zo~w(3as0$+x;Y% qW5#v;B#4s#`eREb2S2rt$#mrD*W|g?a%q3~{b?@}+S$l77 z$EI!H{Fulv3k!>k@SAZRj{EVOA1fcf0LaqfQsMv*5D90DRLG6EtBA{-ntCNc^dItB&?JQ5Z*COS4MItKb* z4*>!DyayZt1_A;G9RUsj{Xe{Y^a4uh3bPz6UlqI_+GOvx+qK zvn3Q@P$(NEI)AJI;KBZO8wx-G@b06C8kQtlK!HLXE-Fp>-zWcv??BncRVMm+47#~D z*<1s8=5a-M&J~UMD{EKX%Yv2Qzj~^k2Jl ztiG`Dd%l)QnE2-@OyiuJS^*Cf1%M!%WF?Px^0zh#WgcKP$>`7WA4LzF3FZ0;x>td%`h-wrY!`P#{BufrU?WmVpO!Q zIDXol;-PBLi@FmJL=V^ml94CToFG&Wn2k!E!V=986ohmSLK^QnF%O@T?RM>)sNh=B zYw46Ym>DXOhpKyk^W+CWKLdzLZfK=y0`qs(t!2R{ee~DGY0=O3gsB;}{EmB(KM6b$ zURRqb;4KQOKJ)1rBi2Z9?5?WCmhddQvE+v z>;LrEbPKOKJ^<4!AAlRNy$^t~ipmEdrFwt+@_UBB?FQr12jJSV_!tq-Y@7+Pbh2&W zp1EoXNgHJ9WOmhSfi*@;3Pf*_+CrPqmuAq7lS9=m5?Hb=fkw6@K%vF=P7lo9`BLVi z1wus8b{K6BMW59MOK4i*lqg{LF*d1J5u!%H=a7?Uv zx|T42e>BTxp5`GSC`!zx_=@bLpsL{H% z9OcNN$sP5ueDZC&%u%j8>4Ul%qB+_7Q99PvYqbg`<(Nte zYj{dV+)d;p)(wR}^>=Iap)}^I%op-U)U)LrY$W%0^=9Od!tZ(^cggXR%L_)DYe7T@ zoIxii>MT3}gPz#Xly#tUvhK9uVB;1mVXt(4ZZ?j+E#MFWan# zs+9@*J>ewt61@CdS93q`Mv}@Bg64*nc=qf#e)H0Tv{yVGrJhU*7zk+%I@{w3AV+*Uq}*TvpwlH0&S=Eb zW1d$8qqo>pZY3cqJd|ofuY=1SjjTaWTL^hjJZXe-z&PhxQ)wzp+NE)Ac!3qJ8#5gz zm0c*vJniVKU0r9_BwNNLm3C(F3P?;KJn}Ke0hmxE2-BU9Uz2zQU!l4R9||iYKhLC^@`*Q z-VGW1h9?H@k^{yM%_0DwZuTyeNaQ}@j}BXoc{%}2de<}QRc1JirWnVyY)Z?HarXhG znSyW_6277GzQJI-;ip%tx!sPcT3N%UAc<68enmSL7W4gAo=c+MMSj{WHg&XR-?$yX zy6qWGHtNrL9p;O7k}QUql&{8n4W-*QWoeh`^+*;r5Xl&You~EC_yHgv03r;n4}hap zr<8@2%$M)_8wgpCI`~p7B%Sr12G@LUMZUOSUx^gB*S|Ly zE5M(AN&2aMjpt#50WR(`=nss`FQ%Y6IzRHY++4E1KjD7Cmb^tdej0Yr_)^%JFv%rG3G5rFDo8dx(W2hPYJn8j?4ZH z>-$^TY9e)vtIjsQxC4etaY5%h={yF(Q8y(n0DFw`;>Zw8(tP6#tU!p;c0cp*bkb05)&E+X<-#$pdk3=7>i2J5Le>LSqJbtwDBtsx?U71u!C47P z2Emv%TRD)SdF$A_D|VlTy`GXzoHNgx=k3BHwZ!^{IM3d(pj0+Y*H!Yyv+dcpoy_L* zp#-g;Y4M%?&5+c?s4!Ro4h&v{Q^rFfaACdmbs4dRGT&!*MGdQJ^)w2gx?x*!lS?s z$7~LXCF9QA)QGEYC4Fq^slp}6(g`>HIVv)uNfz2e-!$mwHtjf8)NnVsH`%vIr}Vml z!P+&~t;@9x%_SEFiia$Yk)Ns?&RyU%jf4kGM~!+wlE>RaPxT{8_h;&=W@#UH^jVI(6)`oy*1l_!7G%9|4Zb(Ru7YxCQ2 z4$fSuXKWltREtkE6tx_eWut5|1rteW)0Xm7d5h9*1hKu~1%SQ4!yM$u{yws-Q6ZIU zk#RN#0D|Im$&P=~Q87Weu`sm?G#$FX@ zaxhxAV%YqgpWH8;#Xv8I;pkyZK@3RtAOo@i^}i+SlDuS(^|g-zteqp#u$T-zb_{(i zU3AvDf~!ZI6UG?A)2IMMySR0YMjB?)w#yqa>me*wQ#C)km^0aGsd5=s(o^n9crznT zRC@3E7L$&5*^@w%s1p#KwN>WKqeZP238}#?n1bk2v0DY;A*$6`7n}(|!Ht^@QW0H= zLB2A&eH%Hlnx|yjb)v+r9%|W;DAbBb8cve1PTWuWWBtAu4P{j{V!24HpWS$xJgeJI z+tu#e$DSU!>lWix=F;Bxe<4+E#wQZ!c0N2M-7`pLorc4Khgx!w|uW8mqLaK zdS&`$oLLl9tI>E??Q;hb2BWZ5;aqJ55_$8o_zl_{x7))SDF&nsR0(1^N$i}qX=eX8 z);q8n4VVcH?Yw;qQ-=kaOT`QL=}}{eOups;acz4I!y|tX;`Zj5WbQmvC@R?Gy~D~P zE0=Fmt~gZKs8VTI+aRiiGI+8E8n)Jev9`L6va}^bw?TxNHHsGzC;$5f{R0x8m8svH zvG&|sq45R$gR0SMTJ}aOfqcEnt*(35;65<=8aWmoeI-BBjnat6lTm&%@Zt(D;JEPW zz|czll6K{yk_Kd>wDWY1DDz`MlcmKO9fGDj>a7LQGjkJKP3W_98b-ENOn(u3Ny4&e zm@A1p(Th23%L^`wzO5>!SFFr40UXM-EF$m*iM&HORPiHqW z7_n}NtTqQqVx2>{uxS#E0zMV{YAf%?OF{CrU{TaaF~ z4WD@8bl*asud&6wn!eBV!lGTg$pIe?|KdQY!j5msV%Qn7= z>xq*988iulP}|(|7+>IR_e&)~Mr(T~j?3Q>WE7Q>ier4Tmv7puMt?VRTIuVz8#_!j z?Co75fx%sEjpnU2p=SQGFlJ-zg3&}2+uF>o(hUna5<0bK3R)Po1!&^zQ3q=aAYl6# z8!8PCEV>ROd&_C#G!<3$mJ|j*I)wCba;e4ngiy$Hq)6jXhi9n`OM+33Y1M|egq|1u zk~l6O__T{ebgaRgh&}GSM*po{dq!*1o`phpn!zc{agS=wkGaOkWq>6*PQJ@WH66`t zeXZ%IY=^hmN<0oQpW4QnbJa!=GJe0*ck|MCX_~L3?(~#9_Nl}y9|~O5y3yclRVuo! zWRw2)`kJFq=EU@vwYpxO_Vx6@9yWc&U1aC$!SX4VGDfPFDV`w^TmI#J!gp zdwCsxTF50T6?GwI4u2Ojn7!7rPijpif8XZ=;E7j%H-!()C#2GcxPdH@)~bf>r^3vO zxoO{`RXn2F@Jpdw?KKMecDKEVAm1b%p&CDQRnYEbA+bEarWH~`1cfXq2$H2e&q!oa z=({LkfhiIvXO(h)@`t-x zm;;~knEuz(;1mUwZV?mFv$wG-8C>V+3}b}gu)1M*?=}eHJ}O7z?8(C;$`3#+ivWYm zC8rx{w6E%FY-JOQ0)7&Gy>M||$=q6Ia!C^n1&rjMcR$c3hlR(^Kbrf-iBZN=Eck(y zP^Q?pMxsKQVMDj(NB4^HOI7{+@|HaVZH-o~YnjRlLp9sD_^xpU1;7{AOc_z?a-9I7 zgD$%7`CXg(6U3AIjzP`W^{rhCoKOHR92BeD<|{ys+ED70`jTuT>(Jhw8&^G=K{VY` zqfLNyBuq%oZqcnYwgmtcv--4;%FJw11&E68NXacLNkGpOo|s_TKL>fu_ucNuJxAdy zxc7HH-LWexBZV(F#H>G=li7I^Y?vtcaPBE!7?@A1X>91e6^^54qX+UvFU5FeZ8D36 zHAUgXlOi5DW9HObM}8k(FIQt|Gj)G!3WML+lZz%)PArVu-$kl|^j;axnqba5l zq)tL<^6K_pGOV`J8V*B1CY|8|WdN)(H6%zaR_rVjZ=iX_S$`YtUedasXYbmoU%{lA zU!+`xl)2dh0;v-8ykcEUJogJ~VBSRkxGzo0#cu}e;7SOQk4%(XMT!X`UE=fj?M)n(s z$wcBiFxHrtTHuG0jd2o4zbD^Mww~5;60dE;SalPplp0M+-qg&tji&rEL?I-lw8y!Y zv7d}k^uvaSdui&%0R7mN{%XvPlhQc6HNDexBXIG8(cY;M;0XW_4xA=GV%4k`8M@f~ z{K0i?>p0IXOP5`OztVMAl+VCEFiGDWCbai#ArGVwfC2C$Z;9rZ>X}9yNXQ62kxiVAa44|R`PNovCvQPZkdeWD5a~{Oy3#q8a+n8%hn1dh&q@*iaW6 zXvv?+b9varnSg89eEDf=38TbK_zq$LTG-8 zt+Hh(7>nFHb>gV9e^h4wOEC*v>h{P1&5aN1=IsB`5olarE)2=(@< zv_JWyvRE7QdE%y(2`6Ig-!N&}Mdx(1HBQ=Juv+rsDVM)8f*umn_$Zy==MAa>HHY$85kW=tNqqnU zAZte2ex%%x&4lp}nJ8t_Ml+(46DbH0{-S-J*K3`OXApi(Aaamv?E)E-=Ajblz42WP z=C`xXd5<_-K^_NeONH93}eQnwWGUy*&nm|_dvyt#G849lrnC+2fXeJ+!*WYJ<^ z+z`L7|7D$9$I5Qu&>QOrcqHLK*mwuz=F##6;dPj}v1(VPw6$agg)7CQZWGwG=RqzA zBf}5_q^^}A;hM4dpqTSoK|#3sN3830YURc(x9yVoMki`yen<6Z(X$3LwdTdS7n2=G z^u8{d4y_|Ss1b)o7`ugsZFxwr!506&`2)Jl93r>~pneP24Yw<2n!4`Uk6gXJJpeS#$D7xQ;$}3K z=Eq>jjEqL^D>2*hP+4LN%IwMg?VDbc8%#2GC?WdEuFS+8z6s#Un6zkVa4V@K1C)fW zgsKLDegMa3C!OFqC0;hX`=izVVjVCJUZK18*tHS14&dgsFQXX5x-L$zwr$|373Wl> zo%6(#K*}88E6jNY!E^}-xaF$|3tiwz&d%{ZNer|7Pg16G!t0YbQ|mY%UWQu~ZV*Rf zKzvk)`6*@yqNNm|-WpI8=vOQ3RU}BW`R^e-7+YWO@N2$L+%S3Q!M?T zcA)JYhAokVd`8_%p z;jxNP*RU!70dAFHtHVR|I{?1vKQeeEx{mP%;1Yd$1$rAMOlJl7RR)spsi70qc8wtzB((O`J%TS|$nxtjuVr+f)m_gL$r8a%=lG(h_N=$#I~XGWL=s8$phZJc5#$z#360_^xyp5E!_HGF%ZOM;7#<4h@?>qRok#v;=FenK z`=f=@+WsT4N9>Efcqm6`a)NqB$m16In$+&--NdWIeV+7{jYP-J$fzPIleuyjktlMm zHR%K`@Zfw4HUHgQ3SBl42rXc5^cSliPBZvU>|Z6m%1!{V*s$6<@i4x%iE2GU;Ne%o=3(dzqH5$s=)C4iz9^vv*Di04|r z$gv|@je%w25^QdO!t1N^>^LvK1`W>IO!9q|lWlGICAhywpenEW<&7pXV*hMyU*r7w z3(RD}JmzTS__j~pj!5;yeKkcLuvB_~8_7|H^HjL=p=&W+x)IU#`#EtqxV+~u@mQQ} zIG}o4RqO(T0cgf{V#eAMUK(nLQkC z868^~ZWm+>>Y&y6g1${gdz3T;L}Ga=Nzk2^02?|5%!`l?m!Si>w$)X?sHF@0FTz(g zGD_OCAuU)GJxV{y&4L078uMV?pUbUea*?AwA%L|j&&nvDiE z3C`AxLEcf_Kq+*&RV_x04m7`g0HB-LaQjRmNeN1Z+lwUspLD!i^8YUk!ojeZW%FF^#0SHZ~@&0vx4C72x& zRHj8KBL($ckQoHB>XMi3m2GhNNMSyG#or^G6kdEY_%0T_d-KKoZ3KT0@-cGr5(_)- zusg=Kp&X)nEvX6p8d{Q2l2?MbmS;JPEQD9>EgRR4XqSo7$d4Ki0v)arktp+&FEk}S z;P{A7RbI|!r9{HK-b|sc!zIwBkU7Bm&ODQCv@tynM(#Bh<8f69^dY#IoNgnKm#{*> zO+Ca_W<$#pvu}Y5ZjeWHFXM0*x?Cc{STkyYBb}mMj(1;ZGB_-KLDse}=O{Ofrs0c% zP2-uoC3)Hn`H#m%XBnBeU)mKA(!!&}fPfoh1cxhDFH3a)uewT^9=)#REqNR)3yf+V zd*>ihd&*+Cu_rPb{Tq&*PFrd$^Ao6US~YLPW=JYb80m^Q#P8UU)T58jCxX*WXa`I0NE0n2@Nz`w{@5$TMVI4QYi+(cGbW)wn%1NUlt! z3ZO3EZ|NrdkdEJ)8AXWY`u4U=4$BcXO~+a%Y$RdRN>H1X*2|^UKvwtB6Nk7ZdBg8E zWmWfd`#IWq*xSWTCa646NIfSs7%2G$0^jmB`z{GciZlkT4Uk23;!Y)w{%rMc(PikL zRkfF{HgAxNh*Sb-ENq5|(Q4cF^z0B6mh#4He)%EAkyW{6+KvC=<2V^s8=k z_|qb64qFkWUXo5W+<~EJ#euxVqITMN*M&+K_Z)NlSYdpkK~L~B1Zzo!f zYBKXrEu%|tl_^ilqcSZUn$W_tB*CDt(rVC9qQ@fA_%UIt;C=U~Hdalu4XYGwzU z&MWP&5!Xb;cFB9Ork)k$FT&_oMz`Q6OR-+!1Iy1h^?urLMCqMkp0DLb4d11tcCk>+ zvyEBq6+|=sth}i!JUZ&FOwc*vJs6O>nJ?j2`v9m4&d|Vu_2cV6-J;^l^ZFYRMs#B- zIO5rITPrfyiZ#DUb@bXK6~oB_$%_$-d%24I<@^N=yi6FR6KqT z@{}d`7HgRj7>zf!Di!Kc2x(D_%9h&>00+bFT9kiE`z&b*Z}KR`c2v{wFkdfuhS&m z&`9C97Vcc%my@!k0U{$6H$E-}BYEY!nC}&C6r({*(3?J;y}*{A0sJE_uLO={5)e~! zsCavuNkx)Yl~+}@L7s={u z$$IkS0MxU=9;-X_C@(*C)z}zEPf;B-yA)l@>R2+t4CZ;4vq(hWW4TiC|UlTY?YLD@^X7-~o&fuw+$WrfO z71GQ`AM^Oc%s!t#Jl#B6rDinhXf1P)%(8eJ@kAGb_Ky$mRQIBxSRdg(9<@iho;;{} z26+aN{^}>*!igr-k*p&dF>WEySrtZJw~!H{B|omqPH^kW_$k?TD0B}d`OH3G9wQ|A z6#z<%VgM1@M3h;}rF|*XzWdIUxk|C0IwaD(^2H4svs4k!GNx3^xjBAaNReXkz1U9s z8KAaExF-?r<>z@~SXh&=NtW!-HFeWygiCvMX8+o}u;5olAd!7;_#618uyR#RA9Nei zr7!G?SW;#5>Rf?reMRJCX^Vcu23S4~wk4$SN<>-Fuc_FiWxI|TXgUD;$dr9mt3(^x zTzs!Pe=Qk#+rpOfwp7(a?)rXqeC?I`fP(wGb!oJIVz7ATiotbFZg~SlYK=EDyP~izDI-DN5xBxpqza2L{=2NcS-StLA z2GxuAP&lEk_?VLrqnGzXVb_pHQ0LQnB_pa0rqK?U-M?BLkSq!4-&(o43!Z} zjmy2zoppLxF!t`8R;*rYvKf&M9$&}!-}PHYA{O}i>vusek@5Hd#E2UFmhBQIE8fhq zF0Q_QXJxfm7H+Sdr&*6)wr1UY}uw&QwW8cm%bC{)4h6r+Pv zgNpR5>VJjcJa);lM6kgG#tNaK0Bx@Y1_%Bm4^MIoFrmG;QSv`}&Jc=2!4!*k_ z)v;j4Zvpv@GBMy@aZqhAt+q#3;BO!*3;*Bkm|`wI19sSpC1Z|lB6l;jii@;hT?=%b zb7~5zMG49mQn(6GBj*xsw77ED0HnenvAM5>UU#o*PsXuoM+db3k!?ZaOIovece7Xa0$IZ}Yhg-~kb0XGuH1BPgg~3@qFacFk8Z#zQ3gkkf|6ZW zpbwtYjSBGJ{eH2P4*-JSu8YW@P}dJYa(hH>o8R3BVB>qh>yn@P1D6xL?KJAM z?2{YMgb67IAORmygX({w99CXgZar*mEw8=Xmw2tYHa&E2oOcyGP>2{|H1k9={H_`w zomeOq)l{39D@3Zuc67W0Yl3I_inP*YpCn8sdLA4PG{0s zD9Y}@0+n|!UQ@U4ta@uDFel$AM$93ZvogbI@q>X1?Z1Au@Y z$}U5QZikG`CPMd^0ReT0>2`?zQ%!rthQhg>yXTwd5}aX+XC8^WajLl`z~q>1(~@oy z8K%Qp=9T4^B^sFIO}MJnvkF_y8trMi+_k&)xVB~AXu)9GKs?NG0}Lm07_F-L^`LfX zEhMi{KSJ6%o~1g;bm5y_43@VR5Q4w&D}j#weu9zKM!d%Ng7jqzinPia1S{9JbQ&{p zj-e|wNYmt7&Oo-v@GcvUl#G&ItP}lD2p(E%O57v>|NMqD;)uUQhBt0YS4&INLr)fU z&O>&!Pi+g2oq1Qd!pe|M%$`g;9diQ<8;v5SY9r@QMR0%6AK#}IAcr@>B&K2`cz*)| zI7jq3hu_tb-EqUR?53}K6uA2*IS_zi(Y7vCmqcl8a?R@#4MT$rxGH>8JX54X()>u) z)%s__Y8m2PELL0Bc3$UpoSMK?7ENTMPmK|c<=j_OxA&rRYbGu&)7XpGF_EJ^OnVfN zn+uq+5gb5t6d;R$^>cxp(227le1l4{1B+K<2SiS{C?7>i9b@SY^i?&KOdC$+?>XQ` z6&05=O0=aM1ZF3*qajEGh%7EBpp1ISCixMxx7OF!UiGKY<-O#Vx|i3pTY!3lW!B%D zM;wYbG14`0GLp(7X;-sM$^r#Jgqh4N!HjGJ3Xdd)2%Q0fSw^*4Mt*eCod}|G97j*v zWdw$%nIUVW!!6uPZm|QJn~ooV_MET}K0>zLc1>cIk9CP` zzx8ZzN6P}dqke@8eaC97BVjxRd2+`%u4|lltX)R4cmN*h4BK(0-mCW3tM(M8XN>>v zu4;>(Ds8W4X?)TN#{TWMyuA>T*sYh^(l$?nZmn~NJD)AjN4u60{mC8-MSIiP%Y%a@ z%#dC}-|d=&uArb*lOB7Ut$d@nM4TxE?mu4Xvh{f$E&aG*a({dcgjSxGGs?&tRrDUV z)^EC(bL?|5|5DXUoAU!&G>xYE37t*VG)=86RMk7SMxMn4j65#rq3HMvqReU{av}`N z?9utHVeaR@%xV>HiyY6lUC!aYA)N)LQ5^GPTY+iJw|t@b(v)x1Q#2_-?ULGJO$e8- z+j12b+&WTlxy0sEN&lv&C){8K4^1WS^){CW)b^2Id*J*Yf?}{k1iVhVa}JIJpRJlk zW*abn1=%n zx1lXbc&?uVpp5qPEb|g36}{HI?8aa9Jo>%0KD}?xr-de!efz#N!sO(lW@ut*FQq=S zG;ygWsph{=hRH6`>T3)1j`LQn_@@~)wsViOc{%19SsFKHkCj0a!!i z{Eq#0S@GhPS^{@avrHthc~tBA>h1Dp{aO_Z(uVL|PuI}g8szBw<(O`TlP^X45pwec zlM99^>(_kkNL$iRT&PTMlCmF{BZuGwvC$qCfii4jpL5tlckXcnb8WHq8E-zLj#55b zq&EK0|@*3fr5I>>`xH^~37;Jn>N=!l%FOUV7|ax(&`L z%;RRX(y}|n+HnqYWV<|bMAy0J$6?fU+ASVrgZ4|5V_@aeexvBw{}A+IygYD zXAhU){5q)IPpP#AzaBL0Ht^iaH1^4dor2_g2oIINm=oGug%qIm5Tzlz^0OUQzS}5JQ`>ZuMKx4vrEm4R?&Tr3!sHDF0AhGh?rwp`}kygi+{k z0l-PS%bFPG2p=k$N4P{|e{(*Ht%6|K`>~oYU}uw)XVf@Lv9(?^66**PmTi}rwNsSz z*7Jp4fBsVS>FylzRom9l73f5wl7LsiXl3W~tnD>TBl1Ht_(}T%0K~T+WP06Jy?bPo z#rmmR!ynr*t@oJ}pFX$j2L75X-2VBqiZ1hC;CQWfmqr|d{&Kvg_EG|(|8Pf|tAv-= zE`Nan^Iy1vkfwZ8EKJe64i>-xuffS4U9P=T5Si8;c60glb+a<;vpXrb=F|GUjll0z z+J{G+78C+@KjGBxUKf4&c!au_*0Zv!@kdq3Lrx;s*0+7twrimd=|bPO&uo z;GS2Z5qJ@zu6uoX$Gbl7rnSA_ubuZ7+jcQMnZDEv@N0a3I@|l({soRVWQyL}4f}77 z*9<)IPV66`Av^x!1AwK)@9eD>15yMqHJWo`!QP_6%#`KmlwH4{&*85_?}$M&{qfe- z>=_UTh>+G^>|=& z$yPqdvdU^;MtVwe^MnlFzGUeXsU#I|433ec&fL13WUM1i%4c-@3;VwHd?nGJ*RxD; zwv7CrDJUw>%RexF)c;?hM!l!^LBHk&=^PIKt~hId?oO}Zv}jw zvGj-B(*Nd!>7Tx3SS^F|eI|>bM%>yKV<;D5%=6W^c0bsVb6XC<>0YcRmE@xTN@%?F zt)BZO{QgR}ADbU;k`b!3Rt_0#D<-~F%fZmT;QnJ`hescgCYNFpkRqDo_AM@r{$5P7 zj=n@i=+UL(d|7q24e+~z(&`y6e6Nm(`AmJ~-JXHIHL5!wfTPuSUHx;o$c6HMw~AAj zt^g;v5LwUN_U4VaZC4%7SbkjVwLupep>PecrEvc@QX2+R7Zt1V@q?Gt1BBq)9zk8M zYpai>&eH#`apHJWb)xE-QNCT&ImghNvRk24;;}$N1m6^WlkN_D8J`Y- zh;731uQkH|PpcALmK9RR!QpRu6h6&nLC+(`TZNbfQ=pE1YxJp6@2Y@-x%J#$0O3B! zg|IDN+aC}C!O!Ksrm2wMx&~WldFr#2g!>7FglNbNe!qo1vANYRY*}=Qgb39W8nQzf z1&5UVn)QC)~w?ZtcNt8PemhzyxWZF*0eu(_7iafr!)=G02^L{3k2v zZ0DP6xeXtGvhk-_6lnA)>;Dt8!@46roWOBEEQ)69C-pLi`XC{--0*@o!pv&%5ttt@ z4WO;BkcvPBminLOEaC`v;Nsb%9ZpnU%_fep?dP8bvL>8rEUXJM&y_27`4wC|*4AGV zZ2+&h%#aH|fcy-`x4$i*o~%Xc*s5ROd_b4GuNcQ>*>_XOnfCC;dq_a9t{edp_}o!j zgYcx?2m1QwwZ$YJ6Z?`V|GmM7u0svOqiYXqBLtoQK4(+|3x;ojs&PwGL~kyy*inIO z4YB*B+@9V_&t4XZGq(UP0gC1>P5`-__OCfrSGQ)rHX5mNTb+5utX$Jm?UrzXy@X6% zcUpr{a;_!(#qqFG*b#fSnFcj8;r%PGb%BZLg!r9AX%;oCCOKpaEu@g{>jz*4HpeDV z--XaPWFQ!yMGW7vt%wcn~_xp5d)9LWpYH z$7CWb1zZqrpoO#4+lkU`~@(uE`49NFGt= z%~$Y~3iH^#k*F@!OGZ@PjUdJXP8upzlPub+MG(x%pW&s4qAR^SG#g#6BfJm=AO3heU_pfy&oucAb~7ajp#< z8hDi{=kwWSl9K;$-T%6q;eZDfk>D&o614AAnUgKPXizpl98M@^rx;UoGZGmDHEURn zfqt4DabPUUrekySi_!`v8AB;e+3-QNn}IA2KhD`Xzs}jB)9!`VAmwEJW_nC48fPp) z%P{HIW$_0I511vDphq>$yo-8sCU}B@M{?%Ynhm2X#5iz*39cC;VT0-QOkTvz|Hx9- zcNhP>Qt&hZM(RqUk8M(}k~Z)V2UVhsoXB3S#=<66+9k=ihJnqMMwY1 zDdLNKpV6s6ZGB+2HQ2A;v8@=D9Zf`%PZfbtKS!G7!VdQ-+T?#6|z}eLZ9%+->Khm z--+5k04O&*cYdNrl?Nj!9lRcwu^n1Zwk3C5>E{p~ zu^!?^oiEDcUvr zZ1x=37L;D-zX?2I=lR~}F22R+T!PmZ5|5LJyZ;yzj=WJT2LAyJ7&9(=B7|)A^L*eR zFCiL?h`DO)w1s5Kj?5zxP*n&0Z7|kybc3q4nIV##sQG>CFfCRlnoBVkg`$xx$_-<( zI%T06AU((Nu;?k5cfn8!r`5^X))yP}-BjX77O<~##RXyCEm*Lw3#n%6ImHTz#>Kt3=GM~r0`C@mHp3tC)Dd{d+9vRXcyu1gYjGG+wP@D9 zi0l|qxclv>5QT|Pa~N1m(#x958xxv%T~RHE5fo(uD+|sS?ea5Ek~^%G+pEz-K#U<~ zlvigAa~mc55Bs z$q|p7y45z`t%8R!RC7M5oCZSQxUOoUMvk2M^Lw{+ z#17`N^8iu%U^D5;AI;y<&+?pgr&hvY2a^&Tu>8t-uHHx(Lxaji?tcJ>9ZQY6%=wL;d|)ln#s-5wn0 ztCNvA=#6a^U}+d-m+-~x{>eafqERcij#R7!oaSt zuv?~M66;hA`-aRIEL&GFMO@dV)TDh?PTgNQCy|neO-Q`ns4%O~%Mo`^A#>G(EI^Y? zNp28k!vtIgKhDf?W!!S6g1KGZj#)arSlszU&5H(&#uf`lu&8QCo~dd?_7+fBtV!ud zj}@A|E+V29MyP?AJvc(m5?ZDrP{TlRVN=6qajlBn5ku|k ziPO#6^woW_2=~pH1P-=bAAq!SQFDS*LHFnFNe_JGG%GIPY7uLEf+@UI;=IYMV*U?S zgn;MpKk9;~sc#E+5`TKA-ka9;cYE%!K4~n8SLvgjo_+0i6a7kci9b9e*>hXzYYpZX zT6oFHTQdvIHIHdul@3z4sC{T;Q?+R?TAPZlSLQ`Lue&3nOOBLx=-hSSa;Na&aLD2y zrXd-On5;wcXdTc;eClwHNDdLn+Lz+3lS_{H5Sk6tY=K|@n8>6?Z&Zf^r!T2b$dlWP zs;)_354Wwxpd|KGkN6hxL_*0$CMB3Y0COYwHd}z`D=e=80@W$AfQf}IbtikbaQbvk zU96I{cY*oS#pqG@1ui5#Pfg}?CMTjK>8-P|qrB7vP#tNdWB@M+(4IVTRpYpHh}D2C z^k_AK-_*NzP3Z7fpC8JD*L3*e*6IOnUUU(h4zdt4OduC)m_`ZKJigu6^dG&WR3>gP z6{1|shfR>HxZM3b^sd`75e{NrhkKE8O7VjUDq3kH^F=~@o1zycQ^@q7U>lXj=&(mGQVF*+#TrW>G@7b;L3B+N zmm`Y$st$W}j@d=LI+C#u?=}30Vm+{b*w z$L<5abgWangDVHMP10Q(-F>Yp?ny!uIi)R_#&!$38ni(qXI9uk;dcffkMB*I`QHax;w3=7-)YhLD+)Fj{TMuS#%&0N|00K&{A#WgS4`13Dd-@d zsB6%aw5?VgByN}e1MokHdkd$yqHx=@k>E~%;0{3(AXww>?i$>!AvgrL;O_1&X_`iZ zyEg9b79cnwk9+T%dGF0kP1RJ*)cgadyXx$HYJY35^;>d`mg7GEzX0_i&r9n^qgfDfe}cPdbo6gx!a__Q=$a%v2rxggw}Mms{LT^*Gx2 zHwWY#g;6pDrm*ONJ}Bx-MhVf3&#RYXbxXDt+Kx-g=CyQ?4le2+pu$)c>OS1zyTzJG zlbv-GNhSFb>fuo;W*kMmQNZZsC_L1l;VcUn4)I&B?-xta;znPnPJ97?ZOMw>YNO9s4QNsR9 zq+j2u6?D~Gi=gK&%s8`*2mrJP>|(OONB%bF>EfhIvOn54Q_#{6Jp>VM=AD{Qn* z68nBdnvj4s%vVJwx7Rs7^dHJ0^U90OpZt!oje}KJ=Jvpq#Qo&p9gg|bmDD|OsB%o` z>D1>4v7J0PZWsyfZ><~rnnrFXFA!g83nCkyQBNp>V_Jl?L#^84iKT)zJBzheJr(Fa zyy2uiTbY<)F1Y{c3e$L@lTqC|6&Q{}wB2*4JluI$a2?WfhH(sgJT63^x3PYeqR~N& zCaMQi%%OZRkU0Hv>ZlN8zp(%vp^JI6ior1cjQ zd?L_uTlUEbCLL$<^2a8CQ{l_M4;+f|z$2}zb>~xQXGOc{HkB=SEt;@w9grM}sJbYr zdfZ5{9k3kbf=(Aw;NT$UZTWO*6Jj4WeTSrN$@eppaZ0*ChPn~SB1z0Kurg@o%vff} ziRWWAXKFlicjjp%rSFS`%`MsE^&YZUn7z-lpI6-^JCn;B`Ai7%C0n(n&_0mDRPf_@I|6_q2QyPCJvn%Ler%x?LKWy65_?asnSla0R*(qQlWzQ&VoygqMc#gSoAzYy7bm#RJui)fL_tYa}s6+lED zYpt$k&lowv=A-?yiQ<3!iZr4bYFW$5Wx6+ZbW_xdf?L!K#_H`6SCt`mG?qKq%DP}q z$2wOvJ^-&;hY-F}6H)b*^ch$RN{RK&)l6`erjjq{At6h+FvvEKw2jS^;g@9C{fsd^ zhUoGdu%Ma2Ubv0P+GR6l5Ml~WX&8yVH7OX1d*m^zF7s#Q*0RIWqg5LQGpT1kTcEG7 zV-}4$O*K`JJO{5%S_F#W$VP#Q(=rpp-O+z#dPy;4TCH%k=i z*d?mGN})&W^ztaOE};pj!G(1}G^N%V)4f-F+_s1pvV54sff6yvlQ47}$o|x9WRjVz zQ=jTuG;y@3!KM6fL*=Qtt{6*g#8tdcAG?NfV%(Pp@y2l1b|9hK8{*K`0Wkw*7|Qd7 zUBZf>f)P*&&*KmYTNfNnVQQ;#32=#W)W*CIW*jRM8?Tcx8~FWN{_XYjdsI|o)GxEH z)gn5{T>3pjb9t8n@S(Te%bv^rL>(ZEW$6odCv$*rZ~B^MWkC!|tU9}jEJJtnq!%=+ zGaa@6=!!GbMIadCs~N^M5g|BihLenB2!22S$Bf9CTt*+)K~eZ*ve-kxk3ZGzuP|@t zKY-C9C6cdOpGSJq<6Fcseg%_^zjoQ6RrV>3FWXqmX2J{~;sbplUGrSXYI1*J+@rK;ixhizc5_h9X#1AMg}!2{$=KliT< zQHo5`NjXCOK|R=u$Orxd!)((4?C(>UFUBAf!1%_ehf<12o&RFrIJO!9%eC^wEMFBQe=UDB zss`SKR+DB9W(@06!9LUdQODXEFt}0<_EK(=*np;-!tIT*Jt5l#i5Djq5j%y64MrOo z#95+--?@{Ybi+h&Puli>mJ9KA9{PVCoC)C~;NOqpC3e+t%P2K4GEk-#jv@MnM>ygV z@w|FCWP;6IfmHQp*^zB-HVG@&#Q_eW-%Wl9r(g#so{zW9dELts_UWywDxOZ zCv$`0hkk=`how`OCi}KR$!w3-HGG$>O&3moQVyQ*2UeC%I*@t_Qa2LBl3K4fG_9kd z4LMRb;q+cq0Ku(va4V3Z{j1n53e>zv8N)*NBx8gSZ~ee!gChpN^e=DYTG@8ZzNale zH*Ddw1@$^pd}q)=;!nfLmrJOv#0pQHoKB1G-@MD!cz75s#N2S#7jK8{cq-vQ>zPx; zk?QrNz}(u_s(Qx>o7OLoT7LuhDgN6b_oNmGygRw``O`>?ICMXq>Ab)fp(zo3XaS-(sg}ms?&{r_YOkDo-p3r0>)!3~=;&leWgA>1dqe(#$zs#Oy3THPz{Xbg z7J4_QvNT1>pJd#lQDB(w6Va8X4L>KxsaDq^^&jaUsh{a87d3lVK?5LaFqSQ4MRnpr zE1%u|ngGc*J9`CsJhQcILlAo=Pqgm4_AIh{!X>1}=}(?f8&A@!BlrtDIx@fjF2-nY zr7|87Gwbr1>vT4*G9~}8QSY6li`tSp8B0N!iUUGP`S41rahUWSYpvQ)?}-Ec%Q@1X z6GnFfJ1s(6YvqKFy6Ku=MtopfFX%IWE>(Zq$uE-LCyC^J7qSS7O}{@6>l^+DQ)Y>7 zX6VjCHm&3i?QE!C1m$~p;NW~Hux7lm`6N2LxkPz#ZUL%KUt)~epID8kfKYWM$cW9c zq6ss9P%xDCL{99$kkc(#e)2eAf@MFi^9Hth`!BB=9?7+-C`yx9iK~`>Aiv%*(l>s? z!0IDA_X-UeVVHmI=ZxJxN3NhtTbaS*#u4MgV^?;rBxCzd>myBT&Nd&wigI9WnYa;W z(#a3D@I>#ACcEWIS8C`dR!Em@So2zY%USPFqXM6f49H zPR?QupU7pTMUDuiR#LzkEknKqMW$n_JJZ3L;(8|s7K{$~=veo)6{hOeqE4`-wNG?$ z$Bu<&I(#AZZ?2r|~$`6X0C?vD>4_zQVC#pAG zYwD{<(8yh216VOHjTtX0uD-YuYiHmmq1xi(Zf8rX3^1nzxm9#zr?q*@Vk5>Ra=6IF zrXR59?8aNK%R>wbmh_-e>Y9%~i)??4Si&i@y}N%ekAsuyC?#bmGa_tf%R^##V-@^n zp7&FZ4T_4)L7`)wXAlV9TSCvyL0#KY3Ret!`b5&#u*!W{O6;Gt88eyFu}sJ>JG8g1 zPFJfgpg$+Rx+LL0)9Ivk zi)|m{n@IR0qGR83&3jylbb9Tn)J~m@HFm-jx%ksf!ou}xIUCVqCl?*H4e(BBPZ|i1 zw@w)P-6v5&1N46H!;?0TQPo?j{yft>?drIfbVNd3>q@YEWvsGP?^2H^PjKX%|+pRKWRnJx$KrW5w z0iHUXT0mq9S?r5YERF0-??;4OXvdm0DfBjq2gCK??+{_CmlGY+1&`{TPns^xbU9KJz_&x@2$svzSf2a4+{=4#IRnAB3a+x0$7W^07JU_F(a?L6P z5=Ty?o>ELqZQH)Q-^n=Xh5Peu9HomvzGn_A@!P=+#dF3owde2WF&^krzq`V>ySR7_C)xDCu z?YqI+fA~pP5h=H`$|8JkV9i=VDwMjv`AprLVux(M(+j>GnphpZ`)w&$R%HAG<|8-| zQ8$E9t%1y}+)_R|hYlZidX9F|$yu;A$(=pUdy=?7o=e9+tI8lyT{5eOK0a~B-iY0Nc^80u+T>CA?Kssc(gwe4h zgZ_f02Av!rNRBvR!wQ*8eF8eQ6e?n_-OnBLXfGe9-$~cb>5wlmsNqRl7{{E_^u~E{ zuu8`@lFiR#%Ed5Q%-kU+!%d_X%jJPd2Cn##tf!RK5yfw#8V;XFyFXQ0B&4lUQ`O{R z(mC%mV-UbCh}yu*bz=fU|Ga4-4yY`-1K=^!rX2@BD~QB#4)PX1#Zpeto?VD3n?B$V zH6@JB7}kgyOd5|~wN=+ky1BT2ze?6QYWWLQJ_UdHnwko?Lm|v=DAER~pg%*~@oi#? zb-C3B$2l%xMn2!VtH?1rC_a&HN2#18Rr^Qfe<8V3{`cGHV(!n-8(56Mg4~>{EzvI8C8C+s5CGmUw$|beQxeM5uai6Og~prvQ4c- zNn13%AQMyPK~)}=Bb|Pjch{&p(D45hHY1!)6!mhijjYg&vF5j6;D0-&!I}BP$gxsZ zoC1Uh%RBzx8Mi+zRVB90yJW%`s72 zzJLkkm_Mp(E~AmE32z0wpsj&!;TWv+Nxf)DgWfedd7o4X6nrtk`|kZ%8F`|#+_L%& zn5Q(PsYy2!r<#`HQG%ET4b5NuN+B%xhRnW2OEMZq%I58*3)&vI+8>r`CY4^KunusZ zOU3P&G~h*4G{qe7XR9otm5GB9hJ7!oMYW+fc^yS+a(=IWqgI59~wH4Ics6rihbH6$dN4+^X%+&Lieiv69L^YB8DiUBpeQ_H{EXO zUoF>9@7fI@d-syOMhd6)S$?%tfu4N90- z2nP42Y`QCPj@h|T#k#4J%BLZ9y;n)Vp72zC7R{qiWzHb!%LSl@&?PKHjR;pWs#xi6 zs0tS2Uu!SttLC?D)Z0WewmPSsBv9C*bhv?B{C+`kAi zcgYTHc)^Ywqu<8GVs@7FxK}`jr{k_K7adWV6Jd@{2zD$ni=U^xAw~v*{{T9Ub`F)K zZ?21Y;qP`TB=;Kcb6wz^W|8`pGb1^23{YkZh7W~17DRSN%vh1&*JJ|=DkjSz6!ww{ z2tj1G&G@yaPg)U_s{HYYV^j#XK{mO(xHg>B+AH52pB{Z!(*-9j*U2aaaf~i2aaSz^ zck|C#c~-ph^O-jw0d87MzTX70!cSJw4)T1Fd3`v+Su$7uTd z!cDt%AIsN@@26$qp?O>PL{4&ysZUqUY8KH|1h}pdCY7@MRthlU0_3ViZ7*p)3|rkOyMx3 z3UQ=puidYjm5GBS366Y07nI5~3U-GiIIgr~LK(p#ZDP-gAoyY7E}r(rMJ6t-7UqfCD&{nm=%Z=lBT+eEytmS|M+1c za3)Y8a0x$&AHT!eFI99%gY)AWUhZhMq*j66k2^V?m{Za0!tf9VGT{F2Vh9 zZ_bXh7lY6w8rOTcOR<*B-6JdXN4iTiJ}#Y^Nq_%9YMREvS|8_+XI_I)9kQgdbOsAw z3tiYgQ|Ei4k}ohLPf5DxIggT(+yqR~3n+i?60p{^>OKhG$$9QZ3xIUQi(7WjVK0~5 zkiF?{$$LdRClJa4wysy3n%~YKVnS(_kjxxU@p$NZ(#HaNJ)r6Th!_^Q(Q=bGkc!G6 z#0QqWEAw%ZMopH^prw+`&WMcSjeJ5#Ak2?ASj<5?*&iHX;wTXyAFii9AWaxMgXXa~ zF6783?4Z1A(ZvRS7v(Mh0b0ywD}>YGw^0y7MjYKlaEV`zJu1;VIbr9jd)>in_72+m z@#KGgyMuYcgW=`q=z#I<&( z&55>>Nu$`$Ri{g_Ahd%|9LeNN60wRXDF1;p2#64c={7sdSWffOCrG{_w3jb9o|H{x;7f8oq4ut`==%vHPHI)7Py&s)A!78x%> zKAc4Ap0;Tvflgwe+_a;)8YwJPEk_DCH6b~|b}_F!Gm}Z}xgjMx%+#X7!=?|Qtn*G$ zD0!@1qYj;lTqEYW)h}Y+*u_jJn>I~r2hd9-%zj5zqtKM=|AP5-T#U;%5Wu?!KuBn4 zYM^iXwkk^{RkNeem`OLjFBR~%0b;_QS1z9NZks&yzmgmM>3ZWT;hx`mm^ZqRrnFM(wj$rZDx-aPN zv!@(5t2Ss>*6+*Pi0TYr_*=PN54GIw;Bsx>xgL8TWMbOHSH4UsqLQV^4-w#l81rJR04ZBcOSXBGmqFH)RAD#;q(C|he zap1s(@J4ags(KXm+|Rv1J~{pGM`P}FI7f()RQy~|M~{;RJjj>-0TiciS=-bNRVc{R zx=^nJQ5J()cxLTwNvJ&Ku;L0%@^k+IW^4{yC$ahAg=ke^nbB2id{x;x@#1n1#e zSje!I6h{yN%ghxM?%bmd6w<8|$|MPoC;E;mmgOIyA5zS`rg;^>U8HC+_;^yOaA7Vz zDE-@7tDI;_pDmiztA2-4sJCb(6Ku3AV^mqnfn)%wa2}0;rIZpTQV*saIiyxEkHw`( zgWa{=qRTvSd}727NtLOj5mh;A;few2a1D%fu8dxjk1QG;2Q4|leU?pY3_j788NyT? zE8@OFhXQfW!D8C;hil4RD+J=)B6{OUPdp|*at8eS{mHF#j~V#|dbQ-D!>qcgHy=V= z4SflYm6-iLhvHm08YW&)RSLUz(K(Bf2Qp95pV^a#zcD8O-x10lHLce><{YDNR1{t< zyzxHEclHC%vrQn`{%sQ;mKk@4YsqlxY%?Y8s6*UqtiV${14C$R=tqP@^O5!F5jFux zpS|2?a~in>E3puJ=3_+ua%5q1HIGZCZndf!Ae*o`#oq@d8m(f6Aa$-1Vnbgqrby(>b^o;lKzSzcZk@Dro zyi04!)!hMWrJ`g~r8G>cxKQ|aHzx9s;+3pTTtpQa>qE*U@NnCDhGkmiXQxG!WFbwD zqLG|xL&>RxSwA$KvxaH^o=3;aq{)Zai_$HjmBH`bhDWPG_wX{WbgBx|yOx#P@fTdE$j0LBG0X=zX2?SnVGYNZy^hP_M=tl82nQ`MU z)@K3$ps{x#vE+hEG$hAhY~n4fbVWW#XLz-IX1o;oD){wD-qe6b#*WgPj2siZDkq9Y z>F7n5SR_|Dcg)}NAicKTfj5E%OpAnaRp7GIkgu0cX(+w$>TDw=O? zhGNqx8ntu`_;QcaXQNQ(g^<)6Kb6l2Qn@f3nuWw;Q+I|V7id+?XeS?aZSRne$CV4* zOk8)--mcF2}5!t4EBg@Xbo@-~k2irh0yO&ox*Ss}OmT?AZVk=x6lHz|OVWJZW}s=c_(X}97} z^cOkeC|$gHQ4Xvfq-r-XEz;1SpVB!w%4jQ87n3~suK!}ll+W4`M&q37jB_F5Gk-xaZ|Rz zq=>VRR1;mqcIAMpTho6qY)fTs-+;~n0u;)JY6+h3j9&PFoJ6Z*)kf{q1#ia%Q%yA`6VN6&3$# z!&XG>LI*d|ki6yno4LlOY5ngl$1kU zgQ{HFeG8NZ^h+sbWlfr(<^(k!;?P+8IWtyoM#|khm7?888E+=Bc}QQ~8d>y-Yj`-k z^Gw^*3Zn(@q}6@_C*a{WpiB=meN~%T2lccD0xl_|2I=xVhf~35j%6R5R)@jFjO~%| z<_@mm74M|$}h72pPeMy7qOc?0O>I~&0Xv3&?9|Dnw zi4h92SG^CcYJtoeRjd4Qa~pAyd1Y+gU{|!puA)6Q{i`uoCz7zZQCG{_y0L)u4SiU1 zwVy|AB`Q#jc4%nAj!geIIF-~uxgT%*b> zx#aTQS1VV@IoR+1@(&P748ROr;eil@3O669I{mIwS~oDv@c6bws_@&qZL|O}CGz46 zWRy%f{-#v&f$j`#8k(-@-Ri$S7y0NVO^cQ#`6U2jsAg*JFspdz#&?n_?Ps#ye%Y$G z<-YLh%#!0r`P7C2lHI-_G};IXAaJ2WOK;8A1WJRkA%^RndAsqbepNGa$kW`Dn|ga+ z`RXyv26IV>-Gn=6dY#$4;@%VDTU0-c-123XYs9eH{F)AHLlXHW@V$fw<-3y7_u~1 z(f5Q7Q-uLnT}ku})DVMJkzSm))HBbrm1ES7z3WT7qD#t7N*Ge)nrt+SQEuBTe3T#NP$6? z`*@nQS9|qz4{B5nN8a2pifz3dQK36s3LWHyE$b9hx3n*_{zqQ_lo7^Pp++psAyXkkpVW)t1~M6thV;N;;>#7 zbokl|DqInLP{1Zz)=532HT-^x#pJ_T?Y}$Bf3E~NBp+uA=Z3>d3d!X8s>S3|bfG9^d`usccwj#6o=6h>;$s zwqhJ=d?)RHO9l}(4s&E~__(5te)@W&%N3ddI|n6E3pxF9STdm@Hl3$eE*Zq|kkb?Q z{#cy&CTw789*A`eI)_kUiQ@BYJSqSHxQN;Mdq|o5Jb{{vpkjd*P9-Tl)2lu%mm7PDA`cHd~aGyjh^P>ot1mefaA4TqL7 zXcY^3%9GjWas|cWTWA;6mAD7be^y+g@=>0Zz#k&Tw za1(0Qogh0dibvb-sL*zyUBe+5yUYAt)jc%r51I>NTqfRh%UT1&`$Yv^RN6%S9|hz8 zn+VDO_>=!r;OPIA2fV4&edokJH$9$FCj&q6pldtd?PgYzro|k;!+2}+kxl;gRQOl& z_tC1fuV6R+hf2L3^UOVT0)Iwmod4~7ZK(LcU`a!rVjOhTRHqZRW?6do)t{Z7y&>Vq zk)BzGhA^zu7=U`yiS8@2VD4DjgsrA1IQ7}vO0Gln0}#4>JX^P2WeoQL$If=;hWH54 zSbnZ??Gt|Mw^sR~Gs2i5#vm-;#XH8eQt{Tl9db6=$R&4-jxifY7Ijf~i(H%p>5BW{ zciPzPu+7hJ%Oij(fkc#WB=snZCgS}C@u5a@Yk|4y2h8Y`&vHb9CGT3?fuu%~?caF% zoO)_q_v8m@6j>WxlHWglV;5hGUw6Ny#t1ExXHjLxB>%LfwKnrCr33BLUr160Os}^4 zvq7j5ZRadOvve+)FuL>(02gpjBy-)eU<055dX4$^%m)27X%AxM%!KYcEwRU#!7i*2 z!(pR_6vv^0sd4(Nb|0yNvF@u-oN;A|XVqh6HV_FFal7uZ)}c{3Ugg56$O+PAb7gEJ zlYo!}7n9g{QSD-r<5%MO7uSnyY2YL&!(xj5x#EoKv zXoi*AI^=DWeaX%B61|uK^Ci%q!?u6ts>2R)`?utv`0vaI`160xS4zv8B9h^V&cVe_ z#M2_t5%l`xTE@oSvao`CWt_;+JD@eRe^aRUOW$sa8wh%O(<=+z#RjU7w>!AN%cK3h% z=v!*@bNdd`kt5z;>eg~yBPa?FTg;T^W;-zIBqqp_ zMN#473RI51ox@fek(_3zxy`bic$R)Ue%|FE6jS~In{_Cq@Jm9Op-bYCs{zNFm2KBK z|7q_RGM}~7X>2B5hU)A4>swGt+%)jO*(Gpg@7E1@{p^36AQnBBlDSJDvCv&+^(mm(cyR3HPr;aoDZx;9;ahWZ3NZnASjt9-^j~( zE@F4YsFxLGrmW)>L9uq3jVC=F9*BqLe48NERK_yKUvr4o0 zFEzKTZ;#M7Vh5SG)o>Zw3S67JJ1jb=#AS6cuYF|N9~g>uDDRK~eJ9)FDRMukn*Lyc z85vvHi`f_~&BnkPM?V4E@z}Vdiawx2AnV>EC?i8-8@FOY%qC%?Sy2F`VI1&62yrSss z=Pyy+4AgF<0}Dz|m%ult*4apXox+8^VOlf6$A5qmxjH+|Rq1S7E=&NnRHuG;t&AoO zU9wYk;jVXT-sXef1gH{Uz_UGeXOo%L7&ZkeOZp8m4BX+K5JpA396VKKykv4YchbL4 zo+bncEeMLZ)_MwHnTy_FC!e*(zLiJ+KSntIf3Q^zcXji!zl*1)uxwy-oqfY_Su~|LYrj6%6(NA8T0K=>n)ypS2bwI+zBy#2 zY=h3n3ujL`AWFxMOCF^EcCn3LrBSNhNRzD)xkoP}bv`*GJo;d^jV4Kyl4sh=#?*}a zd@Snq+m2G{Pi|QO)ooJ}%4n2c#oNh-APbaT91gD^{3mS6p`93lzh)4H7%Z;wbF1Vf zzS%tw59(zVENA0hzs|>_5-MOOdyBqv9B<@c>-d)PAM-J!qZ*Ba^hQ1|Qt|4}m8wU< z7b{q2ggG)W5cpeE{nz{bamxAz6cy?fWLXoDVwTjlf^52DxmwP>gVYuz@FZcyC*H%y zUCjB@?wG=SD2$(Jedm@ny$tExi70~`eM>UO9ehtGw=>bT*}Ic(xmWUW+v(uRE>b`{ zVu&n0H}bz+WUJSy2F|@ByKZa_VlN+@Uo-Xpmk9may8NM4H_!73ig#|2_`WSH-=`?` z1D4}HpC4MvgjkWkq?NVE*C+W8P&!(jLqb3JKGke7WvH#o5xB zF>uzR;(cJPL$I)2VDR)+NJt}iHMf4RP7D#e$Eu?11UkFAxL7T1wo5q4v~pciHC@Dm zQ^)HBF_V%4&YVi_Wo<|BfKgH83>$W}z>sKXBy4fXK<^K~lA2rotg^SS?XH^aELOG< zbKna_CZ136oi?UEeU*oo)37#IK#&RGHiMBJ;Cd{@_MDE<3c@52rpN6M z3RFYJ*6SRz_J-wL$$NoI-he>q=?0V~s@V7ty$EEJ>a@3_4I0p*bA{HerRM* z?4^^wyZBVpZm`ZO7r!Qv+Z>BjURIJp__0jC^nLLNV?tq!F?FJDJ+NGLI zD^jnX3*2qv?I$L6nxEW|=L)xE_5!wMN5mj-!Z*LSjB@dRW|T9&#TLcZ=Vng3o-c#@2O>fQ4Om^QMuuTx($JvvnBjfIE5{+$Is-$ldbzpsy^;|Lz zSA;rDS(4B3Pef>pG@qkUIe5=p3vX%Sk!qLXzb)wP;ckwFezQ>$iDO8$%Qo%U9|H3K z`c(dyA{unk%ad|y)Z6tLtL^zS6iW$B@g!55CQA{Qd69z$o0F^dN%ud&F)p!g+|82Y zIGWyk7Mf$4&TCOh#1j{A{Qy$piwzl&1JauJTno=nDHq!{XqqNS#?!P^45@pY5A=i_ z{cp851Pk2Z8=QZP7HuLgi0K|wbk z*|%nrg?m*R{yQo6$Hjb@v9s5}J#`p%r*#wIyIvJ{)U*3E)kSaxlVJ+VT}XXbl_9$R zVh%pSB;!%=UeKsN9d^u)A4O174D?+iB3yX7UmCXFV}vy}nOSJ0#G6#WhHQZ%vO@8gW>+o@uPIiAKidJlYx8dI8YZNt|Z)l6@ing`$UcKZD4=a+^B+>BC z#!3yr2Mb)NZP7E#B3%s0g7T_yiPJ$C;> z@YgS!h+>RLFjlPlw5VYgpK$%_slebhMc2om8y4=a@fa;Ukd7C@9w&X%dzn5PIYoEO z*VE;iO4yeN(>v4lwUsz%+>Pw)krWs4FwL0qIk2pbWC!_AV!#C@y@c>n42@&lJPmNo zin~#1OhVzjErKq%v=aHOA(hJeZ}WYPR~&r~x2H=gvdd=;js>zE{*k5rOLQu7xfss@ z`b|~1eSr16-7-Ne4x0-@HnRz3evt;6cmM;%E~=a3z8HPrKrGwlJ|S!5Ok9sS+;A7Wz#}?-W+*Q*~wjCaOnxM zuvP5whpO!m<$Y9B)4OOZ=#o4pfyqk`U)|NSb*7(%#C{p_Uy-n!rm|z?lp7Qs3H!P9 zPN%^%`P7RdMDQ-Px!XIF$WUnMN|GVnB1-~QPgf@5zNj9!aoeQab$HNO_c8cnzXxMWYW~ClUTu3r(64!CkjmiVYUpb8&08tf+nSSAu>WzVv!Kq&vJs+0uNDnL zbcQ+FkN`YUMlI2ITegGOW|Cj+$Lk@DF+?9nfYDJBz3&os?v`O&8yJtu3ZP+$^;7X2 zHjro3k}YIZvm`WYt6X<+d*}mF^14U%U^*XsFQaB(6B$NaLyNC~Fn!0DVUU}3A|T`}qa)8PK& zk&cm7_!XJEC*`_a7wQi)Luo*Ezpj}Rr&D=T7~xV!|H}HkvMkYxV?}IDGs`Dspw`^; z29tHmS}o{P{h9^pbi-y9Q+fdnSNuD=HG`F}2a66Mdd3VvKa&3TM)n;PcKZ*9gg0!^ zS)z_y@jHiLwCVfy*dTTrtL`mA^aE`Hqf(J}Wa ztMsMs;mQ2M_;PWl#OOZ0>H=xTv0ytY-H#C8a-xP|{>DZ``GY!98(g6~nb#w(Kv$H8 zU|u95OrlfTPO12BP;)hs1_pb(bc?{3P%uQjfJ|PyMf->ukbCo6B^I0DJBG&GjPAV( z_|oBc+!;s5d4=S5?){5sz6K-zBnF0w{28nbJxeXG;*v%?4Q^wXa?PtAz6 z)B;f#luH?vc5`RvJ*VovSAtAHtPkWWx1g)kFtlu<&=LzuzER<7@pn94PxO8tGn^6En_2E)$`6 zsUyCB%|T7ul7&Jmh-(o?`2Hb$=7j%de;DfuZQ=Ir;mXL+P<{Iq=Ida~Q|K(d2oOA< z)D~nq|LB7K-7Xw|K`y^=klL=*J)7Xo3XHuj*vj=|ATw!iV$EM`L$lSuf{P9kJS*$Y zc0Ge&C!bsr?=-?qrW!}3W*Sr&Cv4??W)k9fWm!-{}+0aPL=aVjovE|6}Co`$%ApY7{ zB4YJ~TH(n%)a%FBBIrqTP5FS!pPukUt>9}>`V}#r9^Earui2iv%P|E`9Y3q6lO! z)GL^hc&#$%TrV4voVj8b-rEVM;(ZybYMjEiap7FZQ)X>wT(=YjoHe0iv% zgFlN=f19(1^4@6SL}HtI}?$gn@gqdBhgKDbgzXWF+>LGc;j zS1EGE*a2mK0`a@!ZRHS5;GNJzHsuQ<8v4SW0ZSKDks@cM8-!_@wn#wFm{t1`A;r4+ z_-`5%0fb%4oB~q8BPqT8U%S4{`NrH|%DO}PDnP$^Q9rskU;FW;@WnoN4k^<@S3G8)4IQssCf5d%7?IOf@9FzLpl?uh3&G=L8#?8}7sw_X7iZIMF2z9k?R`nc z?wvcoC+nn_f1PIHmKpFV4LkqQOOUH9@1)nsCJNwNc)`m1qf;s8eF+NfB z5AZ3(=J=N+urit>e)S^poFC>GGnRE$a6M$F>bUQ*A@3Vo0{D^;a+vhqKBi-S+sm3P z=?!^;nS6R3NOP@HtekCg^LMRyR>00&(cNu()zkVtmrceL2 zEGWWeiq1R@R9jyBaZ2*RW+5Pu$o>NkX$_uFcxMsNz&$xn##WKy%7%5bv*JrIzi0OK zFuMQ56aVa(&H`t&WvzUF6EbU!SuAl}(#odGQ$z7v2uFi_?^yB_D*UwI$3kYWUZ`ty zi<}orJv4n6<8UB$!_HI8q*|*TQvS2-aleLt+!i?i)z3U5QXLq%9)fs`t;2EZ!Dw&v zRu);dNjfK+QCcX}D%OIEhqSOnrt!;`vX({IKHi|}cL!IFlaa;}&nt8vAW6))V9BGl z3oYm|l@5vQ-0x2Cj7qlQbi;Xf@umhmMJ*VrAh(-i{9-r^>sR}gnS{^GG7L#4WusO27HG0t>O^eeWZOY}Ok%AJ84G;1@zOpxwP@#%*e)akHijLs<}O~MZ|CR6D4 zIc$ckWCUXhlUCKW3RosNP?F$5y?Uywotna3@oqR=vqN-EM}U}PU^vb)^6Dfh2bGDC z+7mZVqEgG|p|hKSJ#5qx^f6$%uEO$knfpPB`~9qoi^hMh%-gjV*zYbk7O4TG!jez) zlF(uk7oHu_U~*kRd$-p2e&9vk4FGhlU8)#gJPd(yvCn#WqP-Az<5|*53`R}qio4Bf z<*SS|a^{Wwqzmet`3v8gtvl(KfSj?+lNPl8>f+Sh9(;?br|oH;-KrdQ|2Z=nf=f%~ z1wD$(WL3awKx;Euldx+f#mz$-IHh3)VXz}(C9__`p8o;<0hB(3yks~31I&vUJ}dVR zg}lVRm8t#_GCqy4RD4_bsr^%2^|J*Zzee$+=P|UVeLv>DW^xRgd7+WJ+4GQ|ff9zr zs2om~SE)*kGALT^LweF!r0nd_7Q~HA z?|P%cEBW_p>IT*D>fny4i&0MP291Byx})wVEod5N=P|Xe?6M5#hg#@f0WPQ-_f=Y} z_;}gyCee=K&K2YrKd^)9d}h8PAZ`8=Y9{hw1HV4igbRA#7=P>B*=8wBWFzyGWs)4SRY+)X#hNP_ z$Y{aYf?`S|*cb}9A@q-=^uuiAA=w%eTA5}Jo8_AM@1sOMY0mNXmeLn(4?JM&z6*PU zf4=>6y?!`a_Xo_Qt~HPqARZ{z%nGl;5+xRSRg2tqCP<~d-kONF7QQn(%NIZ-^NX2t z_bSUXUg8Qny=kzFwqspeL&!K4))~(u?y`tUM#6VyZboW?Q zR{E@xB|w@4Blb6k(X(9nQwWH4Ba`|jxqCFRG1E%ut7LT5sBcbN7ELG!cZsV1cVzq> z(Fr-3?ciIgk%E@B_8Va5-aSwil2#^X0#U)fkGyu^j(@~L?w)EkhJV?jC4eX3a>E6q zFvXGx1>7N=v(K96<@#|Ft#$5i$7wN2C>vr3Jx*$4@8;<8x)u|PSF(m{(`f?GBboG2 zJ2J?FJaboEq$^s=O->87NQ32wY5^q0`|{#K*pEh6u3`8%fSq$sSvCROh6Wx6E0F*| zt#%X&H$Iym&OC_qhqXqyIju<3q7qivzCUTK5;HYjw;0h9znLah$C7BeD3%Mtr(dazY`Ptu3OvC#5fqXNxvu+)u6z(fO`qq9y2Z=IXQl+@*S*8nw>)wu4 z#qQ1gZHr=(DO%c)X0U-hYG_}5V1703TBx|U*)r$smo3}9hC&&Uxe}~D%+1%CGQY}Q zCHcDj)@fo)kdY3{+eHbFn>#t-Chq+c+gkJCZzCgY<(3MHU8cR8FHr8W9~(|o7hGkB zEhhMV!I3}gEH4l5Hfb6yxRy1GNjnB@_fM?5*cagt-1_;_!OEu63YHJ)pMR(@E6~&V zSG=&D&JBG19ZTQP%%ixXblLSi^)~pLY?j)(pBs%G6H79YK=s2Ll;T(_d_uLPi#edMh&%J3 zC|)lU5`nL%`{Wt><=uuvD*%FFZtbfgM#eAO&cs9-|3KgD9e(o|G5~yUZfs@h{Mvi; zk|wnhrzvW`QbUl&f8fXj3rz*|BW)|`tS&Y(ewRaPN8WfzS+u+Y1&~Qd*6pgf;Acnn zH+|%>3K0xBqr!$EnhwgLuJ9dqt<*cBpzvYmPGjc|n$rY9*36-IzK}MC&N|NXs;z0H zJp$26R5TBU;@$T;WycBTz|KjYP$sG$TVM}ssDc@gx-VzJ*K(}$6CstYt+y=R_fVV^ zXBrFTqpu&L_?G_Y%{d*#_b$TtGj(^y)7-yyxD>we8TChdf#>b%d~?)EtwbeZXL~ny zuPHx3X!yM&QED}s3y35j+>#r?i$kzmiAP~jq*Y6nV-iPXj!pfa!`M3Vas^b)cD8Z* z7#nitYQ!$NM6xo^8myu#JW%@Yvka$=s!;)n2b|! z4hL{#c$B*1vb@TUAryb@n9k|4ZYO7*iI!THu~TF8>m@&CmoGX=>_^c~6Lx+&uhAAF zHk}u+TY6TO(c=FbZlt$pW9BY%)xkMpULRjzobG+H8vzD(bpl{gnj*Q}|O_-^DT=3YRK4`6#Uw`kbWm zJnN~Xm2cOQZ*G9U!MBR_;1o3Rx1JBN$;>)l%j)t@F?^n=*mPj=GR6mALAIbSxxPy3f z9#6Qd@X*}1x?gxH6}Fg9l_||wOPpV@u0I5=xa)l0?KBA0A@IpZqLL0i40t~8{4hKp zLLgdBT;t|eA{T)c{(0&FOxo z&gBb0GL(QsvoHwMbB;6#4$v3 z=-kc~Wc(y4Ia4C9n`d{jgE?)|^=7H$Rb)42snsp0Bol_ZFD5?RFJ)wZwvLxj%8chL zV=hs8(ie^Y5??=I^FhZo)`W%Su7y#woEbJo=>i)IeT9VO%%*_PzL+qT$o7%G#W6z& z@e9Y`XNjla5H5MulxH|A7IDmLlwh~SQiYd$T88~nCg3dCui`L8C#Sbe?-uVA9DJuc zJdbZ9Yx!N~a#=!n4pDRX4)v$knbk3GA(-EvEXsz5&#V+zdakbxnr2j5|og5M+rd=}=5u%gC1#p&b+P@1@eg{cDI1(uN=}%bpR&d@NsWIvB_bcw7oGIR)GZTXiWO}y~ z31P*s(m)SAunVK|2h?yy3;pOb5XH8I9|7u3DBx>{Zgp~w+c7tMao#{FNHcTd9%1?% z%To^y%KNcmM9&7-sxAmBHZVUc-yTpPF58{*6GNi%8gL0=K^D4l0~6YSD{PVTII)vI ziBjq=&XZ7cs@%ta3OsHieYO>j7#GwahCSi(bgamT%Ob)JaD(wpM#~#k6647ZR@zQZ z2&F$*#l6Hq3&I?%9o9q3BJsCsErdw4YJURQBIA63eptz`#b0aNSVJA86>LZs_r6|8 z_jO!(FvAU}G$do?V1@PLa^or4vX&Se9BAe!uCwFSfHfONO^3gn9ous*5L+errou!# zn*4rUk>>)de^#2c316P)ZS1T^VDCldH>8t+Z^nC=T&u;^uutv@V}7tid+O<{=BD7i z`L1t`y7*|T&Q}27196UrHj^#&c zSFg>}IRKVM3@$9=106;bS%C`bX{eJ(i?l2mtGThp`1h7kAZV3yPAYFTbB^_Z zn@RHmQHf!^Vs2IYKJ~+PTBEN#QDeg=c)1Ynr=JO*u6LFyFwbinC*)zR>{LLfcZI-j zEgQ^*1ZYFJq2v@doKh&V<*=a9#*vO3*T(ga{b}nqpuLzG7dJ34t5Gv~m28>dY4@o_ z$)%z6S!S;mDv6(>t8uSQN@>X@nV?{aw+jJ`yt)hiBWloF{nh$Zbvy=08v`_{%;4#^ zZIf82JFU(&_QiI-GiB~^X&s2{P-9M+LnfM@9 zdtzw#h7-&Od~aAMqof&)(28FYSkp{d3&2R} zL(OMX$QRIzr(FpPocbBU*aii?tN0xSt_zyV7nrYos9V>FPa7Yofk~t^pSGtJNx_8r zW8rt&rR?V;Y6i&3SZYLHWjNzhHhNLOc>~{Kh_D#2H>ktS_p%_&`HC__ZJ%v0WJi73 zA<5GkD#&QxH>NAEwYm}a1>WiYA3-#3@v|(m zH<@<{gW`6<3)bqRZNq1bQqbe)gn-aj|95(f#5d?~aWmi}R$^)@8I=-ikOuyD=B&K! zaiJQWpUB_W<{*SbKONS>6KDsy*s>Gp0Yox41tL1zHLb(jsQ7wVH^Ss1VZ^Vf1dro) zg8t*zb-Au_&eI>`TMbGe?fqpn++-5JvHpb14k>{mIwl=ejfndsWF@hv*;!$vG&D;Q zKH)Qaw#p{CwHSYl9N$WLNuFN6cC+_Ci}8wiLp)C zYkSv{;Q|1t0CWIy|4pyj8u*W*-2`Z_PjQD|mt*}li(j#dzAA~h4UQ|p+`0~71R#xC z$0JLIDsE`XY+b}2R#JcM@$?MHs(sTT_>;T1f7%v&skN z!)=bUQE4Nog{(#!yGsUi1>1NhEfhJL3gey8Lm!4;X3G&n%$HD^#yxbBmULWZa=w-% z)UZ%(ZOQtMzpmqT?ORP69f&UFPdV<%XPx|IzYQwbxqkOg zFI4!sR0&asR6?ycWW?T;p)sKF0&%w}QLzSN$iDNEsb820d`Vam#(D17!WtK$@){~o zvUOgBBJ0HvL6`lvOUf+-Ff5=w-P(0oyZ z!AQpKuBhi})CXSgFI z@c%xr73zUxFfI7`6t8ePH)$kqmq`|?wor11{13ptk_g_&pQH^t%!jqDIQx*Dgbm~U zKx{1-jugUbabM{}O77=v;w+`GnAg&T;G*e0X|D7FiwZPe)SQZUIXr&*rq6LiGpW+n z>p2;2U!L81E~MrQT~b>b*UVCvRjDtPBCQI0GD|Nbmjp z`ykO>e3S5;irEaa(ltTTxf19X!(fl=KbN-jIrVCH4a* zzc}rP7!j8hGiS+yfAuQyMyPPRvkWsTCMCvNJ=F=T`H+?CSd#B7=kSNFS%(`{W@H>KeUCl_>gH(2KJ16SF z*=DfILD}Zp`53rxf%Xc1-+=!u;|y`p(`_3VJ%%EG6rtsQn_Zl_H0RCcr!iFlcm~uc z8#n#nFX?i()c2P-c(+jbUuPevdC*IP$*ZIN@3TA6;-0RmZ#yJS@5qiMSy57&(iV4_ zt?qX-F(X3V71{$n7h@9lwvY$H zqb!;N!Gf}tP26|_{5SK#d$Z-67*U(xh(se1j5%nVkZsUv_Wge0cYle&oBI_PKM{la zwz!4aZLeb*99Q32idNVgGEW|y$B8SMgd0uXV-+>@KCs$~b~4tw>6QU0-7l7NJa=X` z@yG%Kc}r$seBXBw^-4i(eFt2IE&8Y|M47n=@-ov&wP|p=tEspWdlIEDmoU{24+`D^ zRukxP_~I(zBLk~A5z(|-j*8AJG#agV-1gWshevgJ^ED`|Y6m&%M7uoz#mNmYOR}ED zx`=GaToJ?OOY||1kk)J5YU7OD-jn-&6qZ5vk!_A^y09gRR>ozpvMfuDtO!ax>cA%B zSXuC)f_ZxRNk!rVO?XE@g4Wg()S7q_XW&M1Y|(g}=cN?Cy7zkp5(kWg-o%>e+x$pS(>+TgaWmUQZpC-6gin1G zoKj)J7ex&dg_AhA**YkDWhFG>Bq%^xnS4jzLB$i3z}yeZe05UoZKF6p+eMb0AJ!dy z>^iP!&6QT{)JdsM=u9G{?;=wDU@jOW9+rl#5XM) z_sNQ^UYsvGxC7=XA zg!aSFH{dk{C>W(vr&G`Op?e6cN0IkDQOM!*+zp(4w|qmLarj+*WUZpSo$~00YuRu( z6B6RB&d%U_m_UgBc%=nbv?w9#0TYu(uJ@h?a;-M_hA?rcxx+n%RnV9dHk87#M0k|6 zQ}LP%oC=HkrA%7Oz+xqj(eAkgR@8cX za$5d0hY5M%3YZ7S=bS3IN}I*Lrh1g^pl+DT4e>7li;0hCqA}=f4z;S?smwt%88gC@ zmzy|0C~V{v_eITnGnpZU@s1g=9U~aelsd{Kj+EbUY<|~?v23o?0~Dh(qbt4RBrMX5 ziv!DWB+&fg(8lS^EfUk&0fF#{F-ZStcf_-m9gd-*p1D`p(1k2uUAnAH6%DCb^^RN&2 ztf61s|B!^>^Qx*|s`ht4VD?Pv<~ulhxHh9VYFOIsI3+(Y^Gw-$1tlFWhov*kVkR93 z@I_e8ie>$H%%P~iJ+F`JOQIa&b{8xv-s!!ha2~N9!e4giZ`U{E|7c0Jp9DPK^fbb{`Ml3yfaCCeL_qpVyW6okK3;>V}4YGLFstuDB`^ z9w$gH1{F|CkKTmuV8wy59`fnbMOXrU4?n*2CUfN%A&0T5w;LME+Y`At0lEPh~_TBhCiCF%sqtoJN*qM&78}!O#%kEZu`MS{jY|T2Kn$pmW!A zzx-$&+*sD;!ASP1wZEndTxjX)al?w3zLrdstDwOKT{>?w+|Ug3?Nwf+Q-9_24qowV zQ*T)-hSEieMe^TRhZc^$0>p>oCtWJ)5S&DMV2(xT75>+#xx1e?Zd1qYgGz(k-2+~K zlZ4c~$dgM!t(}t&9Z|A(Pd@CJPEq_FXV;IuO2qi{ZgNSNp(phL5;p%5Ui@DHGR~Ox z$c^>5Remu-2_L7F3#Ayg_J}n|oz%b;1_E{UXF&NzJyYBjS?i;cw2zQtsfB!8>dC-i zEH7l%q348;eT`04^x%E&=udce^mdxb4@Ma@9|8{un*5Kh4fg`{?B*pLvtc#Mc1&Pq zW&e=*`+s@q5SBMcjr2uEPC<*po$U(JN$$4^ISJkD8A$MsNNpmD_200Ab*w3i0uCX zx_Iy&W!Oe%=*8$`vt^c?=(V;dJ(Z0_2BgHcPFp(vn_tiD|AQDzjcJrhAO+ac&wg-H zjVb4YKCcye1JW-$u6Gf}0)D^YNDOdj=~*V{80H*w%~Vo$Z`j!R&Dq*BJCONzKy20c zi3X~s{qku^N<6+wh<7AeS_!`$ER|pp<$*CBLpS&i!SMdirNaN-FmP6iy6mtrW54#H z$EI1)lCw1O#>kl{Yh=-czXAAVw9Bh}MOeZm~{719* z-yRm^R(}w~;+O^eYueQp!()!%{eOTt1j`zWaq<4|hvogrOLZ!KoFWptXbpwe-&h=V zRMb^y($x~fww&x9>a9+zEdHoeTwqHKZCOz+cOu=~y>sXJjFS@_!pP#q-bNYuQwuCO z_))QUr;Mcx2(u3H_EuCug_YXlwugN?GFxDiT-biho>o7|*@^~k!4<@RuPNdxyP4P@B#k)S#8&Z#q#4 z{##h@T_WK?^XIyAqJneuSGMB)xyoV^6nWd$D3yE(k0o8l0LcQJ-?d<-#v-&j)MauE z9x?|`cY$?T7w2|l|5E!Ez_0Q#Rg4dF?{=>QKPa}02A7Gddrs~MM``W3vFcGBWC#HI zj($!m{R1e9&$zc)lSu@HJ4dH^gP z$wlvaDi97O3Gu~z{Ql`u#XlPAdszz%LU0u-Yi)j2im+raPuk7g2wEOi|EG@?DYcn* z>8p^gA66$bLrz-lElR(7v=qz^C<9*IsIHD0e~=*40E?_ zU}UHvV@b!v_c(6>>2L;)=Y?LBMQp_}8YC=z))5!Y(uEq-^0q;SioYH7Z>0mzJ27w- z??hExs)(7iB;)|M1VDvDPReYzKm~%gj}hnA&)l(3=8e1kJb@tURCAN}@uV5~UW{0J zhAKv+k(|2^8+V6b4Dr-oI@=$Nn$gyqmw`EgCgvN=8`qtJxUMvrbH|p!RfgPTXj#AT zT3s!cSa+LBx=q2o1}NW8)Tz+e5k!gXuJXi3u5#_qq}fB!f>gT#9$u4=z=;mbFab5% zL!IFLb2?qV>){1mFyzEXn`(kz(ptt|9g>qx1#wiPM(HFIBa%6bOw9lDcBB31a!pEK zIcARJyHBGBlFi8B1}YK-E7}6Xyn_|0xD5S*c@QRl^%aKIxA|)MB#PS^BTpAifsyKP ziHKOAz&u=kq5S2~!P6GeS0N4tJA(Z!7S6`=PE-OhvGI_0i8o&+1W!>Jd+ygZyCsVe zI1Iv1>$tx~t>B*a%trk1W&|1jQS_zF^gMAD_0aft73ne)=Cb2}XIE@$7Dn+#rj4;h#-CcoE@z7^1$(% zqD~#%F{y-8@mdJMUE@(UoUSl_pNRG;zowm$ARTDhNN)S&6~`ES==OTd`6;up=QVer zJd;2yJJu#GDeyHXA{=?#zGCpMRH=Zl+9aV^vAd54{Vm$!Z=19eeRO$w%xj;n-=Uja zJae{9R(ZUg-gxV7183J1o@J0aw<52YNG@k_k1`e!5)U<=wqeOO&RHKccqgG&d1@)lv~Ii^mSe>r?w_6G&{@6y zFP+86rY>2=no`v* zIyc_n;{AiVrt`GhON2q0&~czQH^+?QUY_W(>q|yyGXwux!8DphDL+x~V(N-n6w~%w zV!iiT4d}P)#N!yBvuMVbqmg-C-&GLmuCX&eY^l5uflgfm1%gH?B8{SN?PxOM#+&xi zb4ZJswb)o6e}Fr*Ki<>GE6HoMr$*qy7NHn6=Hdh;$^QQ05Sa!;rlDLF3RJR|a8&_d z%KAW9qZS^=(st$rt{p;gg6SpJIL2ja3EG9=8j-IBPb^|jA>4!nNj6~?@!k!EOKjgg z^h)^0=+jGiry+>xzB`bV(dm^@xH1e@VZ6a#ya5!7_wtPW7|M$kM(8xOw{Fod+I9+4 z9yF{DOthaiZJpf8lZ@~=2-1n1eQ0nX;_|2=@PP3!C`H6`T%Kt6>qtf%1XyV?%8Ki~ zk_%63@uS+l2-Ap55r-i!GVQIwfy;6G-hu!}p&bUyLjhE3q_{1UkDU1ZT2hdfv@YP+bheM@8u|tq^l()|sJm-u zK*OU!xSW9M0vic(!%u-XBf{@ejxKjXKK|aDXlbbv!3jEWN!&R@goU+R08XUXK6nKs~JN z#zj0nB6_6VV(n*4?_!1tVM4jp^hb6qTuM>YYNmDX65NhsRmG9N3DDgm-M8m?FL%q> zPFGfOya)OLS!}d9#?0dxdhW}YoK=8Sf}-aQc775Q|aKF@Tt7JZjo%mnTD# z?x?9o*V;jl)%Cj$_cuNUrTaq~h%p*|g8}pzsg7eO4UI*0dB4XfPtGraE~ScyzT#Vt z-DIJ_<4sz>oq2t2VRYZkp_m~#~GjYvdfmC zFQ-m%j-Vtajx1RVl>_8(`9LBfncd+;cqi4Nc=4*)6dvO$^ypjefr|hunYCbJnnRY= zK+BF2kFan!o@8BDL=UiEpfVlP*yigT8$tWpna_evBTrLsHInOBydr016L$3kcFwI5 zL4qEt9_inNYtN3pbCixmk1A}YWHynTNXmb zI;%?f@igbvk>;QA;j@%eLya_}_6F|P%|SLx>0^87W*Rd>C2bQ}I%cb{(NuL7qwCBl zUglqDw^jxm=eD`sVaaX`TWbUwF@V~~q-Ta2+*@odn~r3O23MEpMn*ZsE~Jzt<2+%v z@)|z0nsk;-Q@Rd~JA`DF-QiAJqNm6dNm&!Ni6^f-{51i9CkiX1lEw4#BH564^T(UD z4JKm3tsE3uVdR#?#u!Wb@>+m&bvdhww z#T*n0oHp=U8xJS^*MyV}wtg8xlK+YvazUg7&^KdGb|@Ah-VV(_gp`Z3F&a6m%*0*h zhC>K4%<_NyC{}1)i)oWSR92it%du=DeTfCd_JqVbjZb2bO555@pI!D&G-dj-;k9!t>RrLuCTo zi=`6|Befq7sX^2AI?AKx)leg-oL|W=uPc(lkk&i}T9)}rS!!~j-->6YW#U8X>5P-b zeHo7}?N6CFY=pkpptVnRF8Q~;o3jb|YsDKo8lNMZ-?y%IWvm9hm$ zin876^g(EVihUp%Vmto-q)@%H!fd0F`RSR<(>|{C&l<7}g zY3!CSCTx}{6P`5n>fA7EZ5TM>r;fyefgA?eEhXY>I(si#NUyL|#aTN~2o-PH2Tst2 zb1}&JeI|Z>84M*)i)76Xuaz_BZ7uNRK|MZ@K}J;^%?j%fz zz~a!;FX4h}gDAY^g9q}82t$tnGWZL_0sE)x!T zNlufzDQLF%Dkr&TvB>R1k7D?#nfBe*U-v`K>%FMX z7*^8k8&^FFy*(*gq<62`?p+-4lw(bG-}7*0-x`!M(zF=pi3qK|p8H#@>h9W3JTd=$ zUZxq$tRI^BJ;fQlDh-#FU>$_|^y34H}G3$-+L;<|tsxvS>( z184UyRpHC@Swghy-+FChsZDh^u|{pnD=13p2>R^}5`1b<46W$zP^j(TTnageyg_Pk zScRpqVCNbq$2TUdK|+?dv*pz?ZXqapfs2J{e3r#wKWHZ0y4kbyPvZ3z>e;NMGH+Kr# zo)fDbXc)8IP3to6B<@EjXrFO@t-)fk${{Zd*wyBdmuu)0w;4AIiW$ukK)eDGujm_cA zK$|r1N|5-O)-ki@dRWlhSALI}Rq^{*52ND27WY=aY#D7^EIJo=hg*R$1?zQ}_K3{Z z9N@`kcB>yV_U}?iy80c@JDN-~e^Vlr>1_4^WO@X?@;?IafVEHNPnZ?>Y}VC%YwpnL9xS zJEJl<91n`E(o*}H^>!%2) zYaNOiyU-98;Uw@?)Z{-QeT69jB zvS`|qCrJsifVt{#^px7$k2ow5K`mhLWWZ?+h8#(<_8T@=mbx-{V>X1rS=LFbNP`mi z^(>6R+33wH@Q0Y~Fcd{!0s&Nl9c(5I%tlB!XqUB5D=P}l|3{ge-0y1*SX@>7kod+h zVLrXI7vZFjKe6jue(UZq2DqpH+IxD!Vr{uwSG!48$U;1S~-Ij=@Eu{pMDeLpOK5OHCcX!ZTD zDe!j^z8+Fr6wYhN>Hd(d#}tjD3g37 zU=Umas-bQ|_cJX9nk}T34L)zYr|8?d1)H&(+>g}$X)qL@<=PeK?P38!F8IbbcCleT zts#7BKe;5?1WDnzxmpl}*&d`URJwxe1o~TJ>M;{-&%=-=xC-y2F>lPyqws9CC*+rD z4~U!uxMOSeyuZp#EP6N{TKOW7IBEM2;MN8kckn}=+Z(q~YigA{U%sNxkYo2@kF*YG~Ihtr= z&|oW5b>V0i2VsN8OkV92HID+qiu|s`83)^SLTC$A%1u*OXX@*>Z!!a7Qp#a}V6iC8LO0UiYD>ayBI*bXerNjePA z;R(^RP;Sqxx3{@LmL-3_qx>XrZEs(~(8ZhO)(w9%ng2eEWh3OL&D8c*dP1vJlTp0Y zbPc6}Mz$oohD;KRa~(+$mCMGP&YdWXlyioEfL+{2l=stRG@^FIIQ+ETGK;j+_W0yk z+~aAde@l&;cKl%C=MFp$tk{KvC7@aLOm_iSWx1(Z;lPOMC2V07Cp~U$6Jpm^Mfqch z9wuW+ea@%6&cdnD>BIW4ciTb`v^vi~B`X5l9W4gqlmkN=6*nAgnm}Z%1DOj7T3co& zZcf<7Z=;xEtkF6yaN~)RW}F#!d>yLiFFHo^yX(zS#-DM_HS>*n8!Y^y!{6t6Z>Z9 z85n=UoKVjBTTtbRsE+*;!mE?M(}Rp%^&Y^&P>BiP`l=jFr;I7@XA9stTu8RV^+5;l z9|0#mAtm={F?}$O&mOZon0_<6DUc&OzcwhYj!kzwWMt9Om<8tg)xxtpkR_0nNO{Bw zqIU|gSpus?wN$GyvfuP7+%2%?2}1>RT8O*ky-iR6d*Fbz_tt{#FwY_rbd**kOC=tx z8wS~MRvV*J@uS(Vp~DCalPu7~YHncEXNi^j7Z8Wn@Qyn^!0BlJro}+$46T!dGY3|Q_>BZlzH*WcVMESLT~Tdofu}gal&r!Ox*+I#+I3zy>mkH-JMMB~-kY?IG)i<@b2k?3tQXya*zso}9b)%uF^qilVb z!JIyj`Z9n`fsE7&rP!QA-aHD~-QU2Bahfq}bRd6PmHL~mO-M(Dqng2CesG?P%^OPX7uem+Kd(FyIuDTK1cok9k{3;NbQQx{#PGF8ytJ8VBll(nt zwe(EQNVu~q1&}zCrHQTF%!c)5f8QBQrdvm8-Bn~)reD{|CYePf2@`9F${2m}`>XtY z`o^SwN2s~kYpCdNw=x^u@~`su$^M~I=;Vz}Pf0*o|8f&NSqt6FO&3}2uV7U)Djms% z-(gR+AuhqS9(G!J1udB2f_-#Wb?;$kVwFJ4yM8GO4!Y^1$er zPiJk=IiGpXvbZ$C78|xK&OUSVyhMw~eD4@u%Z^8@v?GGekMfB$oAz#moOH^(bFKAe zH5ckTPEe0Vb&XY1Y2ZR8mf8nsX<0L0{t{9(-<@$EB_Q3QU+drfEGTTH;9gor!_#CU z&%>RT=L{xfE11`pf>V@0Y4}b$$fHRhe=W<^DQNOU zA4sW36_idZpOBwMQd#u&b}V)s*~B9RP1Ct(XiNa6c&MhK4bIGX;dLGu299aH>XMu?&T(aN zg{e!G7PqmKREQ?JQ_nDuEWfpM;^;Yl6I~_AY1sTc);-H|+zOWfgYh?~ zBLa3NmhjmAn8kEL6p&G`<%(;<&AZRXsKFMeuFum__EdtuNIdd)v;e38qA?K{9Y>60 zumoB-LQ$0_<_@N@TA87iZDo2aYf)qbt2AFW?sw6VS+_&Qh1-Lx9| zDgIg&7@zV@NC$An;5WjS8XZARh|I)1U)`PYD?i+lo0y-w&2M>ik9_FulEzPpw&6(h zKxQ&v8=JhVX%S5l+CH?DN5s37;#p62&P0ZRKtyMzG%Pd+GfRMe=PKYpOI4NsT#F&8 zk(q4h>I?W)xQT(iG$7O;d65P7lL zcH9e!bdN-#POn$&af#9y>Wv>T`L6n}^*D=l8~C{`*eIa1)i5hrN`Scwf&9h=`a$Rh zfF1zOp@(lmJQq$FyZj%s7Vd~`aL#=|AxDoN6%tKy$C|CK2=kR-Rm8s0qiSbmlY8~0 z^8D+c!Dsj62s{}i`U_B+hft)mqiV`IMn(N`H=U245?B)J8EYk{qaF8_AT#Y6JeX_A zwJ;D`7_W`v4qslF7Mut>zpImDYRYn7m{6bdkdx?>OfBxur~TXgsv#i9z!0MwRhutb za)5|oB+kOFv?r%h*?TDg#xF*Ryo3MlCJWJFJyqO3xV{?VvLfAhQ4VL4<)@#Gg3R`- z@Vxdkiyd7Oa@xBfm`0K5w?+S9iC~kiL5@Jm&BL3?j0%45TXp?Sim9acs@&+Qyd#o8=ah zk5YB#Rw9X-9@|dRd8JhXlK>h2G5y5TNgU`PP_;GJ`?1fsnlz~#Pt0tZ$qnUPBJYerSgM@B*g)oG|27x&b( z{|_F4^2tf=jVXF@ywU<&_cC({CM^TD5{dJNDv?vUv9mJFR+Tm}<^_reFc)XI-UUH& z$?wl5?2w$)!ub7E1h(lzr-y@+Wb!(Rlk7-XBSU*x}C^@9orPgKn4I0tviZw#0%SQM0`Knx~6?Cu9)Cw z)9Tmf^f)iDXEKl>P57ibVb#%FRhI+J`d6}2Vs;_Xf#@G#(g<-fIxDJ%hDsm1)a;zQ z49%%fVwqZFx2&+;gq3pXck@LZlsK zX777o-26<_{?UDVJ}HzO-lBUGMGw48vudV zg#JiM31(=n=^gZMHmPe2&hhu>=iyRlm5)2#Q2WteM+Q>Wdjb+Q`P14bOB#ZxEgIVY zm((fPCl|9ND{qI*gBy^W8RyY$J>k(gm{Bj1labSV&EA+s`1Ca^KS0fzx8!pBd$2Lq zGT<-brnB?S(#slDU0BpA-Va!L*E6i|_miQm1e4C^pc{6O;hadOJ(<-OvkBXi9 zZt>FmYsyESt&FV&Tqt!iDD~8}t<+xp;xsA};N)>Z404<#jEby?$;Vumv?!KiE!9jJ zOWKV+TP0hsoD_R5SiA~UuN{yTco1L z2uo!WnP@%%!{P5Jhvp}f1|(AeNCjajW&5o!qq0j*c2Gf8dj)UiU&`IYJZgM9D|Oq@|_*QiCygcD-ElwK~Z^X zdb>59>BuVx*e^|3&mRxGe^3b!!QpJMKHS7auRDr$zZ43W;S2?`J&$e2I^*=oTf2m3x$!bbEN3bjuQKIO?8 zRvAQ}MI@+DixkM$HYOKeiWG}le7SXfhR0uBxX7NwB#S~gYnj-ePjzlW zShFL%#aGkmGV-WOncbC+r651)jgfWi()nu-tA^m7wJ~p4nYa~z3ZBlSV(dD{XGLkWQEujG$*p-h!6dH%3r5qFmd7z}4$5me}L2H@y(8#9Dwe}60i zn8FjU(!@f@meSUd_h?7f)VZ--JN_I`crE$>fKraLwYBY6z|zFf`j<9i(~W|n^-P^z zrSJ+n?OyL-T1NW@tR}s^xTG5x@=dR$Ni`k>=uVEmvp3GMWgSWk3W09X;t&Jxp^33Ek1+=C)+?JFjJ+$YhhuY)C=fZP87N443|}Ub(iHx3=QPFt|4a z9}WZ#0v#|@X82G_I(GJJW8x_XOsT&drz;*CH&mu*uPINxwI;AF4PD$ByKswSM~1*t z)k}(CX<$+nk$KbA@vIp<##^@5h#JiTUSI-D+ghA4?Ilvec-$~XqQ4qSmWM37Wp4~I zO&FH1$g)$7>U>>S4#FEIRfGzL%H%oEd=dFuKG zrmJc$#5CH(;1=&c&vI8T*oZ%(X0~CkX@UO`9TTSyHTsoR+?sp7Q^Y- zPc#ZKd&cIES{hADiI6goHxLVny2*4?dG~Upt+z)2KND}pF(=&anyO*L-laNjJ-{U? zVqQPQGK64ZM6y4^y>Fh8=_4hwy6}6y$O5s;3ttvJ^Ns*m5Sqy?6gBKBwRY6@5=?I9 zF8EeM#3U^0IhoOJrc1z9sq9JR%x+Ax!CGf7le8zVp;LMVDGm%Ee}{#1SCgo1D#aKn z?kT}W(#s7}9vDrV&ed^V`ZIF`=LZxQ*@N;AwOwCI5;t-W)UsP>=FAYFLd^wPL#e>` z&&ZM*{=^Ch{)%5@{fTE_i#C74MfXQlo1M9hW~L`5TX$8*pE{1XYux;4IBXgGv1k({ zL=|Qe*Qy3=H`8a6F&JUKY&lmj(8xyw!3}=!z?jq@HbO*?a*mS>tt4v=b)@ZU?yE0wNYfDLJwg$x7lyVt9Rp- z$F2C*pQ<`_Zn8&`Ym$B^kT|u}h2N~B{eOxr|0D6e&HbFKVf;aGUDm(d1Wl zYttY$o;kH@GiPB&wHeU!Et5b_M^%4oi#JO#;sns7cH?6SxtLgjPqhqu442T%ZHPW z?-uD?>wG)oB70H{n5`oiq*IAISy?%2g=(eN#5XHk9SM$ zT!wo(F%kxAl3{W3&(w_-;Cm*aWC;v>#*w=>4f}HKE*?P~;>$+P`g4>6OrDT;i964? zn3Ku|?72H@fyglZBRgfVhLxY?f0;{HYW+jEf3zI7d98PO^@>98vuKV+bSqq{YT40+ z{tAY=qW9M@x?bM#0kS51df$ty84ZK)fcm!Nk>#P8WeBL!iOlNlsYe+#EgA| zGEopC5jW+;wc^p)1xPNxe3|jgCggJBXU0nybQyJszl83?E2_pM7%fQYwC<*`kf|8t zLC?Tv3cw7kQ*Inrepi2dwsUHRrYc{4NE0Nfj0sU1>nl<@Z|{y^v4pOxBG@(%YD34(tz7kUTu7!(v!{_cgK6RuvG|$0&-B`STo^dKin4@yx*RtG;b=dAT~?ffDu8dyE!yCCTGY z0kowq=1*$E4lT%%UU)9T$YSD@wxgxq7yYPR)Z%C2i5GdnTD~hAwTR^YX^2OqXIe$r z|5V+#{VxWzcXsURW`6BA?=+%%@ijjXGkFia;hU+#4zH3CD#`mB2!Gb`fTv%B(lGAb zdLIHIuBc$d&k}do@6|f`YuAUq#SPWzeR_GVOlm1Ecv9P@3}zhkO_7vMNT#5_d|k-k ze83<^76oXHqHn|@rq^maeG+xaAP2d5g2eU=>`CAflH3rc0}g(l-LIV0pqaFCi0WwD z)PLvKF8x#m%%MtdGkPJ*&_5I;Hcza-We*>Im!s3y=%gW;Fx59bLV5R_;#x;5liB*> zx-?E?P5eEztnOuB+!w_UibODV;iXAG?3l)%s^qt(K+m6mTBvq<;ab;`g(+#lEUKw)Thq`Wn!A z{?Yy_bXIu6M;dB4nXo6nqmV2s{SOs9b3@1n*>_y?m{67a(C&R5_rI=P-yP36x$CsO z?0hbBVwtbl1IALCyykWc&0cffGyVG`2wg(mGz)CsGxYOQe54OuyDJ`YmTjR>styFN z^3n#bPeY}-;c-)Hq(q^}(@T$6;1=#{>)IKJpg#MGLnvoPd&yS1Bk&qw8K(N}v?ia& zqZN4PY=f-eArEI3P%mE5SagN%pb+-2Fn8T{o(Y!+v3Y09`3*{W7nT%nS|c*aNS&<0 zI5!CrVB}~Frj@UgPK>oRs~`%VvGzZouYUvU6n$zA-Yp%Qcz+LDl3|j%DVI)FyDNu& z`x{91j~f(wg&+1sJpKTU!X@yIMEYgI4<$LuZJvFKx|5!Cklh>Tp}X#WZrpmxU~jOE z_YUOmek@yzrlhZ{mc{LkAxjb`JsK+TJMv&k(nyhd?m!NgrAqu=2}DjbP6EzQ_?-!_ z2*H$)riu++*wKa(5Dm#N+bYUFu!OuF7V#{o`ZH9F zrZNUnawxyj8BMVbP9s2y?ad+@xEO`LfgL$3F2ZTW?;h8hrr4e{;!8k@vyo1bsWRn@i1WSe}ts2Zq_xD7YF7FGdE{>G3=RK1fj;LWjeA!AZkv+gF`G#@V1iv??PW(KlAuI9^acB?7BfeHTX-fD4Qm-f-ETx!r%4VfCg+ko&uUp5zc zCWE-I+0o`YARFDG1ya*^sa9dd~~P0r2j<8Dm){mx$nL% zbGZ+Xg6?cCt6%aN4ElV@4J-W+u774ryaPQ~Z+#@(8oQFf$H*D6xQ1!Z9IBau?7NUV z(WKeAs55A273`c(Z(F+0t6voL{QTX(YkZ3=GO$7V&@%Zwd<9awfN`{)*PS}|n$+ zeH0W;#Dkztwu}T%l!6%|oBRxl1kU7vLiqkm$;bESAE4viyOtEEPszl6a6hDF^OXpx z<^WljSU&ppxtwdp<4d2V?Mb{z$I^eS?{fQ$UTadJCKRxdS`-Kr73CJyBO8pNXy;<* z!jNl2nJb>ZOH{Jxm-aqv$}FOaa{&TMGqAt{u;Q@F7Y)U{mguIcnf}lZOE z-Cnpd+g3iI!dTyXLEl;3EJvSJ`j4)6MijPjUXkYch!!KHAv^8?U1yh+KQAf2sJ!7P ze_$GgmJs9EqV2PrrR%qpk1z931cd!x0O6mpNTS#NKe)dq40U&o*;J5XinlkSBcdg0 zsfPDisU(j43}FVWo}Va7znvQ{viuI2EZcQguoqKVm_G*&YbU}@6ZfkQ5UIuT`O6gs zFuR^)6QJgGnkwHE<-7T2{eh3gi@Q#E)3>!=rls#$Rno;;ReRR@u9Hbw4zpVx?!82I zsDz`kNB(nCWW55b>Z7vp7b%!`{qCsPTVFz(96h9tJgr)o)q7sNEmQrBr`hUFbL2YB z+1B@!N7x8}qO4R`Y`o}ca&a19kt{F#$EM-$%wNB)R$}b7*r<&EpyrZ*DG;3nk`U65 z?N?k9|FFH$mbn)=?n9rvq>~`*L73BCVx3WU3J6HgoKBR*;*sX(cLIp_}O#Lu3>NRSK9wqL8$!A&KBmd2zm>t@GXk z$vLgq_)J*w9~f`e=t`rVCq*Ef8jqvHk+UF|eTGba8Z@#?Dt}fe;CH&j1GJK<=zUFd zxcf~L{TTP`{Vi+b8h8mPvX*Np%{_scTl@B{U&HzLPO2fXap7re#Da*-O)-CRs#kq= zqQ_8<+84bvR=PC{pAX;Ee7GZa`l}UU?H;=OmPrH~>9oS!#x;zXoQs?cyaN-kM_wU( zNc8Rl%YsP^t;?bnD?XuN(zj`e*mJO}JzCE5CVFHCD$(BHi0t}KUxdDEq|-+-r-3TM zF87p;{A$Tdmy%=y)~PDd+QM$y1%fT`0ghZFib@X?(6c_)dLWW=HE(csf~Q>^n~SEy z!`+|5GJR3e%TqT3<2z}18oK~w1Yn0+0;BG(F+G>oQmrysEfcey(382w%4rwbQT4Qj z@lI%C+F;HQRl%)V`R5a@R1Ac9(solnse-uBo5`uk5jhbl;pIQ zo(qjA=7J={Bmfvvc^`)Pot?bvpt)T|>@t+5a^R&{ozGUC*xOLFkQ*riQz$QA;F3W> zM@uA7__fMbaWK<uPTBKm`LYCtvV6~onEV$xtIIY z)y2sS|B3wlgXZp_X`b%0LQ)7LisXhJ9=glim2uvTlMT z0#Qv^cD@u1Q4^zCR2e^`_l)E75K>gseFn@(@#l2Vh5HD8)E2E*+xT$aw3m)!sUx z(@#m%1#&hXsY+b5OldlwKHAz173}Hi5iKZ6t_Cnk)fGebZQRJ@od*%I4DSZTvFadi zy1E#sOm#ia=~~!}m2|Q@SSOT|Jwf$*dq~h`q~}xdj>=0pOo@pRjg~(vpE~ECa8qLm zOHvP0E*j-_3xd*yqJDRoCsR4ou9OUg2yt~PadP3cj%$M&;-K|@rwvxgO=VKya{Q~k zc>wxN9QB;5`-Lt>#enl?2WH;fTa5JI6!|lpT6!-HDgDiQLLV&~!>dPfKp7W91xO5z zzA5`trNMk|jaB&}46sST2}l>VMq)PuQU>lWi2y8mZ73Jc(yJTPWT=45=K5Jg7L+n! zeT_bXjoaB?qQFTiMS2z{%@qaTHORRB7M02PUf$=(q-mdA?G@G_;iqfl*gMjLpj+H- zUKh94izs3T_ZP%Kpq;5R^-m`qUaEWEHAD69+b(nTr6W-!D!VQ$wk6NknmkMI`4EFEB&ZRr|Y zCJx-}Y&R4yW8M(Q0MnwQuw%sW7(TD?>BhNJU|bU-t6Ug*0RlaoI=B{Kd|~iNA~Z1!VuM;cxiOi!1k?Jj{HFJ`GjwxZizVGc&F`~ zj;fTlh*br-OcgRt3PKGf45PgN0^ax%a1_F+WGI8<^3jb8+Md!vgFq9=wH!!v$O!Ob z6|vrxcBumXfKkB!;W#uqE<1v+mW99hx-fD&!XNDq$J$o>WZyF#P|9Tn7tD@GT3BC6 zIOL%yL}t)PWB!<&@Lm`*NhLPFOpCDn-r8#`-;$+AXvjHnv8_=kBUELZ4`%f>+Xg_M z0&r-!1Ii49xQR(c5XP?9Cdb(_Cnf^#*_silI5D;Yi&rsOSb#jjw%&aJr^4VO@pzTl z7>_nHd|v;=IK`bH+bpVy+EL;1Q2Zw*l@hJF8R}2jRNiEJq;R!xW-2P@<|iepw{{f; zu0$a=srI8r?J}){wel^+aAVPd#Y?Lxnp7xHfV?hHu5GVyk%rz!+}HYD&N#A|gw<|! zrz#aDF8j^WrOXXsaCevBkz|o6W_*U*cy3%eWT=Bu%EFiG>|e(bg*O z@H4MjKW4^|wl?-)75O5BHW#U0duhBzCi7qiV3*5`o&r~}y{8Fqb?bKpvdHN)*$|y1 zqAnz|CHI!%+UTT$^mg=0KBGxq?w6iRvPOh$>MuBqI)-soe=C7X5YF57ccvY@9OiC6 zz8A8ceU&H(<85d5WTem-#=X+^Fr*s}b;B*?^I8dkg1Q{lvzs|0H0Z7)4dY0hl19MH zlH%fjG!Pb&nKu>O;ZA=xG9jnav2qZq3M_WB`fJ-#cjFJGg*LyAz|GTmk5Z58jSGDY z+eZ``Pqbs-yvAAM>Z? zcSxW!+p)O;yS=AoDF7X9VF#^0%oTiBMmG!?rp>#z#87_FeI0mJ{$U?F4;^b?M7pK@ zq++#wYZOQ;6uV9CwNkXVyHx{WC14CRCPi&qQ=)C$0?@9&4F+fj*zu_%yq&7KjiYyD z;P6bgRnL=am7CWtU5^(Mf(%UoQkLv@g!4uDOteC0SW-6nQisW8S%TMl^?b=z(YCn# z^Lt8Qa~;lxxaA0Le2~hlzhI)zd+!fXWMN!+ZU&01)@giO(wW%inl`8SM9FJTZ`;q_ zI_ow!6`i-o-`8oyii=udu2v+;+-=<zhVPbZV^_2)PiAG_6;4P) zyz+}+6{d+g%PYb^bW@X36m{` zGmFeo7)F8jG?0$unoZEpD%1;wQlYq_3ivj|s-ssVXq>L*%lo^hUk0qL`KLuu_)#+x z`y3tnoVUWA^~bQJ@05~hi*d*??v7H7?MkhMiPePRrkc>76ByNU4cMMq3vXcp`h=#J zbJfL(lh1jFCQXgcjN}ggq#M5e7COZz-3**go~|2k*fp`(|ZS%T#*pifpTNd@(sIx&eJEI713oEu>(DC#b25ykc{6zLug&0As8`1{$Nf% zz(vAN)d$QM9@q#bOrdo;g>@i|5w;!!_17ahCX%&*Ki}D;Z>aKjayqjL6MA9=r>uXx zY6QKtl-YF_6S2T-s$>X|5ae17yUt&YinAp_ zEoz~k@>13O4Uxo*6f;u_c3{fSZAk{4-`6)82v=ntP9kdeVxd;je8%JrQHUw(Cuim? zUzY-7Q=_GEkI7XP%gkRe7jBA8mW&Vm7_V-sJiTy1U1m%$u$|9K=xj?Nbxi0ixlekH zc?%f$Ia_Y55|t@pP%>gYOhY$MjU1iXilF@_HRTq;6&HKI>AHRXuPh~FE zsEgo~89dA|Ws3B*Ld5{oj*lrsPK^bs{DLc=;BI_pt>NiYBoy~8Qvd80 z{m$&FlI^hwlpUMXT<;W`jgF9g0RErb_&L>t!j)>zh)gg@=av6+@>V- z*KF?+o@x{!@%>lgrUt4;o>j=C92^(8oy5cru&^UM^CfAa@bQN~2|=Vir!96_KY@@x zVB9_gyVA07)%+YS1b!TG$^1~AO4N49sDtpNIK ztdn8vjj>o82g3I5+L?mCEz=56X$Y8yHEgAGK+o^nxppShuOSobb0sv^YhJDMdaig5 znPc(w8!em5aX(t-8Ptm-bC;*QV0lLibY5CK$QDDc-YavuT7Bi;Q+lX$a2C_FSih8%?rxfq97Sh7LV8Xfz%-D z3?m!^3kg&N!!WniGJM5K653WjW|un*?pF7dW7hRVR%bV%ft4DTB%v;{DS2~b7_q4@ z{$yxZi-_R>*pJvk@&r~HEz%I7mufq%)~vDxqcH+6TMJW7Gk;^kKa}g%X}|+k+-k2% zLsDV%zSU?wRu99-12*(?;b4QLx< z|7rG#B9!4|=+Zgs>)DBeriuca+^(w~LoVZO;s%Y)QL2uNK0S6I7A8zV3Q^QudN(IndCWpMzscM$q3wY*`I1}5BZjs3=FgiPrqu`%CErFE0D!f zWeS!NEX|%sm7IwB$ctzhoNc%=DDgLxUh5#lKgVh>vt|jNc3umghVn%drIk&yfLq2B zGBO95*3Qb0w{)RDDR$A zkyBH!A&8+9M@rkaNSo^S+y!2jmtG+ST#%K|Xhpw}qL|#rzAYX!Hu8mi<|f4_QqV~( zV8Gf{xL0tm5H0Fy#z12WaNT7GCb;!tQAz+vz$muDkDqP4elQ_`8&th`AaXtu=>kBA ze4tLpUxJG5k_DdQ2`WwM?_VV`-_?u-$i-J$-Xl9e#QJ(JE_ey76%uJUm{HCN%zT+{O zfHkYjLYnp?_oS>y=iaO9(p0%PEsnQ%@b(!Qs}YcEO~rqLHRiI%uSNCb5xiopMK{g; zaE;q}|GhbZzG`7BdI!hh@_=>i^ZujW^E;7vkErO;X&J3D%(C2)OmpTq191(N3}pI9 zkHWwrUElSU$ZF@Gt>1CqCJ}B3;$-{PSJ3HG62BWHonm|P6+}>s$Oq6PtS1m-C@+$- zAQpMEE^M(Pusns)Tp+>E#h0rGPT|j8>n|7QSzk*faoz+%om_ioxbsA)g z`{67tJ5K30u*QNUVj0?&~?oBC~ji#?mijV{pJlN)&=Bj>8hP<4k;haKl{dibsnysy(9Rv z_8|`J?lFMi5m#`#M$V-0<;2(jC%Pvu7dEy<4}$U zi4^*bbaaO5&&J;y(zF^~c)YTyGrn4YvGZu*jS@y5>H@%eNOEB$PoM;-`irt>S<9ro31 z6y!60AjqUtMs+Acp*|NBVDrQP71hZj%8ej26sb278_g2XEZ|_ahT5xGX}(z zfaU93V%GlgKg6H?OOf#3hL`_U7R3J}!%LDN5!_tWSm0f3JCOz+E7&lCNwd(Zv?6Ad z=4FX}4_(2&@RX{7faKVmJG;AP5S*T-+``X`*>N_{!$U!0=X#0G|1*{t?y~Clli|XC zx%OgZM!R~?wQKDQ0|F33{iN%P2(n(OOPG{LX+Dc^1u z>AdD=Z%w1joWLKrZS2&717g?4%7_1A@O(?LkToTWDVtUboEHxUQIXJxBP)ml67wF3 z;ly>{;|{!!{AQ~*o=>+zF7B$sMw{1;xx7qisRA?X1S|fB@9qkNd><{&eUvN3 zW7iDYH`8SteEk_!5|1}z|E%+3wi6>vA25fmVON({r-U0%x)7m_&KfWv}nhkQ(g5lFBiIsKO!PQO=IMHD3zk2r`fss6;-Dmd9CwZRLP%^#Q9*%<^yk;RQBAcUdA(0*^e@tw zDVvVTk^Dxk^8C#2PL?h5N9sD+WFVZd-1b98`HF99B*=3SVsl8Uw*mU00G`Vd)gtIP zbL62rp<(MRW@(?!-DmAj|MZvSnr}o~Dx}f6OW$(UMK&OPN%+tH z35XB?-doQC=TLSQ{@mWp>{Png@wioe#ShZCWs_#r`?alJze7Kd32uF8uR7Yuc62wA zP*G`!hScy{s-~es%hPA95FmexFUEVL&l#8wpAy8^I62y^DdsuW9+N9oL(M+^aA{7! zaZawC)t5|s!-O)+CTXtdK~@ZsD{9L&(7dXj!#`b1@;m%Tl=)0uVGvCUQd%gmIV0{uF{F*>$hRs4D3By?Z>`W{5C-yh z`)X^f0suIfK~Kj85y#^W@O=!~IQOu8BGN<#wouMmn)ejWGU>~gNj86#=?_WV7Z<#Y z+p0Em7Awr08QDSfDS0%IoVHCk>STD)KjAM>x-?_wi`BrV+!}FR71W%K~C%MKMkgTbEW)vhPKsgCE zhXWebGFv~ny@h@_io#6hk8{jwM(zrK+^oC3%qyw}uHAwOyGO0-eeN>4#rhcu9m@V?RjX zftoTgK^mPpOS8o$ z>&cv1Ozt%|^@>i}Q+}@Bt0d`Fp&ohsoZzAH$eWa<L@9ev&p$RKCiA)vY%9k+8s?rgUoiLSKI<%v;nAdDu_~9Dw$teqN zTF=k|c49vbyUU*Dq3{LT(!z=$d%h%RT4Y+#yBsmmVV^LpKXYb78C%QPe!0UEpG@%0 zt9T}&*UR;3_tu@7+u3-mxJ$TQzVdc$lap9T$!m}}GnzwySjo(N zZpgxvIlMaKJl34K2|~EI6jX=xGcB!)xOHpyn;kD_8=$|+2txT|*a-E&1S)cR8h$z`%Fz7Xw57)p z&uD9ue4=j;!V^B9y1{=XoL>L;onHH&%CmD$F+IW%^ees$l1S&0LLzd{qcV=Sv73O8 zX&o!YKFmRk1~|L+7)A013OXTqCPmg7V0b1V*_+n1`{ZgL(n^f<*BWosDWVYV@pQie{PSo>=74sE;`HYlQYN!VC%!gyx3ZeC2g$30>QH z%D__oX=a(S$r{C+{Xj57({dh9R7WAHV@+l=apVrGV)y&FGXZQh{8cetU(=Dt;38$I zSI%0V;V~)6>Mg#THxXdsYQS>wu>HGLJR0a4l{t*-VO-+m=;VSvk##VoQ0ohIi3vLm zThQH*bEloOs#Bn>zY!qp2%|wVVhSB(a|@w5(XznA!MJ3KPuuAZ0+In?~p=3G7DP%` z&cz!Ajrc74uF}4KZ7g)DEa!I{Qs{YXtveWsDA4f3tikuKt`sV3A|j!WgyaD_1u_Pz z`LAK&o?Jqi*VFuCn9Q@&RszmGFwK87k4oa&Rb1myk&1b_SUUhcKgz(iv;NOS z()SHwS25}BF$HrhvmgslTH~#JQ)-wy#%nmmJFEJHHP{G84_Cfdx< z(LsuE#gDIco%N5x2VMGv8pk7AOJBvz(3r*=ygFys%;S%mQkc}U97xcuk?;Y$#-Psr$-{4jZ7L zSHzQswpR2|lKtA$hq4-$cvq}JZXk(ASx?eqel`FFrI~M4D8JzyVH06W0CbtXoC#n- z>3kzK6H#Om;*g0V$On5$R&gMUGw@tn7or6eFq1eFB>&9nR~5x*%>v+AAtFPs79@eA zaTe4ocF$nRh-Diqt6d2{psSkd#977>DJkH?!5U96v}PCZClP1V7!iSTRvI0<=^-6) zdmO02y_9+bPy~gu6ADiX5}91mk)ZO;L^R%<&+BtyyICu=H_~_+PdivqGW_vlu`0!a ziQl~I99D7-2WQoZ-Rc0xLpEH@<}s|TxKeOR%v7D)dyTsm&ZIahOI*{H$;pKEZrEU?GgI!xAFZrsLFlFK@Ymo_c5mT77R|J5Mz>IqZK)^fp5 z6}!Va-jo2F8Uq>j5g%U*9WbGMgg)?nXZ_Qy7ME+r#f0&NhfJ^I+J{z>_R6-TGTRh2 zHDfmHiG&2%R@0_sUa$2t0cb?KO^5o)h092VK6sV4;QZPmJhxoVy|0#x<6V4os5wQZ1 zp+skrt-t&)P+|=z!Lvcv^t(_@<+$LG>KJEu0CqTp%_nJHBhgC4Q#|0r>?0R?Z#tqc zqpnJ``IBu{+s?rVws}tr-PzdXl9y9oQQ;-KP>Q~|yZE(CPnC=AtDJk$6MS(pBoMFy z3*g`Y0YnigA>XzTd6yTnE$F{od1_0Q2@;wznHha!XD~2okLmxmrA2lP_u`k6e)Z`5 zyGumd8lqupUEf=XJ>xIlWrwV@;Hzo4M;UQ)@wR`f%b(qT)C%M$Y%$6QdoQJbIuEQ; z2R_ZrO4zfFqkCooAX~pGufw;_)%Mo%8|-%64VI4y`8x-cZ%d^c8UzAG(E<^6u;iNt zqVaw>?x6~1h_Up$gb=OVDGx_8i!e;S2L%e(G|e+goy{fjo#?bOe=NPGTnZ>=1PKo1ojdC64#na^Lg! z1(r}cRAzLGqkXT1va*&=7)DjRuB01Ore$`25l2J7xe0N5g!3oCPbv5GsofKIOoVO( z_;2EH2WT%Jo&9QS97MgR*?y(o7)=DYIQ|8wYS%0Yk|ju+^A(Rnjo7!z4337Y^uBjm ztQhtdnc6q*!{cz+(4K)L9 z%PP_|9u98>W>5&!uA#iRR+iJGXm`G&d%IGxJSod-Gnx;xJU}e+A7Cgyla(zpx8Wzt zEKKwg4TZ8Qaen&#&apfK)L2ri?+;oK!&6CnNgxPCz#Y=skjgl&A;yr>7j#G^@6Vf~ zOr~z$oXcD-JEorQY^6zCUwX_`-&r}c(F#*0omzv}y_Y1y9qi72;lTGsOsnIG5JS1mB-=4f-Se11I#ldziIY4YI>3HkoA1P+Hr%P?&!AIAa4XIB?(CT7`R523M)>!jx2_l16yw@ z!x!2#VX8k0QD?@BGo8jjxar9g>3zV(vv$a66qZTr*kM%)$oYy6nCmESrNNgu}+;vauEP zr*lCV&J>Txy6LE{{zG+z>yw9n7x7^$Da!tPhx>SDsdBLK8jSH_E8ajES;@ObthqUH zdD$KsDZW%?L(dN~-zNZo1r=j!wjS6TWFt6I*t3;=k{2n(m&z#c;{C=ot7izV)t zcvi{751LvZjM&gy8{cO+C)fS4&*?l~c#_|b15PJjM_9+lMQhX0&0QY{EiJ1WB}iSWUe zSvHA2At=BnoP$TZCHban14x3#2hKISjyNst66D!`Xp~~g+YDwE`eE%vIr*@0kMR3L zUPS~tZkl_kGa^98U=YrDmdu**XiWXfP}^kU9-kF{`&TK7xpgDw5tKx$SjH1nR~ehg zyUDU47)s{bg+RP3I7|0V6`F{$ln*>pr9uvr@!mnO2Qr25aXVt;)~U{kK>3Re3HMwG zA$)<$C0k?KIeP|y?)CFMLO!=!ld^rfijq{S(pR#<1F>DOVYr7Bv)-x#SQydNhpu$3 zagA^ZdL$xc5&$LtH6eipA`L6I{(7RJOgXqG~LiO^-6^CjJHB8q5;w6T992c5rb$>bTk_ zu&mqR`PsGnCx_L)*-!pmUN7VQ;}d^%wwVTtK9Id+Q%}m)<-I$Gv%*Yr?yY2`%3NU% z;`Q;Q^hUFjyqGDI$*Jw5Q~Uwc0YZyy%#7Yak1nh8=`SD`Ph=g~btW>39)=>|n0i9_ zPu#&bCy4OBtOrR1X>0ULrYG90|MHFePlvew&NKMm^NaDvpO;al`l9C?o=lCxUd;xa z-cJ_$+_cV1#%7d-Atn03Z9FIN3^TXp|7QO}*o$x$Uv**D!wr%iN+nS) zl#YNL&9z~wym$vcs9>r%PJOPsAaCYU;dg25$zW8s{7nk^N@qc#~9NA^wqqD2+LND?3}_DHWDIEUCLA18r9&BiWr-{X5C z4Ah#pBdHDYzDA}IQn@tXqYd9FJ%xxI{er^_ZeKin{=Qy=`5~Agnj>^9t~X-St)>3x zm&h&vWX-fnW6zR*rc`>mgc>WbAdOx{#Px-{)dStNqNyQ`Ck1P^C1F#;Q7mwaIZ75S z3iq^$Aj)jDDiHDJA^jp)pQXx}ERmcW{SlkWp^b#4qw$xf6}&vLLXu<$%AswJa#ERy zVpiqZ9~~?}o&T{7hG13U*F7U)~R`fQ|9PRVnUP0TD6S#Fp^~7mnr~GtmjqP4h zC856nK}vfLbHy`Dg`e4J8$$749f_2W@Urd8m+kB2Q$aH3F4VM76n<9D>>I7pSz!dS)&wMi64A+m3o& zGTfwJMI#@=joG>C9xXcJ2GXpZX`MGTq5>LIeiaH7og_fXHf7~<7=NhzZDy5Y?V#JY zFt-6y+$<33rZVN(gO@DNu(kHW)QBE1xt$) zXw*j}xF}`Ies4T&_5q@IyQ2ug@<{@Zlpqa>X!9uhNF|La{el_1%7KX>#nQm zNRa77;70h=yW#GIHTGYZ(@>UoF=VgXyYDX`u;i)HQWfvZ>R-T*eLST9fwu8~twsO) zssLNfv-_EnO3K#lYsE5+ZRR7V5N+emSk@t@5h{2_AuJ&$8RLC-q|kl#ma~JYCK%Dm z-;8uuN9-mn=`X<6|A~fhtRQ(AZAy8cw3Y5;fWK~8ajBTnFn=%#yRXZ}z!b7(aG-sV z5U3LRl&53*oj(<_g>+9DC}g%j%`|;IcVWC6cclTfyt`ss5B^I2811e|*MG(DoiZMX z)!z1Qvp0g1D3RDep%rT%BTuS|K`A^kH+j(|2ER zXxKS6PD54Sm15t}K__F>=E2^YMZ!=$T?$(ti2bCj2qu19riLer_M=G)sA z2NOx#S=SqT8z!>p_=*8v`WE^ptGXmU0zue6c|_C<(u(5HB02~o61{2Y96L%qy?^IT z$mRA#i$|e1h1@Y$>YMkie{G(~A-7{bC=fE`s+!GK{Zd%awoEtuNdi=e-+~3@))H68 z=W?5X&q0BXi6G=ezgw+oUtMt_DQVQtJ!@kMLgyLu)SX)!?Tt+4mnj7sKhj}&!s};N zWXrTt<1NMThQ~J^ku<72o-DDmxu8&jrgkb;h{4dzw@-G zjavK||14>rjIA?7H!S{t4lLT*)Abjhtz#pRb58FMD_YaCik_oC71eh6?7#F9Z~b{$ zRK?!*gWV3PL7Zs8zQ9hwqxa)HE&rP5$`t%R+qeHe@gn|*oBY53&i{Mm@c$pH5cPNU F{{ZSTV~_v< literal 0 HcmV?d00001 diff --git a/docs/media/en/table-with-preceding-blank-line+++.jpg b/docs/media/en/table-with-preceding-blank-line+++.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70310c2e0209441cd55fac0cbc9a6ce9d4f576b1 GIT binary patch literal 53759 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 literal 0 HcmV?d00001 diff --git a/docs/media/en/table-with-preceding-blank-line-review.jpg b/docs/media/en/table-with-preceding-blank-line-review.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba044367cace6468d3b1fefc41bb3510fd47faa0 GIT binary patch literal 58262 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 D_$D=O literal 0 HcmV?d00001 diff --git a/docs/media/en/user-interface-overview.jpg b/docs/media/en/user-interface-overview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8fa4c255e6bdb6377e978c0d614ac6ffb61257a GIT binary patch literal 150201 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�ynNNLfwg5L*nFapkOV7%j7Mg@S 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ⅅCc;SE~+Q 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%0D`~2`)W-6D?h) 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 kfZ}f=?FsC3e{OtHCY57L{>ftbJMrXCe%Sw6uR literal 0 HcmV?d00001 diff --git a/docs/user-doco-vault/en/.obsidian/app.json b/docs/user-doco-vault/en/.obsidian/app.json new file mode 100644 index 00000000..4d49ab39 --- /dev/null +++ b/docs/user-doco-vault/en/.obsidian/app.json @@ -0,0 +1,4 @@ +{ + "promptDelete": false, + "alwaysUpdateLinks": true +} \ No newline at end of file diff --git a/docs/user-doco-vault/en/.obsidian/appearance.json b/docs/user-doco-vault/en/.obsidian/appearance.json new file mode 100644 index 00000000..4be79693 --- /dev/null +++ b/docs/user-doco-vault/en/.obsidian/appearance.json @@ -0,0 +1,3 @@ +{ + "theme": "obsidian" +} \ No newline at end of file diff --git a/docs/user-doco-vault/en/.obsidian/community-plugins.json b/docs/user-doco-vault/en/.obsidian/community-plugins.json new file mode 100644 index 00000000..a27f24bc --- /dev/null +++ b/docs/user-doco-vault/en/.obsidian/community-plugins.json @@ -0,0 +1,3 @@ +[ + "obsidian-spaced-repetition-rz" +] \ No newline at end of file diff --git a/docs/user-doco-vault/en/.obsidian/core-plugins-migration.json b/docs/user-doco-vault/en/.obsidian/core-plugins-migration.json new file mode 100644 index 00000000..436f43cf --- /dev/null +++ b/docs/user-doco-vault/en/.obsidian/core-plugins-migration.json @@ -0,0 +1,30 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "properties": false, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false +} \ No newline at end of file diff --git a/docs/user-doco-vault/en/.obsidian/core-plugins.json b/docs/user-doco-vault/en/.obsidian/core-plugins.json new file mode 100644 index 00000000..9405bfdc --- /dev/null +++ b/docs/user-doco-vault/en/.obsidian/core-plugins.json @@ -0,0 +1,20 @@ +[ + "file-explorer", + "global-search", + "switcher", + "graph", + "backlink", + "canvas", + "outgoing-link", + "tag-pane", + "page-preview", + "daily-notes", + "templates", + "note-composer", + "command-palette", + "editor-status", + "bookmarks", + "outline", + "word-count", + "file-recovery" +] \ No newline at end of file diff --git a/docs/user-doco-vault/en/.obsidian/graph.json b/docs/user-doco-vault/en/.obsidian/graph.json new file mode 100644 index 00000000..42a46eca --- /dev/null +++ b/docs/user-doco-vault/en/.obsidian/graph.json @@ -0,0 +1,22 @@ +{ + "collapse-filter": true, + "search": "", + "showTags": false, + "showAttachments": false, + "hideUnresolved": false, + "showOrphans": true, + "collapse-color-groups": true, + "colorGroups": [], + "collapse-display": true, + "showArrow": false, + "textFadeMultiplier": 0, + "nodeSizeMultiplier": 1, + "lineSizeMultiplier": 1, + "collapse-forces": true, + "centerStrength": 0.518713248970312, + "repelStrength": 10, + "linkStrength": 1, + "linkDistance": 250, + "scale": 1, + "close": true +} \ No newline at end of file diff --git a/docs/user-doco-vault/en/.obsidian/plugins/obsidian-spaced-repetition/data.json b/docs/user-doco-vault/en/.obsidian/plugins/obsidian-spaced-repetition/data.json new file mode 100644 index 00000000..5e8f0fb7 --- /dev/null +++ b/docs/user-doco-vault/en/.obsidian/plugins/obsidian-spaced-repetition/data.json @@ -0,0 +1,47 @@ +{ + "settings": { + "flashcardEasyText": "Easy", + "flashcardGoodText": "Good", + "flashcardHardText": "Hard", + "flashcardTags": [ + "#flashcards", + "#course" + ], + "convertFoldersToDecks": false, + "cardCommentOnSameLine": false, + "burySiblingCards": false, + "showContextInCards": true, + "flashcardHeightPercentage": 80, + "flashcardWidthPercentage": 40, + "randomizeCardOrder": null, + "flashcardCardOrder": "DueFirstRandom", + "flashcardDeckOrder": "PrevDeckComplete_Sequential", + "convertHighlightsToClozes": true, + "convertBoldTextToClozes": false, + "convertCurlyBracketsToClozes": false, + "singleLineCardSeparator": "::", + "singleLineReversedCardSeparator": ":::", + "multilineCardSeparator": "?", + "multilineReversedCardSeparator": "??", + "editLaterTag": "#edit-later", + "enableNoteReviewPaneOnStartup": true, + "tagsToReview": [ + "#review" + ], + "noteFoldersToIgnore": [], + "openRandomNote": false, + "autoNextNote": false, + "disableFileMenuReviewOptions": false, + "maxNDaysNotesReviewQueue": 365, + "initiallyExpandAllSubdecksInTree": true, + "baseEase": 250, + "lapsesIntervalChange": 0.5, + "easyBonus": 1.3, + "maximumInterval": 36525, + "maxLinkFactor": 1, + "showDebugMessages": false + }, + "buryDate": "2024-07-29", + "buryList": [], + "historyDeck": null +} \ No newline at end of file diff --git a/docs/user-doco-vault/en/.obsidian/plugins/obsidian-spaced-repetition/main.js b/docs/user-doco-vault/en/.obsidian/plugins/obsidian-spaced-repetition/main.js new file mode 100644 index 00000000..76392574 --- /dev/null +++ b/docs/user-doco-vault/en/.obsidian/plugins/obsidian-spaced-repetition/main.js @@ -0,0 +1,22802 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to2, from2, except, desc) => { + if (from2 && typeof from2 === "object" || typeof from2 === "function") { + for (let key of __getOwnPropNames(from2)) + if (!__hasOwnProp.call(to2, key) && key !== except) + __defProp(to2, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable }); + } + return to2; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; + +// node_modules/.pnpm/pagerank.js@1.0.2/node_modules/pagerank.js/lib/index.js +var require_lib = __commonJS({ + "node_modules/.pnpm/pagerank.js@1.0.2/node_modules/pagerank.js/lib/index.js"(exports, module2) { + "use strict"; + function forOwn(object, callback2) { + if (typeof object === "object" && typeof callback2 === "function") { + for (var key in object) { + if (object.hasOwnProperty(key) === true) { + if (callback2(key, object[key]) === false) { + break; + } + } + } + } + } + module2.exports = function() { + var self = { + count: 0, + edges: {}, + nodes: {} + }; + self.link = function(source, target, weight) { + if (isFinite(weight) !== true || weight === null) { + weight = 1; + } + weight = parseFloat(weight); + if (self.nodes.hasOwnProperty(source) !== true) { + self.count++; + self.nodes[source] = { + weight: 0, + outbound: 0 + }; + } + self.nodes[source].outbound += weight; + if (self.nodes.hasOwnProperty(target) !== true) { + self.count++; + self.nodes[target] = { + weight: 0, + outbound: 0 + }; + } + if (self.edges.hasOwnProperty(source) !== true) { + self.edges[source] = {}; + } + if (self.edges[source].hasOwnProperty(target) !== true) { + self.edges[source][target] = 0; + } + self.edges[source][target] += weight; + }; + self.rank = function(alpha2, epsilon, callback2) { + var delta = 1, inverse = 1 / self.count; + forOwn(self.edges, function(source) { + if (self.nodes[source].outbound > 0) { + forOwn(self.edges[source], function(target) { + self.edges[source][target] /= self.nodes[source].outbound; + }); + } + }); + forOwn(self.nodes, function(key) { + self.nodes[key].weight = inverse; + }); + while (delta > epsilon) { + var leak = 0, nodes = {}; + forOwn(self.nodes, function(key, value) { + nodes[key] = value.weight; + if (value.outbound === 0) { + leak += value.weight; + } + self.nodes[key].weight = 0; + }); + leak *= alpha2; + forOwn(self.nodes, function(source) { + forOwn(self.edges[source], function(target, weight) { + self.nodes[target].weight += alpha2 * nodes[source] * weight; + }); + self.nodes[source].weight += (1 - alpha2) * inverse + leak * inverse; + }); + delta = 0; + forOwn(self.nodes, function(key, value) { + delta += Math.abs(value.weight - nodes[key]); + }); + } + forOwn(self.nodes, function(key) { + return callback2(key, self.nodes[key].weight); + }); + }; + self.reset = function() { + self.count = 0; + self.edges = {}; + self.nodes = {}; + }; + return self; + }(); + } +}); + +// node_modules/.pnpm/vhtml@2.2.0/node_modules/vhtml/dist/vhtml.js +var require_vhtml = __commonJS({ + "node_modules/.pnpm/vhtml@2.2.0/node_modules/vhtml/dist/vhtml.js"(exports, module2) { + (function(global, factory) { + typeof exports === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.vhtml = factory(); + })(exports, function() { + "use strict"; + var emptyTags = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; + var esc = function esc2(str) { + return String(str).replace(/[&<>"']/g, function(s) { + return "&" + map3[s] + ";"; + }); + }; + var map3 = { "&": "amp", "<": "lt", ">": "gt", '"': "quot", "'": "apos" }; + var setInnerHTMLAttr = "dangerouslySetInnerHTML"; + var DOMAttributeNames = { + className: "class", + htmlFor: "for" + }; + var sanitized = {}; + function h4(name, attrs) { + var stack = [], s = ""; + attrs = attrs || {}; + for (var i = arguments.length; i-- > 2; ) { + stack.push(arguments[i]); + } + if (typeof name === "function") { + attrs.children = stack.reverse(); + return name(attrs); + } + if (name) { + s += "<" + name; + if (attrs) + for (var _i in attrs) { + if (attrs[_i] !== false && attrs[_i] != null && _i !== setInnerHTMLAttr) { + s += " " + (DOMAttributeNames[_i] ? DOMAttributeNames[_i] : esc(_i)) + '="' + esc(attrs[_i]) + '"'; + } + } + s += ">"; + } + if (emptyTags.indexOf(name) === -1) { + if (attrs[setInnerHTMLAttr]) { + s += attrs[setInnerHTMLAttr].__html; + } else + while (stack.length) { + var child = stack.pop(); + if (child) { + if (child.pop) { + for (var _i2 = child.length; _i2--; ) { + stack.push(child[_i2]); + } + } else { + s += sanitized[child] === true ? child : esc(child); + } + } + } + s += name ? "" : ""; + } + sanitized[s] = true; + return s; + } + return h4; + }); + } +}); + +// node_modules/.pnpm/moment@2.30.1/node_modules/moment/moment.js +var require_moment = __commonJS({ + "node_modules/.pnpm/moment@2.30.1/node_modules/moment/moment.js"(exports, module2) { + (function(global, factory) { + typeof exports === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.moment = factory(); + })(exports, function() { + "use strict"; + var hookCallback; + function hooks() { + return hookCallback.apply(null, arguments); + } + function setHookCallback(callback2) { + hookCallback = callback2; + } + function isArray2(input) { + return input instanceof Array || Object.prototype.toString.call(input) === "[object Array]"; + } + function isObject2(input) { + return input != null && Object.prototype.toString.call(input) === "[object Object]"; + } + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } + function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return Object.getOwnPropertyNames(obj).length === 0; + } else { + var k; + for (k in obj) { + if (hasOwnProp(obj, k)) { + return false; + } + } + return true; + } + } + function isUndefined(input) { + return input === void 0; + } + function isNumber2(input) { + return typeof input === "number" || Object.prototype.toString.call(input) === "[object Number]"; + } + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === "[object Date]"; + } + function map3(arr, fn) { + var res = [], i, arrLen = arr.length; + for (i = 0; i < arrLen; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + if (hasOwnProp(b, "toString")) { + a.toString = b.toString; + } + if (hasOwnProp(b, "valueOf")) { + a.valueOf = b.valueOf; + } + return a; + } + function createUTC(input, format2, locale3, strict) { + return createLocalOrUTC(input, format2, locale3, strict, true).utc(); + } + function defaultParsingFlags() { + return { + empty: false, + unusedTokens: [], + unusedInput: [], + overflow: -2, + charsLeftOver: 0, + nullInput: false, + invalidEra: null, + invalidMonth: null, + invalidFormat: false, + userInvalidated: false, + iso: false, + parsedDateParts: [], + era: null, + meridiem: null, + rfc2822: false, + weekdayMismatch: false + }; + } + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } + var some; + if (Array.prototype.some) { + some = Array.prototype.some; + } else { + some = function(fun) { + var t2 = Object(this), len = t2.length >>> 0, i; + for (i = 0; i < len; i++) { + if (i in t2 && fun.call(this, t2[i], i, t2)) { + return true; + } + } + return false; + }; + } + function isValid(m) { + var flags = null, parsedParts = false, isNowValid = m._d && !isNaN(m._d.getTime()); + if (isNowValid) { + flags = getParsingFlags(m); + parsedParts = some.call(flags.parsedDateParts, function(i) { + return i != null; + }); + isNowValid = flags.overflow < 0 && !flags.empty && !flags.invalidEra && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || flags.meridiem && parsedParts); + if (m._strict) { + isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === void 0; + } + } + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } else { + return isNowValid; + } + return m._isValid; + } + function createInvalid(flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } else { + getParsingFlags(m).userInvalidated = true; + } + return m; + } + var momentProperties = hooks.momentProperties = [], updateInProgress = false; + function copyConfig(to3, from3) { + var i, prop, val, momentPropertiesLen = momentProperties.length; + if (!isUndefined(from3._isAMomentObject)) { + to3._isAMomentObject = from3._isAMomentObject; + } + if (!isUndefined(from3._i)) { + to3._i = from3._i; + } + if (!isUndefined(from3._f)) { + to3._f = from3._f; + } + if (!isUndefined(from3._l)) { + to3._l = from3._l; + } + if (!isUndefined(from3._strict)) { + to3._strict = from3._strict; + } + if (!isUndefined(from3._tzm)) { + to3._tzm = from3._tzm; + } + if (!isUndefined(from3._isUTC)) { + to3._isUTC = from3._isUTC; + } + if (!isUndefined(from3._offset)) { + to3._offset = from3._offset; + } + if (!isUndefined(from3._pf)) { + to3._pf = getParsingFlags(from3); + } + if (!isUndefined(from3._locale)) { + to3._locale = from3._locale; + } + if (momentPropertiesLen > 0) { + for (i = 0; i < momentPropertiesLen; i++) { + prop = momentProperties[i]; + val = from3[prop]; + if (!isUndefined(val)) { + to3[prop] = val; + } + } + } + return to3; + } + function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = /* @__PURE__ */ new Date(NaN); + } + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } + } + function isMoment(obj) { + return obj instanceof Moment || obj != null && obj._isAMomentObject != null; + } + function warn(msg) { + if (hooks.suppressDeprecationWarnings === false && typeof console !== "undefined" && console.warn) { + console.warn("Deprecation warning: " + msg); + } + } + function deprecate(msg, fn) { + var firstTime = true; + return extend(function() { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = [], arg, i, key, argLen = arguments.length; + for (i = 0; i < argLen; i++) { + arg = ""; + if (typeof arguments[i] === "object") { + arg += "\n[" + i + "] "; + for (key in arguments[0]) { + if (hasOwnProp(arguments[0], key)) { + arg += key + ": " + arguments[0][key] + ", "; + } + } + arg = arg.slice(0, -2); + } else { + arg = arguments[i]; + } + args.push(arg); + } + warn( + msg + "\nArguments: " + Array.prototype.slice.call(args).join("") + "\n" + new Error().stack + ); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + var deprecations = {}; + function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } + hooks.suppressDeprecationWarnings = false; + hooks.deprecationHandler = null; + function isFunction2(input) { + return typeof Function !== "undefined" && input instanceof Function || Object.prototype.toString.call(input) === "[object Function]"; + } + function set2(config) { + var prop, i; + for (i in config) { + if (hasOwnProp(config, i)) { + prop = config[i]; + if (isFunction2(prop)) { + this[i] = prop; + } else { + this["_" + i] = prop; + } + } + } + this._config = config; + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + "|" + /\d{1,2}/.source + ); + } + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject2(parentConfig[prop]) && isObject2(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject2(parentConfig[prop])) { + res[prop] = extend({}, res[prop]); + } + } + return res; + } + function Locale(config) { + if (config != null) { + this.set(config); + } + } + var keys; + if (Object.keys) { + keys = Object.keys; + } else { + keys = function(obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; + } + var defaultCalendar = { + sameDay: "[Today at] LT", + nextDay: "[Tomorrow at] LT", + nextWeek: "dddd [at] LT", + lastDay: "[Yesterday at] LT", + lastWeek: "[Last] dddd [at] LT", + sameElse: "L" + }; + function calendar(key, mom, now2) { + var output = this._calendar[key] || this._calendar["sameElse"]; + return isFunction2(output) ? output.call(mom, now2) : output; + } + function zeroFill(number, targetLength, forceSign) { + var absNumber = "" + Math.abs(number), zerosToFill = targetLength - absNumber.length, sign3 = number >= 0; + return (sign3 ? forceSign ? "+" : "" : "-") + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + } + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, formatFunctions = {}, formatTokenFunctions = {}; + function addFormatToken(token2, padded, ordinal2, callback2) { + var func = callback2; + if (typeof callback2 === "string") { + func = function() { + return this[callback2](); + }; + } + if (token2) { + formatTokenFunctions[token2] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function() { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal2) { + formatTokenFunctions[ordinal2] = function() { + return this.localeData().ordinal( + func.apply(this, arguments), + token2 + ); + }; + } + } + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ""); + } + return input.replace(/\\/g, ""); + } + function makeFormatFunction(format2) { + var array = format2.match(formattingTokens), i, length; + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + return function(mom) { + var output = "", i2; + for (i2 = 0; i2 < length; i2++) { + output += isFunction2(array[i2]) ? array[i2].call(mom, format2) : array[i2]; + } + return output; + }; + } + function formatMoment(m, format2) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + format2 = expandFormat(format2, m.localeData()); + formatFunctions[format2] = formatFunctions[format2] || makeFormatFunction(format2); + return formatFunctions[format2](m); + } + function expandFormat(format2, locale3) { + var i = 5; + function replaceLongDateFormatTokens(input) { + return locale3.longDateFormat(input) || input; + } + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format2)) { + format2 = format2.replace( + localFormattingTokens, + replaceLongDateFormatTokens + ); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + return format2; + } + var defaultLongDateFormat = { + LTS: "h:mm:ss A", + LT: "h:mm A", + L: "MM/DD/YYYY", + LL: "MMMM D, YYYY", + LLL: "MMMM D, YYYY h:mm A", + LLLL: "dddd, MMMM D, YYYY h:mm A" + }; + function longDateFormat(key) { + var format2 = this._longDateFormat[key], formatUpper = this._longDateFormat[key.toUpperCase()]; + if (format2 || !formatUpper) { + return format2; + } + this._longDateFormat[key] = formatUpper.match(formattingTokens).map(function(tok) { + if (tok === "MMMM" || tok === "MM" || tok === "DD" || tok === "dddd") { + return tok.slice(1); + } + return tok; + }).join(""); + return this._longDateFormat[key]; + } + var defaultInvalidDate = "Invalid date"; + function invalidDate() { + return this._invalidDate; + } + var defaultOrdinal = "%d", defaultDayOfMonthOrdinalParse = /\d{1,2}/; + function ordinal(number) { + return this._ordinal.replace("%d", number); + } + var defaultRelativeTime = { + future: "in %s", + past: "%s ago", + s: "a few seconds", + ss: "%d seconds", + m: "a minute", + mm: "%d minutes", + h: "an hour", + hh: "%d hours", + d: "a day", + dd: "%d days", + w: "a week", + ww: "%d weeks", + M: "a month", + MM: "%d months", + y: "a year", + yy: "%d years" + }; + function relativeTime(number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return isFunction2(output) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); + } + function pastFuture(diff2, output) { + var format2 = this._relativeTime[diff2 > 0 ? "future" : "past"]; + return isFunction2(format2) ? format2(output) : format2.replace(/%s/i, output); + } + var aliases = { + D: "date", + dates: "date", + date: "date", + d: "day", + days: "day", + day: "day", + e: "weekday", + weekdays: "weekday", + weekday: "weekday", + E: "isoWeekday", + isoweekdays: "isoWeekday", + isoweekday: "isoWeekday", + DDD: "dayOfYear", + dayofyears: "dayOfYear", + dayofyear: "dayOfYear", + h: "hour", + hours: "hour", + hour: "hour", + ms: "millisecond", + milliseconds: "millisecond", + millisecond: "millisecond", + m: "minute", + minutes: "minute", + minute: "minute", + M: "month", + months: "month", + month: "month", + Q: "quarter", + quarters: "quarter", + quarter: "quarter", + s: "second", + seconds: "second", + second: "second", + gg: "weekYear", + weekyears: "weekYear", + weekyear: "weekYear", + GG: "isoWeekYear", + isoweekyears: "isoWeekYear", + isoweekyear: "isoWeekYear", + w: "week", + weeks: "week", + week: "week", + W: "isoWeek", + isoweeks: "isoWeek", + isoweek: "isoWeek", + y: "year", + years: "year", + year: "year" + }; + function normalizeUnits(units) { + return typeof units === "string" ? aliases[units] || aliases[units.toLowerCase()] : void 0; + } + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, normalizedProp, prop; + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + return normalizedInput; + } + var priorities = { + date: 9, + day: 11, + weekday: 11, + isoWeekday: 11, + dayOfYear: 4, + hour: 13, + millisecond: 16, + minute: 14, + month: 8, + quarter: 7, + second: 15, + weekYear: 1, + isoWeekYear: 1, + week: 5, + isoWeek: 5, + year: 1 + }; + function getPrioritizedUnits(unitsObj) { + var units = [], u; + for (u in unitsObj) { + if (hasOwnProp(unitsObj, u)) { + units.push({ unit: u, priority: priorities[u] }); + } + } + units.sort(function(a, b) { + return a.priority - b.priority; + }); + return units; + } + var match1 = /\d/, match2 = /\d\d/, match3 = /\d{3}/, match4 = /\d{4}/, match6 = /[+-]?\d{6}/, match1to2 = /\d\d?/, match3to4 = /\d\d\d\d?/, match5to6 = /\d\d\d\d\d\d?/, match1to3 = /\d{1,3}/, match1to4 = /\d{1,4}/, match1to6 = /[+-]?\d{1,6}/, matchUnsigned = /\d+/, matchSigned = /[+-]?\d+/, matchOffset = /Z|[+-]\d\d:?\d\d/gi, matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, match1to2NoLeadingZero = /^[1-9]\d?/, match1to2HasZero = /^([1-9]\d|\d)/, regexes; + regexes = {}; + function addRegexToken(token2, regex, strictRegex) { + regexes[token2] = isFunction2(regex) ? regex : function(isStrict, localeData2) { + return isStrict && strictRegex ? strictRegex : regex; + }; + } + function getParseRegexForToken(token2, config) { + if (!hasOwnProp(regexes, token2)) { + return new RegExp(unescapeFormat(token2)); + } + return regexes[token2](config._strict, config._locale); + } + function unescapeFormat(s) { + return regexEscape( + s.replace("\\", "").replace( + /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, + function(matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + } + ) + ); + } + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"); + } + function absFloor(number) { + if (number < 0) { + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } + } + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, value = 0; + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + return value; + } + var tokens = {}; + function addParseToken(token2, callback2) { + var i, func = callback2, tokenLen; + if (typeof token2 === "string") { + token2 = [token2]; + } + if (isNumber2(callback2)) { + func = function(input, array) { + array[callback2] = toInt(input); + }; + } + tokenLen = token2.length; + for (i = 0; i < tokenLen; i++) { + tokens[token2[i]] = func; + } + } + function addWeekParseToken(token2, callback2) { + addParseToken(token2, function(input, array, config, token3) { + config._w = config._w || {}; + callback2(input, config._w, config, token3); + }); + } + function addTimeToArrayFromToken(token2, input, config) { + if (input != null && hasOwnProp(tokens, token2)) { + tokens[token2](input, config._a, config, token2); + } + } + function isLeapYear(year) { + return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; + } + var YEAR = 0, MONTH = 1, DATE = 2, HOUR = 3, MINUTE = 4, SECOND = 5, MILLISECOND = 6, WEEK = 7, WEEKDAY = 8; + addFormatToken("Y", 0, 0, function() { + var y = this.year(); + return y <= 9999 ? zeroFill(y, 4) : "+" + y; + }); + addFormatToken(0, ["YY", 2], 0, function() { + return this.year() % 100; + }); + addFormatToken(0, ["YYYY", 4], 0, "year"); + addFormatToken(0, ["YYYYY", 5], 0, "year"); + addFormatToken(0, ["YYYYYY", 6, true], 0, "year"); + addRegexToken("Y", matchSigned); + addRegexToken("YY", match1to2, match2); + addRegexToken("YYYY", match1to4, match4); + addRegexToken("YYYYY", match1to6, match6); + addRegexToken("YYYYYY", match1to6, match6); + addParseToken(["YYYYY", "YYYYYY"], YEAR); + addParseToken("YYYY", function(input, array) { + array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); + }); + addParseToken("YY", function(input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); + }); + addParseToken("Y", function(input, array) { + array[YEAR] = parseInt(input, 10); + }); + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + hooks.parseTwoDigitYear = function(input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2e3); + }; + var getSetYear = makeGetSet("FullYear", true); + function getIsLeapYear() { + return isLeapYear(this.year()); + } + function makeGetSet(unit, keepTime) { + return function(value) { + if (value != null) { + set$1(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; + } + function get(mom, unit) { + if (!mom.isValid()) { + return NaN; + } + var d = mom._d, isUTC = mom._isUTC; + switch (unit) { + case "Milliseconds": + return isUTC ? d.getUTCMilliseconds() : d.getMilliseconds(); + case "Seconds": + return isUTC ? d.getUTCSeconds() : d.getSeconds(); + case "Minutes": + return isUTC ? d.getUTCMinutes() : d.getMinutes(); + case "Hours": + return isUTC ? d.getUTCHours() : d.getHours(); + case "Date": + return isUTC ? d.getUTCDate() : d.getDate(); + case "Day": + return isUTC ? d.getUTCDay() : d.getDay(); + case "Month": + return isUTC ? d.getUTCMonth() : d.getMonth(); + case "FullYear": + return isUTC ? d.getUTCFullYear() : d.getFullYear(); + default: + return NaN; + } + } + function set$1(mom, unit, value) { + var d, isUTC, year, month, date; + if (!mom.isValid() || isNaN(value)) { + return; + } + d = mom._d; + isUTC = mom._isUTC; + switch (unit) { + case "Milliseconds": + return void (isUTC ? d.setUTCMilliseconds(value) : d.setMilliseconds(value)); + case "Seconds": + return void (isUTC ? d.setUTCSeconds(value) : d.setSeconds(value)); + case "Minutes": + return void (isUTC ? d.setUTCMinutes(value) : d.setMinutes(value)); + case "Hours": + return void (isUTC ? d.setUTCHours(value) : d.setHours(value)); + case "Date": + return void (isUTC ? d.setUTCDate(value) : d.setDate(value)); + case "FullYear": + break; + default: + return; + } + year = value; + month = mom.month(); + date = mom.date(); + date = date === 29 && month === 1 && !isLeapYear(year) ? 28 : date; + void (isUTC ? d.setUTCFullYear(year, month, date) : d.setFullYear(year, month, date)); + } + function stringGet(units) { + units = normalizeUnits(units); + if (isFunction2(this[units])) { + return this[units](); + } + return this; + } + function stringSet(units, value) { + if (typeof units === "object") { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units), i, prioritizedLen = prioritized.length; + for (i = 0; i < prioritizedLen; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction2(this[units])) { + return this[units](value); + } + } + return this; + } + function mod(n, x) { + return (n % x + x) % x; + } + var indexOf; + if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; + } else { + indexOf = function(o) { + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; + } + function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 ? isLeapYear(year) ? 29 : 28 : 31 - modMonth % 7 % 2; + } + addFormatToken("M", ["MM", 2], "Mo", function() { + return this.month() + 1; + }); + addFormatToken("MMM", 0, 0, function(format2) { + return this.localeData().monthsShort(this, format2); + }); + addFormatToken("MMMM", 0, 0, function(format2) { + return this.localeData().months(this, format2); + }); + addRegexToken("M", match1to2, match1to2NoLeadingZero); + addRegexToken("MM", match1to2, match2); + addRegexToken("MMM", function(isStrict, locale3) { + return locale3.monthsShortRegex(isStrict); + }); + addRegexToken("MMMM", function(isStrict, locale3) { + return locale3.monthsRegex(isStrict); + }); + addParseToken(["M", "MM"], function(input, array) { + array[MONTH] = toInt(input) - 1; + }); + addParseToken(["MMM", "MMMM"], function(input, array, config, token2) { + var month = config._locale.monthsParse(input, token2, config._strict); + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); + var defaultLocaleMonths = "January_February_March_April_May_June_July_August_September_October_November_December".split( + "_" + ), defaultLocaleMonthsShort = "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, defaultMonthsShortRegex = matchWord, defaultMonthsRegex = matchWord; + function localeMonths(m, format2) { + if (!m) { + return isArray2(this._months) ? this._months : this._months["standalone"]; + } + return isArray2(this._months) ? this._months[m.month()] : this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format2) ? "format" : "standalone"][m.month()]; + } + function localeMonthsShort(m, format2) { + if (!m) { + return isArray2(this._monthsShort) ? this._monthsShort : this._monthsShort["standalone"]; + } + return isArray2(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[MONTHS_IN_FORMAT.test(format2) ? "format" : "standalone"][m.month()]; + } + function handleStrictParse(monthName, format2, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2e3, i]); + this._shortMonthsParse[i] = this.monthsShort( + mom, + "" + ).toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, "").toLocaleLowerCase(); + } + } + if (strict) { + if (format2 === "MMM") { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format2 === "MMM") { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } + } + function localeMonthsParse(monthName, format2, strict) { + var i, mom, regex; + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format2, strict); + } + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + for (i = 0; i < 12; i++) { + mom = createUTC([2e3, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp( + "^" + this.months(mom, "").replace(".", "") + "$", + "i" + ); + this._shortMonthsParse[i] = new RegExp( + "^" + this.monthsShort(mom, "").replace(".", "") + "$", + "i" + ); + } + if (!strict && !this._monthsParse[i]) { + regex = "^" + this.months(mom, "") + "|^" + this.monthsShort(mom, ""); + this._monthsParse[i] = new RegExp(regex.replace(".", ""), "i"); + } + if (strict && format2 === "MMMM" && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format2 === "MMM" && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } + function setMonth(mom, value) { + if (!mom.isValid()) { + return mom; + } + if (typeof value === "string") { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + if (!isNumber2(value)) { + return mom; + } + } + } + var month = value, date = mom.date(); + date = date < 29 ? date : Math.min(date, daysInMonth(mom.year(), month)); + void (mom._isUTC ? mom._d.setUTCMonth(month, date) : mom._d.setMonth(month, date)); + return mom; + } + function getSetMonth(value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, "Month"); + } + } + function getDaysInMonth() { + return daysInMonth(this.year(), this.month()); + } + function monthsShortRegex(isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, "_monthsRegex")) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, "_monthsShortRegex")) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex; + } + } + function monthsRegex(isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, "_monthsRegex")) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, "_monthsRegex")) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex; + } + } + function computeMonthsParse() { + function cmpLenRev(a, b) { + return b.length - a.length; + } + var shortPieces = [], longPieces = [], mixedPieces = [], i, mom, shortP, longP; + for (i = 0; i < 12; i++) { + mom = createUTC([2e3, i]); + shortP = regexEscape(this.monthsShort(mom, "")); + longP = regexEscape(this.months(mom, "")); + shortPieces.push(shortP); + longPieces.push(longP); + mixedPieces.push(longP); + mixedPieces.push(shortP); + } + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + this._monthsRegex = new RegExp("^(" + mixedPieces.join("|") + ")", "i"); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp( + "^(" + longPieces.join("|") + ")", + "i" + ); + this._monthsShortStrictRegex = new RegExp( + "^(" + shortPieces.join("|") + ")", + "i" + ); + } + function createDate(y, m, d, h4, M, s, ms) { + var date; + if (y < 100 && y >= 0) { + date = new Date(y + 400, m, d, h4, M, s, ms); + if (isFinite(date.getFullYear())) { + date.setFullYear(y); + } + } else { + date = new Date(y, m, d, h4, M, s, ms); + } + return date; + } + function createUTCDate(y) { + var date, args; + if (y < 100 && y >= 0) { + args = Array.prototype.slice.call(arguments); + args[0] = y + 400; + date = new Date(Date.UTC.apply(null, args)); + if (isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + } else { + date = new Date(Date.UTC.apply(null, arguments)); + } + return date; + } + function firstWeekOffset(year, dow, doy) { + var fwd = 7 + dow - doy, fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + return -fwdlw + fwd - 1; + } + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, weekOffset = firstWeekOffset(year, dow, doy), dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, resYear, resDayOfYear; + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + return { + year: resYear, + dayOfYear: resDayOfYear + }; + } + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, resWeek, resYear; + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + return { + week: resWeek, + year: resYear + }; + } + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; + } + addFormatToken("w", ["ww", 2], "wo", "week"); + addFormatToken("W", ["WW", 2], "Wo", "isoWeek"); + addRegexToken("w", match1to2, match1to2NoLeadingZero); + addRegexToken("ww", match1to2, match2); + addRegexToken("W", match1to2, match1to2NoLeadingZero); + addRegexToken("WW", match1to2, match2); + addWeekParseToken( + ["w", "ww", "W", "WW"], + function(input, week, config, token2) { + week[token2.substr(0, 1)] = toInt(input); + } + ); + function localeWeek(mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + var defaultLocaleWeek = { + dow: 0, + // Sunday is the first day of the week. + doy: 6 + // The week that contains Jan 6th is the first week of the year. + }; + function localeFirstDayOfWeek() { + return this._week.dow; + } + function localeFirstDayOfYear() { + return this._week.doy; + } + function getSetWeek(input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, "d"); + } + function getSetISOWeek(input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, "d"); + } + addFormatToken("d", 0, "do", "day"); + addFormatToken("dd", 0, 0, function(format2) { + return this.localeData().weekdaysMin(this, format2); + }); + addFormatToken("ddd", 0, 0, function(format2) { + return this.localeData().weekdaysShort(this, format2); + }); + addFormatToken("dddd", 0, 0, function(format2) { + return this.localeData().weekdays(this, format2); + }); + addFormatToken("e", 0, 0, "weekday"); + addFormatToken("E", 0, 0, "isoWeekday"); + addRegexToken("d", match1to2); + addRegexToken("e", match1to2); + addRegexToken("E", match1to2); + addRegexToken("dd", function(isStrict, locale3) { + return locale3.weekdaysMinRegex(isStrict); + }); + addRegexToken("ddd", function(isStrict, locale3) { + return locale3.weekdaysShortRegex(isStrict); + }); + addRegexToken("dddd", function(isStrict, locale3) { + return locale3.weekdaysRegex(isStrict); + }); + addWeekParseToken(["dd", "ddd", "dddd"], function(input, week, config, token2) { + var weekday = config._locale.weekdaysParse(input, token2, config._strict); + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); + addWeekParseToken(["d", "e", "E"], function(input, week, config, token2) { + week[token2] = toInt(input); + }); + function parseWeekday(input, locale3) { + if (typeof input !== "string") { + return input; + } + if (!isNaN(input)) { + return parseInt(input, 10); + } + input = locale3.weekdaysParse(input); + if (typeof input === "number") { + return input; + } + return null; + } + function parseIsoWeekday(input, locale3) { + if (typeof input === "string") { + return locale3.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; + } + function shiftWeekdays(ws, n) { + return ws.slice(n, 7).concat(ws.slice(0, n)); + } + var defaultLocaleWeekdays = "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), defaultLocaleWeekdaysShort = "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), defaultLocaleWeekdaysMin = "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), defaultWeekdaysRegex = matchWord, defaultWeekdaysShortRegex = matchWord, defaultWeekdaysMinRegex = matchWord; + function localeWeekdays(m, format2) { + var weekdays = isArray2(this._weekdays) ? this._weekdays : this._weekdays[m && m !== true && this._weekdays.isFormat.test(format2) ? "format" : "standalone"]; + return m === true ? shiftWeekdays(weekdays, this._week.dow) : m ? weekdays[m.day()] : weekdays; + } + function localeWeekdaysShort(m) { + return m === true ? shiftWeekdays(this._weekdaysShort, this._week.dow) : m ? this._weekdaysShort[m.day()] : this._weekdaysShort; + } + function localeWeekdaysMin(m) { + return m === true ? shiftWeekdays(this._weekdaysMin, this._week.dow) : m ? this._weekdaysMin[m.day()] : this._weekdaysMin; + } + function handleStrictParse$1(weekdayName, format2, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + for (i = 0; i < 7; ++i) { + mom = createUTC([2e3, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin( + mom, + "" + ).toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort( + mom, + "" + ).toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, "").toLocaleLowerCase(); + } + } + if (strict) { + if (format2 === "dddd") { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format2 === "ddd") { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format2 === "dddd") { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format2 === "ddd") { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } + } + function localeWeekdaysParse(weekdayName, format2, strict) { + var i, mom, regex; + if (this._weekdaysParseExact) { + return handleStrictParse$1.call(this, weekdayName, format2, strict); + } + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } + for (i = 0; i < 7; i++) { + mom = createUTC([2e3, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp( + "^" + this.weekdays(mom, "").replace(".", "\\.?") + "$", + "i" + ); + this._shortWeekdaysParse[i] = new RegExp( + "^" + this.weekdaysShort(mom, "").replace(".", "\\.?") + "$", + "i" + ); + this._minWeekdaysParse[i] = new RegExp( + "^" + this.weekdaysMin(mom, "").replace(".", "\\.?") + "$", + "i" + ); + } + if (!this._weekdaysParse[i]) { + regex = "^" + this.weekdays(mom, "") + "|^" + this.weekdaysShort(mom, "") + "|^" + this.weekdaysMin(mom, ""); + this._weekdaysParse[i] = new RegExp(regex.replace(".", ""), "i"); + } + if (strict && format2 === "dddd" && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format2 === "ddd" && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format2 === "dd" && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } + function getSetDayOfWeek(input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = get(this, "Day"); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, "d"); + } else { + return day; + } + } + function getSetLocaleDayOfWeek(input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, "d"); + } + function getSetISODayOfWeek(input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } + } + function weekdaysRegex(isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, "_weekdaysRegex")) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, "_weekdaysRegex")) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex; + } + } + function weekdaysShortRegex(isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, "_weekdaysRegex")) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, "_weekdaysShortRegex")) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } + } + function weekdaysMinRegex(isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, "_weekdaysRegex")) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, "_weekdaysMinRegex")) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } + } + function computeWeekdaysParse() { + function cmpLenRev(a, b) { + return b.length - a.length; + } + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + mom = createUTC([2e3, 1]).day(i); + minp = regexEscape(this.weekdaysMin(mom, "")); + shortp = regexEscape(this.weekdaysShort(mom, "")); + longp = regexEscape(this.weekdays(mom, "")); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + this._weekdaysRegex = new RegExp("^(" + mixedPieces.join("|") + ")", "i"); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + this._weekdaysStrictRegex = new RegExp( + "^(" + longPieces.join("|") + ")", + "i" + ); + this._weekdaysShortStrictRegex = new RegExp( + "^(" + shortPieces.join("|") + ")", + "i" + ); + this._weekdaysMinStrictRegex = new RegExp( + "^(" + minPieces.join("|") + ")", + "i" + ); + } + function hFormat() { + return this.hours() % 12 || 12; + } + function kFormat() { + return this.hours() || 24; + } + addFormatToken("H", ["HH", 2], 0, "hour"); + addFormatToken("h", ["hh", 2], 0, hFormat); + addFormatToken("k", ["kk", 2], 0, kFormat); + addFormatToken("hmm", 0, 0, function() { + return "" + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); + addFormatToken("hmmss", 0, 0, function() { + return "" + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); + }); + addFormatToken("Hmm", 0, 0, function() { + return "" + this.hours() + zeroFill(this.minutes(), 2); + }); + addFormatToken("Hmmss", 0, 0, function() { + return "" + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); + }); + function meridiem(token2, lowercase) { + addFormatToken(token2, 0, 0, function() { + return this.localeData().meridiem( + this.hours(), + this.minutes(), + lowercase + ); + }); + } + meridiem("a", true); + meridiem("A", false); + function matchMeridiem(isStrict, locale3) { + return locale3._meridiemParse; + } + addRegexToken("a", matchMeridiem); + addRegexToken("A", matchMeridiem); + addRegexToken("H", match1to2, match1to2HasZero); + addRegexToken("h", match1to2, match1to2NoLeadingZero); + addRegexToken("k", match1to2, match1to2NoLeadingZero); + addRegexToken("HH", match1to2, match2); + addRegexToken("hh", match1to2, match2); + addRegexToken("kk", match1to2, match2); + addRegexToken("hmm", match3to4); + addRegexToken("hmmss", match5to6); + addRegexToken("Hmm", match3to4); + addRegexToken("Hmmss", match5to6); + addParseToken(["H", "HH"], HOUR); + addParseToken(["k", "kk"], function(input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; + }); + addParseToken(["a", "A"], function(input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(["h", "hh"], function(input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + addParseToken("hmm", function(input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken("hmmss", function(input, array, config) { + var pos1 = input.length - 4, pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken("Hmm", function(input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken("Hmmss", function(input, array, config) { + var pos1 = input.length - 4, pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); + function localeIsPM(input) { + return (input + "").toLowerCase().charAt(0) === "p"; + } + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i, getSetHour = makeGetSet("Hours", true); + function localeMeridiem(hours2, minutes2, isLower) { + if (hours2 > 11) { + return isLower ? "pm" : "PM"; + } else { + return isLower ? "am" : "AM"; + } + } + var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, + week: defaultLocaleWeek, + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, + meridiemParse: defaultLocaleMeridiemParse + }; + var locales = {}, localeFamilies = {}, globalLocale; + function commonPrefix(arr1, arr2) { + var i, minl = Math.min(arr1.length, arr2.length); + for (i = 0; i < minl; i += 1) { + if (arr1[i] !== arr2[i]) { + return i; + } + } + return minl; + } + function normalizeLocale(key) { + return key ? key.toLowerCase().replace("_", "-") : key; + } + function chooseLocale(names2) { + var i = 0, j, next, locale3, split; + while (i < names2.length) { + split = normalizeLocale(names2[i]).split("-"); + j = split.length; + next = normalizeLocale(names2[i + 1]); + next = next ? next.split("-") : null; + while (j > 0) { + locale3 = loadLocale(split.slice(0, j).join("-")); + if (locale3) { + return locale3; + } + if (next && next.length >= j && commonPrefix(split, next) >= j - 1) { + break; + } + j--; + } + i++; + } + return globalLocale; + } + function isLocaleNameSane(name) { + return !!(name && name.match("^[^/\\\\]*$")); + } + function loadLocale(name) { + var oldLocale = null, aliasedRequire; + if (locales[name] === void 0 && typeof module2 !== "undefined" && module2 && module2.exports && isLocaleNameSane(name)) { + try { + oldLocale = globalLocale._abbr; + aliasedRequire = require; + aliasedRequire("./locale/" + name); + getSetGlobalLocale(oldLocale); + } catch (e) { + locales[name] = null; + } + } + return locales[name]; + } + function getSetGlobalLocale(key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } else { + data = defineLocale(key, values); + } + if (data) { + globalLocale = data; + } else { + if (typeof console !== "undefined" && console.warn) { + console.warn( + "Locale " + key + " not found. Did you forget to load it?" + ); + } + } + } + return globalLocale._abbr; + } + function defineLocale(name, config) { + if (config !== null) { + var locale3, parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple( + "defineLocaleOverride", + "use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info." + ); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + locale3 = loadLocale(config.parentLocale); + if (locale3 != null) { + parentConfig = locale3._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name, + config + }); + return null; + } + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); + if (localeFamilies[name]) { + localeFamilies[name].forEach(function(x) { + defineLocale(x.name, x.config); + }); + } + getSetGlobalLocale(name); + return locales[name]; + } else { + delete locales[name]; + return null; + } + } + function updateLocale(name, config) { + if (config != null) { + var locale3, tmpLocale, parentConfig = baseConfig; + if (locales[name] != null && locales[name].parentLocale != null) { + locales[name].set(mergeConfigs(locales[name]._config, config)); + } else { + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + if (tmpLocale == null) { + config.abbr = name; + } + locale3 = new Locale(config); + locale3.parentLocale = locales[name]; + locales[name] = locale3; + } + getSetGlobalLocale(name); + } else { + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + if (name === getSetGlobalLocale()) { + getSetGlobalLocale(name); + } + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; + } + function getLocale(key) { + var locale3; + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + if (!key) { + return globalLocale; + } + if (!isArray2(key)) { + locale3 = loadLocale(key); + if (locale3) { + return locale3; + } + key = [key]; + } + return chooseLocale(key); + } + function listLocales() { + return keys(locales); + } + function checkOverflow(m) { + var overflow, a = m._a; + if (a && getParsingFlags(m).overflow === -2) { + overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1; + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + getParsingFlags(m).overflow = overflow; + } + return m; + } + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, isoDates = [ + ["YYYYYY-MM-DD", /[+-]\d{6}-\d\d-\d\d/], + ["YYYY-MM-DD", /\d{4}-\d\d-\d\d/], + ["GGGG-[W]WW-E", /\d{4}-W\d\d-\d/], + ["GGGG-[W]WW", /\d{4}-W\d\d/, false], + ["YYYY-DDD", /\d{4}-\d{3}/], + ["YYYY-MM", /\d{4}-\d\d/, false], + ["YYYYYYMMDD", /[+-]\d{10}/], + ["YYYYMMDD", /\d{8}/], + ["GGGG[W]WWE", /\d{4}W\d{3}/], + ["GGGG[W]WW", /\d{4}W\d{2}/, false], + ["YYYYDDD", /\d{7}/], + ["YYYYMM", /\d{6}/, false], + ["YYYY", /\d{4}/, false] + ], isoTimes = [ + ["HH:mm:ss.SSSS", /\d\d:\d\d:\d\d\.\d+/], + ["HH:mm:ss,SSSS", /\d\d:\d\d:\d\d,\d+/], + ["HH:mm:ss", /\d\d:\d\d:\d\d/], + ["HH:mm", /\d\d:\d\d/], + ["HHmmss.SSSS", /\d\d\d\d\d\d\.\d+/], + ["HHmmss,SSSS", /\d\d\d\d\d\d,\d+/], + ["HHmmss", /\d\d\d\d\d\d/], + ["HHmm", /\d\d\d\d/], + ["HH", /\d\d/] + ], aspNetJsonRegex = /^\/?Date\((-?\d+)/i, rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; + function configFromISO(config) { + var i, l, string = config._i, match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), allowTime, dateFormat, timeFormat, tzFormat, isoDatesLen = isoDates.length, isoTimesLen = isoTimes.length; + if (match) { + getParsingFlags(config).iso = true; + for (i = 0, l = isoDatesLen; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimesLen; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + timeFormat = (match[2] || " ") + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = "Z"; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || "") + (tzFormat || ""); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } + return result; + } + function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2e3 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; + } + function preprocessRFC2822(s) { + return s.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").replace(/^\s\s*/, "").replace(/\s\s*$/, ""); + } + function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), weekdayActual = new Date( + parsedInput[0], + parsedInput[1], + parsedInput[2] + ).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; + return false; + } + } + return true; + } + function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + return 0; + } else { + var hm = parseInt(numOffset, 10), m = hm % 100, h4 = (hm - m) / 100; + return h4 * 60 + m; + } + } + function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)), parsedArray; + if (match) { + parsedArray = extractFromRFC2822Strings( + match[4], + match[3], + match[2], + match[5], + match[6], + match[7] + ); + if (!checkWeekday(match[1], parsedArray, config)) { + return; + } + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + getParsingFlags(config).rfc2822 = true; + } else { + config._isValid = false; + } + } + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); + if (matched !== null) { + config._d = /* @__PURE__ */ new Date(+matched[1]); + return; + } + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + configFromRFC2822(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + if (config._strict) { + config._isValid = false; + } else { + hooks.createFromInputFallback(config); + } + } + hooks.createFromInputFallback = deprecate( + "value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.", + function(config) { + config._d = /* @__PURE__ */ new Date(config._i + (config._useUTC ? " UTC" : "")); + } + ); + function defaults2(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; + } + function currentDateArray(config) { + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [ + nowValue.getUTCFullYear(), + nowValue.getUTCMonth(), + nowValue.getUTCDate() + ]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + } + function configFromArray(config) { + var i, date, input = [], currentDate, expectedWeekday, yearToUse; + if (config._d) { + return; + } + currentDate = currentDateArray(config); + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + if (config._dayOfYear != null) { + yearToUse = defaults2(config._a[YEAR], currentDate[YEAR]); + if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { + getParsingFlags(config)._overflowDayOfYear = true; + } + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + for (; i < 7; i++) { + config._a[i] = input[i] = config._a[i] == null ? i === 2 ? 1 : 0 : config._a[i]; + } + if (config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + config._d = (config._useUTC ? createUTCDate : createDate).apply( + null, + input + ); + expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + if (config._nextDay) { + config._a[HOUR] = 24; + } + if (config._w && typeof config._w.d !== "undefined" && config._w.d !== expectedWeekday) { + getParsingFlags(config).weekdayMismatch = true; + } + } + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek; + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + weekYear = defaults2( + w.GG, + config._a[YEAR], + weekOfYear(createLocal(), 1, 4).year + ); + week = defaults2(w.W, 1); + weekday = defaults2(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + curWeek = weekOfYear(createLocal(), dow, doy); + weekYear = defaults2(w.gg, config._a[YEAR], curWeek.year); + week = defaults2(w.w, curWeek.week); + if (w.d != null) { + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + } + hooks.ISO_8601 = function() { + }; + hooks.RFC_2822 = function() { + }; + function configFromStringAndFormat(config) { + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; + var string = "" + config._i, i, parsedInput, tokens2, token2, skipped, stringLength = string.length, totalParsedInputLength = 0, era, tokenLen; + tokens2 = expandFormat(config._f, config._locale).match(formattingTokens) || []; + tokenLen = tokens2.length; + for (i = 0; i < tokenLen; i++) { + token2 = tokens2[i]; + parsedInput = (string.match(getParseRegexForToken(token2, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice( + string.indexOf(parsedInput) + parsedInput.length + ); + totalParsedInputLength += parsedInput.length; + } + if (formatTokenFunctions[token2]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } else { + getParsingFlags(config).unusedTokens.push(token2); + } + addTimeToArrayFromToken(token2, parsedInput, config); + } else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token2); + } + } + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + if (config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = void 0; + } + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + config._a[HOUR] = meridiemFixWrap( + config._locale, + config._a[HOUR], + config._meridiem + ); + era = getParsingFlags(config).era; + if (era !== null) { + config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]); + } + configFromArray(config); + checkOverflow(config); + } + function meridiemFixWrap(locale3, hour, meridiem2) { + var isPm; + if (meridiem2 == null) { + return hour; + } + if (locale3.meridiemHour != null) { + return locale3.meridiemHour(hour, meridiem2); + } else if (locale3.isPM != null) { + isPm = locale3.isPM(meridiem2); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + return hour; + } + } + function configFromStringAndArray(config) { + var tempConfig, bestMoment, scoreToBeat, i, currentScore, validFormatFound, bestFormatIsValid = false, configfLen = config._f.length; + if (configfLen === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = /* @__PURE__ */ new Date(NaN); + return; + } + for (i = 0; i < configfLen; i++) { + currentScore = 0; + validFormatFound = false; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + if (isValid(tempConfig)) { + validFormatFound = true; + } + currentScore += getParsingFlags(tempConfig).charsLeftOver; + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + getParsingFlags(tempConfig).score = currentScore; + if (!bestFormatIsValid) { + if (scoreToBeat == null || currentScore < scoreToBeat || validFormatFound) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + if (validFormatFound) { + bestFormatIsValid = true; + } + } + } else { + if (currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + } + extend(config, bestMoment || tempConfig); + } + function configFromObject(config) { + if (config._d) { + return; + } + var i = normalizeObjectUnits(config._i), dayOrDate = i.day === void 0 ? i.date : i.day; + config._a = map3( + [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond], + function(obj) { + return obj && parseInt(obj, 10); + } + ); + configFromArray(config); + } + function createFromConfig(config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + res.add(1, "d"); + res._nextDay = void 0; + } + return res; + } + function prepareConfig(config) { + var input = config._i, format2 = config._f; + config._locale = config._locale || getLocale(config._l); + if (input === null || format2 === void 0 && input === "") { + return createInvalid({ nullInput: true }); + } + if (typeof input === "string") { + config._i = input = config._locale.preparse(input); + } + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray2(format2)) { + configFromStringAndArray(config); + } else if (format2) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } + if (!isValid(config)) { + config._d = null; + } + return config; + } + function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === "string") { + configFromString(config); + } else if (isArray2(input)) { + config._a = map3(input.slice(0), function(obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject2(input)) { + configFromObject(config); + } else if (isNumber2(input)) { + config._d = new Date(input); + } else { + hooks.createFromInputFallback(config); + } + } + function createLocalOrUTC(input, format2, locale3, strict, isUTC) { + var c = {}; + if (format2 === true || format2 === false) { + strict = format2; + format2 = void 0; + } + if (locale3 === true || locale3 === false) { + strict = locale3; + locale3 = void 0; + } + if (isObject2(input) && isObjectEmpty(input) || isArray2(input) && input.length === 0) { + input = void 0; + } + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale3; + c._i = input; + c._f = format2; + c._strict = strict; + return createFromConfig(c); + } + function createLocal(input, format2, locale3, strict) { + return createLocalOrUTC(input, format2, locale3, strict, false); + } + var prototypeMin = deprecate( + "moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/", + function() { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } + ), prototypeMax = deprecate( + "moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/", + function() { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } + ); + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray2(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + function min() { + var args = [].slice.call(arguments, 0); + return pickBy("isBefore", args); + } + function max() { + var args = [].slice.call(arguments, 0); + return pickBy("isAfter", args); + } + var now = function() { + return Date.now ? Date.now() : +/* @__PURE__ */ new Date(); + }; + var ordering = [ + "year", + "quarter", + "month", + "week", + "day", + "hour", + "minute", + "second", + "millisecond" + ]; + function isDurationValid(m) { + var key, unitHasDecimal = false, i, orderLen = ordering.length; + for (key in m) { + if (hasOwnProp(m, key) && !(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + return false; + } + } + for (i = 0; i < orderLen; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; + } + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; + } + } + } + return true; + } + function isValid$1() { + return this._isValid; + } + function createInvalid$1() { + return createDuration(NaN); + } + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), years2 = normalizedInput.year || 0, quarters = normalizedInput.quarter || 0, months2 = normalizedInput.month || 0, weeks2 = normalizedInput.week || normalizedInput.isoWeek || 0, days2 = normalizedInput.day || 0, hours2 = normalizedInput.hour || 0, minutes2 = normalizedInput.minute || 0, seconds2 = normalizedInput.second || 0, milliseconds2 = normalizedInput.millisecond || 0; + this._isValid = isDurationValid(normalizedInput); + this._milliseconds = +milliseconds2 + seconds2 * 1e3 + // 1000 + minutes2 * 6e4 + // 1000 * 60 + hours2 * 1e3 * 60 * 60; + this._days = +days2 + weeks2 * 7; + this._months = +months2 + quarters * 3 + years2 * 12; + this._data = {}; + this._locale = getLocale(); + this._bubble(); + } + function isDuration(obj) { + return obj instanceof Duration; + } + function absRound(number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } + } + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), diffs = 0, i; + for (i = 0; i < len; i++) { + if (dontConvert && array1[i] !== array2[i] || !dontConvert && toInt(array1[i]) !== toInt(array2[i])) { + diffs++; + } + } + return diffs + lengthDiff; + } + function offset(token2, separator) { + addFormatToken(token2, 0, 0, function() { + var offset2 = this.utcOffset(), sign3 = "+"; + if (offset2 < 0) { + offset2 = -offset2; + sign3 = "-"; + } + return sign3 + zeroFill(~~(offset2 / 60), 2) + separator + zeroFill(~~offset2 % 60, 2); + }); + } + offset("Z", ":"); + offset("ZZ", ""); + addRegexToken("Z", matchShortOffset); + addRegexToken("ZZ", matchShortOffset); + addParseToken(["Z", "ZZ"], function(input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); + }); + var chunkOffset = /([\+\-]|\d\d)/gi; + function offsetFromString(matcher, string) { + var matches = (string || "").match(matcher), chunk, parts, minutes2; + if (matches === null) { + return null; + } + chunk = matches[matches.length - 1] || []; + parts = (chunk + "").match(chunkOffset) || ["-", 0, 0]; + minutes2 = +(parts[1] * 60) + toInt(parts[2]); + return minutes2 === 0 ? 0 : parts[0] === "+" ? minutes2 : -minutes2; + } + function cloneWithOffset(input, model) { + var res, diff2; + if (model._isUTC) { + res = model.clone(); + diff2 = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); + res._d.setTime(res._d.valueOf() + diff2); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } + } + function getDateOffset(m) { + return -Math.round(m._d.getTimezoneOffset()); + } + hooks.updateOffset = function() { + }; + function getSetOffset(input, keepLocalTime, keepMinutes) { + var offset2 = this._offset || 0, localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === "string") { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; + } + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, "m"); + } + if (offset2 !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract( + this, + createDuration(input - offset2, "m"), + 1, + false + ); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset2 : getDateOffset(this); + } + } + function getSetZone(input, keepLocalTime) { + if (input != null) { + if (typeof input !== "string") { + input = -input; + } + this.utcOffset(input, keepLocalTime); + return this; + } else { + return -this.utcOffset(); + } + } + function setOffsetToUTC(keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + } + function setOffsetToLocal(keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + if (keepLocalTime) { + this.subtract(getDateOffset(this), "m"); + } + } + return this; + } + function setOffsetToParsedOffset() { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === "string") { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } else { + this.utcOffset(0, true); + } + } + return this; + } + function hasAlignedHourOffset(input) { + if (!this.isValid()) { + return false; + } + input = input ? createLocal(input).utcOffset() : 0; + return (this.utcOffset() - input) % 60 === 0; + } + function isDaylightSavingTime() { + return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset(); + } + function isDaylightSavingTimeShifted() { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + var c = {}, other; + copyConfig(c, this); + c = prepareConfig(c); + if (c._a) { + other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + return this._isDSTShifted; + } + function isLocal() { + return this.isValid() ? !this._isUTC : false; + } + function isUtcOffset() { + return this.isValid() ? this._isUTC : false; + } + function isUtc() { + return this.isValid() ? this._isUTC && this._offset === 0 : false; + } + var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/, isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + function createDuration(input, key) { + var duration = input, match = null, sign3, ret, diffRes; + if (isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (isNumber2(input) || !isNaN(+input)) { + duration = {}; + if (key) { + duration[key] = +input; + } else { + duration.milliseconds = +input; + } + } else if (match = aspNetRegex.exec(input)) { + sign3 = match[1] === "-" ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign3, + h: toInt(match[HOUR]) * sign3, + m: toInt(match[MINUTE]) * sign3, + s: toInt(match[SECOND]) * sign3, + ms: toInt(absRound(match[MILLISECOND] * 1e3)) * sign3 + // the millisecond decimal point is included in the match + }; + } else if (match = isoRegex.exec(input)) { + sign3 = match[1] === "-" ? -1 : 1; + duration = { + y: parseIso(match[2], sign3), + M: parseIso(match[3], sign3), + w: parseIso(match[4], sign3), + d: parseIso(match[5], sign3), + h: parseIso(match[6], sign3), + m: parseIso(match[7], sign3), + s: parseIso(match[8], sign3) + }; + } else if (duration == null) { + duration = {}; + } else if (typeof duration === "object" && ("from" in duration || "to" in duration)) { + diffRes = momentsDifference( + createLocal(duration.from), + createLocal(duration.to) + ); + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + ret = new Duration(duration); + if (isDuration(input) && hasOwnProp(input, "_locale")) { + ret._locale = input._locale; + } + if (isDuration(input) && hasOwnProp(input, "_isValid")) { + ret._isValid = input._isValid; + } + return ret; + } + createDuration.fn = Duration.prototype; + createDuration.invalid = createInvalid$1; + function parseIso(inp, sign3) { + var res = inp && parseFloat(inp.replace(",", ".")); + return (isNaN(res) ? 0 : res) * sign3; + } + function positiveMomentsDifference(base, other) { + var res = {}; + res.months = other.month() - base.month() + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, "M").isAfter(other)) { + --res.months; + } + res.milliseconds = +other - +base.clone().add(res.months, "M"); + return res; + } + function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return { milliseconds: 0, months: 0 }; + } + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + return res; + } + function createAdder(direction, name) { + return function(val, period) { + var dur, tmp; + if (period !== null && !isNaN(+period)) { + deprecateSimple( + name, + "moment()." + name + "(period, number) is deprecated. Please use moment()." + name + "(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info." + ); + tmp = val; + val = period; + period = tmp; + } + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; + }; + } + function addSubtract(mom, duration, isAdding, updateOffset) { + var milliseconds2 = duration._milliseconds, days2 = absRound(duration._days), months2 = absRound(duration._months); + if (!mom.isValid()) { + return; + } + updateOffset = updateOffset == null ? true : updateOffset; + if (months2) { + setMonth(mom, get(mom, "Month") + months2 * isAdding); + } + if (days2) { + set$1(mom, "Date", get(mom, "Date") + days2 * isAdding); + } + if (milliseconds2) { + mom._d.setTime(mom._d.valueOf() + milliseconds2 * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days2 || months2); + } + } + var add = createAdder(1, "add"), subtract = createAdder(-1, "subtract"); + function isString(input) { + return typeof input === "string" || input instanceof String; + } + function isMomentInput(input) { + return isMoment(input) || isDate(input) || isString(input) || isNumber2(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === void 0; + } + function isMomentInputObject(input) { + var objectTest = isObject2(input) && !isObjectEmpty(input), propertyTest = false, properties = [ + "years", + "year", + "y", + "months", + "month", + "M", + "days", + "day", + "d", + "dates", + "date", + "D", + "hours", + "hour", + "h", + "minutes", + "minute", + "m", + "seconds", + "second", + "s", + "milliseconds", + "millisecond", + "ms" + ], i, property, propertyLen = properties.length; + for (i = 0; i < propertyLen; i += 1) { + property = properties[i]; + propertyTest = propertyTest || hasOwnProp(input, property); + } + return objectTest && propertyTest; + } + function isNumberOrStringArray(input) { + var arrayTest = isArray2(input), dataTypeTest = false; + if (arrayTest) { + dataTypeTest = input.filter(function(item) { + return !isNumber2(item) && isString(input); + }).length === 0; + } + return arrayTest && dataTypeTest; + } + function isCalendarSpec(input) { + var objectTest = isObject2(input) && !isObjectEmpty(input), propertyTest = false, properties = [ + "sameDay", + "nextDay", + "lastDay", + "nextWeek", + "lastWeek", + "sameElse" + ], i, property; + for (i = 0; i < properties.length; i += 1) { + property = properties[i]; + propertyTest = propertyTest || hasOwnProp(input, property); + } + return objectTest && propertyTest; + } + function getCalendarFormat(myMoment, now2) { + var diff2 = myMoment.diff(now2, "days", true); + return diff2 < -6 ? "sameElse" : diff2 < -1 ? "lastWeek" : diff2 < 0 ? "lastDay" : diff2 < 1 ? "sameDay" : diff2 < 2 ? "nextDay" : diff2 < 7 ? "nextWeek" : "sameElse"; + } + function calendar$1(time, formats) { + if (arguments.length === 1) { + if (!arguments[0]) { + time = void 0; + formats = void 0; + } else if (isMomentInput(arguments[0])) { + time = arguments[0]; + formats = void 0; + } else if (isCalendarSpec(arguments[0])) { + formats = arguments[0]; + time = void 0; + } + } + var now2 = time || createLocal(), sod = cloneWithOffset(now2, this).startOf("day"), format2 = hooks.calendarFormat(this, sod) || "sameElse", output = formats && (isFunction2(formats[format2]) ? formats[format2].call(this, now2) : formats[format2]); + return this.format( + output || this.localeData().calendar(format2, this, createLocal(now2)) + ); + } + function clone3() { + return new Moment(this); + } + function isAfter(input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || "millisecond"; + if (units === "millisecond") { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } + } + function isBefore(input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || "millisecond"; + if (units === "millisecond") { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } + } + function isBetween(from3, to3, units, inclusivity) { + var localFrom = isMoment(from3) ? from3 : createLocal(from3), localTo = isMoment(to3) ? to3 : createLocal(to3); + if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { + return false; + } + inclusivity = inclusivity || "()"; + return (inclusivity[0] === "(" ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && (inclusivity[1] === ")" ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)); + } + function isSame(input, units) { + var localInput = isMoment(input) ? input : createLocal(input), inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || "millisecond"; + if (units === "millisecond") { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + } + } + function isSameOrAfter(input, units) { + return this.isSame(input, units) || this.isAfter(input, units); + } + function isSameOrBefore(input, units) { + return this.isSame(input, units) || this.isBefore(input, units); + } + function diff(input, units, asFloat) { + var that, zoneDelta, output; + if (!this.isValid()) { + return NaN; + } + that = cloneWithOffset(input, this); + if (!that.isValid()) { + return NaN; + } + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + units = normalizeUnits(units); + switch (units) { + case "year": + output = monthDiff(this, that) / 12; + break; + case "month": + output = monthDiff(this, that); + break; + case "quarter": + output = monthDiff(this, that) / 3; + break; + case "second": + output = (this - that) / 1e3; + break; + case "minute": + output = (this - that) / 6e4; + break; + case "hour": + output = (this - that) / 36e5; + break; + case "day": + output = (this - that - zoneDelta) / 864e5; + break; + case "week": + output = (this - that - zoneDelta) / 6048e5; + break; + default: + output = this - that; + } + return asFloat ? output : absFloor(output); + } + function monthDiff(a, b) { + if (a.date() < b.date()) { + return -monthDiff(b, a); + } + var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()), anchor = a.clone().add(wholeMonthDiff, "months"), anchor2, adjust; + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, "months"); + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, "months"); + adjust = (b - anchor) / (anchor2 - anchor); + } + return -(wholeMonthDiff + adjust) || 0; + } + hooks.defaultFormat = "YYYY-MM-DDTHH:mm:ssZ"; + hooks.defaultFormatUtc = "YYYY-MM-DDTHH:mm:ss[Z]"; + function toString() { + return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ"); + } + function toISOString(keepOffset) { + if (!this.isValid()) { + return null; + } + var utc = keepOffset !== true, m = utc ? this.clone().utc() : this; + if (m.year() < 0 || m.year() > 9999) { + return formatMoment( + m, + utc ? "YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYYYY-MM-DD[T]HH:mm:ss.SSSZ" + ); + } + if (isFunction2(Date.prototype.toISOString)) { + if (utc) { + return this.toDate().toISOString(); + } else { + return new Date(this.valueOf() + this.utcOffset() * 60 * 1e3).toISOString().replace("Z", formatMoment(m, "Z")); + } + } + return formatMoment( + m, + utc ? "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYY-MM-DD[T]HH:mm:ss.SSSZ" + ); + } + function inspect() { + if (!this.isValid()) { + return "moment.invalid(/* " + this._i + " */)"; + } + var func = "moment", zone = "", prefix, year, datetime, suffix; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? "moment.utc" : "moment.parseZone"; + zone = "Z"; + } + prefix = "[" + func + '("]'; + year = 0 <= this.year() && this.year() <= 9999 ? "YYYY" : "YYYYYY"; + datetime = "-MM-DD[T]HH:mm:ss.SSS"; + suffix = zone + '[")]'; + return this.format(prefix + year + datetime + suffix); + } + function format(inputString) { + if (!inputString) { + inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); + } + function from2(time, withoutSuffix) { + if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) { + return createDuration({ to: this, from: time }).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + function fromNow(withoutSuffix) { + return this.from(createLocal(), withoutSuffix); + } + function to2(time, withoutSuffix) { + if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) { + return createDuration({ from: this, to: time }).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + function toNow(withoutSuffix) { + return this.to(createLocal(), withoutSuffix); + } + function locale2(key) { + var newLocaleData; + if (key === void 0) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + } + var lang = deprecate( + "moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.", + function(key) { + if (key === void 0) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ); + function localeData() { + return this._locale; + } + var MS_PER_SECOND = 1e3, MS_PER_MINUTE = 60 * MS_PER_SECOND, MS_PER_HOUR = 60 * MS_PER_MINUTE, MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; + function mod$1(dividend, divisor) { + return (dividend % divisor + divisor) % divisor; + } + function localStartOfDate(y, m, d) { + if (y < 100 && y >= 0) { + return new Date(y + 400, m, d) - MS_PER_400_YEARS; + } else { + return new Date(y, m, d).valueOf(); + } + } + function utcStartOfDate(y, m, d) { + if (y < 100 && y >= 0) { + return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; + } else { + return Date.UTC(y, m, d); + } + } + function startOf(units) { + var time, startOfDate; + units = normalizeUnits(units); + if (units === void 0 || units === "millisecond" || !this.isValid()) { + return this; + } + startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; + switch (units) { + case "year": + time = startOfDate(this.year(), 0, 1); + break; + case "quarter": + time = startOfDate( + this.year(), + this.month() - this.month() % 3, + 1 + ); + break; + case "month": + time = startOfDate(this.year(), this.month(), 1); + break; + case "week": + time = startOfDate( + this.year(), + this.month(), + this.date() - this.weekday() + ); + break; + case "isoWeek": + time = startOfDate( + this.year(), + this.month(), + this.date() - (this.isoWeekday() - 1) + ); + break; + case "day": + case "date": + time = startOfDate(this.year(), this.month(), this.date()); + break; + case "hour": + time = this._d.valueOf(); + time -= mod$1( + time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), + MS_PER_HOUR + ); + break; + case "minute": + time = this._d.valueOf(); + time -= mod$1(time, MS_PER_MINUTE); + break; + case "second": + time = this._d.valueOf(); + time -= mod$1(time, MS_PER_SECOND); + break; + } + this._d.setTime(time); + hooks.updateOffset(this, true); + return this; + } + function endOf(units) { + var time, startOfDate; + units = normalizeUnits(units); + if (units === void 0 || units === "millisecond" || !this.isValid()) { + return this; + } + startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; + switch (units) { + case "year": + time = startOfDate(this.year() + 1, 0, 1) - 1; + break; + case "quarter": + time = startOfDate( + this.year(), + this.month() - this.month() % 3 + 3, + 1 + ) - 1; + break; + case "month": + time = startOfDate(this.year(), this.month() + 1, 1) - 1; + break; + case "week": + time = startOfDate( + this.year(), + this.month(), + this.date() - this.weekday() + 7 + ) - 1; + break; + case "isoWeek": + time = startOfDate( + this.year(), + this.month(), + this.date() - (this.isoWeekday() - 1) + 7 + ) - 1; + break; + case "day": + case "date": + time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; + break; + case "hour": + time = this._d.valueOf(); + time += MS_PER_HOUR - mod$1( + time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), + MS_PER_HOUR + ) - 1; + break; + case "minute": + time = this._d.valueOf(); + time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; + break; + case "second": + time = this._d.valueOf(); + time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; + break; + } + this._d.setTime(time); + hooks.updateOffset(this, true); + return this; + } + function valueOf() { + return this._d.valueOf() - (this._offset || 0) * 6e4; + } + function unix() { + return Math.floor(this.valueOf() / 1e3); + } + function toDate() { + return new Date(this.valueOf()); + } + function toArray() { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hour(), + m.minute(), + m.second(), + m.millisecond() + ]; + } + function toObject() { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; + } + function toJSON() { + return this.isValid() ? this.toISOString() : null; + } + function isValid$2() { + return isValid(this); + } + function parsingFlags() { + return extend({}, getParsingFlags(this)); + } + function invalidAt() { + return getParsingFlags(this).overflow; + } + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; + } + addFormatToken("N", 0, 0, "eraAbbr"); + addFormatToken("NN", 0, 0, "eraAbbr"); + addFormatToken("NNN", 0, 0, "eraAbbr"); + addFormatToken("NNNN", 0, 0, "eraName"); + addFormatToken("NNNNN", 0, 0, "eraNarrow"); + addFormatToken("y", ["y", 1], "yo", "eraYear"); + addFormatToken("y", ["yy", 2], 0, "eraYear"); + addFormatToken("y", ["yyy", 3], 0, "eraYear"); + addFormatToken("y", ["yyyy", 4], 0, "eraYear"); + addRegexToken("N", matchEraAbbr); + addRegexToken("NN", matchEraAbbr); + addRegexToken("NNN", matchEraAbbr); + addRegexToken("NNNN", matchEraName); + addRegexToken("NNNNN", matchEraNarrow); + addParseToken( + ["N", "NN", "NNN", "NNNN", "NNNNN"], + function(input, array, config, token2) { + var era = config._locale.erasParse(input, token2, config._strict); + if (era) { + getParsingFlags(config).era = era; + } else { + getParsingFlags(config).invalidEra = input; + } + } + ); + addRegexToken("y", matchUnsigned); + addRegexToken("yy", matchUnsigned); + addRegexToken("yyy", matchUnsigned); + addRegexToken("yyyy", matchUnsigned); + addRegexToken("yo", matchEraYearOrdinal); + addParseToken(["y", "yy", "yyy", "yyyy"], YEAR); + addParseToken(["yo"], function(input, array, config, token2) { + var match; + if (config._locale._eraYearOrdinalRegex) { + match = input.match(config._locale._eraYearOrdinalRegex); + } + if (config._locale.eraYearOrdinalParse) { + array[YEAR] = config._locale.eraYearOrdinalParse(input, match); + } else { + array[YEAR] = parseInt(input, 10); + } + }); + function localeEras(m, format2) { + var i, l, date, eras = this._eras || getLocale("en")._eras; + for (i = 0, l = eras.length; i < l; ++i) { + switch (typeof eras[i].since) { + case "string": + date = hooks(eras[i].since).startOf("day"); + eras[i].since = date.valueOf(); + break; + } + switch (typeof eras[i].until) { + case "undefined": + eras[i].until = Infinity; + break; + case "string": + date = hooks(eras[i].until).startOf("day").valueOf(); + eras[i].until = date.valueOf(); + break; + } + } + return eras; + } + function localeErasParse(eraName, format2, strict) { + var i, l, eras = this.eras(), name, abbr, narrow; + eraName = eraName.toUpperCase(); + for (i = 0, l = eras.length; i < l; ++i) { + name = eras[i].name.toUpperCase(); + abbr = eras[i].abbr.toUpperCase(); + narrow = eras[i].narrow.toUpperCase(); + if (strict) { + switch (format2) { + case "N": + case "NN": + case "NNN": + if (abbr === eraName) { + return eras[i]; + } + break; + case "NNNN": + if (name === eraName) { + return eras[i]; + } + break; + case "NNNNN": + if (narrow === eraName) { + return eras[i]; + } + break; + } + } else if ([name, abbr, narrow].indexOf(eraName) >= 0) { + return eras[i]; + } + } + } + function localeErasConvertYear(era, year) { + var dir = era.since <= era.until ? 1 : -1; + if (year === void 0) { + return hooks(era.since).year(); + } else { + return hooks(era.since).year() + (year - era.offset) * dir; + } + } + function getEraName() { + var i, l, val, eras = this.localeData().eras(); + for (i = 0, l = eras.length; i < l; ++i) { + val = this.clone().startOf("day").valueOf(); + if (eras[i].since <= val && val <= eras[i].until) { + return eras[i].name; + } + if (eras[i].until <= val && val <= eras[i].since) { + return eras[i].name; + } + } + return ""; + } + function getEraNarrow() { + var i, l, val, eras = this.localeData().eras(); + for (i = 0, l = eras.length; i < l; ++i) { + val = this.clone().startOf("day").valueOf(); + if (eras[i].since <= val && val <= eras[i].until) { + return eras[i].narrow; + } + if (eras[i].until <= val && val <= eras[i].since) { + return eras[i].narrow; + } + } + return ""; + } + function getEraAbbr() { + var i, l, val, eras = this.localeData().eras(); + for (i = 0, l = eras.length; i < l; ++i) { + val = this.clone().startOf("day").valueOf(); + if (eras[i].since <= val && val <= eras[i].until) { + return eras[i].abbr; + } + if (eras[i].until <= val && val <= eras[i].since) { + return eras[i].abbr; + } + } + return ""; + } + function getEraYear() { + var i, l, dir, val, eras = this.localeData().eras(); + for (i = 0, l = eras.length; i < l; ++i) { + dir = eras[i].since <= eras[i].until ? 1 : -1; + val = this.clone().startOf("day").valueOf(); + if (eras[i].since <= val && val <= eras[i].until || eras[i].until <= val && val <= eras[i].since) { + return (this.year() - hooks(eras[i].since).year()) * dir + eras[i].offset; + } + } + return this.year(); + } + function erasNameRegex(isStrict) { + if (!hasOwnProp(this, "_erasNameRegex")) { + computeErasParse.call(this); + } + return isStrict ? this._erasNameRegex : this._erasRegex; + } + function erasAbbrRegex(isStrict) { + if (!hasOwnProp(this, "_erasAbbrRegex")) { + computeErasParse.call(this); + } + return isStrict ? this._erasAbbrRegex : this._erasRegex; + } + function erasNarrowRegex(isStrict) { + if (!hasOwnProp(this, "_erasNarrowRegex")) { + computeErasParse.call(this); + } + return isStrict ? this._erasNarrowRegex : this._erasRegex; + } + function matchEraAbbr(isStrict, locale3) { + return locale3.erasAbbrRegex(isStrict); + } + function matchEraName(isStrict, locale3) { + return locale3.erasNameRegex(isStrict); + } + function matchEraNarrow(isStrict, locale3) { + return locale3.erasNarrowRegex(isStrict); + } + function matchEraYearOrdinal(isStrict, locale3) { + return locale3._eraYearOrdinalRegex || matchUnsigned; + } + function computeErasParse() { + var abbrPieces = [], namePieces = [], narrowPieces = [], mixedPieces = [], i, l, erasName, erasAbbr, erasNarrow, eras = this.eras(); + for (i = 0, l = eras.length; i < l; ++i) { + erasName = regexEscape(eras[i].name); + erasAbbr = regexEscape(eras[i].abbr); + erasNarrow = regexEscape(eras[i].narrow); + namePieces.push(erasName); + abbrPieces.push(erasAbbr); + narrowPieces.push(erasNarrow); + mixedPieces.push(erasName); + mixedPieces.push(erasAbbr); + mixedPieces.push(erasNarrow); + } + this._erasRegex = new RegExp("^(" + mixedPieces.join("|") + ")", "i"); + this._erasNameRegex = new RegExp("^(" + namePieces.join("|") + ")", "i"); + this._erasAbbrRegex = new RegExp("^(" + abbrPieces.join("|") + ")", "i"); + this._erasNarrowRegex = new RegExp( + "^(" + narrowPieces.join("|") + ")", + "i" + ); + } + addFormatToken(0, ["gg", 2], 0, function() { + return this.weekYear() % 100; + }); + addFormatToken(0, ["GG", 2], 0, function() { + return this.isoWeekYear() % 100; + }); + function addWeekYearFormatToken(token2, getter) { + addFormatToken(0, [token2, token2.length], 0, getter); + } + addWeekYearFormatToken("gggg", "weekYear"); + addWeekYearFormatToken("ggggg", "weekYear"); + addWeekYearFormatToken("GGGG", "isoWeekYear"); + addWeekYearFormatToken("GGGGG", "isoWeekYear"); + addRegexToken("G", matchSigned); + addRegexToken("g", matchSigned); + addRegexToken("GG", match1to2, match2); + addRegexToken("gg", match1to2, match2); + addRegexToken("GGGG", match1to4, match4); + addRegexToken("gggg", match1to4, match4); + addRegexToken("GGGGG", match1to6, match6); + addRegexToken("ggggg", match1to6, match6); + addWeekParseToken( + ["gggg", "ggggg", "GGGG", "GGGGG"], + function(input, week, config, token2) { + week[token2.substr(0, 2)] = toInt(input); + } + ); + addWeekParseToken(["gg", "GG"], function(input, week, config, token2) { + week[token2] = hooks.parseTwoDigitYear(input); + }); + function getSetWeekYear(input) { + return getSetWeekYearHelper.call( + this, + input, + this.week(), + this.weekday() + this.localeData()._week.dow, + this.localeData()._week.dow, + this.localeData()._week.doy + ); + } + function getSetISOWeekYear(input) { + return getSetWeekYearHelper.call( + this, + input, + this.isoWeek(), + this.isoWeekday(), + 1, + 4 + ); + } + function getISOWeeksInYear() { + return weeksInYear(this.year(), 1, 4); + } + function getISOWeeksInISOWeekYear() { + return weeksInYear(this.isoWeekYear(), 1, 4); + } + function getWeeksInYear() { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + } + function getWeeksInWeekYear() { + var weekInfo = this.localeData()._week; + return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy); + } + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } + } + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; + } + addFormatToken("Q", 0, "Qo", "quarter"); + addRegexToken("Q", match1); + addParseToken("Q", function(input, array) { + array[MONTH] = (toInt(input) - 1) * 3; + }); + function getSetQuarter(input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + } + addFormatToken("D", ["DD", 2], "Do", "date"); + addRegexToken("D", match1to2, match1to2NoLeadingZero); + addRegexToken("DD", match1to2, match2); + addRegexToken("Do", function(isStrict, locale3) { + return isStrict ? locale3._dayOfMonthOrdinalParse || locale3._ordinalParse : locale3._dayOfMonthOrdinalParseLenient; + }); + addParseToken(["D", "DD"], DATE); + addParseToken("Do", function(input, array) { + array[DATE] = toInt(input.match(match1to2)[0]); + }); + var getSetDayOfMonth = makeGetSet("Date", true); + addFormatToken("DDD", ["DDDD", 3], "DDDo", "dayOfYear"); + addRegexToken("DDD", match1to3); + addRegexToken("DDDD", match3); + addParseToken(["DDD", "DDDD"], function(input, array, config) { + config._dayOfYear = toInt(input); + }); + function getSetDayOfYear(input) { + var dayOfYear = Math.round( + (this.clone().startOf("day") - this.clone().startOf("year")) / 864e5 + ) + 1; + return input == null ? dayOfYear : this.add(input - dayOfYear, "d"); + } + addFormatToken("m", ["mm", 2], 0, "minute"); + addRegexToken("m", match1to2, match1to2HasZero); + addRegexToken("mm", match1to2, match2); + addParseToken(["m", "mm"], MINUTE); + var getSetMinute = makeGetSet("Minutes", false); + addFormatToken("s", ["ss", 2], 0, "second"); + addRegexToken("s", match1to2, match1to2HasZero); + addRegexToken("ss", match1to2, match2); + addParseToken(["s", "ss"], SECOND); + var getSetSecond = makeGetSet("Seconds", false); + addFormatToken("S", 0, 0, function() { + return ~~(this.millisecond() / 100); + }); + addFormatToken(0, ["SS", 2], 0, function() { + return ~~(this.millisecond() / 10); + }); + addFormatToken(0, ["SSS", 3], 0, "millisecond"); + addFormatToken(0, ["SSSS", 4], 0, function() { + return this.millisecond() * 10; + }); + addFormatToken(0, ["SSSSS", 5], 0, function() { + return this.millisecond() * 100; + }); + addFormatToken(0, ["SSSSSS", 6], 0, function() { + return this.millisecond() * 1e3; + }); + addFormatToken(0, ["SSSSSSS", 7], 0, function() { + return this.millisecond() * 1e4; + }); + addFormatToken(0, ["SSSSSSSS", 8], 0, function() { + return this.millisecond() * 1e5; + }); + addFormatToken(0, ["SSSSSSSSS", 9], 0, function() { + return this.millisecond() * 1e6; + }); + addRegexToken("S", match1to3, match1); + addRegexToken("SS", match1to3, match2); + addRegexToken("SSS", match1to3, match3); + var token, getSetMillisecond; + for (token = "SSSS"; token.length <= 9; token += "S") { + addRegexToken(token, matchUnsigned); + } + function parseMs(input, array) { + array[MILLISECOND] = toInt(("0." + input) * 1e3); + } + for (token = "S"; token.length <= 9; token += "S") { + addParseToken(token, parseMs); + } + getSetMillisecond = makeGetSet("Milliseconds", false); + addFormatToken("z", 0, 0, "zoneAbbr"); + addFormatToken("zz", 0, 0, "zoneName"); + function getZoneAbbr() { + return this._isUTC ? "UTC" : ""; + } + function getZoneName() { + return this._isUTC ? "Coordinated Universal Time" : ""; + } + var proto = Moment.prototype; + proto.add = add; + proto.calendar = calendar$1; + proto.clone = clone3; + proto.diff = diff; + proto.endOf = endOf; + proto.format = format; + proto.from = from2; + proto.fromNow = fromNow; + proto.to = to2; + proto.toNow = toNow; + proto.get = stringGet; + proto.invalidAt = invalidAt; + proto.isAfter = isAfter; + proto.isBefore = isBefore; + proto.isBetween = isBetween; + proto.isSame = isSame; + proto.isSameOrAfter = isSameOrAfter; + proto.isSameOrBefore = isSameOrBefore; + proto.isValid = isValid$2; + proto.lang = lang; + proto.locale = locale2; + proto.localeData = localeData; + proto.max = prototypeMax; + proto.min = prototypeMin; + proto.parsingFlags = parsingFlags; + proto.set = stringSet; + proto.startOf = startOf; + proto.subtract = subtract; + proto.toArray = toArray; + proto.toObject = toObject; + proto.toDate = toDate; + proto.toISOString = toISOString; + proto.inspect = inspect; + if (typeof Symbol !== "undefined" && Symbol.for != null) { + proto[Symbol.for("nodejs.util.inspect.custom")] = function() { + return "Moment<" + this.format() + ">"; + }; + } + proto.toJSON = toJSON; + proto.toString = toString; + proto.unix = unix; + proto.valueOf = valueOf; + proto.creationData = creationData; + proto.eraName = getEraName; + proto.eraNarrow = getEraNarrow; + proto.eraAbbr = getEraAbbr; + proto.eraYear = getEraYear; + proto.year = getSetYear; + proto.isLeapYear = getIsLeapYear; + proto.weekYear = getSetWeekYear; + proto.isoWeekYear = getSetISOWeekYear; + proto.quarter = proto.quarters = getSetQuarter; + proto.month = getSetMonth; + proto.daysInMonth = getDaysInMonth; + proto.week = proto.weeks = getSetWeek; + proto.isoWeek = proto.isoWeeks = getSetISOWeek; + proto.weeksInYear = getWeeksInYear; + proto.weeksInWeekYear = getWeeksInWeekYear; + proto.isoWeeksInYear = getISOWeeksInYear; + proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear; + proto.date = getSetDayOfMonth; + proto.day = proto.days = getSetDayOfWeek; + proto.weekday = getSetLocaleDayOfWeek; + proto.isoWeekday = getSetISODayOfWeek; + proto.dayOfYear = getSetDayOfYear; + proto.hour = proto.hours = getSetHour; + proto.minute = proto.minutes = getSetMinute; + proto.second = proto.seconds = getSetSecond; + proto.millisecond = proto.milliseconds = getSetMillisecond; + proto.utcOffset = getSetOffset; + proto.utc = setOffsetToUTC; + proto.local = setOffsetToLocal; + proto.parseZone = setOffsetToParsedOffset; + proto.hasAlignedHourOffset = hasAlignedHourOffset; + proto.isDST = isDaylightSavingTime; + proto.isLocal = isLocal; + proto.isUtcOffset = isUtcOffset; + proto.isUtc = isUtc; + proto.isUTC = isUtc; + proto.zoneAbbr = getZoneAbbr; + proto.zoneName = getZoneName; + proto.dates = deprecate( + "dates accessor is deprecated. Use date instead.", + getSetDayOfMonth + ); + proto.months = deprecate( + "months accessor is deprecated. Use month instead", + getSetMonth + ); + proto.years = deprecate( + "years accessor is deprecated. Use year instead", + getSetYear + ); + proto.zone = deprecate( + "moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/", + getSetZone + ); + proto.isDSTShifted = deprecate( + "isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information", + isDaylightSavingTimeShifted + ); + function createUnix(input) { + return createLocal(input * 1e3); + } + function createInZone() { + return createLocal.apply(null, arguments).parseZone(); + } + function preParsePostFormat(string) { + return string; + } + var proto$1 = Locale.prototype; + proto$1.calendar = calendar; + proto$1.longDateFormat = longDateFormat; + proto$1.invalidDate = invalidDate; + proto$1.ordinal = ordinal; + proto$1.preparse = preParsePostFormat; + proto$1.postformat = preParsePostFormat; + proto$1.relativeTime = relativeTime; + proto$1.pastFuture = pastFuture; + proto$1.set = set2; + proto$1.eras = localeEras; + proto$1.erasParse = localeErasParse; + proto$1.erasConvertYear = localeErasConvertYear; + proto$1.erasAbbrRegex = erasAbbrRegex; + proto$1.erasNameRegex = erasNameRegex; + proto$1.erasNarrowRegex = erasNarrowRegex; + proto$1.months = localeMonths; + proto$1.monthsShort = localeMonthsShort; + proto$1.monthsParse = localeMonthsParse; + proto$1.monthsRegex = monthsRegex; + proto$1.monthsShortRegex = monthsShortRegex; + proto$1.week = localeWeek; + proto$1.firstDayOfYear = localeFirstDayOfYear; + proto$1.firstDayOfWeek = localeFirstDayOfWeek; + proto$1.weekdays = localeWeekdays; + proto$1.weekdaysMin = localeWeekdaysMin; + proto$1.weekdaysShort = localeWeekdaysShort; + proto$1.weekdaysParse = localeWeekdaysParse; + proto$1.weekdaysRegex = weekdaysRegex; + proto$1.weekdaysShortRegex = weekdaysShortRegex; + proto$1.weekdaysMinRegex = weekdaysMinRegex; + proto$1.isPM = localeIsPM; + proto$1.meridiem = localeMeridiem; + function get$1(format2, index, field, setter) { + var locale3 = getLocale(), utc = createUTC().set(setter, index); + return locale3[field](utc, format2); + } + function listMonthsImpl(format2, index, field) { + if (isNumber2(format2)) { + index = format2; + format2 = void 0; + } + format2 = format2 || ""; + if (index != null) { + return get$1(format2, index, field, "month"); + } + var i, out = []; + for (i = 0; i < 12; i++) { + out[i] = get$1(format2, i, field, "month"); + } + return out; + } + function listWeekdaysImpl(localeSorted, format2, index, field) { + if (typeof localeSorted === "boolean") { + if (isNumber2(format2)) { + index = format2; + format2 = void 0; + } + format2 = format2 || ""; + } else { + format2 = localeSorted; + index = format2; + localeSorted = false; + if (isNumber2(format2)) { + index = format2; + format2 = void 0; + } + format2 = format2 || ""; + } + var locale3 = getLocale(), shift = localeSorted ? locale3._week.dow : 0, i, out = []; + if (index != null) { + return get$1(format2, (index + shift) % 7, field, "day"); + } + for (i = 0; i < 7; i++) { + out[i] = get$1(format2, (i + shift) % 7, field, "day"); + } + return out; + } + function listMonths(format2, index) { + return listMonthsImpl(format2, index, "months"); + } + function listMonthsShort(format2, index) { + return listMonthsImpl(format2, index, "monthsShort"); + } + function listWeekdays(localeSorted, format2, index) { + return listWeekdaysImpl(localeSorted, format2, index, "weekdays"); + } + function listWeekdaysShort(localeSorted, format2, index) { + return listWeekdaysImpl(localeSorted, format2, index, "weekdaysShort"); + } + function listWeekdaysMin(localeSorted, format2, index) { + return listWeekdaysImpl(localeSorted, format2, index, "weekdaysMin"); + } + getSetGlobalLocale("en", { + eras: [ + { + since: "0001-01-01", + until: Infinity, + offset: 1, + name: "Anno Domini", + narrow: "AD", + abbr: "AD" + }, + { + since: "0000-12-31", + until: -Infinity, + offset: 1, + name: "Before Christ", + narrow: "BC", + abbr: "BC" + } + ], + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal: function(number) { + var b = number % 10, output = toInt(number % 100 / 10) === 1 ? "th" : b === 1 ? "st" : b === 2 ? "nd" : b === 3 ? "rd" : "th"; + return number + output; + } + }); + hooks.lang = deprecate( + "moment.lang is deprecated. Use moment.locale instead.", + getSetGlobalLocale + ); + hooks.langData = deprecate( + "moment.langData is deprecated. Use moment.localeData instead.", + getLocale + ); + var mathAbs = Math.abs; + function abs() { + var data = this._data; + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + return this; + } + function addSubtract$1(duration, input, value, direction) { + var other = createDuration(input, value); + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + return duration._bubble(); + } + function add$1(input, value) { + return addSubtract$1(this, input, value, 1); + } + function subtract$1(input, value) { + return addSubtract$1(this, input, value, -1); + } + function absCeil(number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } + } + function bubble() { + var milliseconds2 = this._milliseconds, days2 = this._days, months2 = this._months, data = this._data, seconds2, minutes2, hours2, years2, monthsFromDays; + if (!(milliseconds2 >= 0 && days2 >= 0 && months2 >= 0 || milliseconds2 <= 0 && days2 <= 0 && months2 <= 0)) { + milliseconds2 += absCeil(monthsToDays(months2) + days2) * 864e5; + days2 = 0; + months2 = 0; + } + data.milliseconds = milliseconds2 % 1e3; + seconds2 = absFloor(milliseconds2 / 1e3); + data.seconds = seconds2 % 60; + minutes2 = absFloor(seconds2 / 60); + data.minutes = minutes2 % 60; + hours2 = absFloor(minutes2 / 60); + data.hours = hours2 % 24; + days2 += absFloor(hours2 / 24); + monthsFromDays = absFloor(daysToMonths(days2)); + months2 += monthsFromDays; + days2 -= absCeil(monthsToDays(monthsFromDays)); + years2 = absFloor(months2 / 12); + months2 %= 12; + data.days = days2; + data.months = months2; + data.years = years2; + return this; + } + function daysToMonths(days2) { + return days2 * 4800 / 146097; + } + function monthsToDays(months2) { + return months2 * 146097 / 4800; + } + function as(units) { + if (!this.isValid()) { + return NaN; + } + var days2, months2, milliseconds2 = this._milliseconds; + units = normalizeUnits(units); + if (units === "month" || units === "quarter" || units === "year") { + days2 = this._days + milliseconds2 / 864e5; + months2 = this._months + daysToMonths(days2); + switch (units) { + case "month": + return months2; + case "quarter": + return months2 / 3; + case "year": + return months2 / 12; + } + } else { + days2 = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case "week": + return days2 / 7 + milliseconds2 / 6048e5; + case "day": + return days2 + milliseconds2 / 864e5; + case "hour": + return days2 * 24 + milliseconds2 / 36e5; + case "minute": + return days2 * 1440 + milliseconds2 / 6e4; + case "second": + return days2 * 86400 + milliseconds2 / 1e3; + case "millisecond": + return Math.floor(days2 * 864e5) + milliseconds2; + default: + throw new Error("Unknown unit " + units); + } + } + } + function makeAs(alias) { + return function() { + return this.as(alias); + }; + } + var asMilliseconds = makeAs("ms"), asSeconds = makeAs("s"), asMinutes = makeAs("m"), asHours = makeAs("h"), asDays = makeAs("d"), asWeeks = makeAs("w"), asMonths = makeAs("M"), asQuarters = makeAs("Q"), asYears = makeAs("y"), valueOf$1 = asMilliseconds; + function clone$1() { + return createDuration(this); + } + function get$2(units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + "s"]() : NaN; + } + function makeGetter(name) { + return function() { + return this.isValid() ? this._data[name] : NaN; + }; + } + var milliseconds = makeGetter("milliseconds"), seconds = makeGetter("seconds"), minutes = makeGetter("minutes"), hours = makeGetter("hours"), days = makeGetter("days"), months = makeGetter("months"), years = makeGetter("years"); + function weeks() { + return absFloor(this.days() / 7); + } + var round2 = Math.round, thresholds = { + ss: 44, + // a few seconds to seconds + s: 45, + // seconds to minute + m: 45, + // minutes to hour + h: 22, + // hours to day + d: 26, + // days to month/week + w: null, + // weeks to month + M: 11 + // months to year + }; + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale3) { + return locale3.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + function relativeTime$1(posNegDuration, withoutSuffix, thresholds2, locale3) { + var duration = createDuration(posNegDuration).abs(), seconds2 = round2(duration.as("s")), minutes2 = round2(duration.as("m")), hours2 = round2(duration.as("h")), days2 = round2(duration.as("d")), months2 = round2(duration.as("M")), weeks2 = round2(duration.as("w")), years2 = round2(duration.as("y")), a = seconds2 <= thresholds2.ss && ["s", seconds2] || seconds2 < thresholds2.s && ["ss", seconds2] || minutes2 <= 1 && ["m"] || minutes2 < thresholds2.m && ["mm", minutes2] || hours2 <= 1 && ["h"] || hours2 < thresholds2.h && ["hh", hours2] || days2 <= 1 && ["d"] || days2 < thresholds2.d && ["dd", days2]; + if (thresholds2.w != null) { + a = a || weeks2 <= 1 && ["w"] || weeks2 < thresholds2.w && ["ww", weeks2]; + } + a = a || months2 <= 1 && ["M"] || months2 < thresholds2.M && ["MM", months2] || years2 <= 1 && ["y"] || ["yy", years2]; + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale3; + return substituteTimeAgo.apply(null, a); + } + function getSetRelativeTimeRounding(roundingFunction) { + if (roundingFunction === void 0) { + return round2; + } + if (typeof roundingFunction === "function") { + round2 = roundingFunction; + return true; + } + return false; + } + function getSetRelativeTimeThreshold(threshold, limit) { + if (thresholds[threshold] === void 0) { + return false; + } + if (limit === void 0) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === "s") { + thresholds.ss = limit - 1; + } + return true; + } + function humanize(argWithSuffix, argThresholds) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + var withSuffix = false, th = thresholds, locale3, output; + if (typeof argWithSuffix === "object") { + argThresholds = argWithSuffix; + argWithSuffix = false; + } + if (typeof argWithSuffix === "boolean") { + withSuffix = argWithSuffix; + } + if (typeof argThresholds === "object") { + th = Object.assign({}, thresholds, argThresholds); + if (argThresholds.s != null && argThresholds.ss == null) { + th.ss = argThresholds.s - 1; + } + } + locale3 = this.localeData(); + output = relativeTime$1(this, !withSuffix, th, locale3); + if (withSuffix) { + output = locale3.pastFuture(+this, output); + } + return locale3.postformat(output); + } + var abs$1 = Math.abs; + function sign2(x) { + return (x > 0) - (x < 0) || +x; + } + function toISOString$1() { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + var seconds2 = abs$1(this._milliseconds) / 1e3, days2 = abs$1(this._days), months2 = abs$1(this._months), minutes2, hours2, years2, s, total = this.asSeconds(), totalSign, ymSign, daysSign, hmsSign; + if (!total) { + return "P0D"; + } + minutes2 = absFloor(seconds2 / 60); + hours2 = absFloor(minutes2 / 60); + seconds2 %= 60; + minutes2 %= 60; + years2 = absFloor(months2 / 12); + months2 %= 12; + s = seconds2 ? seconds2.toFixed(3).replace(/\.?0+$/, "") : ""; + totalSign = total < 0 ? "-" : ""; + ymSign = sign2(this._months) !== sign2(total) ? "-" : ""; + daysSign = sign2(this._days) !== sign2(total) ? "-" : ""; + hmsSign = sign2(this._milliseconds) !== sign2(total) ? "-" : ""; + return totalSign + "P" + (years2 ? ymSign + years2 + "Y" : "") + (months2 ? ymSign + months2 + "M" : "") + (days2 ? daysSign + days2 + "D" : "") + (hours2 || minutes2 || seconds2 ? "T" : "") + (hours2 ? hmsSign + hours2 + "H" : "") + (minutes2 ? hmsSign + minutes2 + "M" : "") + (seconds2 ? hmsSign + s + "S" : ""); + } + var proto$2 = Duration.prototype; + proto$2.isValid = isValid$1; + proto$2.abs = abs; + proto$2.add = add$1; + proto$2.subtract = subtract$1; + proto$2.as = as; + proto$2.asMilliseconds = asMilliseconds; + proto$2.asSeconds = asSeconds; + proto$2.asMinutes = asMinutes; + proto$2.asHours = asHours; + proto$2.asDays = asDays; + proto$2.asWeeks = asWeeks; + proto$2.asMonths = asMonths; + proto$2.asQuarters = asQuarters; + proto$2.asYears = asYears; + proto$2.valueOf = valueOf$1; + proto$2._bubble = bubble; + proto$2.clone = clone$1; + proto$2.get = get$2; + proto$2.milliseconds = milliseconds; + proto$2.seconds = seconds; + proto$2.minutes = minutes; + proto$2.hours = hours; + proto$2.days = days; + proto$2.weeks = weeks; + proto$2.months = months; + proto$2.years = years; + proto$2.humanize = humanize; + proto$2.toISOString = toISOString$1; + proto$2.toString = toISOString$1; + proto$2.toJSON = toISOString$1; + proto$2.locale = locale2; + proto$2.localeData = localeData; + proto$2.toIsoString = deprecate( + "toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)", + toISOString$1 + ); + proto$2.lang = lang; + addFormatToken("X", 0, 0, "unix"); + addFormatToken("x", 0, 0, "valueOf"); + addRegexToken("x", matchSigned); + addRegexToken("X", matchTimestamp); + addParseToken("X", function(input, array, config) { + config._d = new Date(parseFloat(input) * 1e3); + }); + addParseToken("x", function(input, array, config) { + config._d = new Date(toInt(input)); + }); + hooks.version = "2.30.1"; + setHookCallback(createLocal); + hooks.fn = proto; + hooks.min = min; + hooks.max = max; + hooks.now = now; + hooks.utc = createUTC; + hooks.unix = createUnix; + hooks.months = listMonths; + hooks.isDate = isDate; + hooks.locale = getSetGlobalLocale; + hooks.invalid = createInvalid; + hooks.duration = createDuration; + hooks.isMoment = isMoment; + hooks.weekdays = listWeekdays; + hooks.parseZone = createInZone; + hooks.localeData = getLocale; + hooks.isDuration = isDuration; + hooks.monthsShort = listMonthsShort; + hooks.weekdaysMin = listWeekdaysMin; + hooks.defineLocale = defineLocale; + hooks.updateLocale = updateLocale; + hooks.locales = listLocales; + hooks.weekdaysShort = listWeekdaysShort; + hooks.normalizeUnits = normalizeUnits; + hooks.relativeTimeRounding = getSetRelativeTimeRounding; + hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; + hooks.calendarFormat = getCalendarFormat; + hooks.prototype = proto; + hooks.HTML5_FMT = { + DATETIME_LOCAL: "YYYY-MM-DDTHH:mm", + // + DATETIME_LOCAL_SECONDS: "YYYY-MM-DDTHH:mm:ss", + // + DATETIME_LOCAL_MS: "YYYY-MM-DDTHH:mm:ss.SSS", + // + DATE: "YYYY-MM-DD", + // + TIME: "HH:mm", + // + TIME_SECONDS: "HH:mm:ss", + // + TIME_MS: "HH:mm:ss.SSS", + // + WEEK: "GGGG-[W]WW", + // + MONTH: "YYYY-MM" + // + }; + return hooks; + }); + } +}); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => SRPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian12 = require("obsidian"); +var graph = __toESM(require_lib()); + +// src/settings.ts +var import_obsidian2 = require("obsidian"); + +// src/lang/helpers.ts +var import_obsidian = require("obsidian"); + +// src/lang/locale/af.ts +var af_default = {}; + +// src/lang/locale/ar.ts +var ar_default = { + // flashcard-modal.tsx + DECKS: "\u0627\u0644\u0631\u064F\u0632\u0645\u064E\u0627\u062A", + DUE_CARDS: "\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u064F\u0633\u062A\u062D\u0642\u0629", + NEW_CARDS: "\u0628\u0637\u0627\u0642\u0627\u062A \u062C\u062F\u064A\u062F\u0629", + TOTAL_CARDS: "\u0625\u062C\u0645\u0627\u0644\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + BACK: "\u0631\u062C\u0648\u0639", + SKIP: "Skip", + EDIT_CARD: "\u062A\u0639\u062F\u064A\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", + RESET_CARD_PROGRESS: "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u062A\u0642\u062F\u0651\u064F\u0645\u0652 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", + HARD: "\u0635\u0639\u0628", + GOOD: "\u062C\u064A\u062F", + EASY: "\u0633\u0647\u0644", + SHOW_ANSWER: "\u0623\u0638\u0647\u0650\u0631 \u0627\u0644\u0625\u062C\u0627\u0628\u0629", + CARD_PROGRESS_RESET: ".\u062A\u0645\u0651\u064E\u062A \u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u062A\u0642\u062F\u0651\u064F\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", + SAVE: "\u062D\u0641\u0638", + CANCEL: "\u0625\u0644\u063A\u0627\u0621", + NO_INPUT: ".\u0644\u0645 \u064A\u062A\u0650\u0645 \u062A\u0642\u062F\u064A\u0645 \u0623\u064A \u0645\u064F\u062F\u062E\u0644\u0627\u062A", + CURRENT_EASE_HELP_TEXT: ":\u0627\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u062D\u0627\u0644\u064A\u0629", + CURRENT_INTERVAL_HELP_TEXT: ":\u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u0627\u0644\u062D\u0627\u0644\u064A", + CARD_GENERATED_FROM: "${notePath} :\u062A\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629", + REVIEW_CARDS: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + REVIEW_DIFFICULTY_FILE_MENU: "${difficulty} :\u0645\u0631\u0627\u062C\u0639\u0629", + REVIEW_NOTE_DIFFICULTY_CMD: "${difficulty} \u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0643\u0640", + CRAM_ALL_CARDS: "\u062D\u062F\u062F \u0631\u064F\u0632\u0645\u064E\u0629 \u0644\u0644\u062D\u0634\u0631", + REVIEW_ALL_CARDS: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u0646 \u062C\u0645\u064A\u0639 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A", + REVIEW_CARDS_IN_NOTE: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629", + CRAM_CARDS_IN_NOTE: "\u0623\u062D\u0634\u0631 \u062C\u0645\u064A\u0639 \u0628\u0637\u0627\u0642\u0627\u062A \u0647\u0630\u0647 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629", + VIEW_STATS: "\u0639\u0631\u0636 \u0627\u0644\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062D\u0642\u0629 ${dueFlashcardsCount},\u0645\u0644\u0627\u062D\u0638\u0627\u062A ${dueNotesCount}:\u0645\u0631\u0627\u062C\u0639\u0629", + SYNC_TIME_TAKEN: "${t}ms \u0627\u0633\u062A\u063A\u0631\u0627\u0642 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629", + NOTE_IN_IGNORED_FOLDER: ".\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u064A\u062A\u0645 \u062D\u0641\u0638\u0647\u0627 \u0636\u0645\u0646 \u0627\u0644\u0645\u062C\u0644\u062F \u0627\u0644\u0630\u064A \u062A\u0645 \u062A\u062C\u0627\u0647\u0644\u0647 (\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A)", + PLEASE_TAG_NOTE: ".\u064A\u0631\u062C\u0649 \u0648\u0636\u0639 \u0648\u0633\u0645 \u0639\u0644\u0649 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0628\u0634\u0643\u0644 \u0645\u0646\u0627\u0633\u0628 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629 (\u0641\u064A \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A)", + RESPONSE_RECEIVED: ".\u0627\u0633\u062A\u064F\u0644\u0645\u062A \u0627\u0644\u0627\u0633\u062A\u062C\u0627\u0628\u0629", + NO_DECK_EXISTS: "${deckName} \u0644\u0627 \u064A\u0648\u062C\u062F \u0631\u064F\u0632\u0645\u064E\u0629", + ALL_CAUGHT_UP: "\u{1F606} \u0644\u0642\u062F \u062A\u0645 \u0627\u0644\u0642\u0628\u0636 \u0639\u0644\u064A\u0643\u0645 \u062C\u0645\u064A\u0639\u0627 \u0627\u0644\u0622\u0646", + // scheduling.ts + DAYS_STR_IVL: "\u064A\u0648\u0645/\u0623\u064A\u0627\u0645 ${interval}", + MONTHS_STR_IVL: "\u0634\u0647\u0631/\u0623\u0634\u0647\u0631 ${interval}", + YEARS_STR_IVL: "\u0633\u0646\u0629/\u0633\u0646\u0648\u0627\u062A ${interval}", + DAYS_STR_IVL_MOBILE: "\u064A${interval}", + MONTHS_STR_IVL_MOBILE: "\u0634${interval}", + YEARS_STR_IVL_MOBILE: "\u0633${interval}", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - Settings", + CHECK_WIKI: '.wiki \u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u060C \u062A\u062D\u0642\u0642 \u0645\u0646', + FOLDERS_TO_IGNORE: "\u0645\u062C\u0644\u062F\u0627\u062A \u0644\u062A\u062C\u0627\u0647\u0644\u0647\u0627", + FOLDERS_TO_IGNORE_DESC: "Templates Meta/Scripts : \u0623\u062F\u062E\u0644 \u0645\u0633\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u062C\u0644\u062F \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0648\u0627\u0633\u0637\u0629 \u0633\u0637\u0648\u0631 \u062C\u062F\u064A\u062F\u0629,\u0645\u062B\u0627\u0644", + FLASHCARDS: "\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + FLASHCARD_EASY_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u0633\u0647\u0644", + FLASHCARD_GOOD_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u062C\u064A\u062F", + FLASHCARD_HARD_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u0635\u0639\u0628", + FLASHCARD_EASY_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u0633\u0647\u0644', + FLASHCARD_GOOD_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u062C\u064A\u062F', + FLASHCARD_HARD_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u0635\u0639\u0628', + FLASHCARD_TAGS: "\u0648\u064F\u0633\u0648\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + FLASHCARD_TAGS_DESC: "#2\u0623\u062F\u062E\u0644 \u0627\u0644\u0648\u064F\u0633\u0648\u0645 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0645\u0633\u0627\u0641\u0627\u062A \u0623\u0648 \u0623\u0633\u0637\u0631 \u062C\u062F\u064A\u062F\u0629 \u060C \u0623\u064A \u0628\u0637\u0627\u0642\u0627\u062A# \u0631\u0632\u0645\u06293# \u0631\u0632\u0645\u0629", + CONVERT_FOLDERS_TO_DECKS: "\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0645\u062C\u0644\u062F\u0627\u062A \u0625\u0644\u0649 \u0645\u0644\u0641\u0627\u062A \u0623\u0635\u0644\u064A\u0629 \u0648 \u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0641\u0631\u0639\u064A\u0629\u061F", + CONVERT_FOLDERS_TO_DECKS_DESC: ".\u0647\u0630\u0627 \u0647\u0648 \u0628\u062F\u064A\u0644 \u0644\u062E\u064A\u0627\u0631 \u0648\u0633\u0648\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 \u0623\u0639\u0644\u0627\u0647", + INLINE_SCHEDULING_COMMENTS: "\u062D\u0641\u0638 \u062A\u0639\u0644\u064A\u0642 \u0627\u0644\u062C\u062F\u0648\u0644\u0629 \u0639\u0644\u0649 \u0646\u0641\u0633 \u0627\u0644\u0633\u0637\u0631 \u0645\u062B\u0644 \u0627\u0644\u0633\u0637\u0631 \u0627\u0644\u0623\u062E\u064A\u0631 \u0644\u0644\u0628\u0637\u0627\u0642\u0629 \u061F", + INLINE_SCHEDULING_COMMENTS_DESC: "\u0644\u0627 \u062A\u0643\u0633\u0631 \u062A\u0646\u0633\u064A\u0642 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 HTML \u0633\u064A\u0624\u062F\u064A \u062A\u0634\u063A\u064A\u0644 \u0647\u0630\u0627 \u0625\u0644\u0649 \u062C\u0639\u0644 \u062A\u0639\u0644\u064A\u0642\u0627\u062A", + BURY_SIBLINGS_TILL_NEXT_DAY: "\u0623\u062E\u0641\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0634\u0642\u064A\u0642\u0629 \u062D\u062A\u0649 \u0627\u0644\u064A\u0648\u0645 \u0627\u0644\u062A\u0627\u0644\u064A", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "cloze deletions : \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0634\u0642\u064A\u0642\u0629 \u0647\u064A \u0628\u0637\u0627\u0642\u0627\u062A \u062A\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646 \u0646\u0641\u0633 \u0646\u0635 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 \u0643\u0640", + SHOW_CARD_CONTEXT: "\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0633\u064A\u0627\u0642 \u0641\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A\u061F", + SHOW_CARD_CONTEXT_DESC: "i.e. Title > Heading 1 > Subheading > ... > Subheading", + CARD_MODAL_HEIGHT_PERCENT: "\u0646\u0633\u0628\u0629 \u0627\u0631\u062A\u0641\u0627\u0639 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", + CARD_MODAL_SIZE_PERCENT_DESC: "\u064A\u062C\u0628 \u0636\u0628\u0637\u0647\u0627 \u0639\u0644\u0649 100 \u066A \u0639\u0644\u0649 \u0627\u0644\u0647\u0627\u062A\u0641 \u0627\u0644\u0645\u062D\u0645\u0648\u0644 \u0623\u0648 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062F\u064A\u0643 \u0635\u0648\u0631 \u0643\u0628\u064A\u0631\u0629 \u062C\u062F\u064B\u0627", + RESET_DEFAULT: "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u0625\u0644\u0649 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A", + CARD_MODAL_WIDTH_PERCENT: "\u0646\u0633\u0628\u0629 \u0639\u0631\u0636 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", + RANDOMIZE_CARD_ORDER: "\u062A\u0631\u062A\u064A\u0628 \u0628\u0637\u0627\u0642\u0629 \u0639\u0634\u0648\u0627\u0626\u064A \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629\u061F", + REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + REVIEW_DECK_ORDER: "Order decks are displayed during review", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + DISABLE_CLOZE_CARDS: "\u061Fcloze \u062A\u0639\u0637\u064A\u0644 \u0628\u0637\u0627\u0642\u0627\u062A", + CONVERT_HIGHLIGHTS_TO_CLOZES: "Convert ==hightlights== to clozes?", + CONVERT_BOLD_TEXT_TO_CLOZES: "Convert **bolded text** to clozes?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convert {{curly brackets}} to clozes?", + INLINE_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0636\u0645\u0646\u0629", + FIX_SEPARATORS_MANUALLY_WARNING: "\u0636\u0639 \u0641\u064A \u062D\u0633\u0627\u0628\u0643 \u0623\u0646\u0647 \u0628\u0639\u062F \u062A\u063A\u064A\u064A\u0631 \u0647\u0630\u0627 \u060C \u064A\u062C\u0628 \u0639\u0644\u064A\u0643 \u062A\u0639\u062F\u064A\u0644 \u0623\u064A \u0628\u0637\u0627\u0642\u0627\u062A \u0644\u062F\u064A\u0643 \u0628\u0627\u0644\u0641\u0639\u0644 \u064A\u062F\u0648\u064A\u064B\u0627", + INLINE_REVERSED_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0639\u0643\u0633\u064A\u0629 \u0627\u0644\u0645\u0636\u0645\u0646\u0629", + MULTILINE_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0639\u0643\u0633\u064A\u0629 \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629", + NOTES: "\u0645\u0644\u0627\u062D\u0638\u0627\u062A", + REVIEW_PANE_ON_STARTUP: "\u062A\u0645\u0643\u064A\u0646 \u062C\u0632\u0621 \u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0639\u0646\u062F \u0628\u062F\u0621 \u0627\u0644\u062A\u0634\u063A\u064A\u0644", + TAGS_TO_REVIEW: "\u0648\u0633\u0648\u0645 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629", + TAGS_TO_REVIEW_DESC: "#\u0623\u062F\u062E\u0644 \u0627\u0644\u0648\u0633\u0648\u0645 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0645\u0633\u0627\u0641\u0627\u062A \u0623\u0648 \u062E\u0637\u0648\u0637 \u062C\u062F\u064A\u062F\u0629 \u060C \u0623\u064A : \u0645\u0631\u0627\u062C\u0639\u0629# \u0648\u0633\u06452# \u0648\u0633\u06453", + OPEN_RANDOM_NOTE: "\u0627\u0641\u062A\u062D \u0645\u0644\u0627\u062D\u0638\u0629 \u0639\u0634\u0648\u0627\u0626\u064A\u0629 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629", + OPEN_RANDOM_NOTE_DESC: "(Pagerank) \u0639\u0646\u062F \u062A\u0639\u0637\u064A\u0644 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u060C\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0633\u064A\u062A\u0645 \u062A\u0631\u062A\u064A\u0628\u064F\u0647\u0627 \u062D\u0633\u0628 \u0627\u0644\u0623\u0647\u0645\u064A\u0629", + AUTO_NEXT_NOTE: "\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627 \u0628\u0639\u062F \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u062A\u0639\u0637\u064A\u0644 \u062E\u064A\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0641\u064A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u060C \u0623\u064A \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629:\u0627\u0644\u0633\u0647\u0644 \u0627\u0644\u0635\u0639\u0628 \u0627\u0644\u062C\u064A\u062F", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u0639\u0646\u062F \u062A\u063A\u064A\u064A\u0631 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 Obsidian \u0623\u0639\u062F \u062A\u0634\u063A\u064A\u0644 , command hotkeys. \u0628\u0639\u062F \u0627\u0644\u062A\u0639\u0637\u064A\u0644 \u060C \u064A\u0645\u0643\u0646\u0643 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645", + MAX_N_DAYS_REVIEW_QUEUE: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0639\u062F\u062F \u0627\u0644\u0623\u064A\u0627\u0645 \u0627\u0644\u062A\u064A \u064A\u062C\u0628 \u0639\u0631\u0636\u0647\u0627 \u0639\u0644\u0649 \u0627\u0644\u0644\u0648\u062D\u0629 \u0627\u0644\u064A\u0645\u0646\u0649", + MIN_ONE_DAY: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0639\u062F\u062F \u0627\u0644\u0623\u064A\u0627\u0645 1 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644", + VALID_NUMBER_WARNING: "\u064A\u0631\u062C\u0649 \u062A\u0642\u062F\u064A\u0645 \u0631\u0642\u0645 \u0635\u0627\u0644\u062D", + UI_PREFERENCES: "\u062A\u0641\u0636\u064A\u0644\u0627\u062A \u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0644\u0639\u0631\u0636 \u0627\u0644\u0634\u062C\u0631\u064A \u0644\u0644\u0631\u064F\u0632\u0645 \u0645\u0648\u0633\u0639 \u0628\u062D\u064A\u062B \u062A\u0637\u0647\u0631 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0641\u0631\u0639\u064A\u0629 \u0643\u0644\u0647\u0627", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: " \u0639\u0637\u0644 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u0644\u0637\u064A \u0627\u0644\u0631\u064F\u0632\u0645 \u0627\u0644\u0645\u062A\u062F\u0627\u062E\u0644\u0629 \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 , \u0645\u0641\u064A\u062F \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062F\u064A\u0643 \u0628\u0637\u0627\u0642\u0627\u062A \u062A\u0646\u062A\u0645\u064A \u0625\u0644\u0649 \u0627\u0644\u0639\u062F\u064A\u062F \u0645\u0646 \u0627\u0644\u0631\u064F\u0632\u0645 \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0645\u0644\u0641", + ALGORITHM: "\u062E\u0648\u0627\u0631\u0632\u0645\u064A\u0629", + CHECK_ALGORITHM_WIKI: 'algorithm implementation :\u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u062A\u062D\u0642\u0642 \u0645\u0646', + BASE_EASE: "\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0642\u0627\u0639\u062F\u0629", + BASE_EASE_DESC: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 = 130 \u060C \u0648\u064A\u0641\u0636\u0644 \u062D\u0648\u0627\u0644\u064A 250.", + BASE_EASE_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0642\u0627\u0639\u062F\u0629 130 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.", + LAPSE_INTERVAL_CHANGE: "\u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u064A\u062A\u063A\u064A\u0631 \u0639\u0646\u062F \u0645\u0631\u0627\u062C\u0639\u0629 \u0628\u0637\u0627\u0642\u0629/\u0645\u0644\u0627\u062D\u0638\u0629 \u0635\u0639\u0628\u0629", + LAPSE_INTERVAL_CHANGE_DESC: "newInterval = oldInterval * intervalChange / 100.", + EASY_BONUS: "\u0645\u0643\u0627\u0641\u0623\u0629 \u0633\u0647\u0644\u0629", + EASY_BONUS_DESC: "\u062A\u062A\u064A\u062D \u0644\u0643 \u0627\u0644\u0645\u0643\u0627\u0641\u0623\u0629 \u0627\u0644\u0633\u0647\u0644\u0629 \u0636\u0628\u0637 \u0627\u0644\u0641\u0631\u0642 \u0641\u064A \u0627\u0644\u0641\u0648\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A\u0629 \u0628\u064A\u0646 \u0627\u0644\u0631\u062F \u0627\u0644\u062C\u064A\u062F \u0648\u0627\u0644\u0633\u0647\u0644 \u0639\u0644\u0649 \u0628\u0637\u0627\u0642\u0629/\u0645\u0644\u0627\u062D\u0638\u0629 (\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 = 100 \u066A).", + EASY_BONUS_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0627\u0644\u0645\u0643\u0627\u0641\u0623\u0629 \u0627\u0644\u0633\u0647\u0644\u0629 100 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.", + MAX_INTERVAL: "Maximum interval in days", + MAX_INTERVAL_DESC: "\u064A\u062A\u064A\u062D \u0644\u0643 \u0648\u0636\u0639 \u062D\u062F \u0623\u0639\u0644\u0649 \u0644\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A (\u0627\u0641\u062A\u0631\u0627\u0636\u064A = 100 \u0639\u0627\u0645).", + MAX_INTERVAL_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u0644\u0645\u062F\u0629 \u064A\u0648\u0645 \u0648\u0627\u062D\u062F \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.", + MAX_LINK_CONTRIB: "\u0623\u0642\u0635\u0649 \u0645\u0633\u0627\u0647\u0645\u0629 \u0627\u0631\u062A\u0628\u0627\u0637", + MAX_LINK_CONTRIB_DESC: "\u0623\u0642\u0635\u0649 \u0645\u0633\u0627\u0647\u0645\u0629 \u0644\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0645\u0631\u062C\u062D\u0629 \u0644\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0645\u0631\u062A\u0628\u0637\u0629 \u0628\u0627\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0623\u0648\u0644\u064A\u0629.", + LOGGING: "\u062A\u0633\u062C\u064A\u0644", + DISPLAY_DEBUG_INFO: "\u0639\u0631\u0636 \u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u062A\u0635\u062D\u064A\u062D \u0639\u0644\u0649 \u0648\u062D\u062F\u0629 \u062A\u062D\u0643\u0645 \u0627\u0644\u0645\u0637\u0648\u0631\u061F", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629", + CLOSE: "\u0623\u063A\u0644\u0642", + NEW: "\u062C\u062F\u064A\u062F", + YESTERDAY: "\u0627\u0644\u0628\u0627\u0631\u062D\u0629", + TODAY: "\u0627\u0644\u064A\u0648\u0645", + TOMORROW: "\u0627\u0644\u063A\u062F", + // stats-modal.tsx + STATS_TITLE: "\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A", + MONTH: "\u0634\u0647\u0631", + QUARTER: "\u0631\u0628\u0639 \u0627\u0644\u0633\u0646\u0629", + YEAR: "\u0633\u0646\u0629", + LIFETIME: "", + FORECAST: "", + FORECAST_DESC: "\u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062D\u0642\u0629 \u0641\u064A \u0627\u0644\u0645\u0633\u062A\u0642\u0628\u0644", + SCHEDULED: "\u0627\u0644\u0645\u0642\u0631\u0631", + DAYS: "\u0623\u064A\u0627\u0645", + NUMBER_OF_CARDS: "\u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + REVIEWS_PER_DAY: "\u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0627\u062A/\u0627\u0644\u064A\u0648\u0645 ${avg} :\u0645\u062A\u0648\u0633\u0637", + INTERVALS: "\u0641\u0648\u0627\u0635\u0644 \u0632\u0645\u0646\u064A\u0629", + INTERVALS_DESC: "\u0627\u0644\u062A\u0623\u062E\u064A\u0631 \u062D\u062A\u0649 \u064A\u062A\u0645 \u0639\u0631\u0636 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0627\u062A \u0645\u0631\u0629 \u0623\u062E\u0631\u0649", + COUNT: "\u0639\u062F\u062F", + INTERVALS_SUMMARY: "${longest} : \u0623\u0637\u0648\u0644 \u0641\u0627\u0635\u0644 \u0632\u0645\u0646\u064A ,${avg} :\u0645\u062A\u0648\u0633\u0637 \u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A", + EASES: "\u0627\u0644\u0633\u0647\u0648\u0644\u0629", + EASES_SUMMARY: "${avgEase} :\u0645\u062A\u0648\u0633\u0637 \u0627\u0644\u0633\u0647\u0648\u0644\u0629", + CARD_TYPES: "\u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + CARD_TYPES_DESC: "\u0648\u0647\u0630\u0627 \u064A\u0634\u0645\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629 \u0643\u0630\u0644\u0643 \u060C \u0625\u0646 \u0648\u062C\u062F\u062A", + CARD_TYPE_NEW: "\u062C\u062F\u064A\u062F\u0629", + CARD_TYPE_YOUNG: "\u0635\u063A\u064A\u0631\u0629", + CARD_TYPE_MATURE: "\u0646\u0627\u0636\u062C\u0629", + CARD_TYPES_SUMMARY: " ${totalCardsCount} :\u0625\u062C\u0645\u0627\u0644\u064A \u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A" +}; + +// src/lang/locale/cz.ts +var cz_default = { + // flashcard-modal.tsx + DECKS: "Bal\xED\u010Dky", + DUE_CARDS: "Karti\u010Dky po term\xEDnu", + NEW_CARDS: "Nov\xE9 karti\u010Dky", + TOTAL_CARDS: "Karti\u010Dek celkem", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "Vynulovat pokrok karti\u010Dky", + HARD: "Te\u017Ek\xE9", + GOOD: "Dobr\xE9", + EASY: "Jednoduch\xE9", + SHOW_ANSWER: "Uk\xE1zat odpov\u011B\u010F", + CARD_PROGRESS_RESET: "Pokrok karti\u010Dky byl vynulov\xE1n.", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "Otev\u0159\xEDt pozn\xE1mku k revizi", + REVIEW_CARDS: "Pozn\xE1mek k revizi", + REVIEW_DIFFICULTY_FILE_MENU: "Revize: ${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "Ozna\u010Dit pozn\xE1mku jako ${difficulty}", + REVIEW_ALL_CARDS: "Revidovat karti\u010Dky ve v\u0161ech pozn\xE1mk\xE1ch", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_CARDS_IN_NOTE: "Revidovat karti\u010Dky v t\xE9to pozn\xE1mce.", + CRAM_CARDS_IN_NOTE: "Cram karti\u010Dky v t\xE9to pozn\xE1mce.", + VIEW_STATS: "Uk\xE1zat statistiky", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "Revize: ${dueNotesCount} pozn\xE1mek, ${dueFlashcardsCount} karti\u010Dek po term\xEDnu", + SYNC_TIME_TAKEN: "Synchronizace trvala ${t}ms", + NOTE_IN_IGNORED_FOLDER: "Pozn\xE1mka je ulo\u017Eena v ignorovan\xE9 slo\u017Ece (zkontrolujte nastaven\xED).", + PLEASE_TAG_NOTE: "Pros\xEDm ozna\u010Dne pozn\xE1mku odpov\xEDdaj\xEDc\xEDm tagem pro revizi (v nastaven\xED).", + RESPONSE_RECEIVED: "Odpov\u011B\u010F p\u0159ijata.", + NO_DECK_EXISTS: "Neexistuje \u017E\xE1dn\xFD bal\xED\u010Dek pro ${deckName}", + ALL_CAUGHT_UP: "V\u0161e zrevidov\xE1no", + // scheduling.ts + DAYS_STR_IVL: "${interval} den/dn\xED", + MONTHS_STR_IVL: "${interval} m\u011Bs\xEDc(\u016F)", + YEARS_STR_IVL: "${interval} rok(\u016F)", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}r", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - Nastaven\xED", + CHECK_WIKI: 'Pro v\xEDce informac\xED jd\u011Bte na wiki.', + FOLDERS_TO_IGNORE: "Ignorovan\xE9 slo\u017Eky", + FOLDERS_TO_IGNORE_DESC: "Zadejte cesty ke slo\u017Ek\xE1m odd\u011Blen\xE9 od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDkad. \u0160ablony Meta/Scripts", + FLASHCARDS: "Karti\u010Dky", + FLASHCARD_EASY_LABEL: "Easy Button Text", + FLASHCARD_GOOD_LABEL: "Good Button Text", + FLASHCARD_HARD_LABEL: "Hard Button Text", + FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', + FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', + FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', + FLASHCARD_TAGS: "Tag pro karti\u010Dky", + FLASHCARD_TAGS_DESC: "Zadete tagy ood\u011Blen\xE9 mezerou nebo od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDklad. #karti\u010Dky #bal\xED\u010Dke2 #bal\xED\u010Dek3.", + CONVERT_FOLDERS_TO_DECKS: "P\u0159ev\xE9st slo\u017Eky na bal\xED\u010Dky a podbal\xED\u010Dky?", + CONVERT_FOLDERS_TO_DECKS_DESC: "Toto je alternativa k tag\u016Fm karti\u010Dek viz nastaven\xED v\xFD\u0161e.", + INLINE_SCHEDULING_COMMENTS: "Ulo\u017Eit pl\xE1novac\xED koment\xE1\u0159 na stejn\xFD \u0159\xE1dek jako posledn\xED polo\u017Eka karti\u010Dky?", + INLINE_SCHEDULING_COMMENTS_DESC: "Zapnut\xED t\xE9to volby zp\u016Fsob\xED, \u017Ee HTML koment\xE1\u0159e nebudou rozb\xEDjet form\xE1tov\xE1n\xED list\u016F.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Odlo\u017Eit p\u0159\xEDbuzn\xE9 karti\u010Dky na dal\u0161\xED den?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "P\u0159\xEDbuzn\xE9 karti\u010Dky jsou karti\u010Dky generovan\xE9 z textu stejn\xE9 pozn\xE1mky nap\u0159\xEDklad cloze smaz\xE1n\xED", + SHOW_CARD_CONTEXT: "Uk\xE1zat kontext v karti\u010Dce?", + SHOW_CARD_CONTEXT_DESC: "nap\u0159\xEDklad Titulek > Nadpis1 > Podnadpis > ... > Podnadpis", + CARD_MODAL_HEIGHT_PERCENT: "V\xFD\u0161ka karti\u010Dek v procentech", + CARD_MODAL_SIZE_PERCENT_DESC: "M\u011Blo by b\xFDt nastaveno na 100% na mobilu nebo kdy\u017E pou\u017E\xEDv\xE1te velk\xE9 obr\xE1zky", + RESET_DEFAULT: "Resetovat v\xFDchoz\xED nastaven\xED", + CARD_MODAL_WIDTH_PERCENT: "\u0160\xED\u0159ka karti\u010Dek v procentech", + RANDOMIZE_CARD_ORDER: "N\xE1hodn\u011B zm\u011Bnit po\u0159ad\xED karti\u010Dek b\u011Bhem revize?", + REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + REVIEW_DECK_ORDER: "Order decks are displayed during review", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + DISABLE_CLOZE_CARDS: "Vypnout cloze karti\u010Dky?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "P\u0159ev\xE9st ==zv\xFDrazn\u011Bn\xED== na clozes?", + CONVERT_BOLD_TEXT_TO_CLOZES: "P\u0159ev\xE9st **tu\u010Dn\xFD text** na clozes?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "P\u0159ev\xE9st {{slo\u017Een\xE9 z\xE1vorky}} na clozes?", + INLINE_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro inline karti\u010Dky", + FIX_SEPARATORS_MANUALLY_WARNING: "Pozor. Jakmile toto zm\u011Bn\xEDte, budete muset ru\u010Dn\u011B upravit v\u0161echny existuj\xEDc\xED karti\u010Dky.", + INLINE_REVERSED_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro oto\u010Den\xE9 inline karti\u010Dky", + MULTILINE_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro v\xEDce\u0159\xE1dkov\xE9 karti\u010Dky", + MULTILINE_REVERSED_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro v\xEDce\u0159\xE1dkove oto\u010Den\xE9 karti\u010Dky", + NOTES: "Pozn\xE1mky", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "Tag pro revizi", + TAGS_TO_REVIEW_DESC: "Zadejte tagy odd\u011Blen\xE9 mezerami nebo od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDklad #review #tag2 #tag3.", + OPEN_RANDOM_NOTE: "Otev\u0159\xEDt n\xE1hodnou pozn\xE1mku pro revizi", + OPEN_RANDOM_NOTE_DESC: "Pokud toto vypnete, pozn\xE1mky budou \u0159azeny dle d\u016Fle\u017Eitosti (PageRank).", + AUTO_NEXT_NOTE: "Otev\u0159\xEDt automaticky dal\u0161\xED pozn\xE1mku po dokon\u010Den\xED revize", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "Vypnout volby revize v menu souboru nap\u0159\xEDklad 'Revize: Jednoduch\xE9'", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Po vypnut\xED m\u016F\u017Eete pou\u017E\xEDvat kl\xE1vesov\xE9 zkratky. Restartujte Obsidian po zm\u011Bn\u011B nastaven\xED.", + MAX_N_DAYS_REVIEW_QUEUE: "Maxim\xE1ln\xED po\u010Det dn\xED zobrazen\xFDch v prav\xE9m panelu", + MIN_ONE_DAY: "Po\u010Det dn\xED mus\xED b\xFDt minim\xE1ln\u011B 1.", + VALID_NUMBER_WARNING: "Pros\xEDm zadejte validn\xED \u010D\xEDslo.", + UI_PREFERENCES: "P\u0159edvolby u\u017Eivatelsk\xE9ho rozhran\xED", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Stromy bal\xED\u010Dky by m\u011Bly b\xFDt zpo\u010D\xE1tku zobrazeny jako rozbalen\xE9", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Vypn\u011Bte toto, chcete-li sbalit vno\u0159en\xE9 bal\xED\u010Dky na stejn\xE9 kart\u011B. To je u\u017Eite\u010Dn\xE9, pokud m\xE1te karti\u010Dky, kter\xE9 pat\u0159\xED k mnoha bal\xED\u010Dk\u016Fm ve stejn\xE9m souboru.", + ALGORITHM: "Algoritmus", + CHECK_ALGORITHM_WIKI: 'Pro v\xEDce informac\xED jd\u011Bte na popis algoritmu.', + BASE_EASE: "Z\xE1kladn\xED slo\u017Eitost", + BASE_EASE_DESC: "minimum = 130, nejl\xE9pe p\u0159ibli\u017En\u011B 250.", + BASE_EASE_MIN_WARNING: "Z\xE1kladn\xED slo\u017Eitost mus\xED b\xFDt minim\xE1ln\u011B 130.", + LAPSE_INTERVAL_CHANGE: "Zm\u011Bna intervalu pokud karti\u010Dku/pozn\xE1mku ozna\u010D\xEDte jako slo\u017Eitou", + LAPSE_INTERVAL_CHANGE_DESC: "nov\xFD_inteval = star\xFD_interval * zm\u011Bna_intevalu / 100.", + EASY_BONUS: "Bonus pro jednoduch\xE9", + EASY_BONUS_DESC: "Tento bonus umo\u017E\u0148uje nastavit rozd\xEDl intervalu mezi jednoduch\xFDmi a dobr\xFDmi karti\u010Dkami/pozn\xE1mkami (minimum = 100%).", + EASY_BONUS_MIN_WARNING: "Bonus pro jednoduchost mus\xED b\xFDt minim\xE1ln\u011B 100.", + MAX_INTERVAL: "Maximum interval in days", + MAX_INTERVAL_DESC: "Umo\u017E\u0148uje nastavit horn\xED limit pro interval (defaultn\u011B = 100 let).", + MAX_INTERVAL_MIN_WARNING: "Maxim\xE1ln\xED interval mus\xED b\xFDt alespo\u0148 1 den.", + MAX_LINK_CONTRIB: "Maxim\xE1ln\xED p\u0159\xEDsp\u011Bv\u011Bk prolinkov\xE1n\xED", + MAX_LINK_CONTRIB_DESC: "Maxim\xE1ln\xED p\u0159\xEDsp\u011Bvek v\xE1\u017Een\xE9 slo\u017Eitosti prolinkovan\xFDch pozn\xE1mek pou\u017Eit\xFD pro ur\u010Den\xED po\u010D\xE1te\u010Dn\xED slo\u017Eitosti.", + LOGGING: "Zaznamen\xE1v\xE1m", + DISPLAY_DEBUG_INFO: "Zobrazit informace pro lad\u011Bn\xED na v\xFDvoj\xE1\u0159sk\xE9 konzoli?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "Fronta pozn\xE1mek k revizi", + CLOSE: "Uzav\u0159en\xE9", + NEW: "Nov\xE9", + YESTERDAY: "V\u010Dera", + TODAY: "Dnes", + TOMORROW: "Z\xEDtra", + // stats-modal.tsx + STATS_TITLE: "Statistiky", + MONTH: "M\u011Bs\xEDc", + QUARTER: "\u010Ctvrtlet\xED", + YEAR: "Rok", + LIFETIME: "Celkov\u011B", + FORECAST: "P\u0159edpov\u011B\u010F", + FORECAST_DESC: "Celkov\xFD po\u010Det karti\u010Dek, kter\xFDm vypr\u0161\xED term\xEDn", + SCHEDULED: "Napl\xE1nov\xE1no", + DAYS: "Dn\xED", + NUMBER_OF_CARDS: "Po\u010Det karti\u010Dek", + REVIEWS_PER_DAY: "Pr\u016Fm\u011Br: ${avg} revize/den", + INTERVALS: "Intervaly", + INTERVALS_DESC: "Doba, za kterou bude znovu zobrazeno k revize", + COUNT: "Po\u010Det", + INTERVALS_SUMMARY: "Pr\u016Fm\u011Brn\xFD interval: ${avg}, Nejdel\u0161\xED interval: ${longest}", + EASES: "Slo\u017Eitost", + EASES_SUMMARY: "Pr\u016Fm\u011Brn\xE1 slo\u017Eitost: ${avgEase}", + CARD_TYPES: "Typy karti\u010Dek", + CARD_TYPES_DESC: "Obsahuje i odlo\u017Een\xE9 karti\u010Dky (pokud existuj\xED)", + CARD_TYPE_NEW: "Nov\xE1", + CARD_TYPE_YOUNG: "Mlad\xE1", + CARD_TYPE_MATURE: "Dosp\u011Bl\xE1", + CARD_TYPES_SUMMARY: "Karti\u010Dek celkem: ${totalCardsCount}" +}; + +// src/lang/locale/bn.ts +var bn_default = {}; + +// src/lang/locale/da.ts +var da_default = {}; + +// src/lang/locale/de.ts +var de_default = { + // flashcard-modal.tsx + DECKS: "Stapel", + DUE_CARDS: "Anstehende Karten", + NEW_CARDS: "Neue Karten", + TOTAL_CARDS: "Alle Karten", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "Kartenfortschritt zur\xFCcksetzten", + HARD: "Schwer", + GOOD: "Gut", + EASY: "Einfach", + SHOW_ANSWER: "Zeige Antwort", + CARD_PROGRESS_RESET: "Kartenfortschritt wurde zur\xFCckgesetzt.", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "Notiz zur Wiederholung \xF6ffnen", + REVIEW_CARDS: "Lernkarten wiederholen", + REVIEW_DIFFICULTY_FILE_MENU: "Notiz abschliessen als: ${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "Notiz abschliessen als: ${difficulty}", + REVIEW_ALL_CARDS: "Alle Lernkarten wiederholen", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_CARDS_IN_NOTE: "Lernkarten in dieser Notiz wiederholen", + CRAM_CARDS_IN_NOTE: "Lernkarten in dieser Notiz pauken.", + VIEW_STATS: "Statistiken anzeigen", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "Wiederholung: ${dueNotesCount} Notiz(en), ${dueFlashcardsCount} Karte(n) anstehend", + SYNC_TIME_TAKEN: "Sync dauerte ${t}ms", + NOTE_IN_IGNORED_FOLDER: "Notiz befindet sich in einem ausgeschlossenen Ordner (siehe Einstellungen).", + PLEASE_TAG_NOTE: "Bitte die Notiz f\xFCr Wiederholungen entsprechend taggen (siehe Einstellungen).", + RESPONSE_RECEIVED: "Antwort erhalten.", + NO_DECK_EXISTS: "Kein Stapel f\xFCr ${deckName} gefunden.", + ALL_CAUGHT_UP: "Yuhu! Alles geschafft! :D.", + // scheduling.ts + DAYS_STR_IVL: "${interval} Tag(e)", + MONTHS_STR_IVL: "${interval} Monat(e)", + YEARS_STR_IVL: "${interval} Jahr(e)", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}y", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - Einstellungen", + CHECK_WIKI: 'Weitere Informationen gibt es im Wiki (english).', + FOLDERS_TO_IGNORE: "Ausgeschlossene Ordner", + FOLDERS_TO_IGNORE_DESC: "Mehrere Ordner mit Zeilenumbr\xFCchen getrennt angeben. Bsp. OrdnerA[Zeilenumbruch]OrdnerB/Unterordner", + FLASHCARDS: "Lernkarten", + FLASHCARD_EASY_LABEL: "Easy Button Text", + FLASHCARD_GOOD_LABEL: "Good Button Text", + FLASHCARD_HARD_LABEL: "Hard Button Text", + FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', + FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', + FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', + FLASHCARD_TAGS: "Lernkarten Tags", + FLASHCARD_TAGS_DESC: "Mehrere Tags mit Leerzeichen oder Zeilenumbr\xFCchen getrennt angeben. Bsp. #karte #stapel2 #stapel3.", + CONVERT_FOLDERS_TO_DECKS: "Ordner in Stapel und Substapel umwandeln?", + CONVERT_FOLDERS_TO_DECKS_DESC: 'Eine Alternative zur oberen "Lernkarten Tags" Option.', + INLINE_SCHEDULING_COMMENTS: "Den Fortschritt in der gleichen Zeile wie die letzte Zeile einer Lernkartei speichern?", + INLINE_SCHEDULING_COMMENTS_DESC: "Wenn aktiviert, wird der HTML Kommentar die umgebende Liste nicht aufbrechen.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Verwandte Karten auf den n\xE4chsten Tag verlegen?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Verwandte Karten sind aus der gleichen Karte generiert worden (z.B. L\xFCckentextkarten oder beidseitige Karten).", + SHOW_CARD_CONTEXT: "Kontext in den Karten anzeigen?", + SHOW_CARD_CONTEXT_DESC: "Bsp. Titel > \xDCberschrift 1 > Sektion > ... > Untersektion", + CARD_MODAL_HEIGHT_PERCENT: "H\xF6he der Lernkartei in Prozent", + CARD_MODAL_SIZE_PERCENT_DESC: "Auf kleinen Bildschirmen (z.B. Smartphones) oder bei sehr grossen Bildern sollte dieser Wert auf 100% gesetzt werden.", + RESET_DEFAULT: "Standardeinstellung wiederherstellen", + CARD_MODAL_WIDTH_PERCENT: "Breite einer Lernkarte in Prozent", + RANDOMIZE_CARD_ORDER: "W\xE4hrend der Wiederhoung die Reihenfolge zuf\xE4llig mischen?", + REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + REVIEW_DECK_ORDER: "Order decks are displayed during review", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + DISABLE_CLOZE_CARDS: "L\xFCckentextkarten (cloze deletions) deaktivieren?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "==Hervorgehobenen== Text in L\xFCckentextkarten umwandeln?", + CONVERT_BOLD_TEXT_TO_CLOZES: "**Fettgedruckten** Text in L\xFCckentextkarten umwandeln?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{Geschweifte Klammern}} Text in L\xFCckentextkarten umwandeln?", + INLINE_CARDS_SEPARATOR: "Trennzeichen f\xFCr einzeilige Lernkarten", + FIX_SEPARATORS_MANUALLY_WARNING: "Wenn diese Einstellung ge\xE4ndert wird, dann m\xFCssen die entsprechenden Lernkarten manuell angepasst werden.", + INLINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen f\xFCr einzeilige beidseitige Lernkarten", + MULTILINE_CARDS_SEPARATOR: "Trennzeichen f\xFCr mehrzeilige Lernkarten", + MULTILINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen f\xFCr mehrzeilige beidseitige Lernkarten", + NOTES: "Notizen", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "Zu wiederholende Tags", + TAGS_TO_REVIEW_DESC: "Mehrere Tags k\xF6nnen mit Leerzeichen oder Zeilenumbr\xFCchen getrennt angegeben werden. Bsp. #karte #tag1 #tag2.", + OPEN_RANDOM_NOTE: "Zuf\xE4llige Karten wiederholen", + OPEN_RANDOM_NOTE_DESC: "Wenn dies deaktiviert wird, dann werden die Notizen nach Wichtigkeit wiederholt (PageRank).", + AUTO_NEXT_NOTE: "Nach einer Wiederholung automatisch die n\xE4chste Karte \xF6ffnen", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "Optionen zur Wiederholung im Men\xFC einer Datei deaktivieren. Bsp. Wiederholen: Einfach Gut Schwer", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Nach dem Deaktivieren k\xF6nnen die Tastenk\xFCrzel zur Wiederholung verwendet werden. Obsidian muss nach einer \xC4nderung neu geladen weren.", + MAX_N_DAYS_REVIEW_QUEUE: "Maximale Anzahl anstehender Notizen, die im rechten Fensterbereich angezeigt werden", + MIN_ONE_DAY: "Anzahl der Tage muss mindestens 1 sein.", + VALID_NUMBER_WARNING: "Bitte eine g\xFCltige Zahl eingeben.", + UI_PREFERENCES: "Einstellungen der Benutzeroberfl\xE4che", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Deckb\xE4ume sollten anf\xE4nglich erweitert angezeigt werden", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Deaktivieren Sie dies, um verschachtelte Decks in derselben Karte zu reduzieren. N\xFCtzlich, wenn Sie Karten haben, die zu vielen Decks in derselben Datei geh\xF6ren.", + ALGORITHM: "Algorithmus", + CHECK_ALGORITHM_WIKI: 'Weiterf\xFChrende Informationen: Implementierung des Algorithmus (english).', + BASE_EASE: "Basis der Einfachheit", + BASE_EASE_DESC: "Minimum ist 130. Empfohlen wird ca. 250.", + BASE_EASE_MIN_WARNING: "Basis der Einfachheit muss mindestens 130 sein.", + LAPSE_INTERVAL_CHANGE: "Anpassungsfaktor des Intervalls wenn eine Notiz / Karte 'Schwer' abgeschlossen wird", + LAPSE_INTERVAL_CHANGE_DESC: "neuesIntervall = altesIntervall * anpassungsfaktor / 100.", + EASY_BONUS: "Einfachheit-Bonus", + EASY_BONUS_DESC: "Der Einfachheit-Bonus gibt an um welchen Faktor (in Prozent) das Intervall l\xE4nger sein soll, wenn eine Notiz / Karte 'Einfach' statt 'Gut' abgeschlossen wird. Minimum ist 100%.", + EASY_BONUS_MIN_WARNING: "Der Einfachheit-Bonus muss mindestens 100 sein.", + MAX_INTERVAL: "Maximum interval in days", + MAX_INTERVAL_DESC: "Das maximale Intervall (in Tagen) f\xFCr Wiederholungen. Standard sind 100 Jahre.", + MAX_INTERVAL_MIN_WARNING: "Das maximale Interall muss mindestens ein Tag sein.", + MAX_LINK_CONTRIB: "Maximaler Einfluss von Links", + MAX_LINK_CONTRIB_DESC: "Maximaler Einfluss der Einfachheiten verlinkter Notizen zur gewichteten initialen Einfachheit einer neuen Lernkarte.", + LOGGING: "Logging", + DISPLAY_DEBUG_INFO: "Informationen zum Debugging in der Entwicklerkonsole anzeigen?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "Anstehende Notizen zur Wiederholung", + CLOSE: "Schliessen", + NEW: "Neu", + YESTERDAY: "Gestern", + TODAY: "Heute", + TOMORROW: "Morgen", + // stats-modal.tsx + STATS_TITLE: "Statistiken", + MONTH: "Month", + QUARTER: "Quarter", + YEAR: "Year", + LIFETIME: "Lifetime", + FORECAST: "Prognose", + FORECAST_DESC: "Anzahl der k\xFCnftig anstehenden Karten", + SCHEDULED: "Anstehend", + DAYS: "Tage", + NUMBER_OF_CARDS: "Anzahl der Karten", + REVIEWS_PER_DAY: "Durchschnitt: ${avg} Wiederholungen/Tag", + INTERVALS: "Intervalle", + INTERVALS_DESC: "Intervalle bis Wiederholungen anstehen", + COUNT: "Anzahl", + INTERVALS_SUMMARY: "Durchschnittliches Intervall: ${avg}, L\xE4ngstes Intervall: ${longest}", + EASES: "Einfachheit", + EASES_SUMMARY: "Durchschnittliche Einfachheit: ${avgEase}", + CARD_TYPES: "Kategorisierung", + CARD_TYPES_DESC: "Verlegte Karten eingeschlossen", + CARD_TYPE_NEW: "Neu", + CARD_TYPE_YOUNG: "Jung", + CARD_TYPE_MATURE: "Ausgereift", + CARD_TYPES_SUMMARY: "Insgesamt ${totalCardsCount} Karten" +}; + +// src/lang/locale/en.ts +var en_default = { + // flashcard-modal.tsx + DECKS: "Decks", + DUE_CARDS: "Due Cards", + NEW_CARDS: "New Cards", + TOTAL_CARDS: "Total Cards", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "Reset card's progress", + HARD: "Hard", + GOOD: "Good", + EASY: "Easy", + SHOW_ANSWER: "Show Answer", + CARD_PROGRESS_RESET: "Card's progress has been reset.", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "Open a note for review", + REVIEW_CARDS: "Review flashcards", + REVIEW_DIFFICULTY_FILE_MENU: "Review: ${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "Review note as ${difficulty}", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_ALL_CARDS: "Review flashcards from all notes", + REVIEW_CARDS_IN_NOTE: "Review flashcards in this note", + CRAM_CARDS_IN_NOTE: "Cram flashcards in this note", + VIEW_STATS: "View statistics", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "Review: ${dueNotesCount} note(s), ${dueFlashcardsCount} card(s) due", + SYNC_TIME_TAKEN: "Sync took ${t}ms", + NOTE_IN_IGNORED_FOLDER: "Note is saved under ignored folder (check settings).", + PLEASE_TAG_NOTE: "Please tag the note appropriately for reviewing (in settings).", + RESPONSE_RECEIVED: "Response received.", + NO_DECK_EXISTS: "No deck exists for ${deckName}", + ALL_CAUGHT_UP: "You're all caught up now :D.", + // scheduling.ts + DAYS_STR_IVL: "${interval} day(s)", + MONTHS_STR_IVL: "${interval} month(s)", + YEARS_STR_IVL: "${interval} year(s)", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}y", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - Settings", + CHECK_WIKI: 'For more information, check the wiki.', + FOLDERS_TO_IGNORE: "Folders to ignore", + FOLDERS_TO_IGNORE_DESC: "Enter folder paths separated by newlines i.e. Templates Meta/Scripts", + FLASHCARDS: "Flashcards", + FLASHCARD_EASY_LABEL: "Easy Button Text", + FLASHCARD_GOOD_LABEL: "Good Button Text", + FLASHCARD_HARD_LABEL: "Hard Button Text", + FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', + FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', + FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', + FLASHCARD_TAGS: "Flashcard tags", + FLASHCARD_TAGS_DESC: "Enter tags separated by spaces or newlines i.e. #flashcards #deck2 #deck3.", + CONVERT_FOLDERS_TO_DECKS: "Convert folders to decks and subdecks?", + CONVERT_FOLDERS_TO_DECKS_DESC: "This is an alternative to the Flashcard tags option above.", + INLINE_SCHEDULING_COMMENTS: "Save scheduling comment on the same line as the flashcard's last line?", + INLINE_SCHEDULING_COMMENTS_DESC: "Turning this on will make the HTML comments not break list formatting.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Bury sibling cards until the next day?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Siblings are cards generated from the same card text i.e. cloze deletions", + SHOW_CARD_CONTEXT: "Show context in cards?", + SHOW_CARD_CONTEXT_DESC: "i.e. Title > Heading 1 > Subheading > ... > Subheading", + CARD_MODAL_HEIGHT_PERCENT: "Flashcard Height Percentage", + CARD_MODAL_SIZE_PERCENT_DESC: "Should be set to 100% on mobile or if you have very large images", + RESET_DEFAULT: "Reset to default", + CARD_MODAL_WIDTH_PERCENT: "Flashcard Width Percentage", + RANDOMIZE_CARD_ORDER: "Randomize card order during review?", + REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + REVIEW_DECK_ORDER: "Order decks are displayed during review", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + DISABLE_CLOZE_CARDS: "Disable cloze cards?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "Convert ==hightlights== to clozes?", + CONVERT_BOLD_TEXT_TO_CLOZES: "Convert **bolded text** to clozes?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convert {{curly brackets}} to clozes?", + INLINE_CARDS_SEPARATOR: "Separator for inline flashcards", + FIX_SEPARATORS_MANUALLY_WARNING: "Note that after changing this you have to manually edit any flashcards you already have.", + INLINE_REVERSED_CARDS_SEPARATOR: "Separator for inline reversed flashcards", + MULTILINE_CARDS_SEPARATOR: "Separator for multiline flashcards", + MULTILINE_REVERSED_CARDS_SEPARATOR: "Separator for multiline reversed flashcards", + NOTES: "Notes", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "Tags to review", + TAGS_TO_REVIEW_DESC: "Enter tags separated by spaces or newlines i.e. #review #tag2 #tag3.", + OPEN_RANDOM_NOTE: "Open a random note for review", + OPEN_RANDOM_NOTE_DESC: "When you turn this off, notes are ordered by importance (PageRank).", + AUTO_NEXT_NOTE: "Open next note automatically after a review", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "Disable review options in the file menu i.e. Review: Easy Good Hard", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "After disabling, you can review using the command hotkeys. Reload Obsidian after changing this.", + MAX_N_DAYS_REVIEW_QUEUE: "Maximum number of days to display on right panel", + MIN_ONE_DAY: "The number of days must be at least 1.", + VALID_NUMBER_WARNING: "Please provide a valid number.", + UI_PREFERENCES: "UI Preferences", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Deck trees should be initially displayed as expanded", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Turn this off to collapse nested decks in the same card. Useful if you have cards which belong to many decks in the same file.", + ALGORITHM: "Algorithm", + CHECK_ALGORITHM_WIKI: 'For more information, check the algorithm implementation.', + BASE_EASE: "Base ease", + BASE_EASE_DESC: "minimum = 130, preferrably approximately 250.", + BASE_EASE_MIN_WARNING: "The base ease must be at least 130.", + LAPSE_INTERVAL_CHANGE: "Interval change when you review a flashcard/note as hard", + LAPSE_INTERVAL_CHANGE_DESC: "newInterval = oldInterval * intervalChange / 100.", + EASY_BONUS: "Easy Bonus", + EASY_BONUS_DESC: "The easy bonus allows you to set the difference in intervals between answering Good and Easy on a flashcard/note (minimum = 100%).", + EASY_BONUS_MIN_WARNING: "The easy bonus must be at least 100.", + MAX_INTERVAL: "Maximum interval in days", + MAX_INTERVAL_DESC: "Allows you to place an upper limit on the interval (default = 100 years).", + MAX_INTERVAL_MIN_WARNING: "The maximum interval must be at least 1 day.", + MAX_LINK_CONTRIB: "Maximum link contribution", + MAX_LINK_CONTRIB_DESC: "Maximum contribution of the weighted ease of linked notes to the initial ease.", + LOGGING: "Logging", + DISPLAY_DEBUG_INFO: "Display debugging information on the developer console?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "Notes Review Queue", + CLOSE: "Close", + NEW: "New", + YESTERDAY: "Yesterday", + TODAY: "Today", + TOMORROW: "Tomorrow", + // stats-modal.tsx + STATS_TITLE: "Statistics", + MONTH: "Month", + QUARTER: "Quarter", + YEAR: "Year", + LIFETIME: "Lifetime", + FORECAST: "Forecast", + FORECAST_DESC: "The number of cards due in the future", + SCHEDULED: "Scheduled", + DAYS: "Days", + NUMBER_OF_CARDS: "Number of cards", + REVIEWS_PER_DAY: "Average: ${avg} reviews/day", + INTERVALS: "Intervals", + INTERVALS_DESC: "Delays until reviews are shown again", + COUNT: "Count", + INTERVALS_SUMMARY: "Average interval: ${avg}, Longest interval: ${longest}", + EASES: "Eases", + EASES_SUMMARY: "Average ease: ${avgEase}", + CARD_TYPES: "Card Types", + CARD_TYPES_DESC: "This includes buried cards as well, if any", + CARD_TYPE_NEW: "New", + CARD_TYPE_YOUNG: "Young", + CARD_TYPE_MATURE: "Mature", + CARD_TYPES_SUMMARY: "Total cards: ${totalCardsCount}" +}; + +// src/lang/locale/en-gb.ts +var en_gb_default = {}; + +// src/lang/locale/es.ts +var es_default = { + // flashcard-modal.tsx + DECKS: "Mazos", + DUE_CARDS: "Tarjetas Vencidas", + NEW_CARDS: "Tarjetas Nuevas", + TOTAL_CARDS: "Tarjetas Totales", + BACK: "Atr\xE1s", + SKIP: "Saltar", + EDIT_CARD: "Editar Tarjeta", + RESET_CARD_PROGRESS: "Reiniciar progreso de la tarjeta", + HARD: "Dif\xEDcil", + GOOD: "Bien", + EASY: "F\xE1cil", + SHOW_ANSWER: "Mostrar Respuesta", + CARD_PROGRESS_RESET: "El progreso de la tarjeta se ha reiniciado.", + SAVE: "Guardar", + CANCEL: "Cancelar", + NO_INPUT: "Se ha prove\xEDdo entrada.", + CURRENT_EASE_HELP_TEXT: "Facilidad Actual: ", + CURRENT_INTERVAL_HELP_TEXT: "Intervalo Actual: ", + CARD_GENERATED_FROM: "Generado Desde: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "Abrir nota para revisi\xF3n", + REVIEW_CARDS: "Revisar Tarjetas", + REVIEW_DIFFICULTY_FILE_MENU: "Revisar: ${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "Revisar nota como ${difficulty}", + CRAM_ALL_CARDS: "Selecciona un mazo a memorizar", + REVIEW_ALL_CARDS: "Revisar tarjetas de todas las notas", + REVIEW_CARDS_IN_NOTE: "Revisar tarjetas en esta nota", + CRAM_CARDS_IN_NOTE: "Memorizar tarjetas en esta nota", + VIEW_STATS: "Ver estad\xEDsticas", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "Revisar: ${dueNotesCount} nota(s), ${dueFlashcardsCount} tarjetas vencidas", + SYNC_TIME_TAKEN: "La sincronizaci\xF3n tom\xF3 ${t} milisegundos", + NOTE_IN_IGNORED_FOLDER: "La nota est\xE1 guardada en un directorio ignorado (revisa los ajustes).", + PLEASE_TAG_NOTE: "Por favor etiquete apropiadamente la nota para revisi\xF3n (en los ajustes).", + RESPONSE_RECEIVED: "Respuesta Recibida", + NO_DECK_EXISTS: "No existen mazos para: ${deckName}", + ALL_CAUGHT_UP: "\xA1Est\xE1s al d\xEDa! \u{1F603}", + // scheduling.ts + DAYS_STR_IVL: "${interval} d\xEDa(s)", + MONTHS_STR_IVL: "${interval} mes(es)", + YEARS_STR_IVL: "${interval} a\xF1o(s)", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}a", + // settings.ts + SETTINGS_HEADER: "Extensi\xF3n de Repetici\xF3n Espaciada - Ajustes", + CHECK_WIKI: 'Para m\xE1s informaci\xF3n revisa la wiki.', + FOLDERS_TO_IGNORE: "Directorios a ignorar", + FOLDERS_TO_IGNORE_DESC: "Escriba las rutas de los directorios separadas por saltos de l\xEDnea, por ejemplo, Plantillas Extra/Guiones", + FLASHCARDS: "Tarjetas de Memorizaci\xF3n", + FLASHCARD_EASY_LABEL: "Texto del bot\xF3n: F\xE1cil", + FLASHCARD_GOOD_LABEL: "Texto del bot\xF3n: Bien", + FLASHCARD_HARD_LABEL: "Texto del bot\xF3n: Dif\xEDcil", + FLASHCARD_EASY_DESC: "Personalize la etiqueta para el bot\xF3n: F\xE1cil", + FLASHCARD_GOOD_DESC: "Personalize la etiqueta para el bot\xF3n: Bien", + FLASHCARD_HARD_DESC: "Personalize la etiqueta para el bot\xF3n: Dif\xEDcil", + FLASHCARD_TAGS: "Etiquetas de las Tarjetas de Memorizaci\xF3n", + FLASHCARD_TAGS_DESC: "Escriba las etiquetas separadas por espacios o saltos de l\xEDnea, por ejemplo, #memorizar #mazo2 #mazo3", + CONVERT_FOLDERS_TO_DECKS: "\xBFConvertir directorios a mazos y submazos?", + CONVERT_FOLDERS_TO_DECKS_DESC: "Esta es una opci\xF3n alternativa a las etiquetas de las Tarjetas de Memorizaci\xF3n.", + INLINE_SCHEDULING_COMMENTS: "\xBFGuardar el comentario para programaci\xF3n de las tarjetas en la \xFAltima l\xEDnea?", + INLINE_SCHEDULING_COMMENTS_DESC: "Activar esto har\xE1 que los comentarios HTML no rompan el formato de las listas.", + BURY_SIBLINGS_TILL_NEXT_DAY: "\xBFEnterrar tarjetas hermanas hasta el siguiente d\xEDa?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Los hermanos son tarjetas generadas del mismo texto de la tarjeta, por ejemplo, deletreos de huecos (cloze deletions en ingl\xE9s)", + SHOW_CARD_CONTEXT: "\xBFMostrar contexto en las tarjetas?", + SHOW_CARD_CONTEXT_DESC: "Por Ejemplo: T\xEDtulo > Cabecera > Sub-Cabecera > ... > Sub-Cabecera", + CARD_MODAL_HEIGHT_PERCENT: "Porcentaje de la altura de las tarjetas de memoria", + CARD_MODAL_SIZE_PERCENT_DESC: "Deber\xEDa ser establecido en 100% si tienes im\xE1genes grandes", + RESET_DEFAULT: "Reiniciar a la configuraci\xF3n por defecto", + CARD_MODAL_WIDTH_PERCENT: "Porcentaje del ancho de las tarjetas de memoria", + RANDOMIZE_CARD_ORDER: "\xBFAleatorizar el orden de las tarjetas para revisi\xF3n?", + REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + REVIEW_DECK_ORDER: "Order decks are displayed during review", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + DISABLE_CLOZE_CARDS: "\xBFDeshabilitar deletreo de huecos en las tarjetas?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "\xBFConvertir ==resaltados== a deletreo de huecos?", + CONVERT_BOLD_TEXT_TO_CLOZES: "\xBFConvertir **texto en negrita** a deletreo de huecos?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "\xBFConvertir {{llaves rizadas}} a deletreo de huecos?", + INLINE_CARDS_SEPARATOR: "Separador de tarjetas de memorizaci\xF3n en l\xEDnea", + FIX_SEPARATORS_MANUALLY_WARNING: "Note que despu\xE9s de cambiar este ajuste, tendr\xE1 que cambiar manualmente todas las notas que tenga.", + INLINE_REVERSED_CARDS_SEPARATOR: "Separador de tarjetas de memorizaci\xF3n para tarjetas de notas invertidas", + MULTILINE_CARDS_SEPARATOR: "Separador para tarjetas de memorizaci\xF3n multil\xEDnea", + MULTILINE_REVERSED_CARDS_SEPARATOR: "Separador para tarjetas de memorizaci\xF3n multil\xEDnea invertidas", + NOTES: "Notes", + REVIEW_PANE_ON_STARTUP: "Activar panel de revisi\xF3n de notas al arrancar", + TAGS_TO_REVIEW: "Etiquetas a revisar", + TAGS_TO_REVIEW_DESC: "Escriba las etiquetas separadas por espacios o saltos de l\xEDneas, por ejemplo, #revisi\xF3n #etiqueta2 #etiqueta3.", + OPEN_RANDOM_NOTE: "Abrir una nota al azar para revisar", + OPEN_RANDOM_NOTE_DESC: "Cuando deshabilita esto, las notas son ordenadas por importancia (Algoritmo PageRank).", + AUTO_NEXT_NOTE: "Abrir la siguiente nota autom\xE1ticamente despu\xE9s de una revisi\xF3n", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "Deshabilitar opciones de revisi\xF3n en el men\xFA de archivo, por ejemplo, Revisi\xF3n: F\xE1cil Bien Dif\xEDcil", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Despu\xE9s de deshabilitarlo, puede hacer las revisiones utilizando atajos de teclado. Reinicie Obsidian despu\xE9s de cambiar esto.", + MAX_N_DAYS_REVIEW_QUEUE: "N\xFAmero m\xE1ximo de d\xEDas a mostrar en el panel derecho.", + MIN_ONE_DAY: "El n\xFAmero de d\xEDas debe ser al menos uno.", + VALID_NUMBER_WARNING: "Por favor especifique un n\xFAmero v\xE1lido.", + UI_PREFERENCES: "Preferencias de la interfaz de usuario.", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Los \xE1rboles de mazos deber\xEDan ser expandidos al inicio.", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Desactiva esto para contraer mazos anidados en la misma tarjeta. \xDAtil si tienes tarjetas que pertenecen a muchos mazos en el mismo archivo.", + ALGORITHM: "Algoritmo", + CHECK_ALGORITHM_WIKI: 'Para m\xE1s informaci\xF3n, revisa la implementaci\xF3n del algoritmo.', + BASE_EASE: "Base ease", + BASE_EASE_DESC: "El m\xEDnimo es 130, es preferible que est\xE9 aproximado a 250.", + BASE_EASE_MIN_WARNING: "La facilidad base de las tarjetas debe ser al menos 130.", + LAPSE_INTERVAL_CHANGE: "El intervalo cambiar\xE1 cuando se revise una tarjeta o nota como Dif\xEDcil.", + LAPSE_INTERVAL_CHANGE_DESC: "NuevoInterval = ViejoIntervalo * CambioDeIntervalo / 100.", + EASY_BONUS: "Bonificaci\xF3n para F\xE1cil", + EASY_BONUS_DESC: "La bonificaci\xF3n para F\xE1cil te permite establecer la diferencia entre intervalos al responder Bien y F\xE1cil en las tarjetas o notas (m\xEDnimo = 100%).", + EASY_BONUS_MIN_WARNING: "El bono de facilidad debe ser al menos 100.", + MAX_INTERVAL: "Intervalo m\xE1ximo en d\xEDas", + MAX_INTERVAL_DESC: "Te permite establecer un l\xEDmite mayor en el intervalo (por defecto es de 100 a\xF1os).", + MAX_INTERVAL_MIN_WARNING: "El intervalo m\xE1ximo debe ser de al menos un d\xEDa.", + MAX_LINK_CONTRIB: "Contribuci\xF3n m\xE1xima de las notas vinculadas.", + MAX_LINK_CONTRIB_DESC: "Contribuci\xF3n m\xE1xima de la facilidad ponderada de las notas vinculadas a la facilidad inicial.", + LOGGING: "Registro", + DISPLAY_DEBUG_INFO: "\xBFMostrar informaci\xF3n de depuraci\xF3n en la consola de desarrollador?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "Cola de notas a revisar", + CLOSE: "Cerrar", + NEW: "Nuevo", + YESTERDAY: "Ayer", + TODAY: "Hoy", + TOMORROW: "Ma\xF1ana", + // stats-modal.tsx + STATS_TITLE: "Estad\xEDsticas", + MONTH: "Mes", + QUARTER: "Trimestre o Cuatrimestre", + // En Inglés: Quarter. + YEAR: "A\xF1o", + LIFETIME: "Tiempo de Vida", + FORECAST: "Pron\xF3stico", + FORECAST_DESC: "El n\xFAmero de tarjetas vencidas en el futuro", + SCHEDULED: "Programado", + DAYS: "D\xEDas", + NUMBER_OF_CARDS: "N\xFAmero de tarjetas", + REVIEWS_PER_DAY: "Carga: ${avg} Revisiones por d\xEDa", + INTERVALS: "Intervalos", + INTERVALS_DESC: "Retrasos hasta que las revisiones se muestren de nuevo", + COUNT: "Conteo", + INTERVALS_SUMMARY: "Intervalo de carga: ${avg}, Intervalo mayor: ${longest}", + EASES: "Facilidad", + EASES_SUMMARY: "Carga de Facilidad: ${avgEase}", + CARD_TYPES: "Tipos de tarjetas", + CARD_TYPES_DESC: "Esto incluye tambi\xE9n a las tarjetas enterradas, si las hay", + CARD_TYPE_NEW: "Nueva", + CARD_TYPE_YOUNG: "Joven", + CARD_TYPE_MATURE: "Madura", + CARD_TYPES_SUMMARY: "Tarjetas Totales: ${totalCardsCount}" +}; + +// src/lang/locale/fr.ts +var fr_default = {}; + +// src/lang/locale/hi.ts +var hi_default = {}; + +// src/lang/locale/id.ts +var id_default = {}; + +// src/lang/locale/it.ts +var it_default = { + // flashcard-modal.tsx + DECKS: "Mazzi", + DUE_CARDS: "Schede da fare", + NEW_CARDS: "Schede nuove", + TOTAL_CARDS: "Schede totali", + BACK: "Indietro", + SKIP: "Salta", + EDIT_CARD: "Modifica scheda", + RESET_CARD_PROGRESS: "Ripristina i progressi della scheda", + HARD: "Difficile", + GOOD: "Buono", + EASY: "Facile", + SHOW_ANSWER: "Mostra risposta", + CARD_PROGRESS_RESET: "I progressi della scheda sono stati ripristinati", + SAVE: "Salva", + CANCEL: "Cancella", + NO_INPUT: "Non \xE8 stato provvisto alcun input", + CURRENT_EASE_HELP_TEXT: "Difficolt\xE0 attuale: ", + CURRENT_INTERVAL_HELP_TEXT: "Intervallo attuale: ", + CARD_GENERATED_FROM: "Generato da: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "Apri una nota per rivisita", + REVIEW_CARDS: "Rivisita schede", + REVIEW_DIFFICULTY_FILE_MENU: "Rivisita: ${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "Revisita note come ${difficulty}", + CRAM_ALL_CARDS: "Seleziona un mazzo da memorizzare", + REVIEW_ALL_CARDS: "Seleziona schede da rivedere", + REVIEW_CARDS_IN_NOTE: "Rivedi schede in questa nota", + CRAM_CARDS_IN_NOTE: "Memorizza schede in questa nota", + VIEW_STATS: "Vedi statistiche", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "Da rivedere: ${dueNotesCount} scheda/e, ${dueFlashcardsCount} schede in ritardo", + SYNC_TIME_TAKEN: "Sincronizzato in ${t}ms", + NOTE_IN_IGNORED_FOLDER: "La nota \xE8 salvata in una cartella ignorata (rivedi le impostazioni).", + PLEASE_TAG_NOTE: "Per favore etichetta la nota appropriatamente per la revisione (nelle impostazioni).", + RESPONSE_RECEIVED: "Risposta ricevuta.", + NO_DECK_EXISTS: "Non esistono mazzi per ${deckName}", + ALL_CAUGHT_UP: "Sei al passo! :D.", + // scheduling.ts + DAYS_STR_IVL: "${interval} giorno/i", + MONTHS_STR_IVL: "${interval} mese/i", + YEARS_STR_IVL: "${interval} anno/i", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}y", + // settings.ts + SETTINGS_HEADER: "Plugin per ripetizione spaziata - Impostazioni", + CHECK_WIKI: 'Per maggiori informazioni, rivolgersi alla wiki.', + FOLDERS_TO_IGNORE: "Cartelle da ignorare", + FOLDERS_TO_IGNORE_DESC: "Inserisci i percorsi delle cartelle separati da a capo, per esempio, Templates Meta/Scripts", + FLASHCARDS: "Schede", + FLASHCARD_EASY_LABEL: "Testo del bottone facile", + FLASHCARD_GOOD_LABEL: "Testo del bottone buono", + FLASHCARD_HARD_LABEL: "Testo del bottone difficile", + FLASHCARD_EASY_DESC: 'Personalizza il testo per il pulsante "Facile"', + FLASHCARD_GOOD_DESC: 'Personalizza il testo per il pulsante "Buono"', + FLASHCARD_HARD_DESC: 'Personalizza il testo per il pulsante "Difficile"', + FLASHCARD_TAGS: "Etichette delle schede", + FLASHCARD_TAGS_DESC: "Inserire etichette separate da spazi o a capi, per esempio #flashcards #deck2 #deck3.", + CONVERT_FOLDERS_TO_DECKS: "Trasformare cartelle in mazzi e sotto-mazzi?", + CONVERT_FOLDERS_TO_DECKS_DESC: "Questa \xE8 un'alternativa all'opzione delle etichette delle schede sopra.", + INLINE_SCHEDULING_COMMENTS: "Salvare il commento per l'orario sulla stessa linea dell'ultimna linea della scheda?", + INLINE_SCHEDULING_COMMENTS_DESC: "Attivando quest'impostazione far\xF2 s\xEC che i commento HTML non rompino la formattazione delle liste.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Sotterrare schede sorelle fino al giorno dopo?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Le schede sorelle sono schede generate dallo stesso testo della scheda, per esempio i.e. cloze deletions", + SHOW_CARD_CONTEXT: "Mostrare contesto nelle schede?", + SHOW_CARD_CONTEXT_DESC: "per esempio, Titolo > Intestazione 1 > Sottotitolo 1 > ... > Sottotitolo", + CARD_MODAL_HEIGHT_PERCENT: "Percentuale altezza schede", + CARD_MODAL_SIZE_PERCENT_DESC: "Dovrebbe essere 100% se sei su telefono o se hai immagini molto grandi", + RESET_DEFAULT: "Reimposta alle impostazioni iniziali", + CARD_MODAL_WIDTH_PERCENT: "Percentuale di larghezza delle schede", + RANDOMIZE_CARD_ORDER: "Rendere casuale l'ordine delle schede durante la revisione?", + REVIEW_CARD_ORDER_WITHIN_DECK: "L'ordine in cui le schede saranno visualizzate all'interno del mazzo", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequenzialmente dentro il mazzo (prima schede nuove)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequenzialmente dentro il mazzo (prima schede in ritardo)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "A caso dentro il mazzo (prima schede nuove)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "A caso dentro il mazzo (prima schede in ritardo)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Scheda a caso da mazzo a caso", + REVIEW_DECK_ORDER: "L'ordine in cui i mazzi vengono mostrati durante la revisione", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequenzialmente (quando le schede nel mazzo precedente saranno state riviste)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "A caso (quando le schede nel mazzo precedente saranno state riviste)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Scheda a caso da mazzo a caso", + DISABLE_CLOZE_CARDS: "Disabilita schede con spazi da riempire?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "Convertire ==testo evidenziato== in spazi da riempire?", + CONVERT_BOLD_TEXT_TO_CLOZES: "Convertire **testo in grassetto** in spazi da riempire", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convertire {{parentesi graffe}} in spazi da riempire?", + INLINE_CARDS_SEPARATOR: "Separatore per schede sulla stessa riga", + FIX_SEPARATORS_MANUALLY_WARNING: "Si avvisa che dopo aver cambiato questo dovrai manualmente modificare le schede che hai gi\xE0.", + INLINE_REVERSED_CARDS_SEPARATOR: "Separatore per schede all'incontrario sulla stessa riga", + MULTILINE_CARDS_SEPARATOR: "Separatore per schede su pi\xF9 righe", + MULTILINE_REVERSED_CARDS_SEPARATOR: "Separatore per schede all'incontrario su pi\xF9 righe", + NOTES: "Note", + REVIEW_PANE_ON_STARTUP: "Abilita il pannello di revisione note all'avvio", + TAGS_TO_REVIEW: "Etichette da rivedere", + TAGS_TO_REVIEW_DESC: "Inserisci le etichette separate da spazi o a capi, tipo #review #tag2 #tag3.", + OPEN_RANDOM_NOTE: "Apri una nota a caso per revisione", + OPEN_RANDOM_NOTE_DESC: "Quando lo disabiliti, le note saranno ordinate per importanza (PageRank).", + AUTO_NEXT_NOTE: "Apri la prossima nota automaticamente dopo la revisione", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "Disabilita le opzioni di revisioni nel men\xF9 di file, per esempio Revisione: Facile Buono Difficile", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Dopo avermi disattivato, puoi iniziare una revisione con le combinazioni di testi per il comando. Riavvia Obsidian dopo avermi cambiato.", + MAX_N_DAYS_REVIEW_QUEUE: "Numero di giorni massimi da visualizzare nel pannello di destra", + MIN_ONE_DAY: "Il numero di giorni deve essere almeno 1.", + VALID_NUMBER_WARNING: "Per favore, mettere un numero valido.", + UI_PREFERENCES: "Preferenze di interfaccia", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Alberti di mazzi dovrebbero essere inizialmente visualizzate come espansi", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Disabilitami per collassare mazzi annidati nella stessa scheda. Utile se hai schede che appartengono a pi\xF9 mazzi nello stesso file.", + ALGORITHM: "Algoritmo", + CHECK_ALGORITHM_WIKI: "Per maggiori informazioni, visita l'implementazione dell'algoritmo.", + BASE_EASE: "Difficolt\xE0 base", + BASE_EASE_DESC: "mino = 130, preferibilmente circa 250.", + BASE_EASE_MIN_WARNING: "La difficolt\xE0 base deve essere di almeno 130.", + LAPSE_INTERVAL_CHANGE: "L'intervallo cambier\xE0 segnando una scheda / nota come difficile", + LAPSE_INTERVAL_CHANGE_DESC: "Intervallo nuovo = intervallo vecchio * cambio intervallo / 100.", + EASY_BONUS: "Bonus facilit\xE0", + EASY_BONUS_DESC: "Il bonus facilit\xE0 ti permette di impostare le differenze negli intervalli tra il rispondere Buono e Facile su una scheda o nota (minimo 100%).", + EASY_BONUS_MIN_WARNING: "Il bonus facilit\xE0 deve essere di almeno 100.", + MAX_INTERVAL: "Intervallo massimo in giorni", + MAX_INTERVAL_DESC: "Ti permette di mettere un limite massimo all'intervallo (default 100 anni).", + MAX_INTERVAL_MIN_WARNING: "L'intervallo massimo deve essere di almeno 1 giorno.", + MAX_LINK_CONTRIB: "Contributo massimo delle note collegate", + MAX_LINK_CONTRIB_DESC: "Contributo massimo della difficolt\xE0 pasata delle note collegate alla difficolt\xE0 iniziale.", + LOGGING: "Registrando", + DISPLAY_DEBUG_INFO: "Visualizza informazione di debug sulla console per sviluppatori?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "Coda di note da rivedere", + CLOSE: "Chiusi", + NEW: "Nuovo/a", + YESTERDAY: "Ieri", + TODAY: "Oggi", + TOMORROW: "Domani", + // stats-modal.tsx + STATS_TITLE: "Statistiche", + MONTH: "Mese", + QUARTER: "Trimestre", + YEAR: "Anno", + LIFETIME: "Per tutta la vita", + FORECAST: "Previsione", + FORECAST_DESC: "Il numero di schede che saranno in ritardo in futuro", + SCHEDULED: "Programmate", + DAYS: "Giorni", + NUMBER_OF_CARDS: "Numero di schede", + REVIEWS_PER_DAY: "Media: ${avg} revisioni/giorno", + INTERVALS: "Intervalli", + INTERVALS_DESC: "Ritardi finch\xE9 le revisioni saranno visualizzate di nuovo", + COUNT: "Conta", + INTERVALS_SUMMARY: "Intervallo medio: ${avg}, Intervallo massimo: ${longest}", + EASES: "Difficolt\xE0", + EASES_SUMMARY: "Difficolt\xE0 media: ${avgEase}", + CARD_TYPES: "Tipi di schede", + CARD_TYPES_DESC: "Include eventuali schede sepolte", + CARD_TYPE_NEW: "Nuove", + CARD_TYPE_YOUNG: "Giovani", + CARD_TYPE_MATURE: "Mature", + CARD_TYPES_SUMMARY: "Schede tottali: ${totalCardsCount}" +}; + +// src/lang/locale/ja.ts +var ja_default = { + // flashcard-modal.tsx + DECKS: "\u30C7\u30C3\u30AD", + DUE_CARDS: "\u671F\u65E5\u306E\u30AB\u30FC\u30C9", + NEW_CARDS: "\u65B0\u898F\u306E\u30AB\u30FC\u30C9", + TOTAL_CARDS: "\u30AB\u30FC\u30C9\u5408\u8A08", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "\u30AB\u30FC\u30C9\u306E\u9032\u6357\u3092\u30EA\u30BB\u30C3\u30C8", + HARD: "Hard", + GOOD: "Good", + EASY: "Easy", + SHOW_ANSWER: "\u89E3\u7B54\u3092\u8868\u793A", + CARD_PROGRESS_RESET: "\u30AB\u30FC\u30C9\u306E\u9032\u6357\u304C\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3057\u305F\u3002", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u30CE\u30FC\u30C8\u3092\u958B\u304F", + REVIEW_CARDS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u30EC\u30D3\u30E5\u30FC", + REVIEW_DIFFICULTY_FILE_MENU: "\u30EC\u30D3\u30E5\u30FC: ${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "\u30CE\u30FC\u30C8\u3092${difficulty}\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B", + REVIEW_ALL_CARDS: "\u3059\u3079\u3066\u306E\u30CE\u30FC\u30C8\u304B\u3089\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u30EC\u30D3\u30E5\u30FC\u3059\u308B", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_CARDS_IN_NOTE: "\u3053\u306E\u30CE\u30FC\u30C8\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u30EC\u30D3\u30E5\u30FC\u3059\u308B", + CRAM_CARDS_IN_NOTE: "\u3053\u306E\u30CE\u30FC\u30C8\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u8A70\u3081\u8FBC\u307F\u5B66\u7FD2\u3059\u308B", + VIEW_STATS: "\u7D71\u8A08\u3092\u95B2\u89A7\u3059\u308B", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "\u30EC\u30D3\u30E5\u30FC: ${dueNotesCount}\u30CE\u30FC\u30C8, ${dueFlashcardsCount}\u30AB\u30FC\u30C9\u304C\u671F\u65E5", + SYNC_TIME_TAKEN: "\u540C\u671F\u306B${t}ms\u304B\u304B\u308A\u307E\u3057\u305F\u3002", + NOTE_IN_IGNORED_FOLDER: "\u30CE\u30FC\u30C8\u304C\u7121\u8996\u3059\u308B\u30D5\u30A9\u30EB\u30C0\u306B\u4FDD\u5B58\u3055\u308C\u3066\u3044\u307E\u3059(\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044)\u3002", + PLEASE_TAG_NOTE: "\u30EC\u30D3\u30E5\u30FC\u3092\u884C\u3046\u306B\u306F\u30CE\u30FC\u30C8\u306B\u5BFE\u3057\u3066\u6B63\u3057\u304F\u30BF\u30B0\u4ED8\u3051\u3057\u3066\u304F\u3060\u3055\u3044(\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044)\u3002", + RESPONSE_RECEIVED: "\u7B54\u3048\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\u3002", + NO_DECK_EXISTS: "${deckName}\u306B\u306F\u30C7\u30C3\u30AD\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002", + ALL_CAUGHT_UP: "\u4ECA\u65E5\u306E\u8AB2\u984C\u3092\u3059\u3079\u3066\u9054\u6210\u3057\u307E\u3057\u305F :D", + // scheduling.ts + DAYS_STR_IVL: "${interval}\u65E5\u5F8C", + MONTHS_STR_IVL: "${interval}\u6708\u5F8C", + YEARS_STR_IVL: "${interval}\u5E74\u5F8C", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}y", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - \u8A2D\u5B9A", + CHECK_WIKI: '\u8A73\u7D30\u306B\u3064\u3044\u3066\u306Fwiki\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002', + FOLDERS_TO_IGNORE: "\u7121\u8996\u3059\u308B\u30D5\u30A9\u30EB\u30C0", + FOLDERS_TO_IGNORE_DESC: '\u30D5\u30A9\u30EB\u30C0\u30D1\u30B9\u3092\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"Templates Meta/Scripts" \u306E\u3088\u3046\u306A\u30B9\u30DA\u30FC\u30B9\u306B\u3088\u308B\u533A\u5207\u308A\u3067\u306E\u66F8\u304D\u65B9\u306F\u7121\u52B9\u3067\u3059\u3002', + FLASHCARDS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9", + FLASHCARD_EASY_LABEL: "Easy Button Text", + FLASHCARD_GOOD_LABEL: "Good Button Text", + FLASHCARD_HARD_LABEL: "Hard Button Text", + FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', + FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', + FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', + FLASHCARD_TAGS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BF\u30B0", + FLASHCARD_TAGS_DESC: '\u30BF\u30B0\u3092\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F8B: "#flashcards #deck2 #deck3"', + CONVERT_FOLDERS_TO_DECKS: "\u30D5\u30A9\u30EB\u30C0\u3092\u30C7\u30C3\u30AD\u3068\u30B5\u30D6\u30C7\u30C3\u30AD\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", + CONVERT_FOLDERS_TO_DECKS_DESC: "\u3053\u308C\u306F\u4E0A\u8A18\u306E\u30BF\u30B0\u3092\u4F7F\u7528\u3057\u305F\u30C7\u30C3\u30AD\u69CB\u7BC9\u306E\u4EE3\u66FF\u3068\u306A\u308B\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u3059\u3002", + INLINE_SCHEDULING_COMMENTS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u6700\u7D42\u884C\u3068\u540C\u4E00\u306E\u884C\u306B\u30B9\u30B1\u30B8\u30E5\u30FC\u30EA\u30F3\u30B0\u30B3\u30E1\u30F3\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F", + INLINE_SCHEDULING_COMMENTS_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u5316\u3059\u308B\u3068\u3001HTML\u30B3\u30E1\u30F3\u30C8\u306B\u3088\u3063\u3066Markdown\u306E\u30EA\u30B9\u30C8\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u304C\u5D29\u308C\u306A\u304F\u306A\u308A\u307E\u3059\u3002", + BURY_SIBLINGS_TILL_NEXT_DAY: "\u6B21\u306E\u30EC\u30D3\u30E5\u30FC\u307E\u3067\u30B7\u30D6\u30EA\u30F3\u30B0\u3092\u5EF6\u671F\u3057\u307E\u3059\u304B\uFF1F", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u30B7\u30D6\u30EA\u30F3\u30B0\u306F\u540C\u4E00\u306E\u30AB\u30FC\u30C9\u30C6\u30AD\u30B9\u30C8\u304B\u3089\u751F\u6210\u3055\u308C\u305F\u30AB\u30FC\u30C9\u3001\u3064\u307E\u308A\u7A74\u57CB\u3081\u554F\u984C\u306E\u6D3E\u751F\u30AB\u30FC\u30C9\u3067\u3059\u3002", + SHOW_CARD_CONTEXT: "\u30AB\u30FC\u30C9\u306B\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3092\u8868\u793A\u3057\u307E\u3059\u304B\uFF1F", + SHOW_CARD_CONTEXT_DESC: "\uFF62\u30BF\u30A4\u30C8\u30EB > \u898B\u51FA\u3057 1 > \u526F\u898B\u51FA\u3057 > ... > \u526F\u898B\u51FA\u3057\uFF63\u306E\u8868\u793A\u3092\u884C\u3046\u304B\u3069\u3046\u304B\u3092\u6C7A\u3081\u307E\u3059\u3002", + CARD_MODAL_HEIGHT_PERCENT: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u7E26\u30B5\u30A4\u30BA\u306E\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8", + CARD_MODAL_SIZE_PERCENT_DESC: "\u30E2\u30D0\u30A4\u30EB\u7248\u3001\u307E\u305F\u306F\u975E\u5E38\u306B\u5927\u304D\u306A\u30B5\u30A4\u30BA\u306E\u753B\u50CF\u304C\u3042\u308B\u5834\u5408\u306B\u306F100%\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002", + RESET_DEFAULT: "\u30C7\u30D5\u30A9\u30EB\u30C8\u5024\u306B\u30EA\u30BB\u30C3\u30C8\u3059\u308B", + CARD_MODAL_WIDTH_PERCENT: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u6A2A\u30B5\u30A4\u30BA\u306E\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8", + RANDOMIZE_CARD_ORDER: "\u30EC\u30D3\u30E5\u30FC\u4E2D\u306E\u30AB\u30FC\u30C9\u306E\u9806\u756A\u3092\u30E9\u30F3\u30C0\u30E0\u306B\u3057\u307E\u3059\u304B\uFF1F", + REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + REVIEW_DECK_ORDER: "Order decks are displayed during review", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + DISABLE_CLOZE_CARDS: "\u7A74\u57CB\u3081\u30AB\u30FC\u30C9\u3092\u7121\u52B9\u5316\u3057\u307E\u3059\u304B\uFF1F", + CONVERT_HIGHLIGHTS_TO_CLOZES: "==\u30CF\u30A4\u30E9\u30A4\u30C8==\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", + CONVERT_BOLD_TEXT_TO_CLOZES: "**\u30DC\u30FC\u30EB\u30C9\u4F53**\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{\u4E2D\u62EC\u5F27}}\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", + INLINE_CARDS_SEPARATOR: "\u30A4\u30F3\u30E9\u30A4\u30F3\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", + FIX_SEPARATORS_MANUALLY_WARNING: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u5909\u66F4\u3059\u308B\u5834\u5408\u306B\u306F\u3001\u4F5C\u6210\u6E08\u307F\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u624B\u52D5\u3067\u7DE8\u96C6\u3057\u76F4\u3059\u5FC5\u8981\u304C\u3042\u308B\u3053\u3068\u306B\u6CE8\u610F\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + INLINE_REVERSED_CARDS_SEPARATOR: "\u30A4\u30F3\u30E9\u30A4\u30F3\u306E\u8868\u88CF\u53CD\u8EE2\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", + MULTILINE_CARDS_SEPARATOR: "\u8907\u6570\u884C\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\u8907\u6570\u884C\u306E\u8868\u88CF\u53CD\u8EE2\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", + NOTES: "\u30CE\u30FC\u30C8", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "\u30EC\u30D3\u30E5\u30FC\u306B\u4F7F\u7528\u3059\u308B\u30BF\u30B0", + TAGS_TO_REVIEW_DESC: '\u30BF\u30B0\u3092\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F8B: "#review #tag2 #tag3"', + OPEN_RANDOM_NOTE: "\u30E9\u30F3\u30C0\u30E0\u306B\u30CE\u30FC\u30C8\u3092\u958B\u3044\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B", + OPEN_RANDOM_NOTE_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u7121\u52B9\u5316\u3055\u308C\u3066\u3044\u308B\u72B6\u614B\u3067\u306F\u3001\u30CE\u30FC\u30C8\u306F\u91CD\u8981\u5EA6(\u30DA\u30FC\u30B8\u30E9\u30F3\u30AF)\u306B\u3088\u308B\u9806\u756A\u3067\u8868\u793A\u3055\u308C\u307E\u3059\u3002", + AUTO_NEXT_NOTE: "\u30EC\u30D3\u30E5\u30FC\u5F8C\u306B\u6B21\u306E\u30CE\u30FC\u30C8\u3092\u81EA\u52D5\u7684\u306B\u958B\u304F", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u30D5\u30A1\u30A4\u30EB\u30E1\u30CB\u30E5\u30FC\u3067\u306E\u30EC\u30D3\u30E5\u30FC\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u5316(\uFF62\u30EC\u30D3\u30E5\u30FC: Easy\uFF63\u7B49\u306E\u9805\u76EE\u3092\u975E\u8868\u793A\u306B\u3059\u308B)", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u7121\u52B9\u5316\u3057\u305F\u5F8C\u3001\u30B3\u30DE\u30F3\u30C9\u30DB\u30C3\u30C8\u30AD\u30FC\u3092\u4F7F\u3063\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u3053\u3068\u304C\u53EF\u80FD\u306B\u306A\u308A\u307E\u3059\u3002\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u5909\u66F4\u3057\u305F\u5834\u5408\u306B\u306FObsidian\u3092\u30EA\u30ED\u30FC\u30C9\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u30D1\u30CD\u30EB\u306B\u8868\u793A\u3059\u308B\u6700\u5927\u306E\u65E5\u6570", + MIN_ONE_DAY: "\u65E5\u6570\u306B\u306F1\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + VALID_NUMBER_WARNING: "\u6709\u52B9\u306A\u6570\u5B57\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + UI_PREFERENCES: "\u30E6\u30FC\u30B6\u30FC \u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9\u306E\u8A2D\u5B9A", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u30C7\u30C3\u30AD \u30C4\u30EA\u30FC\u306F\u6700\u521D\u306F\u5C55\u958B\u3057\u3066\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u3053\u308C\u3092\u30AA\u30D5\u306B\u3059\u308B\u3068\u3001\u540C\u3058\u30AB\u30FC\u30C9\u5185\u306E\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30C7\u30C3\u30AD\u304C\u6298\u308A\u305F\u305F\u307E\u308C\u307E\u3059\u3002\u540C\u3058\u30D5\u30A1\u30A4\u30EB\u306B\u591A\u304F\u306E\u30C7\u30C3\u30AD\u306B\u5C5E\u3059\u308B\u30AB\u30FC\u30C9\u304C\u3042\u308B\u5834\u5408\u306B\u4FBF\u5229\u3067\u3059\u3002", + ALGORITHM: "\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0", + CHECK_ALGORITHM_WIKI: '\u8A73\u7D30\u306B\u3064\u3044\u3066\u306F\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u306E\u5B9F\u88C5\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002', + BASE_EASE: "\u30D9\u30FC\u30B9\u306E\u6613\u3057\u3055", + BASE_EASE_DESC: "\u6700\u5C0F\u5024\u306F130\u3067\u3059\u304C\u3001 \u9069\u6B63\u5024\u306F\u304A\u304A\u3088\u305D250\u3067\u3059\u3002", + BASE_EASE_MIN_WARNING: "\u30D9\u30FC\u30B9\u306E\u6613\u3057\u3055\u306B\u306F130\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + LAPSE_INTERVAL_CHANGE: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9/\u30CE\u30FC\u30C8\u3092Hard\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3057\u305F\u969B\u306E\u9593\u9694\u5909\u66F4", + LAPSE_INTERVAL_CHANGE_DESC: '"\u65B0\u3057\u3044\u9593\u9694 = \u4EE5\u524D\u306E\u9593\u9694 * \u9593\u9694\u5909\u66F4 / 100" \u3068\u3057\u3066\u8A08\u7B97\u3055\u308C\u307E\u3059\u3002', + EASY_BONUS: "Easy\u30DC\u30FC\u30CA\u30B9", + EASY_BONUS_DESC: "Easy\u30DC\u30FC\u30CA\u30B9\u306B\u3088\u3063\u3066\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9/\u30CE\u30FC\u30C8\u306B\u304A\u3051\u308B\u9593\u9694\u306E\u5DEE\u5206\u3092\u8A2D\u5B9A\u3067\u304D\u307E\u3059(\u6700\u5C0F\u5024 = 100%)\u3002", + EASY_BONUS_MIN_WARNING: "Easy\u30DC\u30FC\u30CA\u30B9\u306B\u306F100\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + MAX_INTERVAL: "Maximum interval in days", + MAX_INTERVAL_DESC: "\u9593\u9694\u306B\u4E0A\u9650\u5024\u3092\u8A2D\u5B9A\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8\u5024 = 100\u5E74)\u3002", + MAX_INTERVAL_MIN_WARNING: "\u9593\u9694\u306E\u6700\u5927\u5024\u306B\u306F1\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + MAX_LINK_CONTRIB: "\u30EA\u30F3\u30AF\u30B3\u30F3\u30C8\u30EA\u30D3\u30E5\u30FC\u30B7\u30E7\u30F3\u306E\u6700\u5927\u5024", + MAX_LINK_CONTRIB_DESC: "\u6700\u521D\u306E\u6613\u3057\u3055\u306B\u5BFE\u3057\u3066\u3001\u30EA\u30F3\u30AF\u3055\u308C\u305F\u30CE\u30FC\u30C8\u306E\u91CD\u307F\u4ED8\u3051\u3055\u308C\u305F\u6613\u3057\u3055\u304C\u5BC4\u4E0E\u3059\u308B\u6700\u5927\u5024\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + LOGGING: "\u30ED\u30B0\u7BA1\u7406", + DISPLAY_DEBUG_INFO: "\u30C7\u30D9\u30ED\u30C3\u30D1\u30FC\u30B3\u30F3\u30BD\u30FC\u30EB\u306B\u3066\u30C7\u30D0\u30C3\u30B0\u60C5\u5831\u3092\u8868\u793A\u3057\u307E\u3059\u304B\uFF1F", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\u30CE\u30FC\u30C8\u30EC\u30D3\u30E5\u30FC\u306E\u30AD\u30E5\u30FC", + CLOSE: "\u9589\u3058\u308B", + NEW: "\u65B0\u898F", + YESTERDAY: "\u6628\u65E5", + TODAY: "\u4ECA\u65E5", + TOMORROW: "\u660E\u65E5", + // stats-modal.tsx + STATS_TITLE: "\u7D71\u8A08", + MONTH: "Month", + QUARTER: "Quarter", + YEAR: "Year", + LIFETIME: "Lifetime", + FORECAST: "\u4E88\u6E2C", + FORECAST_DESC: "\u5FA9\u7FD2\u671F\u65E5\u304C\u6765\u308B\u30AB\u30FC\u30C9\u306E\u679A\u6570", + SCHEDULED: "\u30B9\u30B1\u30B8\u30E5\u30FC\u30EA\u30F3\u30B0\u6E08\u307F", + DAYS: "\u65E5", + NUMBER_OF_CARDS: "\u30AB\u30FC\u30C9\u6570", + REVIEWS_PER_DAY: "\u5E73\u5747: ${avg}\u30EC\u30D3\u30E5\u30FC/\u65E5", + INTERVALS: "\u9593\u9694", + INTERVALS_DESC: "\u6B21\u306E\u30EC\u30D3\u30E5\u30FC\u4E88\u5B9A\u65E5", + COUNT: "\u30AB\u30A6\u30F3\u30C8", + INTERVALS_SUMMARY: "\u9593\u9694\u306E\u5E73\u5747\u5024: ${avg}, \u6700\u9577\u306E\u9593\u9694: ${longest}", + EASES: "\u6613\u3057\u3055", + EASES_SUMMARY: "\u6613\u3057\u3055\u306E\u5E73\u5747\u5024: ${avgEase}", + CARD_TYPES: "\u30AB\u30FC\u30C9\u30BF\u30A4\u30D7", + CARD_TYPES_DESC: "\u5EF6\u671F\u306E\u30AB\u30FC\u30C9\u304C\u3042\u308B\u5834\u5408\u306B\u306F\u3053\u308C\u306B\u542B\u307E\u308C\u307E\u3059", + CARD_TYPE_NEW: "\u65B0\u898F", + CARD_TYPE_YOUNG: "\u5FA9\u7FD2(\u521D\u671F)", + CARD_TYPE_MATURE: "\u5FA9\u7FD2(\u5F8C\u671F)", + CARD_TYPES_SUMMARY: "\u30AB\u30FC\u30C9\u306E\u5408\u8A08: ${totalCardsCount}\u679A" +}; + +// src/lang/locale/ko.ts +var ko_default = { + // flashcard-modal.tsx + DECKS: "\uB371", + DUE_CARDS: "\uB2E4\uC2DC \uBCFC \uCE74\uB4DC\uB4E4", + NEW_CARDS: "\uC0C8\uB85C\uC6B4 \uCE74\uB4DC\uB4E4", + TOTAL_CARDS: "\uC804\uCCB4 \uCE74\uB4DC\uB4E4", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "\uCE74\uB4DC\uC758 \uC9C4\uD589\uC0C1\uD669\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.", + HARD: "\uC5B4\uB824\uC6C0(Hard)", + GOOD: "\uC88B\uC74C(Good)", + EASY: "\uC26C\uC6C0(Easy)", + SHOW_ANSWER: "\uC815\uB2F5 \uD655\uC778\uD558\uAE30", + CARD_PROGRESS_RESET: "\uCE74\uB4DC\uC758 \uC9C4\uD589\uC0C1\uD669\uC774 \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\uB9AC\uBDF0\uD560 \uB178\uD2B8 \uC5F4\uAE30", + REVIEW_CARDS: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB9AC\uBDF0", + REVIEW_DIFFICULTY_FILE_MENU: "\uB9AC\uBDF0: ${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "\uB178\uD2B8\uB97C ${difficulty}\uC73C\uB85C \uB9AC\uBDF0\uD569\uB2C8\uB2E4", + REVIEW_ALL_CARDS: "\uBAA8\uB4E0 \uB178\uD2B8\uB4E4\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_CARDS_IN_NOTE: "\uC774 \uB178\uD2B8\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4", + CRAM_CARDS_IN_NOTE: "\uC774 \uB178\uD2B8\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uBCBC\uB77D\uCE58\uAE30\uD569\uB2C8\uB2E4.", + VIEW_STATS: "\uD1B5\uACC4 \uD655\uC778", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "--\uB9AC\uBDF0: ${dueNotesCount} \uB178\uD2B8, ${dueFlashcardsCount} \uCE74\uB4DC \uB0A8\uC558\uC2B5\uB2C8\uB2E4.", + SYNC_TIME_TAKEN: "\uB3D9\uAE30\uD654\uC5D0 ${t}\uBC00\uB9AC\uCD08 \uAC78\uB838\uC2B5\uB2C8\uB2E4", + NOTE_IN_IGNORED_FOLDER: "\uB178\uD2B8\uAC00 \uBB34\uC2DC\uB41C \uD3F4\uB354 \uC544\uB798\uC5D0 \uC800\uC7A5\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. (\uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694)", + PLEASE_TAG_NOTE: "\uB9AC\uBDF0\uB97C \uD558\uAE30\uC704\uD574 \uB178\uD2B8\uC5D0 \uC801\uC808\uD788 \uD0DC\uADF8\uD574\uC8FC\uC138\uC694. (\uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694)", + RESPONSE_RECEIVED: "\uC694\uCCAD\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4", + NO_DECK_EXISTS: "${deckName}\uC774\uB77C\uB294 \uC774\uB984\uC758 \uB371\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", + ALL_CAUGHT_UP: "\uBAA8\uB450 \uD655\uC778\uD588\uC2B5\uB2C8\uB2E4. :D", + // scheduling.ts + DAYS_STR_IVL: "${interval} \uC77C \uD6C4", + MONTHS_STR_IVL: "${interval} \uAC1C\uC6D4 \uD6C4", + YEARS_STR_IVL: "${interval} \uB144 \uD6C4", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}y", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - \uC124\uC815", + CHECK_WIKI: '\uB354 \uB9CE\uC740 \uC815\uBCF4\uB97C \uC6D0\uD558\uC2DC\uBA74, wiki\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.', + FOLDERS_TO_IGNORE: "\uBB34\uC2DC\uD560 \uD3F4\uB354\uB4E4", + FOLDERS_TO_IGNORE_DESC: "\uD3F4\uB354 \uACBD\uB85C\uB97C \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. 'Templates Meta/Scripts' \uC640 \uAC19\uC774 \uC785\uB825\uD558\uB294 \uAC83\uC740 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", + FLASHCARDS: "\uD50C\uB798\uC2DC\uCE74\uB4DC", + FLASHCARD_EASY_LABEL: "Easy Button Text", + FLASHCARD_GOOD_LABEL: "Good Button Text", + FLASHCARD_HARD_LABEL: "Hard Button Text", + FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', + FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', + FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', + FLASHCARD_TAGS: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uD0DC\uADF8", + FLASHCARD_TAGS_DESC: "\uD0DC\uADF8\uB97C \uACF5\uBC31 \uB610\uB294 \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. \uC608) '#flashcards #deck2 #deck3'", + CONVERT_FOLDERS_TO_DECKS: "\uD3F4\uB354\uB97C \uB371\uACFC \uC11C\uBE0C\uB371\uC73C\uB85C \uC0AC\uC6A9\uD560\uAE4C\uC694?", + CONVERT_FOLDERS_TO_DECKS_DESC: "\uC774 \uAE30\uB2A5\uC740 \uC704\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC \uD0DC\uADF8 \uC635\uC158\uC744 \uB300\uCCB4\uD569\uB2C8\uB2E4.", + INLINE_SCHEDULING_COMMENTS: "\uD50C\uB798\uC2DC\uCE74\uB4DC\uC758 \uB9C8\uC9C0\uB9C9 \uC904\uACFC \uB3D9\uC77C\uD55C \uC904\uC5D0 \uC2A4\uCF00\uC904\uB9C1 \uCF54\uBA58\uD2B8\uB97C \uC800\uC7A5\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + INLINE_SCHEDULING_COMMENTS_DESC: "\uC774 \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uBA74 HTML \uC8FC\uC11D\uC774 \uBAA9\uB85D\uC758 \uD3EC\uB9E4\uD305\uC744 \uBB34\uB108\uD2B8\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Sibling \uCE74\uB4DC\uB97C \uB2E4\uC74C\uB0A0\uAE4C\uC9C0 \uBB3B\uC5B4\uB450\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Sibling \uCE74\uB4DC\uB294 \uB3D9\uC77C\uD55C \uCE74\uB4DC \uD14D\uC2A4\uD2B8\uC5D0\uC11C \uC0DD\uC131\uB41C \uCE74\uB4DC\uC785\uB2C8\uB2E4. i.e. cloze deletions", + SHOW_CARD_CONTEXT: "\uCE74\uB4DC\uC758 \uBB38\uB9E5(context)\uC744 \uD45C\uC2DC\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + SHOW_CARD_CONTEXT_DESC: "\uCE74\uB4DC\uC5D0\uC11C 'Title > Heading 1 > Subheading > ... > Subheading' \uC758 \uD45C\uC2DC\uB97C \uD560\uC9C0 \uC124\uC815\uD569\uB2C8\uB2E4.", + CARD_MODAL_HEIGHT_PERCENT: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB192\uC774 \uBE44\uC728", + CARD_MODAL_SIZE_PERCENT_DESC: "\uBAA8\uBC14\uC77C \uBC84\uC804 \uD639\uC740 \uB9E4\uC6B0 \uD070 \uC774\uBBF8\uC9C0\uAC00 \uC788\uB294 \uACBD\uC6B0 100%\uB85C \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.", + RESET_DEFAULT: "\uAE30\uBCF8\uAC12\uC73C\uB85C \uCD08\uAE30\uD654", + CARD_MODAL_WIDTH_PERCENT: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB108\uBE44 \uBE44\uC728", + RANDOMIZE_CARD_ORDER: "\uB9AC\uBDF0\uC911\uC778 \uCE74\uB4DC\uC758 \uC21C\uC11C\uB97C \uB79C\uB364\uC73C\uB85C \uB450\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + REVIEW_DECK_ORDER: "Order decks are displayed during review", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + DISABLE_CLOZE_CARDS: "\uBE48 \uCE78 \uCC44\uC6B0\uAE30 \uCE74\uB4DC\uB97C \uBE44\uD65C\uC131\uD654\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "==hightlights== \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + CONVERT_BOLD_TEXT_TO_CLOZES: "**bolded text** \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{curly brackets}} \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + INLINE_CARDS_SEPARATOR: "\uC778\uB77C\uC778 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", + FIX_SEPARATORS_MANUALLY_WARNING: "\uC8FC\uC758: \uC774 \uC635\uC158\uC744 \uC218\uC815\uD55C \uD6C4\uC5D0\uB294 \uC774\uBBF8 \uC791\uC131\uB41C \uD50C\uB798\uC2DC\uCE74\uB4DC\uB97C \uC218\uB3D9\uC73C\uB85C \uC218\uC815\uD574\uC57C \uD568\uC744 \uC8FC\uC758\uD558\uC2ED\uC2DC\uC624.", + INLINE_REVERSED_CARDS_SEPARATOR: "\uC778\uB77C\uC778 \uBC18\uC804 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", + MULTILINE_CARDS_SEPARATOR: "\uC5EC\uB7EC \uC904 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\uC5EC\uB7EC \uC904 \uBC18\uC804 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", + NOTES: "\uB178\uD2B8", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "\uB9AC\uBDF0\uC5D0 \uC0AC\uC6A9\uD560 \uD0DC\uADF8", + TAGS_TO_REVIEW_DESC: "\uD0DC\uADF8\uB97C \uACF5\uBC31 \uB610\uB294 \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. \uC608) '#review #tag2 #tag3'", + OPEN_RANDOM_NOTE: "\uB9AC\uBDF0\uB97C \uC704\uD574 \uB79C\uB364 \uB178\uD2B8\uB97C \uC5FD\uB2C8\uB2E4.", + OPEN_RANDOM_NOTE_DESC: "\uC774 \uC635\uC158\uC774 \uAEBC\uC838\uC788\uC73C\uBA74, \uB178\uD2B8\uB294 \uC911\uC694\uB3C4(\uD398\uC774\uC9C0 \uB7AD\uD06C)\uC5D0 \uB530\uB77C \uC815\uB82C\uB429\uB2C8\uB2E4.", + AUTO_NEXT_NOTE: "\uB9AC\uBDF0 \uD6C4\uC5D0 \uB2E4\uC74C \uB178\uD2B8\uB97C \uC790\uB3D9\uC73C\uB85C \uC5FD\uB2C8\uB2E4.", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\uD30C\uC77C \uBA54\uB274\uC5D0\uC11C\uC758 \uB9AC\uBDF0 \uC635\uC158\uC744 \uBE44\uD65C\uC131\uD654 \uD569\uB2C8\uB2E4. \uC608) \uB9AC\uBDF0: Easy Good Hard", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\uC774 \uC635\uC158\uC744 \uBE44\uD65C\uC131\uD654 \uD55C \uD6C4, \uBA85\uB839 \uB2E8\uCD95\uD0A4\uB97C \uC774\uC6A9\uD574 \uB9AC\uBDF0\uD558\uC2E4 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uC635\uC158\uC744 \uBCC0\uACBD\uD55C \uD6C4\uC5D0 \uC635\uC2DC\uB514\uC5B8\uC744 \uC0C8\uB85C\uACE0\uCE68 \uD558\uC2ED\uC2DC\uC624.", + MAX_N_DAYS_REVIEW_QUEUE: "\uC624\uB978\uCABD \uD328\uB110\uC5D0 \uD45C\uC2DC\uD560 \uCD5C\uB300 \uC77C\uC218", + MIN_ONE_DAY: "\uC801\uC5B4\uB3C4 1\uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", + VALID_NUMBER_WARNING: "\uC720\uD6A8\uD55C \uC22B\uC790\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694.", + UI_PREFERENCES: "\uC0AC\uC6A9\uC790 \uC778\uD130\uD398\uC774\uC2A4 \uAE30\uBCF8 \uC124\uC815", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\uB371 \uD2B8\uB9AC\uB294 \uCC98\uC74C\uC5D0 \uD655\uC7A5\uB41C \uAC83\uC73C\uB85C \uD45C\uC2DC\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\uAC19\uC740 \uCE74\uB4DC\uC5D0 \uC911\uCCA9\uB41C \uB371\uC744 \uC811\uC73C\uB824\uBA74 \uC774 \uC635\uC158\uC744 \uB044\uC2ED\uC2DC\uC624. \uAC19\uC740 \uD30C\uC77C\uC5D0 \uC5EC\uB7EC \uB371\uC5D0 \uC18D\uD55C \uCE74\uB4DC\uAC00 \uC788\uB294 \uACBD\uC6B0 \uC720\uC6A9\uD569\uB2C8\uB2E4.", + ALGORITHM: "\uC54C\uACE0\uB9AC\uC998", + CHECK_ALGORITHM_WIKI: '\uB354 \uB9CE\uC740 \uC815\uBCF4\uB97C \uC6D0\uD558\uC2DC\uBA74, algorithm implementation\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694.', + BASE_EASE: "\uAE30\uBCF8 ease", + BASE_EASE_DESC: "\uCD5C\uC19F\uAC12 = 130, \uC801\uC815\uCE58\uB294 \uB300\uB7B5 250\uC785\uB2C8\uB2E4.", + BASE_EASE_MIN_WARNING: "\uAE30\uBCF8 ease\uB294 \uC801\uC5B4\uB3C4 130 \uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", + LAPSE_INTERVAL_CHANGE: "\uD50C\uB798\uC2DC\uCE74\uB4DC/\uB178\uD2B8\uB97C \uC5B4\uB824\uC6C0(Hard)\uC73C\uB85C \uB9AC\uBDF0\uD588\uC744 \uB54C\uC758 \uAC04\uACA9 \uBCC0\uACBD", + LAPSE_INTERVAL_CHANGE_DESC: "\uC0C8\uB85C\uC6B4 \uAC04\uACA9 = \uC774\uC804 \uAC04\uACA9 * \uAC04\uACA9\uBCC0\uACBD \uAC12 / 100.", + EASY_BONUS: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4", + EASY_BONUS_DESC: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4\uB294 \uD50C\uB798\uC2DC\uCE74\uB4DC/\uB178\uD2B8\uC5D0\uC11C \uC88B\uC74C(Good)\uACFC \uC26C\uC6C0(Easy) \uC0AC\uC774\uC758 \uAC04\uACA9 \uCC28\uC774\uB97C \uC124\uC815\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. (\uCD5C\uC18C = 100%)", + EASY_BONUS_MIN_WARNING: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4\uB294 \uC801\uC5B4\uB3C4 100\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", + MAX_INTERVAL: "Maximum interval in days", + MAX_INTERVAL_DESC: "\uAC04\uACA9\uC758 \uC0C1\uD55C\uC120\uC744 \uB458 \uC218 \uC788\uC2B5\uB2C8\uB2E4. (\uAE30\uBCF8\uAC12 = 100\uB144)", + MAX_INTERVAL_MIN_WARNING: "\uCD5C\uB300 \uAC04\uACA9\uC740 \uC801\uC5B4\uB3C4 1\uC77C\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", + MAX_LINK_CONTRIB: "\uCD5C\uB300 \uC5F0\uACB0 \uAE30\uC5EC\uB3C4", + MAX_LINK_CONTRIB_DESC: "\uB9C1\uD06C\uB41C \uB178\uD2B8\uC758 \uCD08\uAE30 ease\uC5D0 \uB300\uD55C \uAC00\uC911\uCE58\uAC00 \uC801\uC6A9\uB41C ease\uC758 \uCD5C\uB300 \uAE30\uC5EC\uB3C4\uC785\uB2C8\uB2E4.", + LOGGING: "\uB85C\uAE45", + DISPLAY_DEBUG_INFO: "\uB514\uBC84\uAE45 \uC815\uBCF4\uB97C \uAC1C\uBC1C\uC790 \uCF58\uC194\uC5D0 \uD45C\uC2DC\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\uB9AC\uBDF0\uD560 \uB178\uD2B8 \uB300\uAE30\uC5F4", + CLOSE: "\uB2EB\uAE30", + NEW: "New", + YESTERDAY: "\uC5B4\uC81C", + TODAY: "\uC624\uB298", + TOMORROW: "\uB0B4\uC77C", + // stats-modal.tsx + STATS_TITLE: "\uD1B5\uACC4", + MONTH: "\uC6D4", + QUARTER: "\uBD84\uAE30", + YEAR: "\uB144", + LIFETIME: "\uD3C9\uC0DD", + FORECAST: "\uC608\uCE21", + FORECAST_DESC: "\uC774\uD6C4\uC5D0 \uD559\uC2B5\uD560 \uCE74\uB4DC\uC758 \uC218", + SCHEDULED: "Scheduled", + DAYS: "\uC77C", + NUMBER_OF_CARDS: "\uCE74\uB4DC\uC758 \uC218", + REVIEWS_PER_DAY: "\uD3C9\uADE0: ${avg} \uB9AC\uBDF0/\uC77C", + INTERVALS: "\uAC04\uACA9", + INTERVALS_DESC: "\uB9AC\uBDF0\uB97C \uB2E4\uC2DC \uD560 \uB54C \uAE4C\uC9C0\uC758 \uAE30\uAC04", + COUNT: "Count", + INTERVALS_SUMMARY: "\uD3C9\uADE0 \uAC04\uACA9: ${avg}, \uAC00\uC7A5 \uAE34 \uAC04\uACA9: ${longest}", + EASES: "Eases", + EASES_SUMMARY: "Average ease: ${avgEase}", + CARD_TYPES: "\uCE74\uB4DC \uD0C0\uC785", + CARD_TYPES_DESC: "\uC5EC\uAE30\uC5D0\uB294 \uBB3B\uC5B4\uB454 \uCE74\uB4DC\uB3C4 \uD3EC\uD568\uB429\uB2C8\uB2E4.", + CARD_TYPE_NEW: "New", + CARD_TYPE_YOUNG: "Young", + CARD_TYPE_MATURE: "Mature", + CARD_TYPES_SUMMARY: "\uC804\uCCB4 \uCE74\uB4DC \uC218: ${totalCardsCount}" +}; + +// src/lang/locale/mr.ts +var mr_default = {}; + +// src/lang/locale/nl.ts +var nl_default = {}; + +// src/lang/locale/no.ts +var no_default = {}; + +// src/lang/locale/pl.ts +var pl_default = { + // flashcard-modal.tsx + DECKS: "Talie", + DUE_CARDS: "Fiszki z terminem", + NEW_CARDS: "Nowe fiszki", + TOTAL_CARDS: "Wszystkie karty", + BACK: "Wstecz", + SKIP: "Pomi\u0144", + EDIT_CARD: "Edytuj kart\u0119", + RESET_CARD_PROGRESS: "Zresetuj post\u0119p karty", + HARD: "Trudne", + GOOD: "\u015Arednio Trudne", + EASY: "\u0141atwe", + SHOW_ANSWER: "Poka\u017C odpowied\u017A", + CARD_PROGRESS_RESET: "Post\u0119p karty zosta\u0142 zresetowany.", + SAVE: "Zapisz", + CANCEL: "Anuluj", + NO_INPUT: "Nie wprowadzono warto\u015Bci.", + CURRENT_EASE_HELP_TEXT: "Aktualna \u0142atwo\u015B\u0107: ", + CURRENT_INTERVAL_HELP_TEXT: "Aktualny interwa\u0142: ", + CARD_GENERATED_FROM: "Wygenerowano z: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "Otw\xF3rz notatk\u0119 do przegl\u0105du", + REVIEW_CARDS: "Przegl\u0105daj fiszki", + REVIEW_DIFFICULTY_FILE_MENU: "Przegl\u0105daj: ${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "Przegl\u0105daj notatk\u0119 jako ${difficulty}", + CRAM_ALL_CARDS: "Wybierz tali\u0119 do intensywnego uczenia", + REVIEW_ALL_CARDS: "Przegl\u0105daj fiszki ze wszystkich notatek", + REVIEW_CARDS_IN_NOTE: "Przegl\u0105daj fiszki w tej notatce", + CRAM_CARDS_IN_NOTE: "Intensywne uczenie fiszek w tej notatce", + VIEW_STATS: "Wy\u015Bwietl statystyki", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "Przegl\u0105daj: ${dueNotesCount} notatek, ${dueFlashcardsCount} fiszek z terminem", + SYNC_TIME_TAKEN: "Synchronizacja zaj\u0119\u0142a ${t}ms", + NOTE_IN_IGNORED_FOLDER: "Notatka jest zapisana w folderze zignorowanym (sprawd\u017A ustawienia).", + PLEASE_TAG_NOTE: "Prosz\u0119 odpowiednio otagowa\u0107 notatk\u0119 do przegl\u0105du (w ustawieniach).", + RESPONSE_RECEIVED: "Otrzymano odpowied\u017A.", + NO_DECK_EXISTS: "Nie istnieje talia o nazwie ${deckName}", + ALL_CAUGHT_UP: "Jeste\u015B teraz na bie\u017C\u0105co :D.", + // scheduling.ts + DAYS_STR_IVL: "${interval} dni", + MONTHS_STR_IVL: "${interval} miesi\u0119cy", + YEARS_STR_IVL: "${interval} lata", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}r", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition - Ustawienia", + CHECK_WIKI: 'Aby uzyska\u0107 wi\u0119cej informacji, sprawd\u017A wiki.', + FOLDERS_TO_IGNORE: "Foldery do zignorowania", + FOLDERS_TO_IGNORE_DESC: "Wprowad\u017A \u015Bcie\u017Cki folder\xF3w oddzielone nowymi liniami, np. Szablony Meta/Scripts", + FLASHCARDS: "Fiszki", + FLASHCARD_EASY_LABEL: "Tekst przycisku \u0141atwe", + FLASHCARD_GOOD_LABEL: "Tekst przycisku \u015Arednio trudne", + FLASHCARD_HARD_LABEL: "Tekst przycisku Trudne", + FLASHCARD_EASY_DESC: 'Dostosuj etykiet\u0119 dla przycisku "\u0141atwe"', + FLASHCARD_GOOD_DESC: 'Dostosuj etykiet\u0119 dla przycisku "\u015Arednio trudne"', + FLASHCARD_HARD_DESC: 'Dostosuj etykiet\u0119 dla przycisku "Trudne"', + FLASHCARD_TAGS: "Tagi fiszek", + FLASHCARD_TAGS_DESC: "Wprowad\u017A tagi oddzielone spacj\u0105 lub nowymi liniami, np. #fiszki #talia2 #talia3.", + CONVERT_FOLDERS_TO_DECKS: "Czy konwertowa\u0107 foldery na talie i podtalie?", + CONVERT_FOLDERS_TO_DECKS_DESC: "Jest to alternatywa dla opcji tag\xF3w fiszek powy\u017Cej.", + INLINE_SCHEDULING_COMMENTS: "Czy zachowa\u0107 komentarz harmonogramowania w tej samej linii co ostatnia linia fiszki?", + INLINE_SCHEDULING_COMMENTS_DESC: "W\u0142\u0105czenie tej opcji sprawi, \u017Ce komentarze HTML nie b\u0119d\u0105 przerywa\u0107 formatowania listy.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Czy ukrywa\u0107 karty rodze\u0144stwa do nast\u0119pnego dnia?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Rodze\u0144stwo to karty wygenerowane z tego samego tekstu karty, np. usuni\u0119cia zamaskowane", + SHOW_CARD_CONTEXT: "Czy pokazywa\u0107 kontekst na kartach?", + SHOW_CARD_CONTEXT_DESC: "np. Tytu\u0142 > Nag\u0142\xF3wek 1 > Podnag\u0142\xF3wek > ... > Podnag\u0142\xF3wek", + CARD_MODAL_HEIGHT_PERCENT: "Procentowa wysoko\u015B\u0107 fiszki", + CARD_MODAL_SIZE_PERCENT_DESC: "Powinno by\u0107 ustawione na 100% na urz\u0105dzeniach mobilnych lub gdy masz bardzo du\u017Ce obrazy", + RESET_DEFAULT: "Zresetuj do domy\u015Blnych", + CARD_MODAL_WIDTH_PERCENT: "Procentowa szeroko\u015B\u0107 fiszki", + RANDOMIZE_CARD_ORDER: "Czy losowa\u0107 kolejno\u015B\u0107 kart podczas przegl\u0105du?", + REVIEW_CARD_ORDER_WITHIN_DECK: "Kolejno\u015B\u0107 kart w talii wy\u015Bwietlana podczas przegl\u0105dania", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Kolejno w ramach talii (Najpierw wszystkie nowe karty)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Kolejno w ramach talii (Najpierw wszystkie karty z terminem)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Losowo w ramach talii (Najpierw wszystkie nowe karty)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Losowo w ramach talii (Najpierw wszystkie karty z terminem)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Losowa karta z losowej talii", + REVIEW_DECK_ORDER: "Kolejno\u015B\u0107 talii wy\u015Bwietlana podczas przegl\u0105dania", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Kolejno (gdy wszystkie karty w poprzedniej talii przegl\u0105dni\u0119te)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Losowo (gdy wszystkie karty w poprzedniej talii przegl\u0105dni\u0119te)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Losowa karta z losowej talii", + DISABLE_CLOZE_CARDS: "Wy\u0142\u0105czy\u0107 karty zamaskowane?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "Konwertowa\u0107 ==pod\u015Bwietlenia== na karty zamaskowane?", + CONVERT_BOLD_TEXT_TO_CLOZES: "Konwertowa\u0107 pogrubiony tekst na karty zamaskowane?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "Konwertowa\u0107 {{klamry}} na karty zamaskowane?", + INLINE_CARDS_SEPARATOR: "Separator dla kart zamaskowanych w linii", + FIX_SEPARATORS_MANUALLY_WARNING: "Pami\u0119taj, \u017Ce po zmianie tego musisz r\u0119cznie edytowa\u0107 wszystkie karty zamaskowane, kt\xF3re ju\u017C masz.", + INLINE_REVERSED_CARDS_SEPARATOR: "Separator dla kart zamaskowanych odwr\xF3conych w linii", + MULTILINE_CARDS_SEPARATOR: "Separator dla kart zamaskowanych wieloliniowych", + MULTILINE_REVERSED_CARDS_SEPARATOR: "Separator dla kart zamaskowanych odwr\xF3conych wieloliniowych", + NOTES: "Notatki", + REVIEW_PANE_ON_STARTUP: "W\u0142\u0105czy\u0107 panel przegl\u0105du notatek przy starcie", + TAGS_TO_REVIEW: "Tagi do przegl\u0105du", + TAGS_TO_REVIEW_DESC: "Wprowad\u017A tagi oddzielone spacj\u0105 lub nowymi liniami, np. #przegl\u0105d #tag2 #tag3.", + OPEN_RANDOM_NOTE: "Otw\xF3rz losow\u0105 notatk\u0119 do przegl\u0105du", + OPEN_RANDOM_NOTE_DESC: "Po wy\u0142\u0105czeniu tej opcji notatki s\u0105 uporz\u0105dkowane wed\u0142ug istotno\u015Bci (PageRank).", + AUTO_NEXT_NOTE: "Automatycznie otwiera\u0107 nast\u0119pn\u0105 notatk\u0119 po przegl\u0105dzie", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "Wy\u0142\u0105czy\u0107 opcje przegl\u0105du w menu pliku, tj. Przegl\u0105d: \u0141atwe Dobrze Trudne", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Po wy\u0142\u0105czeniu mo\u017Cesz przegl\u0105da\u0107 za pomoc\u0105 skr\xF3t\xF3w klawiszowych. Po zmianie tej opcji konieczne jest ponowne za\u0142adowanie Obsidian.", + MAX_N_DAYS_REVIEW_QUEUE: "Maksymalna liczba dni do wy\u015Bwietlenia w panelu prawym", + MIN_ONE_DAY: "Liczba dni musi wynosi\u0107 co najmniej 1.", + VALID_NUMBER_WARNING: "Podaj prawid\u0142ow\u0105 liczb\u0119.", + UI_PREFERENCES: "Preferencje interfejsu u\u017Cytkownika", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Podtalie powinny by\u0107 pocz\u0105tkowo wy\u015Bwietlane rozszerzone", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Wy\u0142\u0105cz to, aby zwin\u0105\u0107 zagnie\u017Cd\u017Cone talie w tej samej karcie. Przydatne, je\u015Bli karty nale\u017C\u0105 do wielu talii w tym samym pliku.", + ALGORITHM: "Algorytm", + CHECK_ALGORITHM_WIKI: 'Aby uzyska\u0107 wi\u0119cej informacji, sprawd\u017A implementacj\u0119 algorytmu.', + BASE_EASE: "Podstawowa \u0142atwo\u015B\u0107", + BASE_EASE_DESC: "minimum = 130, preferowana warto\u015B\u0107 to oko\u0142o 250.", + BASE_EASE_MIN_WARNING: "Podstawowa \u0142atwo\u015B\u0107 musi wynosi\u0107 co najmniej 130.", + LAPSE_INTERVAL_CHANGE: "Zmiana interwa\u0142u podczas przegl\u0105dania fiszki/notatki jako trudne", + LAPSE_INTERVAL_CHANGE_DESC: "nowyInterwa\u0142 = staryInterwa\u0142 * zmianaInterwa\u0142u / 100.", + EASY_BONUS: "Bonus za \u0142atwe", + EASY_BONUS_DESC: "Bonus za \u0142atwe pozwala ustawi\u0107 r\xF3\u017Cnic\u0119 w interwa\u0142ach mi\u0119dzy odpowiedziami \u015Arednio trudne i \u0141atwe na fiszce/notatce (minimum = 100%).", + EASY_BONUS_MIN_WARNING: "Bonus za \u0142atwe musi wynosi\u0107 co najmniej 100.", + MAX_INTERVAL: "Maksymalny interwa\u0142 w dniach", + MAX_INTERVAL_DESC: "Pozwala na ustawienie g\xF3rnego limitu interwa\u0142u (domy\u015Blnie = 100 lat).", + MAX_INTERVAL_MIN_WARNING: "Maksymalny interwa\u0142 musi wynosi\u0107 co najmniej 1 dzie\u0144.", + MAX_LINK_CONTRIB: "Maksymalny wk\u0142ad \u0142\u0105cza", + MAX_LINK_CONTRIB_DESC: "Maksymalny wk\u0142ad wa\u017Conej \u0142atwo\u015Bci po\u0142\u0105czonych notatek do pocz\u0105tkowej \u0142atwo\u015Bci.", + LOGGING: "Logowanie", + DISPLAY_DEBUG_INFO: "Wy\u015Bwietl informacje debugowania w konsoli deweloperskiej?", + // sidebar.ts + //sidebar.ts + NOTES_REVIEW_QUEUE: "Kolejka przegl\u0105du notatek", + CLOSE: "Zamknij", + NEW: "Nowe", + YESTERDAY: "Wczoraj", + TODAY: "Dzisiaj", + TOMORROW: "Jutro", + // stats-modal.tsx + STATS_TITLE: "Statystyki", + MONTH: "Miesi\u0105c", + QUARTER: "Kwarta\u0142", + YEAR: "Rok", + LIFETIME: "Ca\u0142e \u017Cycie", + FORECAST: "Prognoza", + FORECAST_DESC: "Liczba kart z terminem w przysz\u0142o\u015Bci", + SCHEDULED: "Zaplanowane", + DAYS: "Dni", + NUMBER_OF_CARDS: "Liczba kart", + REVIEWS_PER_DAY: "\u015Arednio: ${avg} przegl\u0105d\xF3w/dzie\u0144", + INTERVALS: "Interwa\u0142y", + INTERVALS_DESC: "Op\xF3\u017Anienia przed ponownym pokazaniem przegl\u0105d\xF3w", + COUNT: "Liczba", + INTERVALS_SUMMARY: "\u015Aredni interwa\u0142: ${avg}, Najd\u0142u\u017Cszy interwa\u0142: ${longest}", + EASES: "\u0141atwo\u015Bci", + EASES_SUMMARY: "\u015Arednia \u0142atwo\u015B\u0107: ${avgEase}", + CARD_TYPES: "Typy kart", + CARD_TYPES_DESC: "Obejmuje tak\u017Ce ukryte karty, je\u015Bli takie s\u0105", + CARD_TYPE_NEW: "Nowe", + CARD_TYPE_YOUNG: "M\u0142ode", + CARD_TYPE_MATURE: "Stare", + CARD_TYPES_SUMMARY: "\u0141\u0105czna liczba kart: ${totalCardsCount}" +}; + +// src/lang/locale/pt.ts +var pt_default = {}; + +// src/lang/locale/pt-br.ts +var pt_br_default = { + // flashcard-modal.tsx + DECKS: "Baralhos", + DUE_CARDS: "Cartas para Colocar em Dia", + NEW_CARDS: "Novas Cartas", + TOTAL_CARDS: "Total de Cartas", + BACK: "Voltar", + SKIP: "Pular", + EDIT_CARD: "Editar Cart\xE3o", + RESET_CARD_PROGRESS: "Reiniciar o Progresso da Carta", + HARD: "Dif\xEDcil", + GOOD: "OK", + EASY: "F\xE1cil", + SHOW_ANSWER: "Mostrar Resposta", + CARD_PROGRESS_RESET: "O Progresso da Carta foi reiniciado", + SAVE: "Salvar", + CANCEL: "Cancelar", + NO_INPUT: "Nenhuma entrada fornecida.", + CURRENT_EASE_HELP_TEXT: "Facilidade atual: ", + CURRENT_INTERVAL_HELP_TEXT: "Intervalo atual: ", + CARD_GENERATED_FROM: "Gerada a partir de: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "Abrir uma nota para revisar", + REVIEW_CARDS: "Revisar flashcards", + REVIEW_DIFFICULTY_FILE_MENU: "Revis\xE3o: ${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "Revisar nota como ${difficulty}", + REVIEW_ALL_CARDS: "Revisar flashcards de todas as notas", + CRAM_ALL_CARDS: "Selecione um baralho para revisar", + REVIEW_CARDS_IN_NOTE: "Revisar flashcards nessa nota", + CRAM_CARDS_IN_NOTE: "Revisar todas as flashcards nessa nota", + VIEW_STATS: "Ver estat\xEDsticas", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "Revis\xE3o: ${dueNotesCount} nota(s), ${dueFlashcardsCount} Carta(s) para colocar em dia", + SYNC_TIME_TAKEN: "Sincroniza\xE7\xE3o levou ${t}ms", + NOTE_IN_IGNORED_FOLDER: "Nota \xE9 salva na pasta ignorada (cheque as configura\xE7\xF5es).", + PLEASE_TAG_NOTE: "Por favor etiquete a nota apropriadamente para revisar (nas configura\xE7\xF5es).", + RESPONSE_RECEIVED: "Resposta recebida.", + NO_DECK_EXISTS: "Nenhum baralho existe para ${deckName}", + ALL_CAUGHT_UP: "Voc\xEA colocou tudo em dia agora :D.", + // scheduling.ts + DAYS_STR_IVL: "${interval} dia(s)", + MONTHS_STR_IVL: "${interval} m\xEAs(es)", + YEARS_STR_IVL: "${interval} ano(s)", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}a", + // settings.ts + SETTINGS_HEADER: "Plugin Spaced Repetition - Configura\xE7\xE3o", + CHECK_WIKI: 'Para mais informa\xE7\xF5es, cheque a wiki.', + FOLDERS_TO_IGNORE: "Pastas para ignorar", + FOLDERS_TO_IGNORE_DESC: "Insira o caminho das pastas separado por quebras de linha ex: Templates Meta/Scripts", + FLASHCARDS: "Flashcards", + FLASHCARD_EASY_LABEL: "Texto do Bot\xE3o de F\xE1cil", + FLASHCARD_GOOD_LABEL: "Texto do Bot\xE3o de OK", + FLASHCARD_HARD_LABEL: "Texto do Bot\xE3o de Dif\xEDcil", + FLASHCARD_EASY_DESC: 'Customize o r\xF3tulo para o bot\xE3o de "F\xE1cil"', + FLASHCARD_GOOD_DESC: 'Customize o r\xF3tulo para o bot\xE3o de "OK"', + FLASHCARD_HARD_DESC: 'Customize o r\xF3tulo para o bot\xE3o de "Dif\xEDcil"', + FLASHCARD_TAGS: "Etiquetas dos Flashcards", + FLASHCARD_TAGS_DESC: "Insira etiquetas separadas por espa\xE7os ou quebras de linha ex: #flashcards #baralho2 #baralho3.", + CONVERT_FOLDERS_TO_DECKS: "Converter pastas para baralhos e sub-baralhos?", + CONVERT_FOLDERS_TO_DECKS_DESC: "Isso \xE9 uma alternativa para a op\xE7\xE3o de etiqueta dos Flashcards em cima.", + INLINE_SCHEDULING_COMMENTS: "Salvar coment\xE1rios de agendamento na mesma linha que a \xFAltima linha do flashcard?", + INLINE_SCHEDULING_COMMENTS_DESC: "Ligar isso vai fazer com que os coment\xE1rios em HTML n\xE3o quebrem a formata\xE7\xE3o de listas.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Enterrar cartas irm\xE3s at\xE9 o pr\xF3ximo dia?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Cartas irm\xE3s s\xE3o geradas pelo texto da mesma carta ex: omiss\xE3o de palavras", + SHOW_CARD_CONTEXT: "Mostrar contexto nas cartas?", + SHOW_CARD_CONTEXT_DESC: "ex: T\xEDtulo > Cabe\xE7alho 1 > Subcabe\xE7alho > ... > Subcabe\xE7alho", + CARD_MODAL_HEIGHT_PERCENT: "Porcentagem da Altura do Flashcard", + CARD_MODAL_SIZE_PERCENT_DESC: "Deveria estar configurado em 100% em dispositivos m\xF3veis ou se voc\xEA tem imagens muito grandes", + RESET_DEFAULT: "Reiniciar para a pr\xE9-defini\xE7\xE3o", + CARD_MODAL_WIDTH_PERCENT: "Porcentagem de Largura do Flashcard", + RANDOMIZE_CARD_ORDER: "Aleatorizar a ordem das cartas durante a revis\xE3o?", + REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + REVIEW_DECK_ORDER: "Order decks are displayed during review", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck", + DISABLE_CLOZE_CARDS: "Desabilitar cartas que usam omiss\xE3o de palavras?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "Converter ==marca-texto== em omiss\xF5es?", + CONVERT_BOLD_TEXT_TO_CLOZES: "Converter **texto em negrito** em omiss\xF5es?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "Converter {{chaves}} em omiss\xF5es?", + INLINE_CARDS_SEPARATOR: "Separador para flashcards inline", + FIX_SEPARATORS_MANUALLY_WARNING: "Note que depois de mudar isso voc\xEA vai ter que manualmente mudar quaisquer flashcards que voc\xEA tenha.", + INLINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards inline reversos", + MULTILINE_CARDS_SEPARATOR: "Separador para flashcards de m\xFAltiplas linhas", + MULTILINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards de m\xFAltiplas linhas reversos", + NOTES: "Notas", + REVIEW_PANE_ON_STARTUP: "Habilitar painel de revis\xE3o de notas na inicializa\xE7\xE3o", + TAGS_TO_REVIEW: "Etiquetas para revisar", + TAGS_TO_REVIEW_DESC: "Insira etiquetas separadas por espa\xE7os ou quebra de linhas ex: #revisar #etiqueta2 #etiqueta3.", + OPEN_RANDOM_NOTE: "Abrir uma nota aleat\xF3ria para revisar", + OPEN_RANDOM_NOTE_DESC: "Quando voc\xEA desabilitar isso, as notas v\xE3o ser ordenadas por import\xE2ncia (PageRank).", + AUTO_NEXT_NOTE: "Abrir a pr\xF3xima nota automaticamente depois de uma revis\xE3o", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "Desabilitar op\xE7\xF5es de revis\xE3o no menu de arquivos ex: Revis\xE3o: F\xE1cil OK Dif\xEDcil", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Depois de desabilitar, voc\xEA pode revisar usando os atalhos de comando. Reinicie Obsidian depois de mudar isso.", + MAX_N_DAYS_REVIEW_QUEUE: "N\xFAmero m\xE1ximo de dias para exibir no painel direito", + MIN_ONE_DAY: "O n\xFAmero de dias deve ser pelo menos 1.", + VALID_NUMBER_WARNING: "Por favor Insira um n\xFAmero v\xE1lido.", + UI_PREFERENCES: "Prefer\xEAncias de UI", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\xC1rvores de baralhos devem inicialmente ser exibidas como expandidas", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Desabilite isso para colapsar baralhos que est\xE3o um dentro do outro na mesma carta. \xDAtil se voc\xEA tem cartas que pertencem a muitos baralhos em um mesmo arquivo.", + ALGORITHM: "Algor\xEDtmo", + CHECK_ALGORITHM_WIKI: 'Para mais informa\xE7\xF5es, cheque a implementa\xE7\xE3o do algor\xEDtmo.', + BASE_EASE: "Facilidade base", + BASE_EASE_DESC: "m\xEDnimo = 130, preferivelmente por volta de 250.", + BASE_EASE_MIN_WARNING: "A facilidade base deve ser pelo menos 130.", + LAPSE_INTERVAL_CHANGE: "Mudan\xE7a de intervalo quando voc\xEA revisa um(a) flashcard/nota como dif\xEDcil", + LAPSE_INTERVAL_CHANGE_DESC: "novoIntervalo = velhoIntervalo * mudancaIntervalo / 100.", + EASY_BONUS: "B\xF4nus de F\xE1cil", + EASY_BONUS_DESC: "O b\xF4nus de f\xE1cil te permite mudar a difer\xEAncia entre intervalos de responder OK e F\xE1cil em um(a) flashcard/nota (m\xEDnimo = 100%).", + EASY_BONUS_MIN_WARNING: "O b\xF4nus de f\xE1cil deve ser pelo menos 100.", + MAX_INTERVAL: "Intervalo m\xE1ximo em dias", + MAX_INTERVAL_DESC: "Te permite colocar um limite m\xE1ximo no intervalo (pr\xE9-defini\xE7\xE3o = 100 anos).", + MAX_INTERVAL_MIN_WARNING: "O intervalo m\xE1ximo deve ser pelo menos 1 dia.", + MAX_LINK_CONTRIB: "Contribui\xE7\xE3o M\xE1xima de Links", + MAX_LINK_CONTRIB_DESC: "Contribui\xE7\xE3o m\xE1xima da facilidade ponderada das notas linkadas \xE0 facilidade inicial.", + LOGGING: "Logging", + DISPLAY_DEBUG_INFO: "Mostrar informa\xE7\xE3o de debugging no console de desenvolvimento?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "Fila de Notas para Revisar", + CLOSE: "Fechar", + NEW: "Novo", + YESTERDAY: "Ontem", + TODAY: "Hoje", + TOMORROW: "Amanh\xE3", + // stats-modal.tsx + STATS_TITLE: "Estat\xEDsticas", + MONTH: "M\xEAs", + QUARTER: "Trimestre", + YEAR: "Ano", + LIFETIME: "Tempo Total", + FORECAST: "Previs\xE3o", + FORECAST_DESC: "O n\xFAmero de cartas a serem colocadas em dia no futuro", + SCHEDULED: "Agendado", + DAYS: "Dias", + NUMBER_OF_CARDS: "N\xFAmero de cartas", + REVIEWS_PER_DAY: "M\xE9dia: ${avg} revis\xF5es/dia", + INTERVALS: "Intervalos", + INTERVALS_DESC: "Atrasos at\xE9 que as revis\xF5es sejam exibidas de novo", + COUNT: "Contagem", + INTERVALS_SUMMARY: "Intervalo em m\xE9dia: ${avg}, Maior intervalo: ${longest}", + EASES: "Facilidades", + EASES_SUMMARY: "Facilidade em m\xE9dia: ${avgEase}", + CARD_TYPES: "Tipos de Cartas", + CARD_TYPES_DESC: "Isso tamb\xE9m inclui cartas enterradas, caso existam", + CARD_TYPE_NEW: "Novo", + CARD_TYPE_YOUNG: "Jovem", + CARD_TYPE_MATURE: "Amadurecido", + CARD_TYPES_SUMMARY: "Total de cartas: ${totalCardsCount}" +}; + +// src/lang/locale/ro.ts +var ro_default = {}; + +// src/lang/locale/ru.ts +var ru_default = { + // flashcard-modal.tsx + DECKS: "\u041A\u043E\u043B\u043E\u0434\u044B", + DUE_CARDS: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0435\u043C\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + NEW_CARDS: "\u041D\u043E\u0432\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + TOTAL_CARDS: "\u0412\u0441\u0435\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + BACK: "\u041D\u0430\u0437\u0430\u0434", + SKIP: "\u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C", + EDIT_CARD: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0443", + RESET_CARD_PROGRESS: "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + HARD: "\u0421\u043B\u043E\u0436\u043D\u043E", + GOOD: "\u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E", + EASY: "\u041B\u0435\u0433\u043A\u043E", + SHOW_ANSWER: "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u0442\u0432\u0435\u0442", + CARD_PROGRESS_RESET: "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + SAVE: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C", + CANCEL: "\u041E\u0442\u043C\u0435\u043D\u0430", + NO_INPUT: "\u041F\u0443\u0441\u0442\u043E\u0439 \u0432\u0432\u043E\u0434.", + CURRENT_EASE_HELP_TEXT: "\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441: ", + CURRENT_INTERVAL_HELP_TEXT: "\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B: ", + CARD_GENERATED_FROM: "\u0421\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E \u0438\u0437: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0434\u043B\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F", + REVIEW_CARDS: "\u0418\u0437\u0443\u0447\u0430\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + REVIEW_DIFFICULTY_FILE_MENU: "\u0418\u0437\u0443\u0447\u0435\u043D\u0438\u0435: ${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "\u0418\u0437\u0443\u0447\u0430\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A ${difficulty}", + CRAM_ALL_CARDS: "\u0417\u0443\u0431\u0440\u0438\u0442\u044C \u0432\u0441\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u043A\u043E\u043B\u043E\u0434\u0435", + REVIEW_ALL_CARDS: "\u0418\u0437\u0443\u0447\u0430\u0442\u044C \u0432\u0441\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432\u043E \u0432\u0441\u0435\u0445 \u0437\u0430\u043C\u0435\u0442\u043A\u0430\u0445", + REVIEW_CARDS_IN_NOTE: "\u0418\u0437\u0443\u0447\u0430\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0437\u0430\u043C\u0435\u0442\u043A\u0435", + CRAM_CARDS_IN_NOTE: "\u0417\u0443\u0431\u0440\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0437\u0430\u043C\u0435\u0442\u043A\u0435", + VIEW_STATS: "\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0443", + OPEN_REVIEW_QUEUE_VIEW: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043E\u0447\u0435\u0440\u0435\u0434\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u043D\u0430 \u0431\u043E\u043A\u043E\u0432\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438", + STATUS_BAR: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C: ${dueNotesCount} \u0437\u0430\u043C\u0435\u0442\u043E\u043A, ${dueFlashcardsCount} \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + SYNC_TIME_TAKEN: "\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u0437\u0430\u043D\u044F\u043B\u0430 ${t}\u043C\u0441", + NOTE_IN_IGNORED_FOLDER: "\u0417\u0430\u043C\u0435\u0442\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430 \u0432 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u043C\u0443\u044E \u043F\u0430\u043F\u043A\u0443 (\u0441\u043C. \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438).", + PLEASE_TAG_NOTE: "\u0414\u043B\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F, \u043F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u043F\u043E\u043C\u0435\u0442\u044C\u0442\u0435 \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0442\u0435\u0433\u043E\u043C (\u0441\u043C. \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438).", + RESPONSE_RECEIVED: "\u041E\u0442\u0432\u0435\u0442 \u043F\u043E\u043B\u0443\u0447\u0435\u043D.", + NO_DECK_EXISTS: "\u041D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0440\u043E\u0432\u043D\u044F ${deckName}", + ALL_CAUGHT_UP: "\u041C\u043E\u043B\u043E\u0434\u0435\u0446! \u0422\u044B \u0441\u043F\u0440\u0430\u0432\u0438\u043B\u0441\u044F \u0438 \u0434\u043E\u0448\u0435\u043B \u0434\u043E \u043A\u043E\u043D\u0446\u0430! :D", + // scheduling.ts + DAYS_STR_IVL: "${interval} \u0434\u043D\u0435\u0439", + MONTHS_STR_IVL: "${interval} \u043C\u0435\u0441\u044F\u0446\u0435\u0432", + YEARS_STR_IVL: "${interval} \u0433\u043E\u0434\u043E\u0432", + DAYS_STR_IVL_MOBILE: "${interval}\u0434.", + MONTHS_STR_IVL_MOBILE: "${interval}\u043C.", + YEARS_STR_IVL_MOBILE: "${interval}\u0433.", + // settings.ts + SETTINGS_HEADER: "\u041F\u043B\u0430\u0433\u0438\u043D Spaced Repetition - \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", + CHECK_WIKI: '\u0414\u043B\u044F \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u043F\u043E\u0441\u0435\u0442\u0438\u0442\u0435: wiki.', + FOLDERS_TO_IGNORE: "\u0418\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u0430\u043F\u043A\u0438", + FOLDERS_TO_IGNORE_DESC: "\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u043F\u0443\u0442\u0438 \u043F\u0430\u043F\u043E\u043A, \u043A\u0430\u0436\u0434\u044B\u0439 \u043D\u0430 \u0441\u0432\u043E\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: Templates Meta/Scripts", + FLASHCARDS: "\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + FLASHCARD_EASY_LABEL: '\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 "\u041B\u0435\u0433\u043A\u043E"', + FLASHCARD_GOOD_LABEL: '\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E"', + FLASHCARD_HARD_LABEL: '\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 "\u0421\u043B\u043E\u0436\u043D\u043E"', + FLASHCARD_EASY_DESC: '\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u044F\u0440\u043B\u044B\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041B\u0435\u0433\u043A\u043E"', + FLASHCARD_GOOD_DESC: '\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u044F\u0440\u043B\u044B\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E"', + FLASHCARD_HARD_DESC: '\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u044F\u0440\u043B\u044B\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0421\u043B\u043E\u0436\u043D\u043E"', + FLASHCARD_TAGS: "\u0422\u0435\u0433\u0438 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + FLASHCARD_TAGS_DESC: "\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0442\u0435\u0433\u0438 \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 Enter-\u043E\u043C \u0438\u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u043C, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: #flashcards #deck2 #deck3.", + CONVERT_FOLDERS_TO_DECKS: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0438 \u0432 \u0443\u0440\u043E\u0432\u043D\u0438 \u0438 \u043F\u043E\u0434\u0443\u0440\u043E\u0432\u043D\u0438?", + CONVERT_FOLDERS_TO_DECKS_DESC: "\u042D\u0442\u043E \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u0430 \u043E\u043F\u0438\u0441\u0430\u043D\u043D\u043E\u043C\u0443 \u0432\u044B\u0448\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0443 \u0442\u0435\u0433\u043E\u0432 \u0444\u043B\u044D\u0448-\u043A\u0430\u0440\u0442", + INLINE_SCHEDULING_COMMENTS: "\u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438?", + INLINE_SCHEDULING_COMMENTS_DESC: "\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0439 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0441\u0434\u0435\u043B\u0430\u0435\u0442 \u0442\u0430\u043A, \u0447\u0442\u043E HTML \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043B\u043E\u043C\u0430\u0442\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0441\u043F\u0438\u0441\u043A\u0430.", + BURY_SIBLINGS_TILL_NEXT_DAY: "\u041F\u0440\u044F\u0442\u0430\u0442\u044C \u0440\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0434\u043E \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E \u0434\u043D\u044F?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u0420\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 - \u0442\u0435, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u044B \u0438\u0437 \u043E\u0434\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430, \u043F\u0440\u0438\u043C\u0435\u0440: \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0441 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u043C\u0438 ([...])", + SHOW_CARD_CONTEXT: "\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 (\u0443\u0440\u043E\u0432\u0435\u043D\u044C) \u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430\u0445 (\u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F)?", + SHOW_CARD_CONTEXT_DESC: "\u043F\u0440\u0438\u043C\u0435\u0440: Title > Heading 1 > Subheading > ... > Subheading", + CARD_MODAL_HEIGHT_PERCENT: "\u0412\u044B\u0441\u043E\u0442\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u0430\u0445", + CARD_MODAL_SIZE_PERCENT_DESC: "\u0415\u0441\u043B\u0438 \u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435\u0441\u044C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u043E\u043C, \u0432\u044B\u0441\u0442\u0430\u0432\u044C\u0442\u0435 100%. \u0418\u043D\u0430\u0447\u0435 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u043E\u0433\u0440\u043E\u043C\u043D\u044B\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", + RESET_DEFAULT: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u043E-\u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E", + CARD_MODAL_WIDTH_PERCENT: "\u0428\u0438\u0440\u0438\u043D\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u0430\u0445", + RANDOMIZE_CARD_ORDER: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u0439 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u043A\u0430\u0440\u0442 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F?", + REVIEW_CARD_ORDER_WITHIN_DECK: "\u041F\u043E\u0440\u044F\u0434\u043E\u043A \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442 \u043A\u043E\u043B\u043E\u0434\u044B \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "\u041F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043B\u043E\u0434\u044B (\u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u0441\u0435 \u043D\u043E\u0432\u044B\u0435 \u043A\u0430\u0440\u0442\u044B)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "\u041F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043B\u043E\u0434\u044B (\u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u0441\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0435\u043C\u044B\u0435 \u043A\u0430\u0440\u0442\u044B)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043B\u043E\u0434\u044B (\u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u0441\u0435 \u043D\u043E\u0432\u044B\u0435 \u043A\u0430\u0440\u0442\u044B)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043B\u043E\u0434\u044B (\u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u0441\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0435\u043C\u044B\u0435 \u043A\u0430\u0440\u0442\u044B)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u0430 \u0438\u0437 \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u043E\u0439 \u043A\u043E\u043B\u043E\u0434\u044B", + REVIEW_DECK_ORDER: "\u041F\u043E\u0440\u044F\u0434\u043E\u043A \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043A\u043E\u043B\u043E\u0434 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "\u041F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E (\u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u0432\u0441\u0435\u0445 \u043A\u0430\u0440\u0442 \u0438\u0437 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0439 \u043A\u043E\u043B\u043E\u0434\u044B)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u043E (\u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u0432\u0441\u0435\u0445 \u043A\u0430\u0440\u0442 \u0438\u0437 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0439 \u043A\u043E\u043B\u043E\u0434\u044B)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u0430 \u0438\u0437 \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u043E\u0439 \u043A\u043E\u043B\u043E\u0434\u044B", + DISABLE_CLOZE_CARDS: "\u0412\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u044B \u0441 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u043C\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C ==\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442== \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", + CONVERT_BOLD_TEXT_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C **\u0436\u0438\u0440\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442** \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C {{\u0444\u0438\u0433\u0443\u0440\u043D\u044B\u0435 \u0441\u043A\u043E\u0431\u043A\u0438}} \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", + INLINE_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0438\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + FIX_SEPARATORS_MANUALLY_WARNING: "\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435! \u041F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0433\u043E \u0432\u0430\u043C \u043F\u0440\u0438\u0434\u0451\u0442\u0441\u044F \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + INLINE_REVERSED_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u044B\u0445 \u0432\u043D\u0443\u0442\u0440\u0438\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + MULTILINE_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043C\u043D\u043E\u0433\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u044B\u0445 \u043C\u043D\u043E\u0433\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + NOTES: "\u0417\u0430\u043C\u0435\u0442\u043A\u0438", + REVIEW_PANE_ON_STARTUP: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B", + TAGS_TO_REVIEW: "\u0422\u0435\u0433\u0438 \u0434\u043B\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F", + TAGS_TO_REVIEW_DESC: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u0433\u0438, \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 Enter-\u0430\u043C\u0438 \u0438\u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u0430\u043C\u0438, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: #review #tag2 #tag3.", + OPEN_RANDOM_NOTE: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u0443\u044E \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0434\u043B\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F", + OPEN_RANDOM_NOTE_DESC: "\u0415\u0441\u043B\u0438 \u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C, \u0442\u043E \u0437\u0430\u043C\u0435\u0442\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043E\u0442\u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u044B \u043F\u043E \u0432\u0430\u0436\u043D\u043E\u0441\u0442\u0438 (PageRank).", + AUTO_NEXT_NOTE: "\u041F\u043E\u0441\u043B\u0435 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E \u0437\u0430\u043C\u0435\u0442\u043A\u0443", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u0412\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0431\u043E\u0440 \u0441\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u0438 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u0432 \u043C\u0435\u043D\u044E \u0444\u0430\u0439\u043B\u0430, \u0442.\u0435.: \u0418\u0437\u0443\u0447\u0435\u043D\u0438\u0435: \u041B\u0435\u0433\u043A\u043E \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E \u0421\u043B\u043E\u0436\u043D\u043E", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u041F\u043E\u0441\u043B\u0435 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0432\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u0438\u0437\u0443\u0447\u0430\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u043F\u0440\u0438 \u043F\u043E\u043C\u043E\u0449\u0438 \u0433\u043E\u0440\u044F\u0447\u0438\u0445 \u043A\u043B\u0430\u0432\u0438\u0448. \u041F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 Obsidian \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0439 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438.", + MAX_N_DAYS_REVIEW_QUEUE: "\u041D\u0430\u0438\u0431\u043E\u043B\u044C\u0448\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043D\u0435\u0439 \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u0438 \u0441\u043F\u0440\u0430\u0432\u0430", + MIN_ONE_DAY: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043D\u0435\u0439 \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 1.", + VALID_NUMBER_WARNING: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0435\u0435 \u0447\u0438\u0441\u043B\u043E.", + UI_PREFERENCES: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 - \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u0414\u0435\u0440\u0435\u0432\u044C\u044F \u043A\u043E\u043B\u043E\u0434 \u0434\u043E\u043B\u0436\u043D\u044B \u0438\u0437\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043A\u0430\u043A \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0435", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440, \u0447\u0442\u043E\u0431\u044B \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043A\u043E\u043B\u043E\u0434\u044B \u043D\u0430 \u043E\u0434\u043D\u043E\u0439 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435. \u041F\u043E\u043B\u0435\u0437\u043D\u043E, \u0435\u0441\u043B\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C \u043A\u0430\u0440\u0442\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043F\u0440\u0438\u043D\u0430\u0434\u043B\u0435\u0436\u0430\u0442 \u043C\u043D\u043E\u0433\u0438\u043C \u043A\u043E\u043B\u043E\u0434\u0430\u043C \u0432 \u043E\u0434\u043D\u043E\u043C \u0444\u0430\u0439\u043B\u0435.", + ALGORITHM: "\u0410\u043B\u0433\u043E\u0440\u0438\u0442\u043C", + CHECK_ALGORITHM_WIKI: '\u0417\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439 \u043E\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435\u0441\u044C \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0430.', + BASE_EASE: "\u0411\u0430\u0437\u043E\u0432\u0430\u044F \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C", + BASE_EASE_DESC: "\u043C\u0438\u043D\u0438\u043C\u0443\u043C = 130, \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043E\u043A\u043E\u043B\u043E 250.", + BASE_EASE_MIN_WARNING: "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u043C\u0438\u043D\u0438\u043C\u0443\u043C 130.", + LAPSE_INTERVAL_CHANGE: '\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0430 \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u0435 "\u0421\u043B\u043E\u0436\u043D\u043E" \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438/\u0437\u0430\u043C\u0435\u0442\u043A\u0438', + LAPSE_INTERVAL_CHANGE_DESC: "\u043D\u043E\u0432\u044B\u0439\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A = \u0441\u0442\u0430\u0440\u044B\u0439\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A * \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430 / 100.", + EASY_BONUS: "\u041B\u0435\u0433\u043A\u043E: \u0431\u043E\u043D\u0443\u0441", + EASY_BONUS_DESC: "\u0411\u043E\u043D\u0443\u0441 \u0437\u0430 \u041B\u0435\u0433\u043A\u043E \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u0430\u043C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u043D\u0438\u0446\u0443 \u0432 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430\u0445 \u043C\u0435\u0436\u0434\u0443 \u043E\u0442\u0432\u0435\u0442\u0430\u043C\u0438 \u0425\u043E\u0440\u043E\u0448\u043E \u0438 \u041B\u0435\u0433\u043A\u043E \u043D\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435/\u0437\u0430\u043C\u0435\u0442\u043A\u0435 (\u043C\u0438\u043D. = 100%).", + EASY_BONUS_MIN_WARNING: '\u0411\u043E\u043D\u0443\u0441 \u0437\u0430 "\u041B\u0435\u0433\u043A\u043E" \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 100.', + MAX_INTERVAL: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u0432 \u0434\u043D\u044F\u0445", + MAX_INTERVAL_DESC: "\u041F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u0430\u043C \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0442\u044C \u0432\u0435\u0440\u0445\u043D\u044E\u044E \u0433\u0440\u0430\u043D\u0438\u0446\u0443 \u043D\u0430 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E = 100 \u043B\u0435\u0442).", + MAX_INTERVAL_MIN_WARNING: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 1.", + MAX_LINK_CONTRIB: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u043A\u043B\u0430\u0434 \u0441\u0432\u044F\u0437\u0438 (\u0441\u0441\u044B\u043B\u043A\u0438)", + MAX_LINK_CONTRIB_DESC: '\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u043A\u043B\u0430\u0434 \u0441\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u0438" \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0445 \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u0432 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C".', + LOGGING: "\u0416\u0443\u0440\u043D\u0430\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435", + DISPLAY_DEBUG_INFO: "\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\u041E\u0447\u0435\u0440\u0435\u0434\u044C \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u043D\u0430 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435", + CLOSE: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C", + NEW: "\u041D\u043E\u0432\u044B\u0435", + YESTERDAY: "\u0412\u0447\u0435\u0440\u0430\u0448\u043D\u0438\u0435", + TODAY: "\u0421\u0435\u0433\u043E\u0434\u043D\u044F\u0448\u043D\u0438\u0435", + TOMORROW: "\u0417\u0430\u0432\u0442\u0440\u0430\u0448\u043D\u0438\u0435", + // stats-modal.tsx + STATS_TITLE: "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430", + MONTH: "\u041C\u0435\u0441\u044F\u0446", + QUARTER: "\u041A\u0432\u0430\u0440\u0442\u0430\u043B", + YEAR: "\u0413\u043E\u0434", + LIFETIME: "\u0412\u0441\u0451 \u0432\u0440\u0435\u043C\u044F", + FORECAST: "\u041F\u0440\u043E\u0433\u043D\u043E\u0437", + FORECAST_DESC: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u043F\u0440\u0435\u0434\u0441\u0442\u043E\u044F\u0449\u0438\u0445 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", + SCHEDULED: "\u0417\u0430\u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043E", + DAYS: "\u0414\u043D\u0438", + NUMBER_OF_CARDS: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + REVIEWS_PER_DAY: "\u0421\u0440\u0435\u0434\u043D\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E: ${avg} \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0439 \u0432 \u0434\u0435\u043D\u044C", + INTERVALS: "\u0418\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u044B", + INTERVALS_DESC: "\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0438 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0434\u043E \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E \u043F\u043E\u043A\u0430\u0437\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", + COUNT: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E", + INTERVALS_SUMMARY: "\u0421\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A: ${avg}, \u0421\u0430\u043C\u044B\u0439 \u0434\u043B\u0438\u043D\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A: ${longest}", + EASES: "\u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F", + EASES_SUMMARY: "\u0421\u0440\u0435\u0434\u043D\u0435\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441\u0430: ${avgEase}", + CARD_TYPES: "\u0422\u0438\u043F\u044B \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + CARD_TYPES_DESC: "\u0412\u043A\u043B\u044E\u0447\u0430\u044F \u0441\u043F\u0440\u044F\u0442\u0430\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438, \u0435\u0441\u043B\u0438 \u0442\u0430\u043A\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0442.", + CARD_TYPE_NEW: "\u041D\u043E\u0432\u044B\u0445", + CARD_TYPE_YOUNG: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0435\u043C\u044B\u0445", + CARD_TYPE_MATURE: "\u0418\u0437\u0443\u0447\u0435\u043D\u043D\u044B\u0445", + CARD_TYPES_SUMMARY: "\u0412\u0441\u0435\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A: ${totalCardsCount}" +}; + +// src/lang/locale/ta.ts +var ta_default = {}; + +// src/lang/locale/te.ts +var te_default = {}; + +// src/lang/locale/th.ts +var th_default = {}; + +// src/lang/locale/tr.ts +var tr_default = {}; + +// src/lang/locale/uk.ts +var uk_default = {}; + +// src/lang/locale/ur.ts +var ur_default = {}; + +// src/lang/locale/vi.ts +var vi_default = {}; + +// src/lang/locale/zh-cn.ts +var zh_cn_default = { + // flashcard-modal.tsx + DECKS: "\u5361\u7EC4", + DUE_CARDS: "\u5230\u671F\u5361\u7247", + NEW_CARDS: "\u65B0\u5361\u7247", + TOTAL_CARDS: "\u5168\u90E8\u5361\u7247", + BACK: "\u8FD4\u56DE", + SKIP: "\u7565\u8FC7", + EDIT_CARD: "\u7F16\u8F91\u5361\u7247", + RESET_CARD_PROGRESS: "\u91CD\u7F6E\u5361\u7247", + HARD: "\u8F83\u96BE", + GOOD: "\u8BB0\u5F97", + EASY: "\u7B80\u5355", + SHOW_ANSWER: "\u663E\u793A\u7B54\u6848", + CARD_PROGRESS_RESET: "\u5361\u7247\u5DF2\u88AB\u91CD\u7F6E\u3002", + SAVE: "\u50A8\u5B58", + CANCEL: "\u53D6\u6D88", + NO_INPUT: "\u6CA1\u6709\u63D0\u4F9B\u8F93\u5165\u3002", + CURRENT_EASE_HELP_TEXT: "\u76EE\u524D\u638C\u63E1\u7A0B\u5EA6\uFF1A", + CURRENT_INTERVAL_HELP_TEXT: "\u76EE\u524D\u95F4\u9694\uFF1A", + CARD_GENERATED_FROM: "\u751F\u6210\u81EA\uFF1A${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\u6253\u5F00\u4E00\u4E2A\u7B14\u8BB0\u5F00\u59CB\u590D\u4E60", + REVIEW_CARDS: "\u590D\u4E60\u5361\u7247", + REVIEW_DIFFICULTY_FILE_MENU: "\u590D\u4E60\uFF1A${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "\u6807\u8BB0\u4E3A\u201C${difficulty}\u201D", + REVIEW_ALL_CARDS: "\u590D\u4E60\u6240\u6709\u7B14\u8BB0\u4E2D\u7684\u5361\u7247", + CRAM_ALL_CARDS: "\u9009\u62E9\u8981\u96C6\u4E2D\u590D\u4E60\u7684\u5361\u7EC4", + REVIEW_CARDS_IN_NOTE: "\u590D\u4E60\u6B64\u7B14\u8BB0\u4E2D\u7684\u5361\u7247", + CRAM_CARDS_IN_NOTE: "\u96C6\u4E2D\u590D\u4E60\u6B64\u7B14\u8BB0\u4E2D\u7684\u5361\u7247", + VIEW_STATS: "\u67E5\u770B\u6570\u636E", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "\u590D\u4E60: ${dueNotesCount} \u7B14\u8BB0, ${dueFlashcardsCount} \u5361\u7247\u5DF2\u5230\u671F", + SYNC_TIME_TAKEN: "\u540C\u6B65\u65F6\u95F4 ${t}ms", + NOTE_IN_IGNORED_FOLDER: "\u7B14\u8BB0\u4FDD\u5B58\u5728\u5DF2\u88AB\u5FFD\u7565\u7684\u8DEF\u5F84\u4E2D\uFF08\u68C0\u67E5\u8BBE\u7F6E\u9009\u9879\uFF09\u3002", + PLEASE_TAG_NOTE: "\u8BF7\u5C06\u9700\u8981\u590D\u4E60\u7684\u7B14\u8BB0\u4E2D\u52A0\u5165\u6B63\u786E\u7684\u6807\u7B7E\uFF08\u68C0\u67E5\u8BBE\u7F6E\u9009\u9879\uFF09\u3002", + RESPONSE_RECEIVED: "\u53CD\u9988\u5DF2\u6536\u5230", + NO_DECK_EXISTS: "\u6CA1\u6709 ${deckName} \u5361\u7EC4", + ALL_CAUGHT_UP: "\u90FD\u590D\u4E60\u5B8C\u5566\uFF0C\u4F60\u771F\u68D2\uFF01", + // scheduling.ts + DAYS_STR_IVL: "${interval}\u5929", + MONTHS_STR_IVL: "${interval}\u6708", + YEARS_STR_IVL: "${interval}\u5E74", + DAYS_STR_IVL_MOBILE: "${interval}\u5929", + MONTHS_STR_IVL_MOBILE: "${interval}\u6708", + YEARS_STR_IVL_MOBILE: "${interval}\u5E74", + // settings.ts + SETTINGS_HEADER: "\u95F4\u9694\u91CD\u590D\u63D2\u4EF6 - \u8BBE\u7F6E", + CHECK_WIKI: '\u4E86\u89E3\u66F4\u591A, \u8BF7\u70B9\u51FBwiki.', + FOLDERS_TO_IGNORE: "\u5FFD\u7565\u6B64\u6587\u4EF6\u5939", + FOLDERS_TO_IGNORE_DESC: "\u8F93\u5165\u6587\u4EF6\u5939\u8DEF\u5F84\uFF0C\u7528\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1ATemplates Meta/Scripts", + FLASHCARDS: "\u5361\u7247", + FLASHCARD_EASY_LABEL: "\u201C\u7B80\u5355\u201D\u6309\u94AE\u6587\u672C", + FLASHCARD_GOOD_LABEL: "\u201C\u8BB0\u5F97\u201D\u6309\u94AE\u6587\u672C", + FLASHCARD_HARD_LABEL: "\u201C\u8F83\u96BE\u201D\u6309\u94AE\u6587\u672C", + FLASHCARD_EASY_DESC: "\u81EA\u5B9A\u4E49\u201C\u7B80\u5355\u201D\u6309\u94AE\u7684\u6807\u7B7E", + FLASHCARD_GOOD_DESC: "\u81EA\u5B9A\u4E49\u201C\u8BB0\u5F97\u201D\u6309\u94AE\u7684\u6807\u7B7E", + FLASHCARD_HARD_DESC: "\u81EA\u5B9A\u4E49\u201C\u8F83\u96BE\u201D\u6309\u94AE\u7684\u6807\u7B7E", + FLASHCARD_TAGS: "\u5361\u7247\u6807\u7B7E", + FLASHCARD_TAGS_DESC: "\u8F93\u5165\u6807\u7B7E\uFF0C\u7528\u7A7A\u683C\u6216\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#flashcards #deck2 #deck3.", + CONVERT_FOLDERS_TO_DECKS: "\u662F\u5426\u5C06\u6587\u4EF6\u5939\u5185\u5BB9\u8F6C\u6362\u4E3A\u5361\u7247\u7EC4\u548C\u5B50\u5361\u7247\u7EC4\uFF1F", + CONVERT_FOLDERS_TO_DECKS_DESC: "\u6B64\u9009\u9879\u4E3A\u5361\u7247\u6807\u7B7E\u9009\u9879\u7684\u66FF\u4EE3\u9009\u9879\u3002", + INLINE_SCHEDULING_COMMENTS: "\u662F\u5426\u5C06\u8BA1\u5212\u91CD\u590D\u65F6\u95F4\u4FDD\u5B58\u5728\u5361\u7247\u6700\u540E\u4E00\u884C\u7684\u540C\u4E00\u884C\uFF1F", + INLINE_SCHEDULING_COMMENTS_DESC: "HTML\u6CE8\u91CA\u4E0D\u518D\u7834\u574F\u5217\u8868\u683C\u5F0F", + BURY_SIBLINGS_TILL_NEXT_DAY: "\u5C06\u5173\u8054\u5361\u7247\u9690\u85CF\u81F3\u4E0B\u4E00\u5929\uFF1F", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u5173\u8054\u5361\u7247\u662F\u6765\u81EA\u540C\u4E00\u5361\u7247\u7684\u4E0D\u540C\u5F62\u5F0F\uFF0C \u4F8B\u5982\uFF1A\u5B8C\u5F62\u586B\u7A7A\u5361\u7247", + SHOW_CARD_CONTEXT: "\u5728\u5361\u7247\u4E2D\u663E\u793A\u4E0A\u4E0B\u6587\uFF1F", + SHOW_CARD_CONTEXT_DESC: "\u4F8B\u5982\uFF1A\u6807\u9898 > \u526F\u6807\u9898 > \u5C0F\u6807\u9898 > ... > \u5C0F\u6807\u9898", + CARD_MODAL_HEIGHT_PERCENT: "\u5361\u7247\u9AD8\u5EA6\u767E\u5206\u6BD4", + CARD_MODAL_SIZE_PERCENT_DESC: "\u8BF7\u5728\u79FB\u52A8\u7AEF\u4F7F\u7528\u5E76\u9700\u8981\u6D4F\u89C8\u8F83\u5927\u56FE\u7247\u65F6\u8BBE\u4E3A100%", + RESET_DEFAULT: "\u91CD\u7F6E\u4E3A\u9ED8\u8BA4", + CARD_MODAL_WIDTH_PERCENT: "\u5361\u7247\u5BBD\u5EA6\u767E\u5206\u6BD4", + RANDOMIZE_CARD_ORDER: "\u590D\u4E60\u65F6\u968F\u673A\u663E\u793A\u5361\u7247\uFF1F", + REVIEW_CARD_ORDER_WITHIN_DECK: "\u590D\u4E60\u65F6\u5361\u7247\u7EC4\u5185\u7684\u5361\u7247\u6392\u5E8F", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "\u5361\u7247\u7EC4\u5185\u987A\u5E8F (\u5168\u90E8\u65B0\u5361\u7247\u4F18\u5148)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "\u5361\u7247\u7EC4\u5185\u987A\u5E8F (\u5168\u90E8\u5230\u671F\u5361\u7247\u4F18\u5148)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "\u5361\u7247\u7EC4\u5185\u4E71\u5E8F (\u5168\u90E8\u65B0\u5361\u7247\u4F18\u5148)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "\u5361\u7247\u7EC4\u5185\u4E71\u5E8F (\u5168\u90E8\u5230\u671F\u5361\u7247\u4F18\u5148)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "\u5361\u7247\u7EC4\u53CA\u5361\u7247\u90FD\u4E71\u5E8F", + REVIEW_DECK_ORDER: "\u590D\u4E60\u65F6\u5361\u7247\u7EC4\u7684\u6392\u5E8F", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "\u987A\u5E8F (\u5728\u524D\u4E00\u5361\u7247\u7EC4\u5185\u5361\u7247\u90FD\u590D\u4E60\u5B8C\u540E)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "\u4E71\u5E8F (\u5728\u524D\u4E00\u5361\u7247\u7EC4\u5185\u5361\u7247\u90FD\u590D\u4E60\u5B8C\u540E)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "\u5361\u7247\u7EC4\u53CA\u5361\u7247\u90FD\u4E71\u5E8F", + DISABLE_CLOZE_CARDS: "\u4E0D\u8FDB\u884C\u5B8C\u5F62\u586B\u7A7A\uFF1F", + CONVERT_HIGHLIGHTS_TO_CLOZES: "\u5C06 ==\u9AD8\u4EAE== \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F", + CONVERT_BOLD_TEXT_TO_CLOZES: "\u5C06 **\u7C97\u4F53** \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u5C06 {{\u5927\u62EC\u53F7}} \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F", + INLINE_CARDS_SEPARATOR: "\u5355\u884C\u5361\u7247\u7684\u5206\u9694\u7B26", + FIX_SEPARATORS_MANUALLY_WARNING: "\u6CE8\u610F\uFF1A\u66F4\u6539\u6B64\u9009\u9879\u540E\u4F60\u5C06\u9700\u8981\u81EA\u884C\u66F4\u6539\u5DF2\u5B58\u5728\u5361\u7247\u7684\u5206\u9694\u7B26\u3002", + INLINE_REVERSED_CARDS_SEPARATOR: "\u5355\u884C\u7FFB\u8F6C\u5361\u7247\u7684\u5206\u9694\u7B26", + MULTILINE_CARDS_SEPARATOR: "\u591A\u884C\u5361\u7247\u7684\u5206\u9694\u7B26", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\u591A\u884C\u7FFB\u8F6C\u5361\u7247\u7684\u5206\u9694\u7B26", + NOTES: "\u7B14\u8BB0", + REVIEW_PANE_ON_STARTUP: "\u542F\u52A8\u65F6\u5F00\u542F\u7B14\u8BB0\u590D\u4E60\u7A97\u683C", + TAGS_TO_REVIEW: "\u590D\u4E60\u6807\u7B7E", + TAGS_TO_REVIEW_DESC: "\u8F93\u5165\u6807\u7B7E\uFF0C\u7528\u7A7A\u683C\u6216\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#review #tag2 #tag3.", + OPEN_RANDOM_NOTE: "\u590D\u4E60\u968F\u673A\u7B14\u8BB0", + OPEN_RANDOM_NOTE_DESC: "\u5173\u95ED\u6B64\u9009\u9879\uFF0C\u7B14\u8BB0\u5C06\u4EE5\u91CD\u8981\u5EA6(PageRank)\u6392\u5E8F\u3002", + AUTO_NEXT_NOTE: "\u590D\u4E60\u540E\u81EA\u52A8\u6253\u5F00\u4E0B\u4E00\u4E2A\u7B14\u8BB0", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u5173\u95ED\u6587\u4EF6\u9009\u5355\u4E2D\u7684\u590D\u4E60\u9009\u9879 \u4F8B\u5982\uFF1A\u590D\u4E60\uFF1A\u7B80\u5355 \u8BB0\u5F97 \u8F83\u96BE", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u5173\u95ED\u6B64\u9009\u9879\u540E\u4F60\u53EF\u4EE5\u4F7F\u7528\u5FEB\u6377\u952E\u5F00\u59CB\u590D\u4E60\u3002\u91CD\u65B0\u542F\u52A8Obsidian\u4F7F\u672C\u9009\u9879\u751F\u6548\u3002", + MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u8FB9\u680F\u4E2D\u663E\u793A\u7684\u6700\u5927\u5929\u6570", + MIN_ONE_DAY: "\u5929\u6570\u6700\u5C0F\u503C\u4E3A1", + VALID_NUMBER_WARNING: "\u8BF7\u8F93\u5165\u6709\u6548\u7684\u6570\u5B57\u3002", + UI_PREFERENCES: "\u7528\u6237\u754C\u9762\u9996\u9009\u9879", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u7532\u677F\u6811\u6700\u521D\u5E94\u663E\u793A\u4E3A\u5C55\u5F00", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u5173\u95ED\u6B64\u9009\u9879\u53EF\u6298\u53E0\u540C\u4E00\u5F20\u5361\u7247\u4E2D\u7684\u5D4C\u5957\u724C\u7EC4\u3002\u5982\u679C\u60A8\u7684\u5361\u7247\u5C5E\u4E8E\u540C\u4E00\u6587\u4EF6\u4E2D\u7684\u8BB8\u591A\u5957\u724C\uFF0C\u5219\u5F88\u6709\u7528\u3002", + ALGORITHM: "\u7B97\u6CD5", + CHECK_ALGORITHM_WIKI: '\u4E86\u89E3\u66F4\u591A, \u8BF7\u70B9\u51FB\u7B97\u6CD5\u5B9E\u73B0.', + BASE_EASE: "\u57FA\u7840\u638C\u63E1\u7A0B\u5EA6", + BASE_EASE_DESC: "\u6700\u5C0F\u503C130\uFF0C\u63A8\u8350\u503C\u7EA6250.", + BASE_EASE_MIN_WARNING: "\u57FA\u7840\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5C0F\u503C\u4E3A130\u3002", + LAPSE_INTERVAL_CHANGE: "\u5C06\u590D\u4E60\u65F6\u6807\u6CE8\u4E3A\u201C\u8F83\u96BE\u201D\u7684\u5361\u7247\u6216\u7B14\u8BB0\u590D\u4E60\u95F4\u9694\u7F29\u77ED", + LAPSE_INTERVAL_CHANGE_DESC: "\u65B0\u590D\u4E60\u95F4\u9694 = \u539F\u590D\u4E60\u95F4\u9694 * \u95F4\u9694\u6539\u53D8\u7CFB\u6570 / 100.", + EASY_BONUS: "\u7B80\u5355\u5956\u52B1", + EASY_BONUS_DESC: "\u7B80\u5355\u5956\u52B1\u8BBE\u5B9A\u201C\u8BB0\u5F97\u201D\u548C\u201C\u7B80\u5355\u201D\u5361\u7247\u6216\u7B14\u8BB0\u7684\u590D\u4E60\u95F4\u9694\u5DEE\u8DDD\uFF08\u6700\u5C0F\u503C100%\uFF09\u3002", + EASY_BONUS_MIN_WARNING: "\u7B80\u5355\u5956\u52B1\u81F3\u5C11\u4E3A100\u3002", + MAX_INTERVAL: "\u6700\u5927\u95F4\u9694\uFF08\u5929\uFF09", + MAX_INTERVAL_DESC: "\u8BBE\u5B9A\u590D\u4E60\u7684\u6700\u5927\u95F4\u9694\u65F6\u95F4\uFF08\u9ED8\u8BA4\u503C100\u5E74\uFF09\u3002", + MAX_INTERVAL_MIN_WARNING: "\u6700\u5927\u95F4\u9694\u81F3\u5C11\u4E3A1\u5929", + MAX_LINK_CONTRIB: "\u6700\u5927\u94FE\u63A5\u6536\u76CA", + MAX_LINK_CONTRIB_DESC: "\u94FE\u63A5\u7B14\u8BB0\u7684\u52A0\u6743\u638C\u63E1\u7A0B\u5EA6\u5BF9\u539F\u59CB\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5927\u8D21\u732E\u3002", + LOGGING: "\u8BB0\u5F55\u4E2D", + DISPLAY_DEBUG_INFO: "\u5728\u5F00\u53D1\u8005\u63A7\u5236\u53F0\u4E2D\u663E\u793A\u8C03\u8BD5\u4FE1\u606F\uFF1F", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\u7B14\u8BB0\u590D\u4E60\u5E8F\u5217", + CLOSE: "\u4E34\u8FD1", + NEW: "\u65B0", + YESTERDAY: "\u6628\u5929", + TODAY: "\u4ECA\u5929", + TOMORROW: "\u660E\u5929", + // stats-modal.tsx + STATS_TITLE: "\u6570\u636E", + MONTH: "\u6708", + QUARTER: "\u5B63", + YEAR: "\u5E74", + LIFETIME: "\u5168\u90E8", + FORECAST: "\u9884\u671F", + FORECAST_DESC: "\u5C06\u8981\u5230\u671F\u7684\u5361\u7247\u6570\u91CF", + SCHEDULED: "\u5DF2\u6392\u671F", + DAYS: "\u5929", + NUMBER_OF_CARDS: "\u5361\u7247\u6570\u91CF", + REVIEWS_PER_DAY: "\u5E73\u5747: \u590D\u4E60${avg} /\u5929", + INTERVALS: "\u95F4\u9694", + INTERVALS_DESC: "\u5230\u4E0B\u4E00\u6B21\u590D\u4E60\u7684\u65F6\u95F4\u95F4\u9694", + COUNT: "\u8BA1\u6570", + INTERVALS_SUMMARY: "\u5E73\u5747\u95F4\u9694\u65F6\u95F4: ${avg}, \u6700\u957F\u95F4\u9694\u65F6\u95F4: ${longest}", + EASES: "\u638C\u63E1\u7A0B\u5EA6", + EASES_SUMMARY: "\u5E73\u5747\u638C\u63E1\u7A0B\u5EA6: ${avgEase}", + CARD_TYPES: "\u5361\u7247\u7C7B\u578B", + CARD_TYPES_DESC: "\u5982\u6709\uFF0C\u5C06\u663E\u793A\u9690\u85CF\u7684\u5361\u7247", + CARD_TYPE_NEW: "\u65B0", + CARD_TYPE_YOUNG: "\u8F83\u65B0", + CARD_TYPE_MATURE: "\u719F\u6089", + CARD_TYPES_SUMMARY: "\u603B\u5361\u7247\u6570: ${totalCardsCount}" +}; + +// src/lang/locale/zh-tw.ts +var zh_tw_default = { + // flashcard-modal.tsx + DECKS: "\u724C\u7D44", + DUE_CARDS: "\u5230\u671F\u5361\u7247", + NEW_CARDS: "\u65B0\u5361\u7247", + TOTAL_CARDS: "\u5168\u90E8\u5361\u7247", + BACK: "\u8FD4\u56DE", + SKIP: "\u7565\u904E", + EDIT_CARD: "\u7DE8\u8F2F\u5361\u7247", + RESET_CARD_PROGRESS: "\u91CD\u7F6E\u5361\u7247", + HARD: "\u8F03\u96E3", + GOOD: "\u8A18\u5F97", + EASY: "\u7C21\u55AE", + SHOW_ANSWER: "\u986F\u793A\u7B54\u6848", + CARD_PROGRESS_RESET: "\u5361\u7247\u5DF2\u88AB\u91CD\u7F6E\u3002", + SAVE: "\u5132\u5B58", + CANCEL: "\u53D6\u6D88", + NO_INPUT: "\u6C92\u6709\u63D0\u4F9B\u8F38\u5165\u3002", + CURRENT_EASE_HELP_TEXT: "\u76EE\u524D\u638C\u63E1\u7A0B\u5EA6\uFF1A", + CURRENT_INTERVAL_HELP_TEXT: "\u76EE\u524D\u9593\u9694\u6642\u9593\uFF1A", + CARD_GENERATED_FROM: "\u751F\u6210\u81EA\uFF1A${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\u6253\u958B\u4E00\u500B\u7B46\u8A18\u958B\u59CB\u5FA9\u7FD2", + REVIEW_CARDS: "\u5FA9\u7FD2\u5361\u7247", + REVIEW_DIFFICULTY_FILE_MENU: "\u5FA9\u7FD2\uFF1A${difficulty}", + REVIEW_NOTE_DIFFICULTY_CMD: "\u6A19\u8A18\u70BA\u300C${difficulty}\u300D", + REVIEW_CARDS_IN_NOTE: "\u5FA9\u7FD2\u6B64\u7B46\u8A18\u4E2D\u7684\u5361\u7247", + CRAM_ALL_CARDS: "\u9078\u64C7\u8981\u4E0D\u8A08\u96E3\u6613\u5EA6\u5FA9\u7FD2\u7684\u724C\u7D44", + REVIEW_ALL_CARDS: "\u5FA9\u7FD2\u6240\u6709\u7B46\u8A18\u4E2D\u7684\u5361\u7247", + CRAM_CARDS_IN_NOTE: "\u4E0D\u8A08\u96E3\u6613\u5EA6\u5FA9\u7FD2\u6B64\u7B46\u8A18\u4E2D\u7684\u5361\u7247", + VIEW_STATS: "\u6AA2\u8996\u6578\u64DA", + OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + STATUS_BAR: "\u5FA9\u7FD2: ${dueNotesCount} \u7B46\u8A18, ${dueFlashcardsCount} \u5361\u7247\u5DF2\u5230\u671F", + SYNC_TIME_TAKEN: "\u540C\u6B65\u6642\u9593 ${t}ms", + NOTE_IN_IGNORED_FOLDER: "\u7B46\u8A18\u5132\u5B58\u5728\u5DF2\u88AB\u5FFD\u7565\u7684\u8DEF\u5F91\u4E2D\uFF08\u6AA2\u67E5\u8A2D\u5B9A\u9078\u9805\uFF09\u3002", + PLEASE_TAG_NOTE: "\u8ACB\u5C07\u9700\u8981\u5FA9\u7FD2\u7684\u7B46\u8A18\u4E2D\u52A0\u5165\u6B63\u78BA\u7684\u6A19\u7C64\uFF08\u6AA2\u67E5\u8A2D\u5B9A\u9078\u9805\uFF09\u3002", + RESPONSE_RECEIVED: "\u56DE\u994B\u5DF2\u6536\u5230", + NO_DECK_EXISTS: "\u6C92\u6709 ${deckName} \u724C\u7D44", + ALL_CAUGHT_UP: "\u90FD\u5FA9\u7FD2\u5B8C\u5566\uFF0C\u4F60\u771F\u68D2\uFF01", + // scheduling.ts + DAYS_STR_IVL: "${interval}\u5929", + MONTHS_STR_IVL: "${interval}\u6708", + YEARS_STR_IVL: "${interval}\u5E74", + DAYS_STR_IVL_MOBILE: "${interval}\u5929", + MONTHS_STR_IVL_MOBILE: "${interval}\u6708", + YEARS_STR_IVL_MOBILE: "${interval}\u5E74", + // settings.ts + SETTINGS_HEADER: "\u9593\u9694\u91CD\u8907\u5916\u639B - \u8A2D\u5B9A", + CHECK_WIKI: '\u77AD\u89E3\u66F4\u591A, \u8ACB\u9EDE\u9078wiki.', + FOLDERS_TO_IGNORE: "\u5FFD\u7565\u6B64\u8CC7\u6599\u593E", + FOLDERS_TO_IGNORE_DESC: "\u8F38\u5165\u8CC7\u6599\u593E\u8DEF\u5F91\uFF08\u7528\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF09\uFF0C\u4F8B\u5982\uFF1ATemplates Meta/Scripts", + FLASHCARDS: "\u5361\u7247", + FLASHCARD_EASY_LABEL: "\u7C21\u55AE\u6309\u9215\u6587\u5B57", + FLASHCARD_GOOD_LABEL: "\u8A18\u5F97\u6309\u9215\u6587\u5B57", + FLASHCARD_HARD_LABEL: "\u8F03\u96E3\u6309\u9215\u6587\u5B57", + FLASHCARD_EASY_DESC: "\u81EA\u8A02\u300C\u7C21\u55AE\u300D\u6309\u9215\u7684\u6A19\u7C64", + FLASHCARD_GOOD_DESC: "\u81EA\u8A02\u300C\u8A18\u5F97\u300D\u6309\u9215\u7684\u6A19\u7C64", + FLASHCARD_HARD_DESC: "\u81EA\u8A02\u300C\u8F03\u96E3\u300D\u6309\u9215\u7684\u6A19\u7C64", + FLASHCARD_TAGS: "\u5361\u7247\u6A19\u7C64", + FLASHCARD_TAGS_DESC: "\u8F38\u5165\u6A19\u7C64\uFF08\u7528\u7A7A\u767D\u6216\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF09\uFF0C\u4F8B\u5982\uFF1A#flashcards #deck2 #deck3.", + CONVERT_FOLDERS_TO_DECKS: "\u662F\u5426\u5C07\u8CC7\u6599\u593E\u5167\u5BB9\u8F49\u63DB\u70BA\u724C\u7D44\u548C\u5B50\u724C\u7D44\uFF1F", + CONVERT_FOLDERS_TO_DECKS_DESC: "\u6B64\u9078\u9805\u70BA\u5361\u7247\u6A19\u7C64\u9078\u9805\u7684\u66FF\u4EE3\u9078\u9805\u3002", + INLINE_SCHEDULING_COMMENTS: "\u662F\u5426\u5C07\u8A08\u5283\u91CD\u8907\u6642\u9593\u5132\u5B58\u5728\u5361\u7247\u6700\u5F8C\u4E00\u884C\u7684\u540C\u4E00\u884C\uFF1F", + INLINE_SCHEDULING_COMMENTS_DESC: "\u52FE\u9078\u5F8CHTML\u8A3B\u89E3\u4E0D\u6703\u7834\u58DE\u5217\u8868\u683C\u5F0F\u554F\u984C\u3002", + BURY_SIBLINGS_TILL_NEXT_DAY: "\u5C07\u53CD\u8F49\u5361\u7247\u96B1\u85CF\u81F3\u4E0B\u4E00\u5929\uFF1F", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u53CD\u8F49\u5361\u7247\u7531\u540C\u4E00\u5361\u7247\u6587\u5B57\u7522\u751F\uFF0C\u4F8B\u5982\uFF1A\u586B\u7A7A\u514B\u6F0F\u5B57", + SHOW_CARD_CONTEXT: "\u5728\u5361\u7247\u4E2D\u986F\u793A\u4E0A\u4E0B\u6587\uFF1F", + SHOW_CARD_CONTEXT_DESC: "\u4F8B\u5982\uFF1A\u6A19\u984C > \u526F\u6A19\u984C > \u5C0F\u6A19\u984C > ... > \u5C0F\u6A19\u984C", + CARD_MODAL_HEIGHT_PERCENT: "\u5361\u7247\u9AD8\u5EA6\u767E\u5206\u6BD4", + CARD_MODAL_SIZE_PERCENT_DESC: "\u5728\u79FB\u52D5\u7AEF\u6216\u9700\u8981\u8F03\u5927\u5716\u7247\u6642\u61C9\u8A2D\u5B9A\u70BA100%", + RESET_DEFAULT: "\u91CD\u7F6E\u70BA\u9810\u8A2D\u503C", + CARD_MODAL_WIDTH_PERCENT: "\u5361\u7247\u5BEC\u5EA6\u767E\u5206\u6BD4", + RANDOMIZE_CARD_ORDER: "\u5FA9\u7FD2\u6642\u96A8\u6A5F\u986F\u793A\u5361\u7247\uFF1F", + REVIEW_CARD_ORDER_WITHIN_DECK: "\u5FA9\u7FD2\u6642\u724C\u7D44\u5167\u7684\u5361\u7247\u6392\u5E8F", + REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "\u724C\u7D44\u5167\u9806\u5E8F (\u5168\u90E8\u65B0\u5361\u7247\u512A\u5148)", + REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "\u724C\u7D44\u5167\u9806\u5E8F (\u5168\u90E8\u5230\u671F\u5361\u7247\u512A\u5148)", + REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "\u724C\u7D44\u5167\u4E82\u5E8F (\u5168\u90E8\u65B0\u5361\u7247\u512A\u5148)", + REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "\u724C\u7D44\u5167\u4E82\u5E8F (\u5168\u90E8\u5230\u671F\u5361\u7247\u512A\u5148)", + REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "\u724C\u7D44\u53CA\u5361\u7247\u90FD\u4E82\u5E8F", + REVIEW_DECK_ORDER: "\u5FA9\u7FD2\u6642\u724C\u7D44\u7684\u6392\u5E8F", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "\u9806\u5E8F (\u5728\u524D\u4E00\u724C\u7D44\u5167\u5361\u7247\u90FD\u5FA9\u7FD2\u5B8C\u5F8C)", + REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "\u4E82\u5E8F (\u5728\u524D\u4E00\u724C\u7D44\u5167\u5361\u7247\u90FD\u5FA9\u7FD2\u5B8C\u5F8C)", + REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "\u724C\u7D44\u53CA\u5361\u7247\u90FD\u4E82\u5E8F", + DISABLE_CLOZE_CARDS: "\u505C\u7528\u586B\u7A7A\u514B\u6F0F\u5B57\u5361\u7247\uFF1F", + CONVERT_HIGHLIGHTS_TO_CLOZES: "\u5C07 ==\u9AD8\u4EAE== \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F", + CONVERT_BOLD_TEXT_TO_CLOZES: "\u5C07 **\u7C97\u9AD4** \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u5C07 {{\u5927\u62EC\u865F}} \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F", + INLINE_CARDS_SEPARATOR: "\u55AE\u884C\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", + FIX_SEPARATORS_MANUALLY_WARNING: "\u6CE8\u610F\uFF1A\u66F4\u6539\u6B64\u9078\u9805\u5F8C\u4F60\u5C07\u9700\u8981\u81EA\u884C\u66F4\u6539\u5DF2\u5B58\u5728\u5361\u7247\u7684\u5206\u9694\u5B57\u5143\u3002", + INLINE_REVERSED_CARDS_SEPARATOR: "\u55AE\u884C\u53CD\u8F49\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", + MULTILINE_CARDS_SEPARATOR: "\u591A\u884C\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\u591A\u884C\u7FFB\u8F49\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", + NOTES: "\u7B46\u8A18", + REVIEW_PANE_ON_STARTUP: "\u555F\u52D5\u6642\u958B\u555F\u7B46\u8A18\u5FA9\u7FD2\u7A97\u683C", + TAGS_TO_REVIEW: "\u5FA9\u7FD2\u6A19\u7C64", + TAGS_TO_REVIEW_DESC: "\u8F38\u5165\u6A19\u7C64\uFF0C\u7528\u7A7A\u683C\u6216\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#review #tag2 #tag3.", + OPEN_RANDOM_NOTE: "\u5FA9\u7FD2\u96A8\u6A5F\u7B46\u8A18", + OPEN_RANDOM_NOTE_DESC: "\u95DC\u9589\u6B64\u9078\u9805\uFF0C\u7B46\u8A18\u5C07\u4EE5\u91CD\u8981\u5EA6(PageRank)\u6392\u5E8F\u3002", + AUTO_NEXT_NOTE: "\u5FA9\u7FD2\u5F8C\u81EA\u52D5\u6253\u958B\u4E0B\u4E00\u500B\u7B46\u8A18", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u95DC\u9589\u6A94\u6848\u9078\u55AE\u4E2D\u7684\u5FA9\u7FD2\u9078\u9805 \u4F8B\u5982\uFF1A\u5FA9\u7FD2\uFF1A\u7C21\u55AE \u8A18\u5F97 \u8F03\u96E3", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u95DC\u9589\u6A94\u6848\u9078\u55AE\u7684\u5FA9\u7FD2\u9078\u9805\uFF0C\u4F8B\u5982\uFF1A\u5FA9\u7FD2: \u7C21\u55AE \u8A18\u5F97 \u8F03\u96E3\u3002", + MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u908A\u9762\u677F\u986F\u793A\u7684\u6700\u5927\u5929\u6578", + MIN_ONE_DAY: "\u5929\u6578\u6700\u5C0F\u503C\u70BA1", + VALID_NUMBER_WARNING: "\u8ACB\u8F38\u5165\u6709\u6548\u7684\u6578\u5B57\u3002", + UI_PREFERENCES: "\u7528\u6236\u4ECB\u9762\u9996\u9078\u9805", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u724C\u7D44\u6A39\u6700\u521D\u61C9\u986F\u793A\u70BA\u5C55\u958B", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u95DC\u9589\u6B64\u9078\u9805\u53EF\u647A\u758A\u540C\u4E00\u5F35\u5361\u7247\u4E2D\u7684\u5DE2\u72C0\u724C\u7D44\u3002\u5982\u679C\u60A8\u7684\u5361\u7247\u5C6C\u65BC\u540C\u4E00\u6A94\u6848\u4E2D\u7684\u8A31\u591A\u5957\u724C\uFF0C\u5247\u5F88\u6709\u7528\u3002", + ALGORITHM: "\u6F14\u7B97\u6CD5", + CHECK_ALGORITHM_WIKI: '\u77AD\u89E3\u66F4\u591A, \u8ACB\u9EDE\u9078\u7B97\u6CD5\u5BE6\u73FE.', + BASE_EASE: "\u57FA\u790E\u638C\u63E1\u7A0B\u5EA6", + BASE_EASE_DESC: "\u6700\u5C0F\u503C130\uFF0C\u63A8\u85A6\u503C\u7D04250.", + BASE_EASE_MIN_WARNING: "\u57FA\u790E\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5C0F\u503C\u70BA130\u3002", + LAPSE_INTERVAL_CHANGE: "\u5C07\u5FA9\u7FD2\u6642\u6A19\u8A3B\u70BA\u300C\u8F03\u96E3\u300D\u7684\u5361\u7247\u6216\u7B46\u8A18\u5FA9\u7FD2\u9593\u9694\u7E2E\u77ED", + LAPSE_INTERVAL_CHANGE_DESC: "\u65B0\u5FA9\u7FD2\u9593\u9694 = \u539F\u5FA9\u7FD2\u9593\u9694 * \u9593\u9694\u6539\u8B8A\u4FC2\u6578 / 100.", + EASY_BONUS: "\u7C21\u55AE\u734E\u52F5", + EASY_BONUS_DESC: "\u7C21\u55AE\u734E\u52F5\u8A2D\u5B9A\u300C\u8A18\u5F97\u300D\u548C\u300C\u7C21\u55AE\u300D\u5361\u7247\u6216\u7B46\u8A18\u7684\u5FA9\u7FD2\u9593\u9694\u5DEE\u8DDD\uFF08\u6700\u5C0F\u503C100%\uFF09\u3002", + EASY_BONUS_MIN_WARNING: "\u7C21\u55AE\u734E\u52F5\u81F3\u5C11\u70BA100\u3002", + MAX_INTERVAL: "\u6700\u5927\u9593\u9694\uFF08\u5929\uFF09", + MAX_INTERVAL_DESC: "\u8A2D\u5B9A\u5FA9\u7FD2\u7684\u6700\u5927\u9593\u9694\u6642\u9593\uFF08\u9810\u8A2D\u503C100\u5E74\uFF09\u3002", + MAX_INTERVAL_MIN_WARNING: "\u6700\u5927\u9593\u9694\u81F3\u5C11\u70BA1\u5929", + MAX_LINK_CONTRIB: "\u6700\u5927\u93C8\u63A5\u8CA2\u737B", + MAX_LINK_CONTRIB_DESC: "\u93C8\u63A5\u7B46\u8A18\u7684\u52A0\u6B0A\u638C\u63E1\u7A0B\u5EA6\u5C0D\u539F\u59CB\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5927\u8CA2\u737B\u3002", + LOGGING: "\u8A18\u9304\u4E2D", + DISPLAY_DEBUG_INFO: "\u5728\u958B\u767C\u8005\u63A7\u5236\u53F0\u4E2D\u986F\u793A\u9664\u932F\u8CC7\u8A0A\uFF1F", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\u7B46\u8A18\u5FA9\u7FD2\u5E8F\u5217", + CLOSE: "\u81E8\u8FD1", + NEW: "\u65B0", + YESTERDAY: "\u6628\u5929", + TODAY: "\u4ECA\u5929", + TOMORROW: "\u660E\u5929", + // stats-modal.tsx + STATS_TITLE: "\u7D71\u8A08", + MONTH: "\u6708", + QUARTER: "\u5B63", + YEAR: "\u5E74", + LIFETIME: "\u5168\u90E8", + FORECAST: "\u9810\u6E2C", + FORECAST_DESC: "\u5C07\u8981\u5230\u671F\u7684\u5361\u7247\u6578\u91CF", + SCHEDULED: "\u5DF2\u6392\u7A0B", + DAYS: "\u5929", + NUMBER_OF_CARDS: "\u5361\u7247\u6578\u91CF", + REVIEWS_PER_DAY: "\u5E73\u5747: \u5FA9\u7FD2${avg} /\u5929", + INTERVALS: "\u9593\u9694", + INTERVALS_DESC: "\u5230\u4E0B\u4E00\u6B21\u5FA9\u7FD2\u7684\u6642\u9593\u9593\u9694", + COUNT: "\u8A08\u6578", + INTERVALS_SUMMARY: "\u5E73\u5747\u9593\u9694\u6642\u9593: ${avg}, \u6700\u9577\u9593\u9694\u6642\u9593: ${longest}", + EASES: "\u638C\u63E1\u7A0B\u5EA6", + EASES_SUMMARY: "\u5E73\u5747\u638C\u63E1\u7A0B\u5EA6: ${avgEase}", + CARD_TYPES: "\u5361\u7247\u578B\u5225", + CARD_TYPES_DESC: "\u5982\u6709\uFF0C\u5C07\u986F\u793A\u96B1\u85CF\u7684\u5361\u7247", + CARD_TYPE_NEW: "\u65B0", + CARD_TYPE_YOUNG: "\u8F03\u65B0", + CARD_TYPE_MATURE: "\u719F\u6089", + CARD_TYPES_SUMMARY: "\u7E3D\u5361\u7247\u6578: ${totalCardsCount}" +}; + +// src/lang/helpers.ts +var localeMap = { + af: af_default, + ar: ar_default, + bn: bn_default, + cs: cz_default, + da: da_default, + de: de_default, + en: en_default, + "en-gb": en_gb_default, + es: es_default, + fr: fr_default, + hi: hi_default, + id: id_default, + it: it_default, + ja: ja_default, + ko: ko_default, + mr: mr_default, + nl: nl_default, + nn: no_default, + pl: pl_default, + pt: pt_default, + "pt-br": pt_br_default, + ro: ro_default, + ru: ru_default, + ta: ta_default, + te: te_default, + th: th_default, + tr: tr_default, + uk: uk_default, + ur: ur_default, + vi: vi_default, + "zh-cn": zh_cn_default, + "zh-tw": zh_tw_default +}; +var locale = localeMap[import_obsidian.moment.locale()]; +function interpolate(str, params) { + const names2 = Object.keys(params); + const vals = Object.values(params); + return new Function(...names2, `return \`${str}\`;`)(...vals); +} +function t(str, params) { + if (!locale) { + console.error(`SRS error: Locale ${import_obsidian.moment.locale()} not found.`); + } + const result = locale && locale[str] || en_default[str]; + if (params) { + return interpolate(result, params); + } + return result; +} + +// src/settings.ts +var DEFAULT_SETTINGS = { + // flashcards + flashcardEasyText: t("EASY"), + flashcardGoodText: t("GOOD"), + flashcardHardText: t("HARD"), + flashcardTags: ["#flashcards"], + convertFoldersToDecks: false, + cardCommentOnSameLine: false, + burySiblingCards: false, + showContextInCards: true, + flashcardHeightPercentage: import_obsidian2.Platform.isMobile ? 100 : 80, + flashcardWidthPercentage: import_obsidian2.Platform.isMobile ? 100 : 40, + randomizeCardOrder: null, + flashcardCardOrder: "DueFirstRandom", + flashcardDeckOrder: "PrevDeckComplete_Sequential", + convertHighlightsToClozes: true, + convertBoldTextToClozes: false, + convertCurlyBracketsToClozes: false, + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + editLaterTag: "#edit-later", + // notes + enableNoteReviewPaneOnStartup: true, + tagsToReview: ["#review"], + noteFoldersToIgnore: [], + openRandomNote: false, + autoNextNote: false, + disableFileMenuReviewOptions: false, + maxNDaysNotesReviewQueue: 365, + // UI settings + initiallyExpandAllSubdecksInTree: false, + // algorithm + baseEase: 250, + lapsesIntervalChange: 0.5, + easyBonus: 1.3, + maximumInterval: 36525, + maxLinkFactor: 1, + // logging + showDebugMessages: false +}; +function upgradeSettings(settings) { + if (settings.randomizeCardOrder != null && settings.flashcardCardOrder == null && settings.flashcardDeckOrder == null) { + console.log(`loadPluginData: Upgrading settings: ${settings.randomizeCardOrder}`); + settings.flashcardCardOrder = settings.randomizeCardOrder ? "DueFirstRandom" : "DueFirstSequential"; + settings.flashcardDeckOrder = "PrevDeckComplete_Sequential"; + settings.randomizeCardOrder = null; + } +} +var SettingsUtil = class _SettingsUtil { + static isFlashcardTag(settings, tag) { + return _SettingsUtil.isTagInList(settings.flashcardTags, tag); + } + static isTagInList(tagList, tag) { + for (const tagFromList of tagList) { + if (tag === tagFromList || tag.startsWith(tagFromList + "/")) { + return true; + } + } + return false; + } +}; +var applyDebounceTimer = 0; +function applySettingsUpdate(callback2) { + clearTimeout(applyDebounceTimer); + applyDebounceTimer = window.setTimeout(callback2, 512); +} +var SRSettingTab = class extends import_obsidian2.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + const header = containerEl.createEl("h1", { text: `${t("SETTINGS_HEADER")}` }); + header.addClass("sr-centered"); + containerEl.createDiv().innerHTML = t("CHECK_WIKI", { + wiki_url: "https://www.stephenmwangi.com/obsidian-spaced-repetition/" + }); + new import_obsidian2.Setting(containerEl).setName(t("FOLDERS_TO_IGNORE")).setDesc(t("FOLDERS_TO_IGNORE_DESC")).addTextArea( + (text) => text.setValue(this.plugin.data.settings.noteFoldersToIgnore.join("\n")).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.noteFoldersToIgnore = value.split(/\n+/).map((v) => v.trim()).filter((v) => v); + await this.plugin.savePluginData(); + }); + }) + ); + containerEl.createEl("h3", { text: `${t("FLASHCARDS")}` }); + new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_TAGS")).setDesc(t("FLASHCARD_TAGS_DESC")).addTextArea( + (text) => text.setValue(this.plugin.data.settings.flashcardTags.join(" ")).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.flashcardTags = value.split(/\s+/); + await this.plugin.savePluginData(); + }); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("CONVERT_FOLDERS_TO_DECKS")).setDesc(t("CONVERT_FOLDERS_TO_DECKS_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.convertFoldersToDecks).onChange(async (value) => { + this.plugin.data.settings.convertFoldersToDecks = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("INLINE_SCHEDULING_COMMENTS")).setDesc(t("INLINE_SCHEDULING_COMMENTS_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.cardCommentOnSameLine).onChange(async (value) => { + this.plugin.data.settings.cardCommentOnSameLine = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("BURY_SIBLINGS_TILL_NEXT_DAY")).setDesc(t("BURY_SIBLINGS_TILL_NEXT_DAY_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.burySiblingCards).onChange(async (value) => { + this.plugin.data.settings.burySiblingCards = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("SHOW_CARD_CONTEXT")).setDesc(t("SHOW_CARD_CONTEXT_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.showContextInCards).onChange(async (value) => { + this.plugin.data.settings.showContextInCards = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("CARD_MODAL_HEIGHT_PERCENT")).setDesc(t("CARD_MODAL_SIZE_PERCENT_DESC")).addSlider( + (slider) => slider.setLimits(10, 100, 5).setValue(this.plugin.data.settings.flashcardHeightPercentage).setDynamicTooltip().onChange(async (value) => { + this.plugin.data.settings.flashcardHeightPercentage = value; + await this.plugin.savePluginData(); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.flashcardHeightPercentage = DEFAULT_SETTINGS.flashcardHeightPercentage; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("CARD_MODAL_WIDTH_PERCENT")).setDesc(t("CARD_MODAL_SIZE_PERCENT_DESC")).addSlider( + (slider) => slider.setLimits(10, 100, 5).setValue(this.plugin.data.settings.flashcardWidthPercentage).setDynamicTooltip().onChange(async (value) => { + this.plugin.data.settings.flashcardWidthPercentage = value; + await this.plugin.savePluginData(); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.flashcardWidthPercentage = DEFAULT_SETTINGS.flashcardWidthPercentage; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(this.containerEl).setName(t("REVIEW_CARD_ORDER_WITHIN_DECK")).addDropdown( + (dropdown) => dropdown.addOptions({ + NewFirstSequential: t("REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL"), + DueFirstSequential: t("REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL"), + NewFirstRandom: t("REVIEW_CARD_ORDER_NEW_FIRST_RANDOM"), + DueFirstRandom: t("REVIEW_CARD_ORDER_DUE_FIRST_RANDOM"), + EveryCardRandomDeckAndCard: t("REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD") + }).setValue(this.plugin.data.settings.flashcardCardOrder).onChange(async (value) => { + this.plugin.data.settings.flashcardCardOrder = value; + await this.plugin.savePluginData(); + this.display(); + }) + ); + const deckOrderEnabled = this.plugin.data.settings.flashcardCardOrder != "EveryCardRandomDeckAndCard"; + new import_obsidian2.Setting(this.containerEl).setName(t("REVIEW_DECK_ORDER")).addDropdown( + (dropdown) => dropdown.addOptions( + deckOrderEnabled ? { + PrevDeckComplete_Sequential: t( + "REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL" + ), + PrevDeckComplete_Random: t( + "REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM" + ) + } : { + EveryCardRandomDeckAndCard: t( + "REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD" + ) + } + ).setValue( + deckOrderEnabled ? this.plugin.data.settings.flashcardDeckOrder : "EveryCardRandomDeckAndCard" + ).setDisabled(!deckOrderEnabled).onChange(async (value) => { + this.plugin.data.settings.flashcardDeckOrder = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("CONVERT_HIGHLIGHTS_TO_CLOZES")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.convertHighlightsToClozes).onChange(async (value) => { + this.plugin.data.settings.convertHighlightsToClozes = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("CONVERT_BOLD_TEXT_TO_CLOZES")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.convertBoldTextToClozes).onChange(async (value) => { + this.plugin.data.settings.convertBoldTextToClozes = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("CONVERT_CURLY_BRACKETS_TO_CLOZES")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.convertCurlyBracketsToClozes).onChange(async (value) => { + this.plugin.data.settings.convertCurlyBracketsToClozes = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("INLINE_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( + (text) => text.setValue(this.plugin.data.settings.singleLineCardSeparator).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.singleLineCardSeparator = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.singleLineCardSeparator = DEFAULT_SETTINGS.singleLineCardSeparator; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("INLINE_REVERSED_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( + (text) => text.setValue(this.plugin.data.settings.singleLineReversedCardSeparator).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.singleLineReversedCardSeparator = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.singleLineReversedCardSeparator = DEFAULT_SETTINGS.singleLineReversedCardSeparator; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("MULTILINE_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( + (text) => text.setValue(this.plugin.data.settings.multilineCardSeparator).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.multilineCardSeparator = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.multilineCardSeparator = DEFAULT_SETTINGS.multilineCardSeparator; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("MULTILINE_REVERSED_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( + (text) => text.setValue(this.plugin.data.settings.multilineReversedCardSeparator).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.multilineReversedCardSeparator = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.multilineReversedCardSeparator = DEFAULT_SETTINGS.multilineReversedCardSeparator; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_EASY_LABEL")).setDesc(t("FLASHCARD_EASY_DESC")).addText( + (text) => text.setValue(this.plugin.data.settings.flashcardEasyText).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.flashcardEasyText = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.flashcardEasyText = DEFAULT_SETTINGS.flashcardEasyText; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_GOOD_LABEL")).setDesc(t("FLASHCARD_GOOD_DESC")).addText( + (text) => text.setValue(this.plugin.data.settings.flashcardGoodText).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.flashcardGoodText = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.flashcardGoodText = DEFAULT_SETTINGS.flashcardGoodText; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_HARD_LABEL")).setDesc(t("FLASHCARD_HARD_DESC")).addText( + (text) => text.setValue(this.plugin.data.settings.flashcardHardText).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.flashcardHardText = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.flashcardHardText = DEFAULT_SETTINGS.flashcardHardText; + await this.plugin.savePluginData(); + this.display(); + }); + }); + containerEl.createEl("h3", { text: `${t("NOTES")}` }); + new import_obsidian2.Setting(containerEl).setName(t("REVIEW_PANE_ON_STARTUP")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.enableNoteReviewPaneOnStartup).onChange(async (value) => { + this.plugin.data.settings.enableNoteReviewPaneOnStartup = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("TAGS_TO_REVIEW")).setDesc(t("TAGS_TO_REVIEW_DESC")).addTextArea( + (text) => text.setValue(this.plugin.data.settings.tagsToReview.join(" ")).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.tagsToReview = value.split(/\s+/); + await this.plugin.savePluginData(); + }); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("OPEN_RANDOM_NOTE")).setDesc(t("OPEN_RANDOM_NOTE_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.openRandomNote).onChange(async (value) => { + this.plugin.data.settings.openRandomNote = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("AUTO_NEXT_NOTE")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.autoNextNote).onChange(async (value) => { + this.plugin.data.settings.autoNextNote = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("DISABLE_FILE_MENU_REVIEW_OPTIONS")).setDesc(t("DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.disableFileMenuReviewOptions).onChange(async (value) => { + this.plugin.data.settings.disableFileMenuReviewOptions = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("MAX_N_DAYS_REVIEW_QUEUE")).addText( + (text) => text.setValue(this.plugin.data.settings.maxNDaysNotesReviewQueue.toString()).onChange((value) => { + applySettingsUpdate(async () => { + const numValue = Number.parseInt(value); + if (!isNaN(numValue)) { + if (numValue < 1) { + new import_obsidian2.Notice(t("MIN_ONE_DAY")); + text.setValue( + this.plugin.data.settings.maxNDaysNotesReviewQueue.toString() + ); + return; + } + this.plugin.data.settings.maxNDaysNotesReviewQueue = numValue; + await this.plugin.savePluginData(); + } else { + new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); + } + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.maxNDaysNotesReviewQueue = DEFAULT_SETTINGS.maxNDaysNotesReviewQueue; + await this.plugin.savePluginData(); + this.display(); + }); + }); + containerEl.createEl("h3", { text: `${t("UI_PREFERENCES")}` }); + new import_obsidian2.Setting(containerEl).setName(t("INITIALLY_EXPAND_SUBDECKS_IN_TREE")).setDesc(t("INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.initiallyExpandAllSubdecksInTree).onChange(async (value) => { + this.plugin.data.settings.initiallyExpandAllSubdecksInTree = value; + await this.plugin.savePluginData(); + }) + ); + containerEl.createEl("h3", { text: `${t("ALGORITHM")}` }); + containerEl.createDiv().innerHTML = t("CHECK_ALGORITHM_WIKI", { + algo_url: "https://www.stephenmwangi.com/obsidian-spaced-repetition/algorithms/" + }); + new import_obsidian2.Setting(containerEl).setName(t("BASE_EASE")).setDesc(t("BASE_EASE_DESC")).addText( + (text) => text.setValue(this.plugin.data.settings.baseEase.toString()).onChange((value) => { + applySettingsUpdate(async () => { + const numValue = Number.parseInt(value); + if (!isNaN(numValue)) { + if (numValue < 130) { + new import_obsidian2.Notice(t("BASE_EASE_MIN_WARNING")); + text.setValue(this.plugin.data.settings.baseEase.toString()); + return; + } + this.plugin.data.settings.baseEase = numValue; + await this.plugin.savePluginData(); + } else { + new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); + } + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.baseEase = DEFAULT_SETTINGS.baseEase; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("LAPSE_INTERVAL_CHANGE")).setDesc(t("LAPSE_INTERVAL_CHANGE_DESC")).addSlider( + (slider) => slider.setLimits(1, 99, 1).setValue(this.plugin.data.settings.lapsesIntervalChange * 100).setDynamicTooltip().onChange(async (value) => { + this.plugin.data.settings.lapsesIntervalChange = value / 100; + await this.plugin.savePluginData(); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.lapsesIntervalChange = DEFAULT_SETTINGS.lapsesIntervalChange; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("EASY_BONUS")).setDesc(t("EASY_BONUS_DESC")).addText( + (text) => text.setValue((this.plugin.data.settings.easyBonus * 100).toString()).onChange((value) => { + applySettingsUpdate(async () => { + const numValue = Number.parseInt(value) / 100; + if (!isNaN(numValue)) { + if (numValue < 1) { + new import_obsidian2.Notice(t("EASY_BONUS_MIN_WARNING")); + text.setValue( + (this.plugin.data.settings.easyBonus * 100).toString() + ); + return; + } + this.plugin.data.settings.easyBonus = numValue; + await this.plugin.savePluginData(); + } else { + new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); + } + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.easyBonus = DEFAULT_SETTINGS.easyBonus; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("MAX_INTERVAL")).setDesc(t("MAX_INTERVAL_DESC")).addText( + (text) => text.setValue(this.plugin.data.settings.maximumInterval.toString()).onChange((value) => { + applySettingsUpdate(async () => { + const numValue = Number.parseInt(value); + if (!isNaN(numValue)) { + if (numValue < 1) { + new import_obsidian2.Notice(t("MAX_INTERVAL_MIN_WARNING")); + text.setValue( + this.plugin.data.settings.maximumInterval.toString() + ); + return; + } + this.plugin.data.settings.maximumInterval = numValue; + await this.plugin.savePluginData(); + } else { + new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); + } + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.maximumInterval = DEFAULT_SETTINGS.maximumInterval; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("MAX_LINK_CONTRIB")).setDesc(t("MAX_LINK_CONTRIB_DESC")).addSlider( + (slider) => slider.setLimits(0, 100, 1).setValue(this.plugin.data.settings.maxLinkFactor * 100).setDynamicTooltip().onChange(async (value) => { + this.plugin.data.settings.maxLinkFactor = value / 100; + await this.plugin.savePluginData(); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.maxLinkFactor = DEFAULT_SETTINGS.maxLinkFactor; + await this.plugin.savePluginData(); + this.display(); + }); + }); + containerEl.createEl("h3", { text: `${t("LOGGING")}` }); + new import_obsidian2.Setting(containerEl).setName(t("DISPLAY_DEBUG_INFO")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.showDebugMessages).onChange(async (value) => { + this.plugin.data.settings.showDebugMessages = value; + await this.plugin.savePluginData(); + }) + ); + } +}; + +// src/gui/FlashcardModal.tsx +var import_obsidian6 = require("obsidian"); + +// src/gui/EditModal.tsx +var import_obsidian3 = require("obsidian"); +var FlashcardEditModal = class _FlashcardEditModal extends import_obsidian3.Modal { + constructor(app, existingText) { + super(app); + this.didSaveChanges = false; + // -> Functions & helpers + this.saveClickCallback = (_) => this.save(); + this.cancelClickCallback = (_) => this.cancel(); + this.saveOnEnterCallback = (evt) => { + if ((evt.ctrlKey || evt.metaKey) && evt.key === "Enter") { + evt.preventDefault(); + this.save(); + } + }; + this.modalText = existingText; + this.changedText = existingText; + this.waitForClose = new Promise((resolve2, reject) => { + this.resolvePromise = resolve2; + this.rejectPromise = reject; + }); + this.modalEl.addClasses(["sr-modal", "sr-edit-modal"]); + this.init(); + this.open(); + } + static Prompt(app, placeholder) { + const newPromptModal = new _FlashcardEditModal(app, placeholder); + return newPromptModal.waitForClose; + } + /** + * Initializes all components of the EditModal + */ + init() { + var _a; + this.contentEl.empty(); + this.contentEl.addClass("sr-edit-view"); + this.title = this.contentEl.createDiv(); + this.title.setText(t("EDIT_CARD")); + this.title.addClass("sr-title"); + this.textArea = this.contentEl.createEl("textarea"); + this.textArea.addClass("sr-input"); + this.textArea.setText((_a = this.modalText) != null ? _a : ""); + this.textArea.addEventListener("keydown", this.saveOnEnterCallback); + this._createResponse(this.contentEl); + } + /** + * Opens the EditModal + */ + onOpen() { + super.onOpen(); + this.textArea.focus(); + } + /** + * Closes the EditModal + */ + onClose() { + super.onClose(); + this.resolveInput(); + this.removeInputListener(); + } + save() { + this.didSaveChanges = true; + this.changedText = this.textArea.value; + this.close(); + } + cancel() { + this.close(); + } + resolveInput() { + if (!this.didSaveChanges) + this.rejectPromise(t("NO_INPUT")); + else + this.resolvePromise(this.changedText); + } + removeInputListener() { + this.textArea.removeEventListener("keydown", this.saveOnEnterCallback); + } + // -> Response section + _createResponseButton(container, text, colorClass, callback2) { + const button = container.createEl("button"); + button.addClasses(["sr-response-button", colorClass]); + button.setText(text); + button.addEventListener("click", callback2); + } + _createResponse(mainContentContainer) { + const response = mainContentContainer.createDiv(); + response.addClass("sr-response"); + this._createResponseButton(response, t("CANCEL"), "sr-bg-red", this.cancelClickCallback); + this._createResponseButton(response, "", "sr-spacer", () => { + }); + this._createResponseButton(response, t("SAVE"), "sr-bg-green", this.saveClickCallback); + } +}; + +// src/gui/DeckListView.tsx +var import_vhtml = __toESM(require_vhtml()); + +// src/constants.ts +var SCHEDULING_INFO_REGEX = /^---\r?\n((?:.*\r?\n)*)sr-due: (.+)\r?\nsr-interval: (\d+)\r?\nsr-ease: (\d+)\r?\n((?:.*\r?\n)?)---/; +var YAML_FRONT_MATTER_REGEX = /^---\r?\n((?:.*\r?\n)*?)---/; +var NON_LETTER_SYMBOLS_REGEX = /[!-/:-@[-`{-~}\s]/g; +var MULTI_SCHEDULING_EXTRACTOR = /!([\d-]+),(\d+),(\d+)/gm; +var LEGACY_SCHEDULING_EXTRACTOR = //gm; +var OBSIDIAN_TAG_AT_STARTOFLINE_REGEX = /^#[^\s#]+/gi; +var OBSIDIAN_BLOCK_ID_ENDOFLINE_REGEX = / (\^[a-zA-Z0-9-]+)$/; +var PREFERRED_DATE_FORMAT = "YYYY-MM-DD"; +var ALLOWED_DATE_FORMATS = [PREFERRED_DATE_FORMAT, "DD-MM-YYYY", "ddd MMM DD YYYY"]; +var IMAGE_FORMATS = [ + "jpg", + "jpeg", + "gif", + "png", + "svg", + "webp", + "apng", + "avif", + "jfif", + "pjpeg", + "pjp", + "bmp" +]; +var AUDIO_FORMATS = ["mp3", "webm", "m4a", "wav", "ogg"]; +var VIDEO_FORMATS = ["mp4", "mkv", "avi", "mov"]; +var COLLAPSE_ICON = ''; +var TICKS_PER_DAY = 24 * 3600 * 1e3; +var SR_HTML_COMMENT_BEGIN = ""; + +// src/TopicPath.ts +var TopicPath = class _TopicPath { + constructor(path) { + if (path == null) + throw "null path"; + if (path.some((str) => str.includes("/"))) + throw "path entries must not contain '/'"; + this.path = path; + } + get hasPath() { + return this.path.length > 0; + } + get isEmptyPath() { + return !this.hasPath; + } + static get emptyPath() { + return new _TopicPath([]); + } + shift() { + if (this.isEmptyPath) + throw "can't shift an empty path"; + return this.path.shift(); + } + clone() { + return new _TopicPath([...this.path]); + } + formatAsTag() { + if (this.isEmptyPath) + throw "Empty path"; + const result = "#" + this.path.join("/"); + return result; + } + isSameOrAncestorOf(topicPath) { + if (this.isEmptyPath) + return topicPath.isEmptyPath; + if (this.path.length > topicPath.path.length) + return false; + for (let i = 0; i < this.path.length; i++) { + if (this.path[i] != topicPath.path[i]) + return false; + } + return true; + } + static getTopicPathFromCardText(cardText) { + var _a; + const path = (_a = cardText.trimStart().match(OBSIDIAN_TAG_AT_STARTOFLINE_REGEX)) == null ? void 0 : _a.slice(-1)[0]; + return (path == null ? void 0 : path.length) > 0 ? _TopicPath.getTopicPathFromTag(path) : null; + } + static isValidTag(tag) { + if (tag == null || tag.length == 0) + return false; + if (tag[0] != "#") + return false; + if (tag.length == 1) + return false; + return true; + } + static getTopicPathFromTag(tag) { + if (tag == null || tag.length == 0) + throw "Null/empty tag"; + if (tag[0] != "#") + throw "Tag must start with #"; + if (tag.length == 1) + throw "Invalid tag"; + const path = tag.replace("#", "").split("/").filter((str) => str); + return new _TopicPath(path); + } + static getFolderPathFromFilename(noteFile, settings) { + let result = _TopicPath.emptyPath; + if (settings.convertFoldersToDecks) { + const deckPath = noteFile.path.split("/"); + deckPath.pop(); + if (deckPath.length != 0) { + result = new _TopicPath(deckPath); + } + } + return result; + } +}; +var TopicPathList = class _TopicPathList { + constructor(list, lineNum = null) { + if (list == null) + throw "TopicPathList null"; + this.list = list; + this.lineNum = lineNum; + } + get length() { + return this.list.length; + } + isAnyElementSameOrAncestorOf(topicPath) { + return this.list.some((item) => item.isSameOrAncestorOf(topicPath)); + } + formatPsv() { + return this.format("|"); + } + format(sep) { + return this.list.map((topicPath) => topicPath.formatAsTag()).join(sep); + } + static empty() { + return new _TopicPathList([]); + } + static fromPsv(str, lineNum) { + const result = _TopicPathList.convertTagListToTopicPathList(str.split("|")); + result.lineNum = lineNum; + return result; + } + // + // tagList is a list of tags such as: + // ["#flashcards/computing", "#boring-stuff", "#news-worthy"] + // validTopicPathList is a list of valid tags, such as those from settings.flashcardTags,E.g. + // ["#flashcards"] + // + // This returns a filtered version of tagList, containing only topic paths that are considered valid. + // Validity is defined as "isAnyElementSameOrAncestorOf", and "#flashcards" is considered the ancestor of + // "#flashcards/computing". + // + // Therefore this would return: + // "#flashcards/computing" (but not "#boring-stuff" or "#news-worthy") + // + static filterValidTopicPathsFromTagList(list, validTopicPathList, lineNum = null) { + const result = []; + for (const tag of list.list) { + if (validTopicPathList.isAnyElementSameOrAncestorOf(tag)) + result.push(tag); + } + return new _TopicPathList(result, lineNum); + } + static convertTagListToTopicPathList(tagList) { + const result = []; + for (const tag of tagList) { + if (TopicPath.isValidTag(tag)) + result.push(TopicPath.getTopicPathFromTag(tag)); + } + return new _TopicPathList(result); + } +}; +var TopicPathWithWs = class { + constructor(topicPath, preWhitespace, postWhitespace) { + if (!topicPath || topicPath.isEmptyPath) + throw "topicPath null"; + this.topicPath = topicPath; + this.preWhitespace = preWhitespace; + this.postWhitespace = postWhitespace; + } + formatWithWs() { + return `${this.preWhitespace}${this.topicPath.formatAsTag()}${this.postWhitespace}`; + } +}; + +// src/gui/DeckListView.tsx +var DeckListView = class { + constructor(plugin, settings, reviewSequencer, contentEl, startReviewOfDeck) { + this.plugin = plugin; + this.settings = settings; + this.reviewSequencer = reviewSequencer; + this.modalContentEl = contentEl; + this.startReviewOfDeck = startReviewOfDeck; + this.init(); + } + /** + * Initializes all static elements in the DeckListView + */ + init() { + this.view = this.modalContentEl.createDiv(); + this.view.addClasses(["sr-deck-list", "sr-is-hidden"]); + this.header = this.view.createDiv(); + this.header.addClass("sr-header"); + this.title = this.header.createDiv(); + this.title.addClass("sr-title"); + this.title.setText(t("DECKS")); + this.stats = this.header.createDiv(); + this.stats.addClass("sr-header-stats-container"); + this._createHeaderStats(); + this.content = this.view.createDiv(); + this.content.addClass("sr-content"); + } + /** + * Shows the DeckListView & rerenders dynamic elements + */ + show() { + this.mode = 0 /* DecksList */; + this._createHeaderStats(); + this.content.empty(); + for (const deck of this.reviewSequencer.originalDeckTree.subdecks) { + this._createTree(deck, this.content); + } + if (this.view.hasClass("sr-is-hidden")) { + this.view.removeClass("sr-is-hidden"); + } + } + /** + * Hides the DeckListView + */ + hide() { + if (!this.view.hasClass("sr-is-hidden")) { + this.view.addClass("sr-is-hidden"); + } + } + /** + * Closes the DeckListView + */ + close() { + this.hide(); + } + // -> Header + _createHeaderStats() { + const statistics = this.reviewSequencer.getDeckStats(TopicPath.emptyPath); + this.stats.empty(); + this._createHeaderStatsContainer(t("DUE_CARDS"), statistics.dueCount, "sr-bg-green"); + this._createHeaderStatsContainer(t("NEW_CARDS"), statistics.newCount, "sr-bg-blue"); + this._createHeaderStatsContainer(t("TOTAL_CARDS"), statistics.totalCount, "sr-bg-red"); + } + _createHeaderStatsContainer(statsLable, statsNumber, statsClass) { + const statsContainer = this.stats.createDiv(); + statsContainer.ariaLabel = statsLable; + statsContainer.addClasses([ + "tag-pane-tag-count", + "tree-item-flair", + "sr-header-stats-count", + statsClass + ]); + const lable = statsContainer.createDiv(); + lable.setText(statsLable + ":"); + const number = statsContainer.createDiv(); + number.setText(statsNumber.toString()); + } + // -> Tree content + _createTree(deck, container) { + const deckTree = container.createDiv("tree-item sr-tree-item-container"); + const deckTreeSelf = deckTree.createDiv( + "tree-item-self tag-pane-tag is-clickable sr-tree-item-row" + ); + const shouldBeInitiallyExpanded = this.settings.initiallyExpandAllSubdecksInTree; + let collapsed = !shouldBeInitiallyExpanded; + let collapseIconEl = null; + if (deck.subdecks.length > 0) { + collapseIconEl = deckTreeSelf.createDiv("tree-item-icon collapse-icon"); + collapseIconEl.innerHTML = COLLAPSE_ICON; + collapseIconEl.childNodes[0].style.transform = collapsed ? "rotate(-90deg)" : ""; + } + const deckTreeInner = deckTreeSelf.createDiv("tree-item-inner"); + const deckTreeInnerText = deckTreeInner.createDiv("tag-pane-tag-text"); + deckTreeInnerText.innerHTML += /* @__PURE__ */ (0, import_vhtml.default)("span", { class: "tag-pane-tag-self" }, deck.deckName); + const deckTreeOuter = deckTreeSelf.createDiv(); + deckTreeOuter.addClasses(["tree-item-flair-outer", "sr-tree-stats-container"]); + const deckStats = this.reviewSequencer.getDeckStats(deck.getTopicPath()); + this._createStats(deckStats, deckTreeOuter); + const deckTreeChildren = deckTree.createDiv("tree-item-children"); + deckTreeChildren.style.display = collapsed ? "none" : "block"; + if (deck.subdecks.length > 0) { + collapseIconEl.addEventListener("click", (e) => { + if (collapsed) { + collapseIconEl.childNodes[0].style.transform = ""; + deckTreeChildren.style.display = "block"; + } else { + collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)"; + deckTreeChildren.style.display = "none"; + } + e.stopPropagation(); + collapsed = !collapsed; + }); + } + deckTreeSelf.addEventListener("click", () => { + this.startReviewOfDeck(deck); + }); + for (const subdeck of deck.subdecks) { + this._createTree(subdeck, deckTreeChildren); + } + } + _createStats(statistics, statsWrapper) { + statsWrapper.empty(); + this._createStatsContainer( + t("DUE_CARDS"), + statistics.dueCount, + "sr-bg-green", + statsWrapper + ); + this._createStatsContainer(t("NEW_CARDS"), statistics.newCount, "sr-bg-blue", statsWrapper); + this._createStatsContainer( + t("TOTAL_CARDS"), + statistics.totalCount, + "sr-bg-red", + statsWrapper + ); + } + _createStatsContainer(statsLable, statsNumber, statsClass, statsWrapper) { + const statsContainer = statsWrapper.createDiv(); + statsContainer.ariaLabel = statsLable; + statsContainer.addClasses([ + "tag-pane-tag-count", + "tree-item-flair", + "sr-tree-stats-count", + statsClass + ]); + statsContainer.setText(statsNumber.toString()); + } +}; + +// src/gui/FlashcardReviewView.tsx +var import_obsidian5 = require("obsidian"); + +// src/scheduling.ts +function schedule(response, interval, ease, delayBeforeReview, settingsObj, dueDates) { + delayBeforeReview = Math.max(0, Math.floor(delayBeforeReview / (24 * 3600 * 1e3))); + if (response === 0 /* Easy */) { + ease += 20; + interval = (interval + delayBeforeReview) * ease / 100; + interval *= settingsObj.easyBonus; + } else if (response === 1 /* Good */) { + interval = (interval + delayBeforeReview / 2) * ease / 100; + } else if (response === 2 /* Hard */) { + ease = Math.max(130, ease - 20); + interval = Math.max( + 1, + (interval + delayBeforeReview / 4) * settingsObj.lapsesIntervalChange + ); + } + if (dueDates !== void 0) { + interval = Math.round(interval); + if (!Object.prototype.hasOwnProperty.call(dueDates, interval)) { + dueDates[interval] = 0; + } else { + if (interval > 4) { + let fuzz = 0; + if (interval < 7) + fuzz = 1; + else if (interval < 30) + fuzz = Math.max(2, Math.floor(interval * 0.15)); + else + fuzz = Math.max(4, Math.floor(interval * 0.05)); + const originalInterval = interval; + outer: + for (let i = 1; i <= fuzz; i++) { + for (const ivl of [originalInterval - i, originalInterval + i]) { + if (!Object.prototype.hasOwnProperty.call(dueDates, ivl)) { + dueDates[ivl] = 0; + interval = ivl; + break outer; + } + if (dueDates[ivl] < dueDates[interval]) + interval = ivl; + } + } + } + } + dueDates[interval]++; + } + interval = Math.min(interval, settingsObj.maximumInterval); + return { interval: Math.round(interval * 10) / 10, ease }; +} +function textInterval(interval, isMobile) { + if (interval === void 0) { + return t("NEW"); + } + const m = Math.round(interval / 3.04375) / 10, y = Math.round(interval / 36.525) / 10; + if (isMobile) { + if (m < 1) + return t("DAYS_STR_IVL_MOBILE", { interval }); + else if (y < 1) + return t("MONTHS_STR_IVL_MOBILE", { interval: m }); + else + return t("YEARS_STR_IVL_MOBILE", { interval: y }); + } else { + if (m < 1) + return t("DAYS_STR_IVL", { interval }); + else if (y < 1) + return t("MONTHS_STR_IVL", { interval: m }); + else + return t("YEARS_STR_IVL", { interval: y }); + } +} + +// src/FlashcardReviewSequencer.ts +var DeckStats = class { + constructor(dueCount, newCount, totalCount) { + this.dueCount = dueCount; + this.newCount = newCount; + this.totalCount = totalCount; + } +}; +var FlashcardReviewSequencer = class { + constructor(reviewMode, cardSequencer, settings, cardScheduleCalculator, questionPostponementList) { + this.reviewMode = reviewMode; + this.cardSequencer = cardSequencer; + this.settings = settings; + this.cardScheduleCalculator = cardScheduleCalculator; + this.questionPostponementList = questionPostponementList; + } + get hasCurrentCard() { + return this.cardSequencer.currentCard != null; + } + get currentCard() { + return this.cardSequencer.currentCard; + } + get currentQuestion() { + var _a; + return (_a = this.currentCard) == null ? void 0 : _a.question; + } + get currentDeck() { + return this.cardSequencer.currentDeck; + } + get currentNote() { + return this.currentQuestion.note; + } + // originalDeckTree isn't modified by the review process + // Only remainingDeckTree + setDeckTree(originalDeckTree, remainingDeckTree) { + this.cardSequencer.setBaseDeck(remainingDeckTree); + this._originalDeckTree = originalDeckTree; + this.remainingDeckTree = remainingDeckTree; + this.setCurrentDeck(TopicPath.emptyPath); + } + setCurrentDeck(topicPath) { + this.cardSequencer.setIteratorTopicPath(topicPath); + this.cardSequencer.nextCard(); + } + get originalDeckTree() { + return this._originalDeckTree; + } + getDeckStats(topicPath) { + const totalCount = this._originalDeckTree.getDeck(topicPath).getDistinctCardCount(2 /* All */, true); + const remainingDeck = this.remainingDeckTree.getDeck(topicPath); + const newCount = remainingDeck.getDistinctCardCount(0 /* NewCard */, true); + const dueCount = remainingDeck.getDistinctCardCount(1 /* DueCard */, true); + return new DeckStats(dueCount, newCount, totalCount); + } + skipCurrentCard() { + this.cardSequencer.deleteCurrentQuestionFromAllDecks(); + } + deleteCurrentCard() { + this.cardSequencer.deleteCurrentCardFromAllDecks(); + } + async processReview(response) { + switch (this.reviewMode) { + case 1 /* Review */: + await this.processReview_ReviewMode(response); + break; + case 0 /* Cram */: + await this.processReview_CramMode(response); + break; + } + } + async processReview_ReviewMode(response) { + if (response != 3 /* Reset */ || this.currentCard.hasSchedule) { + this.currentCard.scheduleInfo = this.determineCardSchedule(response, this.currentCard); + await this.currentQuestion.writeQuestion(this.settings); + } + if (response == 3 /* Reset */) { + this.cardSequencer.moveCurrentCardToEndOfList(); + this.cardSequencer.nextCard(); + } else { + if (this.settings.burySiblingCards) { + await this.burySiblingCards(); + this.cardSequencer.deleteCurrentQuestionFromAllDecks(); + } else { + this.deleteCurrentCard(); + } + } + } + async burySiblingCards() { + const remaining = this.currentDeck.getQuestionCardCount(this.currentQuestion); + if (remaining > 1) { + this.questionPostponementList.add(this.currentQuestion); + await this.questionPostponementList.write(); + } + } + async processReview_CramMode(response) { + if (response == 0 /* Easy */) + this.deleteCurrentCard(); + else { + this.cardSequencer.moveCurrentCardToEndOfList(); + this.cardSequencer.nextCard(); + } + } + determineCardSchedule(response, card) { + let result; + if (response == 3 /* Reset */) { + result = this.cardScheduleCalculator.getResetCardSchedule(); + } else { + if (card.hasSchedule) { + result = this.cardScheduleCalculator.calcUpdatedSchedule( + response, + card.scheduleInfo + ); + } else { + const currentNote = card.question.note; + result = this.cardScheduleCalculator.getNewCardSchedule( + response, + currentNote.filePath + ); + } + } + return result; + } + async updateCurrentQuestionText(text) { + const q = this.currentQuestion.questionText; + q.actualQuestion = text; + await this.currentQuestion.writeQuestion(this.settings); + } +}; + +// src/Deck.ts +var Deck2 = class _Deck { + constructor(deckName, parent) { + this.deckName = deckName; + this.newFlashcards = []; + this.dueFlashcards = []; + this.subdecks = []; + this.parent = parent; + } + getCardCount(cardListType, includeSubdeckCounts) { + let result = 0; + if (cardListType == 0 /* NewCard */ || cardListType == 2 /* All */) + result += this.newFlashcards.length; + if (cardListType == 1 /* DueCard */ || cardListType == 2 /* All */) + result += this.dueFlashcards.length; + if (includeSubdeckCounts) { + for (const deck of this.subdecks) { + result += deck.getCardCount(cardListType, includeSubdeckCounts); + } + } + return result; + } + getDistinctCardCount(cardListType, includeSubdeckCounts) { + const cardList = this.getFlattenedCardArray(cardListType, includeSubdeckCounts); + const distinctCardSet = new Set(cardList); + return distinctCardSet.size; + } + getFlattenedCardArray(cardListType, includeSubdeckCounts) { + let result = []; + switch (cardListType) { + case 0 /* NewCard */: + result = this.newFlashcards; + break; + case 1 /* DueCard */: + result = this.dueFlashcards; + break; + case 2 /* All */: + result = this.newFlashcards.concat(this.dueFlashcards); + } + if (includeSubdeckCounts) { + for (const subdeck of this.subdecks) { + result = result.concat( + subdeck.getFlattenedCardArray(cardListType, includeSubdeckCounts) + ); + } + } + return result; + } + // + // Returns a count of the number of this question's cards are present in this deck. + // (The returned value would be <= question.cards.length) + // + getQuestionCardCount(question) { + let result = 0; + result += this.getQuestionCardCountForCardListType(question, this.newFlashcards); + result += this.getQuestionCardCountForCardListType(question, this.dueFlashcards); + return result; + } + getQuestionCardCountForCardListType(question, cards) { + let result = 0; + for (let i = 0; i < cards.length; i++) { + if (Object.is(question, cards[i].question)) + result++; + } + return result; + } + static get emptyDeck() { + return new _Deck("Root", null); + } + get isRootDeck() { + return this.parent == null; + } + getDeckByTopicTag(tag) { + return this.getDeck(TopicPath.getTopicPathFromTag(tag)); + } + getDeck(topicPath) { + return this._getOrCreateDeck(topicPath, false); + } + getOrCreateDeck(topicPath) { + return this._getOrCreateDeck(topicPath, true); + } + _getOrCreateDeck(topicPath, createAllowed) { + if (!topicPath.hasPath) { + return this; + } + const t2 = topicPath.clone(); + const deckName = t2.shift(); + for (const subdeck of this.subdecks) { + if (deckName === subdeck.deckName) { + return subdeck._getOrCreateDeck(t2, createAllowed); + } + } + let result = null; + if (createAllowed) { + const subdeck = new _Deck( + deckName, + this + /* parent */ + ); + this.subdecks.push(subdeck); + result = subdeck._getOrCreateDeck(t2, createAllowed); + } + return result; + } + getTopicPath() { + const list = []; + let deck = this; + while (!deck.isRootDeck) { + list.push(deck.deckName); + deck = deck.parent; + } + return new TopicPath(list.reverse()); + } + getRootDeck() { + let deck = this; + while (!deck.isRootDeck) { + deck = deck.parent; + } + return deck; + } + getCard(index, cardListType) { + const cardList = this.getCardListForCardType(cardListType); + return cardList[index]; + } + getCardListForCardType(cardListType) { + return cardListType == 1 /* DueCard */ ? this.dueFlashcards : this.newFlashcards; + } + appendCard(topicPathList, cardObj) { + if (topicPathList.list.length == 0) { + this.appendCardToRootDeck(cardObj); + } else { + for (const topicPath of topicPathList.list) { + this.appendCard_SingleTopic(topicPath, cardObj); + } + } + } + appendCardToRootDeck(cardObj) { + this.appendCard_SingleTopic(TopicPath.emptyPath, cardObj); + } + appendCard_SingleTopic(topicPath, cardObj) { + const deck = this.getOrCreateDeck(topicPath); + const cardList = deck.getCardListForCardType(cardObj.cardListType); + cardList.push(cardObj); + } + // + // The question lists all the topics in which this card is included. + // The topics are relative to the base deck, and this method must be called on that deck + // + deleteQuestionFromAllDecks(question, exceptionIfMissing) { + for (const card of question.cards) { + this.deleteCardFromAllDecks(card, exceptionIfMissing); + } + } + deleteQuestion(question, exceptionIfMissing) { + for (const card of question.cards) { + this.deleteCardFromThisDeck(card, exceptionIfMissing); + } + } + // + // The card's question lists all the topics in which this card is included. + // The topics are relative to the base deck, and this method must be called on that deck + // + deleteCardFromAllDecks(card, exceptionIfMissing) { + for (const topicPath of card.question.topicPathList.list) { + const deck = this.getDeck(topicPath); + deck.deleteCardFromThisDeck(card, exceptionIfMissing); + } + } + deleteCardFromThisDeck(card, exceptionIfMissing) { + const newIdx = this.newFlashcards.indexOf(card); + if (newIdx != -1) + this.newFlashcards.splice(newIdx, 1); + const dueIdx = this.dueFlashcards.indexOf(card); + if (dueIdx != -1) + this.dueFlashcards.splice(dueIdx, 1); + if (newIdx == -1 && dueIdx == -1 && exceptionIfMissing) { + throw `deleteCardFromThisDeck: Card: ${card.front} not found in deck: ${this.deckName}`; + } + } + deleteCardAtIndex(index, cardListType) { + const cardList = this.getCardListForCardType(cardListType); + cardList.splice(index, 1); + } + toDeckArray() { + const result = []; + result.push(this); + for (const subdeck of this.subdecks) { + result.push(...subdeck.toDeckArray()); + } + return result; + } + sortSubdecksList() { + this.subdecks.sort((a, b) => { + if (a.deckName < b.deckName) { + return -1; + } else if (a.deckName > b.deckName) { + return 1; + } + return 0; + }); + for (const deck of this.subdecks) { + deck.sortSubdecksList(); + } + } + debugLogToConsole(desc = null, indent = 0) { + let str = desc != null ? `${desc}: ` : ""; + console.log(str += this.toString(indent)); + } + toString(indent = 0) { + let result = ""; + let indentStr = " ".repeat(indent * 4); + result += `${indentStr}${this.deckName}\r +`; + indentStr += " "; + for (let i = 0; i < this.newFlashcards.length; i++) { + const card = this.newFlashcards[i]; + result += `${indentStr}New: ${i}: ${card.front}::${card.back}\r +`; + } + for (let i = 0; i < this.dueFlashcards.length; i++) { + const card = this.dueFlashcards[i]; + const s = card.isDue ? "Due" : "Not due"; + result += `${indentStr}${s}: ${i}: ${card.front}::${card.back}\r +`; + } + for (const subdeck of this.subdecks) { + result += subdeck.toString(indent + 1); + } + return result; + } + clone() { + return this.copyWithCardFilter(() => true); + } + copyWithCardFilter(predicate, parent = null) { + const result = new _Deck(this.deckName, parent); + result.newFlashcards = [...this.newFlashcards.filter((card) => predicate(card))]; + result.dueFlashcards = [...this.dueFlashcards.filter((card) => predicate(card))]; + for (const s of this.subdecks) { + const newParent = result; + const newDeck = s.copyWithCardFilter(predicate, newParent); + result.subdecks.push(newDeck); + } + return result; + } + static otherListType(cardListType) { + let result; + if (cardListType == 0 /* NewCard */) + result = 1 /* DueCard */; + else if (cardListType == 1 /* DueCard */) + result = 0 /* NewCard */; + else + throw "Invalid cardListType"; + return result; + } +}; +var DeckTreeFilter = class { + static filterForReviewableCards(reviewableDeckTree) { + return reviewableDeckTree.copyWithCardFilter((card) => !card.question.hasEditLaterTag); + } + static filterForRemainingCards(questionPostponementList, deckTree, reviewMode) { + return deckTree.copyWithCardFilter( + (card) => (reviewMode == 0 /* Cram */ || card.isNew || card.isDue) && !questionPostponementList.includes(card.question) + ); + } +}; + +// src/util/utils.ts +var import_moment = __toESM(require_moment()); +function getTypedObjectEntries(obj) { + return Object.entries(obj); +} +var getKeysPreserveType = Object.keys; +function literalStringReplace(text, searchStr, replacementStr) { + let result = text; + const startIdx = text.indexOf(searchStr); + if (startIdx >= 0) { + const startStr = text.substring(0, startIdx); + const endIdx = startIdx + searchStr.length; + const endStr = text.substring(endIdx); + result = startStr + replacementStr + endStr; + } + return result; +} +function cyrb53(str, seed = 0) { + let h12 = 3735928559 ^ seed, h22 = 1103547991 ^ seed; + for (let i = 0, ch; i < str.length; i++) { + ch = str.charCodeAt(i); + h12 = Math.imul(h12 ^ ch, 2654435761); + h22 = Math.imul(h22 ^ ch, 1597334677); + } + h12 = Math.imul(h12 ^ h12 >>> 16, 2246822507) ^ Math.imul(h22 ^ h22 >>> 13, 3266489909); + h22 = Math.imul(h22 ^ h22 >>> 16, 2246822507) ^ Math.imul(h12 ^ h12 >>> 13, 3266489909); + return (4294967296 * (2097151 & h22) + (h12 >>> 0)).toString(16); +} +function formatDate_YYYY_MM_DD(ticks) { + return ticks.format(PREFERRED_DATE_FORMAT); +} +function splitTextIntoLineArray(text) { + return text.replaceAll("\r\n", "\n").split("\n"); +} +function stringTrimStart(str) { + const trimmed = str.trimStart(); + const wsCount = str.length - trimmed.length; + const ws = str.substring(0, wsCount); + return [ws, trimmed]; +} +function extractFrontmatter(str) { + let frontmatter = ""; + let content = ""; + let frontmatterEndLineNum = null; + if (YAML_FRONT_MATTER_REGEX.test) { + const lines = splitTextIntoLineArray(str); + for (let i = 2; i < lines.length; i++) { + if (lines[i] == "---") { + frontmatterEndLineNum = i; + break; + } + } + if (frontmatterEndLineNum) { + const frontmatterStartLineNum = 0; + const frontmatterLines = []; + for (let i = frontmatterStartLineNum; i <= frontmatterEndLineNum; i++) { + frontmatterLines.push(lines[i]); + lines[i] = ""; + } + frontmatter = frontmatterLines.join("\n"); + content = lines.join("\n"); + } + } + if (frontmatter.length == 0) + content = str; + return [frontmatter, content]; +} +function findLineIndexOfSearchStringIgnoringWs(lines, searchString) { + let result = -1; + for (let i = 0; i < lines.length; i++) { + if (lines[i].trim() == searchString) { + result = i; + break; + } + } + return result; +} +function parseObsidianFrontmatterTag(tagStr) { + const result = []; + const tagStrList = tagStr.split(","); + for (const tag of tagStrList) { + result.push(tag.startsWith("#") ? tag : "#" + tag); + } + return result; +} + +// src/util/DateProvider.ts +var import_moment2 = __toESM(require_moment()); +var LiveDateProvider = class { + get today() { + return (0, import_moment2.default)().startOf("day"); + } +}; +var DateUtil = class { + static dateStrToMoment(str) { + return (0, import_moment2.default)(str, ALLOWED_DATE_FORMATS); + } +}; +var globalDateProvider = new LiveDateProvider(); + +// src/CardSchedule.ts +var _CardScheduleInfo = class _CardScheduleInfo { + constructor(dueDate, interval, ease, delayBeforeReviewTicks) { + this.dueDate = dueDate; + this.interval = interval; + this.ease = ease; + this.delayBeforeReviewTicks = delayBeforeReviewTicks; + } + get delayBeforeReviewDaysInt() { + return Math.ceil(this.delayBeforeReviewTicks / TICKS_PER_DAY); + } + isDue() { + return this.dueDate.isSameOrBefore(globalDateProvider.today); + } + isDummyScheduleForNewCard() { + return this.formatDueDate() == _CardScheduleInfo.dummyDueDateForNewCard; + } + static getDummyScheduleForNewCard(settings) { + return _CardScheduleInfo.fromDueDateStr( + _CardScheduleInfo.dummyDueDateForNewCard, + _CardScheduleInfo.initialInterval, + settings.baseEase, + 0 + ); + } + static fromDueDateStr(dueDateStr, interval, ease, delayBeforeReviewTicks) { + const dueDateTicks = DateUtil.dateStrToMoment(dueDateStr); + return new _CardScheduleInfo(dueDateTicks, interval, ease, delayBeforeReviewTicks); + } + static fromDueDateMoment(dueDateTicks, interval, ease, delayBeforeReviewTicks) { + return new _CardScheduleInfo(dueDateTicks, interval, ease, delayBeforeReviewTicks); + } + static get initialInterval() { + return 1; + } + formatDueDate() { + return formatDate_YYYY_MM_DD(this.dueDate); + } + formatSchedule() { + return `!${this.formatDueDate()},${this.interval},${this.ease}`; + } +}; +// A question can have multiple cards. The schedule info for all sibling cards are formatted together +// in a single comment, such as: +// +// +// However, not all sibling cards may have been reviewed. Therefore we need a method of indicating that a particular card +// has not been reviewed, and should be considered "new" +// This is done by using this magic value for the date +_CardScheduleInfo.dummyDueDateForNewCard = "2000-01-01"; +var CardScheduleInfo = _CardScheduleInfo; +var CardScheduleCalculator = class { + // Record<# of days in future, due count> + constructor(settings, noteEaseList) { + this.dueDatesFlashcards = {}; + this.settings = settings; + this.noteEaseList = noteEaseList; + } + getResetCardSchedule() { + const interval = CardScheduleInfo.initialInterval; + const ease = this.settings.baseEase; + const dueDate = globalDateProvider.today.add(interval, "d"); + const delayBeforeReview = 0; + return CardScheduleInfo.fromDueDateMoment(dueDate, interval, ease, delayBeforeReview); + } + getNewCardSchedule(response, notePath) { + let initial_ease = this.settings.baseEase; + if (this.noteEaseList.hasEaseForPath(notePath)) { + initial_ease = Math.round(this.noteEaseList.getEaseByPath(notePath)); + } + const delayBeforeReview = 0; + const schedObj = schedule( + response, + CardScheduleInfo.initialInterval, + initial_ease, + delayBeforeReview, + this.settings, + this.dueDatesFlashcards + ); + const interval = schedObj.interval; + const ease = schedObj.ease; + const dueDate = globalDateProvider.today.add(interval, "d"); + return CardScheduleInfo.fromDueDateMoment(dueDate, interval, ease, delayBeforeReview); + } + calcUpdatedSchedule(response, cardSchedule) { + const schedObj = schedule( + response, + cardSchedule.interval, + cardSchedule.ease, + cardSchedule.delayBeforeReviewTicks, + this.settings, + this.dueDatesFlashcards + ); + const interval = schedObj.interval; + const ease = schedObj.ease; + const dueDate = globalDateProvider.today.add(interval, "d"); + const delayBeforeReview = 0; + return CardScheduleInfo.fromDueDateMoment(dueDate, interval, ease, delayBeforeReview); + } +}; +var NoteCardScheduleParser = class { + static createCardScheduleInfoList(questionText) { + let scheduling = [...questionText.matchAll(MULTI_SCHEDULING_EXTRACTOR)]; + if (scheduling.length === 0) + scheduling = [...questionText.matchAll(LEGACY_SCHEDULING_EXTRACTOR)]; + const result = []; + for (let i = 0; i < scheduling.length; i++) { + const match = scheduling[i]; + const dueDateStr = match[1]; + const interval = parseInt(match[2]); + const ease = parseInt(match[3]); + const dueDate = DateUtil.dateStrToMoment(dueDateStr); + const delayBeforeReviewTicks = dueDate.valueOf() - globalDateProvider.today.valueOf(); + const info = new CardScheduleInfo( + dueDate, + interval, + ease, + delayBeforeReviewTicks + ); + result.push(info); + } + return result; + } + static removeCardScheduleInfo(questionText) { + return questionText.replace(//gm, ""); + } +}; + +// src/util/MultiLineTextFinder.ts +var MultiLineTextFinder = class _MultiLineTextFinder { + static findAndReplace(sourceText, searchText, replacementText) { + let result = null; + if (sourceText.includes(searchText)) { + result = literalStringReplace(sourceText, searchText, replacementText); + } else { + const sourceTextArray = splitTextIntoLineArray(sourceText); + const searchTextArray = splitTextIntoLineArray(searchText); + const lineNo = _MultiLineTextFinder.find( + sourceTextArray, + searchTextArray + ); + if (lineNo !== null) { + const replacementTextArray = splitTextIntoLineArray(replacementText); + const linesToRemove = searchTextArray.length; + sourceTextArray.splice(lineNo, linesToRemove, ...replacementTextArray); + result = sourceTextArray.join("\n"); + } + } + return result; + } + static find(sourceText, searchText) { + let result = null; + let searchIdx = 0; + const maxSearchIdx = searchText.length - 1; + for (let sourceIdx = 0; sourceIdx < sourceText.length; sourceIdx++) { + const sourceLine = sourceText[sourceIdx].trim(); + const searchLine = searchText[searchIdx].trim(); + if (searchLine == sourceLine) { + if (searchIdx == maxSearchIdx) { + result = sourceIdx - searchIdx; + break; + } + searchIdx++; + } else { + searchIdx = 0; + } + } + return result; + } +}; + +// src/Question.ts +var QuestionText = class _QuestionText { + constructor(original, topicPathWithWs, actualQuestion, blockId) { + this.original = original; + this.topicPathWithWs = topicPathWithWs; + this.actualQuestion = actualQuestion; + this.obsidianBlockId = blockId; + this.textHash = cyrb53(this.formatTopicAndQuestion()); + } + endsWithCodeBlock() { + return this.actualQuestion.endsWith("```"); + } + static create(original, settings) { + const [topicPathWithWs, actualQuestion, blockId] = this.splitText(original, settings); + return new _QuestionText(original, topicPathWithWs, actualQuestion, blockId); + } + static splitText(original, settings) { + const originalWithoutSR = NoteCardScheduleParser.removeCardScheduleInfo(original); + let actualQuestion = originalWithoutSR.trimEnd(); + let topicPathWithWs = null; + let blockId = null; + const topicPath = TopicPath.getTopicPathFromCardText(originalWithoutSR); + if (topicPath == null ? void 0 : topicPath.hasPath) { + const [preTopicPathWs, cardText2] = stringTrimStart(originalWithoutSR); + const cardText3 = cardText2.replaceAll(OBSIDIAN_TAG_AT_STARTOFLINE_REGEX, ""); + let postTopicPathWs = null; + [postTopicPathWs, actualQuestion] = stringTrimStart(cardText3); + if (!settings.convertFoldersToDecks) { + topicPathWithWs = new TopicPathWithWs(topicPath, preTopicPathWs, postTopicPathWs); + } + } + [actualQuestion, blockId] = this.extractObsidianBlockId(actualQuestion); + return [topicPathWithWs, actualQuestion, blockId]; + } + static extractObsidianBlockId(text) { + let question = text; + let blockId = null; + const match = text.match(OBSIDIAN_BLOCK_ID_ENDOFLINE_REGEX); + if (match) { + blockId = match[0].trim(); + const newLength = question.length - blockId.length; + question = question.substring(0, newLength).trimEnd(); + } + return [question, blockId]; + } + formatTopicAndQuestion() { + let result = ""; + if (this.topicPathWithWs) { + result += this.topicPathWithWs.formatWithWs(); + } + result += this.actualQuestion; + return result; + } +}; +var Question = class _Question { + get questionType() { + return this.parsedQuestionInfo.cardType; + } + get lineNo() { + return this.parsedQuestionInfo.firstLineNum; + } + constructor(init) { + Object.assign(this, init); + } + getHtmlCommentSeparator(settings) { + const sep = this.isCardCommentsOnSameLine(settings) ? " " : "\n"; + return sep; + } + isCardCommentsOnSameLine(settings) { + let result = settings.cardCommentOnSameLine; + if (this.questionText.endsWithCodeBlock()) { + result = false; + } + return result; + } + setCardList(cards) { + this.cards = cards; + this.cards.forEach((card) => card.question = this); + } + formatScheduleAsHtmlComment(settings) { + let result = SR_HTML_COMMENT_BEGIN; + for (let i = 0; i < this.cards.length; i++) { + const card = this.cards[i]; + const schedule2 = card.hasSchedule ? card.scheduleInfo : CardScheduleInfo.getDummyScheduleForNewCard(settings); + result += schedule2.formatSchedule(); + } + result += SR_HTML_COMMENT_END; + return result; + } + formatForNote(settings) { + let result = this.questionText.formatTopicAndQuestion(); + const blockId = this.questionText.obsidianBlockId; + const hasSchedule = this.cards.some((card) => card.hasSchedule); + if (hasSchedule) { + result = result.trimEnd(); + const scheduleHtml = this.formatScheduleAsHtmlComment(settings); + if (blockId) { + if (this.isCardCommentsOnSameLine(settings)) + result += ` ${scheduleHtml} ${blockId}`; + else + result += ` ${blockId} +${scheduleHtml}`; + } else { + result += this.getHtmlCommentSeparator(settings) + scheduleHtml; + } + } else { + if (blockId) + result += ` ${blockId}`; + } + return result; + } + updateQuestionText(noteText, settings) { + const originalText = this.questionText.original; + const replacementText = this.formatForNote(settings); + let newText = MultiLineTextFinder.findAndReplace(noteText, originalText, replacementText); + if (newText) { + this.questionText = QuestionText.create(replacementText, settings); + } else { + console.error( + `updateQuestionText: Text not found: ${originalText.substring( + 0, + 100 + )} in note: ${noteText.substring(0, 100)}` + ); + newText = noteText; + } + return newText; + } + async writeQuestion(settings) { + const fileText = await this.note.file.read(); + const newText = this.updateQuestionText(fileText, settings); + await this.note.file.write(newText); + this.hasChanged = false; + } + formatTopicPathList() { + return this.topicPathList.format("|"); + } + static Create(settings, parsedQuestionInfo, noteTopicPathList, context) { + const hasEditLaterTag = parsedQuestionInfo.text.includes(settings.editLaterTag); + const questionText = QuestionText.create(parsedQuestionInfo.text, settings); + let topicPathList = noteTopicPathList; + if (questionText.topicPathWithWs) { + topicPathList = new TopicPathList([questionText.topicPathWithWs.topicPath]); + } + const result = new _Question({ + parsedQuestionInfo, + topicPathList, + questionText, + hasEditLaterTag, + questionContext: context, + cards: null, + hasChanged: false + }); + return result; + } +}; + +// src/util/RenderMarkdownWrapper.ts +var import_obsidian4 = require("obsidian"); +var RenderMarkdownWrapper = class { + constructor(app, plugin, notePath) { + this.app = app; + this.notePath = notePath; + this.plugin = plugin; + } + // slightly modified version of the renderMarkdown function in + // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/KanbanView.tsx + async renderMarkdownWrapper(markdownString, containerEl, recursiveDepth = 0) { + if (recursiveDepth > 4) + return; + import_obsidian4.MarkdownRenderer.renderMarkdown(markdownString, containerEl, this.notePath, this.plugin); + containerEl.findAll(".internal-embed").forEach((el) => { + const link2 = this.parseLink(el.getAttribute("src")); + if (!link2.target) { + el.innerText = link2.text; + } else if (link2.target instanceof import_obsidian4.TFile) { + if (link2.target.extension !== "md") { + this.embedMediaFile(el, link2.target); + } else { + el.innerText = ""; + this.renderTransclude(el, link2, recursiveDepth); + } + } + }); + } + parseLink(src) { + const linkComponentsRegex = /^(?[^#^]+)?(?:#(?!\^)(?.+)|#\^(?.+)|#)?$/; + const matched = typeof src === "string" && src.match(linkComponentsRegex); + const file = matched.groups.file || this.notePath; + const target = this.plugin.app.metadataCache.getFirstLinkpathDest(file, this.notePath); + return { + text: matched[0], + file: matched.groups.file, + heading: matched.groups.heading, + blockId: matched.groups.blockId, + target + }; + } + embedMediaFile(el, target) { + el.innerText = ""; + if (IMAGE_FORMATS.includes(target.extension)) { + el.createEl( + "img", + { + attr: { + src: this.plugin.app.vault.getResourcePath(target) + } + }, + (img) => { + if (el.hasAttribute("width")) + img.setAttribute("width", el.getAttribute("width")); + else + img.setAttribute("width", "100%"); + if (el.hasAttribute("alt")) + img.setAttribute("alt", el.getAttribute("alt")); + el.addEventListener( + "click", + (ev) => ev.target.style.minWidth = ev.target.style.minWidth === "100%" ? null : "100%" + ); + } + ); + el.addClasses(["image-embed", "is-loaded"]); + } else if (AUDIO_FORMATS.includes(target.extension) || VIDEO_FORMATS.includes(target.extension)) { + el.createEl( + AUDIO_FORMATS.includes(target.extension) ? "audio" : "video", + { + attr: { + controls: "", + src: this.plugin.app.vault.getResourcePath(target) + } + }, + (audio) => { + if (el.hasAttribute("alt")) + audio.setAttribute("alt", el.getAttribute("alt")); + } + ); + el.addClasses(["media-embed", "is-loaded"]); + } else { + el.innerText = target.path; + } + } + async renderTransclude(el, link2, recursiveDepth) { + var _a, _b, _c, _d; + const cache = this.app.metadataCache.getCache(link2.target.path); + const text = await this.app.vault.cachedRead(link2.target); + let blockText; + if (link2.heading) { + const clean = (s) => s.replace(NON_LETTER_SYMBOLS_REGEX, ""); + const headingIndex = (_a = cache.headings) == null ? void 0 : _a.findIndex( + (h4) => clean(h4.heading) === clean(link2.heading) + ); + const heading = cache.headings[headingIndex]; + const startAt = heading.position.start.offset; + const endAt = ((_d = (_c = (_b = cache.headings.slice(headingIndex + 1).find((h4) => h4.level <= heading.level)) == null ? void 0 : _b.position) == null ? void 0 : _c.start) == null ? void 0 : _d.offset) || text.length; + blockText = text.substring(startAt, endAt); + } else if (link2.blockId) { + const block = cache.blocks[link2.blockId]; + const startAt = block.position.start.offset; + const endAt = block.position.end.offset; + blockText = text.substring(startAt, endAt); + } else { + blockText = text; + } + this.renderMarkdownWrapper(blockText, el, recursiveDepth + 1); + } +}; + +// src/gui/FlashcardReviewView.tsx +var FlashcardReviewView = class { + constructor(app, plugin, settings, reviewSequencer, reviewMode, contentEl, modalEl, backClickHandler, editClickHandler) { + // -> Functions & helpers + this._keydownHandler = (e) => { + if (document.activeElement.nodeName === "TEXTAREA" || this.mode === 3 /* Closed */) { + return; + } + const consumeKeyEvent = () => { + e.preventDefault(); + e.stopPropagation(); + }; + switch (e.code) { + case "KeyS": + this._skipCurrentCard(); + consumeKeyEvent(); + break; + case "Space": + if (this.mode === 1 /* Front */) { + this._showAnswer(); + consumeKeyEvent(); + } else if (this.mode === 2 /* Back */) { + this._processReview(1 /* Good */); + consumeKeyEvent(); + } + break; + case "Enter": + case "NumpadEnter": + if (this.mode !== 1 /* Front */) { + break; + } + this._showAnswer(); + consumeKeyEvent(); + break; + case "Numpad1": + case "Digit1": + if (this.mode !== 2 /* Back */) { + break; + } + this._processReview(2 /* Hard */); + consumeKeyEvent(); + break; + case "Numpad2": + case "Digit2": + if (this.mode !== 2 /* Back */) { + break; + } + this._processReview(1 /* Good */); + consumeKeyEvent(); + break; + case "Numpad3": + case "Digit3": + if (this.mode !== 2 /* Back */) { + break; + } + this._processReview(0 /* Easy */); + consumeKeyEvent(); + break; + case "Numpad0": + case "Digit0": + if (this.mode !== 2 /* Back */) { + break; + } + this._processReview(3 /* Reset */); + consumeKeyEvent(); + break; + default: + break; + } + }; + this.app = app; + this.plugin = plugin; + this.settings = settings; + this.reviewSequencer = reviewSequencer; + this.reviewMode = reviewMode; + this.backClickHandler = backClickHandler; + this.editClickHandler = editClickHandler; + this.modalContentEl = contentEl; + this.modalEl = modalEl; + this.init(); + } + /** + * Initializes all static elements in the FlashcardView + */ + init() { + this.view = this.modalContentEl.createDiv(); + this.view.addClasses(["sr-flashcard", "sr-is-hidden"]); + this.header = this.view.createDiv(); + this.header.addClass("sr-header"); + this._createBackButton(); + this.title = this.header.createDiv(); + this.title.addClass("sr-title"); + this.controls = this.header.createDiv(); + this.controls.addClass("sr-controls"); + this._createCardControls(); + if (this.settings.showContextInCards) { + this.context = this.view.createDiv(); + this.context.addClass("sr-context"); + } + this.content = this.view.createDiv(); + this.content.addClass("sr-content"); + this.response = this.view.createDiv(); + this.response.addClass("sr-response"); + this._createResponseButtons(); + } + /** + * Shows the FlashcardView & rerenders all dynamic elements + */ + async show() { + this.mode = 1 /* Front */; + const deck = this.reviewSequencer.currentDeck; + this._setTitle(deck); + this.resetButton.disabled = true; + if (this.settings.showContextInCards) { + this.context.setText( + this._formatQuestionContextText(this._currentQuestion.questionContext) + ); + } + this.content.empty(); + const wrapper = new RenderMarkdownWrapper( + this.app, + this.plugin, + this._currentNote.filePath + ); + await wrapper.renderMarkdownWrapper(this._currentCard.front, this.content); + this._resetResponseButtons(); + if (!this.view.hasClass("sr-is-hidden")) { + return; + } + this.view.removeClass("sr-is-hidden"); + this.backButton.removeClass("sr-is-hidden"); + document.addEventListener("keydown", this._keydownHandler); + } + /** + * Hides the FlashcardView + */ + hide() { + if (this.view.hasClass("sr-is-hidden")) { + return; + } + this.view.addClass("sr-is-hidden"); + this.backButton.addClass("sr-is-hidden"); + document.removeEventListener("keydown", this._keydownHandler); + } + /** + * Closes the FlashcardView + */ + close() { + document.removeEventListener("keydown", this._keydownHandler); + this.hide(); + } + _displayCurrentCardInfoNotice() { + var _a; + const schedule2 = this._currentCard.scheduleInfo; + const currentEaseStr = t("CURRENT_EASE_HELP_TEXT") + ((_a = schedule2 == null ? void 0 : schedule2.ease) != null ? _a : t("NEW")); + const currentIntervalStr = t("CURRENT_INTERVAL_HELP_TEXT") + textInterval(schedule2 == null ? void 0 : schedule2.interval, false); + const generatedFromStr = t("CARD_GENERATED_FROM", { + notePath: this._currentQuestion.note.filePath + }); + new import_obsidian5.Notice(currentEaseStr + "\n" + currentIntervalStr + "\n" + generatedFromStr); + } + get _currentCard() { + return this.reviewSequencer.currentCard; + } + get _currentQuestion() { + return this.reviewSequencer.currentQuestion; + } + get _currentNote() { + return this.reviewSequencer.currentNote; + } + _showAnswer() { + this.mode = 2 /* Back */; + this.resetButton.disabled = false; + if (this._currentQuestion.questionType !== 4 /* Cloze */) { + const hr = document.createElement("hr"); + hr.addClass("sr-card-divide"); + this.content.appendChild(hr); + } else { + this.content.empty(); + } + const wrapper = new RenderMarkdownWrapper( + this.app, + this.plugin, + this._currentNote.filePath + ); + wrapper.renderMarkdownWrapper(this._currentCard.back, this.content); + this.answerButton.addClass("sr-is-hidden"); + this.hardButton.removeClass("sr-is-hidden"); + this.easyButton.removeClass("sr-is-hidden"); + if (this.reviewMode === 0 /* Cram */) { + this.response.addClass("is-cram"); + this.hardButton.setText(`${this.settings.flashcardHardText}`); + this.easyButton.setText(`${this.settings.flashcardEasyText}`); + } else { + this.goodButton.removeClass("sr-is-hidden"); + this._setupEaseButton( + this.hardButton, + this.settings.flashcardHardText, + 2 /* Hard */ + ); + this._setupEaseButton( + this.goodButton, + this.settings.flashcardGoodText, + 1 /* Good */ + ); + this._setupEaseButton( + this.easyButton, + this.settings.flashcardEasyText, + 0 /* Easy */ + ); + } + } + async _processReview(response) { + await this.reviewSequencer.processReview(response); + await this._handleSkipCard(); + } + async _skipCurrentCard() { + this.reviewSequencer.skipCurrentCard(); + await this._handleSkipCard(); + } + async _handleSkipCard() { + if (this._currentCard != null) + await this.show(); + else + this.backClickHandler(); + } + _formatQuestionContextText(questionContext) { + const separator = " > "; + let result = this._currentNote.file.basename; + if (questionContext.length > 0) { + result += separator + questionContext.join(separator); + } + return result + separator + "..."; + } + // -> Header + _createBackButton() { + this.backButton = this.modalEl.createDiv(); + this.backButton.addClasses(["sr-back-button", "sr-is-hidden"]); + (0, import_obsidian5.setIcon)(this.backButton, "arrow-left"); + this.backButton.setAttribute("aria-label", t("BACK")); + this.backButton.addEventListener("click", () => { + this.backClickHandler(); + }); + } + _setTitle(deck) { + this.title.setText(`${deck.deckName}: ${deck.getCardCount(2 /* All */, true)}`); + } + // -> Controls + _createCardControls() { + this._createEditButton(); + this._createResetButton(); + this._createCardInfoButton(); + this._createSkipButton(); + } + _createEditButton() { + this.editButton = this.controls.createEl("button"); + this.editButton.addClasses(["sr-button", "sr-edit-button"]); + (0, import_obsidian5.setIcon)(this.editButton, "edit"); + this.editButton.setAttribute("aria-label", t("EDIT_CARD")); + this.editButton.addEventListener("click", async () => { + this.editClickHandler(); + }); + } + _createResetButton() { + this.resetButton = this.controls.createEl("button"); + this.resetButton.addClasses(["sr-button", "sr-reset-button"]); + (0, import_obsidian5.setIcon)(this.resetButton, "refresh-cw"); + this.resetButton.setAttribute("aria-label", t("RESET_CARD_PROGRESS")); + this.resetButton.addEventListener("click", () => { + this._processReview(3 /* Reset */); + }); + } + _createCardInfoButton() { + this.infoButton = this.controls.createEl("button"); + this.infoButton.addClasses(["sr-button", "sr-info-button"]); + (0, import_obsidian5.setIcon)(this.infoButton, "info"); + this.infoButton.setAttribute("aria-label", "View Card Info"); + this.infoButton.addEventListener("click", async () => { + this._displayCurrentCardInfoNotice(); + }); + } + _createSkipButton() { + this.skipButton = this.controls.createEl("button"); + this.skipButton.addClasses(["sr-button", "sr-skip-button"]); + (0, import_obsidian5.setIcon)(this.skipButton, "chevrons-right"); + this.skipButton.setAttribute("aria-label", t("SKIP")); + this.skipButton.addEventListener("click", () => { + this._skipCurrentCard(); + }); + } + // -> Response + _createResponseButtons() { + this._createShowAnswerButton(); + this._createHardButton(); + this._createGoodButton(); + this._createEasyButton(); + } + _resetResponseButtons() { + this.answerButton.removeClass("sr-is-hidden"); + this.hardButton.addClass("sr-is-hidden"); + this.goodButton.addClass("sr-is-hidden"); + this.easyButton.addClass("sr-is-hidden"); + } + _createShowAnswerButton() { + this.answerButton = this.response.createEl("button"); + this.answerButton.addClasses(["sr-response-button", "sr-show-answer-button", "sr-bg-blue"]); + this.answerButton.setText(t("SHOW_ANSWER")); + this.answerButton.addEventListener("click", () => { + this._showAnswer(); + }); + } + _createHardButton() { + this.hardButton = this.response.createEl("button"); + this.hardButton.addClasses([ + "sr-response-button", + "sr-hard-button", + "sr-bg-red", + "sr-is-hidden" + ]); + this.hardButton.setText(this.settings.flashcardHardText); + this.hardButton.addEventListener("click", () => { + this._processReview(2 /* Hard */); + }); + } + _createGoodButton() { + this.goodButton = this.response.createEl("button"); + this.goodButton.addClasses([ + "sr-response-button", + "sr-good-button", + "sr-bg-blue", + "sr-is-hidden" + ]); + this.goodButton.setText(this.settings.flashcardGoodText); + this.goodButton.addEventListener("click", () => { + this._processReview(1 /* Good */); + }); + } + _createEasyButton() { + this.easyButton = this.response.createEl("button"); + this.easyButton.addClasses([ + "sr-response-button", + "sr-hard-button", + "sr-bg-green", + "sr-is-hidden" + ]); + this.easyButton.setText(this.settings.flashcardEasyText); + this.easyButton.addEventListener("click", () => { + this._processReview(0 /* Easy */); + }); + } + _setupEaseButton(button, buttonName, reviewResponse) { + const schedule2 = this.reviewSequencer.determineCardSchedule( + reviewResponse, + this._currentCard + ); + const interval = schedule2.interval; + if (import_obsidian5.Platform.isMobile) { + button.setText(textInterval(interval, true)); + } else { + button.setText(`${buttonName} - ${textInterval(interval, false)}`); + } + } +}; + +// src/gui/FlashcardModal.tsx +var FlashcardModal = class extends import_obsidian6.Modal { + constructor(app, plugin, settings, reviewSequencer, reviewMode) { + super(app); + this.plugin = plugin; + this.settings = settings; + this.reviewSequencer = reviewSequencer; + this.reviewMode = reviewMode; + this.modalEl.style.height = this.settings.flashcardHeightPercentage + "%"; + this.modalEl.style.width = this.settings.flashcardWidthPercentage + "%"; + this.modalEl.setAttribute("id", "sr-modal"); + this.contentEl.addClass("sr-modal-content"); + this.deckView = new DeckListView( + this.plugin, + this.settings, + this.reviewSequencer, + this.contentEl, + this._startReviewOfDeck.bind(this) + ); + this.flashcardView = new FlashcardReviewView( + this.app, + this.plugin, + this.settings, + this.reviewSequencer, + this.reviewMode, + this.contentEl, + this.modalEl, + this._showDecksList.bind(this), + this._doEditQuestionText.bind(this) + ); + } + onOpen() { + this._showDecksList(); + } + onClose() { + this.deckView.close(); + this.flashcardView.close(); + this.mode = 3 /* Closed */; + } + _showDecksList() { + this._hideFlashcard(); + this.deckView.show(); + } + _hideDecksList() { + this.deckView.hide(); + } + _showFlashcard() { + this._hideDecksList(); + this.flashcardView.show(); + } + _hideFlashcard() { + this.flashcardView.hide(); + } + _startReviewOfDeck(deck) { + this.reviewSequencer.setCurrentDeck(deck.getTopicPath()); + if (this.reviewSequencer.hasCurrentCard) { + this._showFlashcard(); + } else { + this._showDecksList(); + } + } + async _doEditQuestionText() { + const currentQ = this.reviewSequencer.currentQuestion; + const textPrompt = currentQ.questionText.actualQuestion; + const editModal = FlashcardEditModal.Prompt(this.app, textPrompt); + editModal.then(async (modifiedCardText) => { + this.reviewSequencer.updateCurrentQuestionText(modifiedCardText); + }).catch((reason) => console.log(reason)); + } +}; + +// src/gui/StatsModal.tsx +var import_obsidian7 = require("obsidian"); +var import_vhtml2 = __toESM(require_vhtml()); + +// node_modules/.pnpm/@kurkle+color@0.3.2/node_modules/@kurkle/color/dist/color.esm.js +function round(v) { + return v + 0.5 | 0; +} +var lim = (v, l, h4) => Math.max(Math.min(v, h4), l); +function p2b(v) { + return lim(round(v * 2.55), 0, 255); +} +function n2b(v) { + return lim(round(v * 255), 0, 255); +} +function b2n(v) { + return lim(round(v / 2.55) / 100, 0, 1); +} +function n2p(v) { + return lim(round(v * 100), 0, 100); +} +var map$1 = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15 }; +var hex = [..."0123456789ABCDEF"]; +var h1 = (b) => hex[b & 15]; +var h2 = (b) => hex[(b & 240) >> 4] + hex[b & 15]; +var eq = (b) => (b & 240) >> 4 === (b & 15); +var isShort = (v) => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a); +function hexParse(str) { + var len = str.length; + var ret; + if (str[0] === "#") { + if (len === 4 || len === 5) { + ret = { + r: 255 & map$1[str[1]] * 17, + g: 255 & map$1[str[2]] * 17, + b: 255 & map$1[str[3]] * 17, + a: len === 5 ? map$1[str[4]] * 17 : 255 + }; + } else if (len === 7 || len === 9) { + ret = { + r: map$1[str[1]] << 4 | map$1[str[2]], + g: map$1[str[3]] << 4 | map$1[str[4]], + b: map$1[str[5]] << 4 | map$1[str[6]], + a: len === 9 ? map$1[str[7]] << 4 | map$1[str[8]] : 255 + }; + } + } + return ret; +} +var alpha = (a, f) => a < 255 ? f(a) : ""; +function hexString(v) { + var f = isShort(v) ? h1 : h2; + return v ? "#" + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f) : void 0; +} +var HUE_RE = /^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/; +function hsl2rgbn(h4, s, l) { + const a = s * Math.min(l, 1 - l); + const f = (n, k = (n + h4 / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); + return [f(0), f(8), f(4)]; +} +function hsv2rgbn(h4, s, v) { + const f = (n, k = (n + h4 / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0); + return [f(5), f(3), f(1)]; +} +function hwb2rgbn(h4, w, b) { + const rgb = hsl2rgbn(h4, 1, 0.5); + let i; + if (w + b > 1) { + i = 1 / (w + b); + w *= i; + b *= i; + } + for (i = 0; i < 3; i++) { + rgb[i] *= 1 - w - b; + rgb[i] += w; + } + return rgb; +} +function hueValue(r, g, b, d, max) { + if (r === max) { + return (g - b) / d + (g < b ? 6 : 0); + } + if (g === max) { + return (b - r) / d + 2; + } + return (r - g) / d + 4; +} +function rgb2hsl(v) { + const range = 255; + const r = v.r / range; + const g = v.g / range; + const b = v.b / range; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const l = (max + min) / 2; + let h4, s, d; + if (max !== min) { + d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + h4 = hueValue(r, g, b, d, max); + h4 = h4 * 60 + 0.5; + } + return [h4 | 0, s || 0, l]; +} +function calln(f, a, b, c) { + return (Array.isArray(a) ? f(a[0], a[1], a[2]) : f(a, b, c)).map(n2b); +} +function hsl2rgb(h4, s, l) { + return calln(hsl2rgbn, h4, s, l); +} +function hwb2rgb(h4, w, b) { + return calln(hwb2rgbn, h4, w, b); +} +function hsv2rgb(h4, s, v) { + return calln(hsv2rgbn, h4, s, v); +} +function hue(h4) { + return (h4 % 360 + 360) % 360; +} +function hueParse(str) { + const m = HUE_RE.exec(str); + let a = 255; + let v; + if (!m) { + return; + } + if (m[5] !== v) { + a = m[6] ? p2b(+m[5]) : n2b(+m[5]); + } + const h4 = hue(+m[2]); + const p1 = +m[3] / 100; + const p2 = +m[4] / 100; + if (m[1] === "hwb") { + v = hwb2rgb(h4, p1, p2); + } else if (m[1] === "hsv") { + v = hsv2rgb(h4, p1, p2); + } else { + v = hsl2rgb(h4, p1, p2); + } + return { + r: v[0], + g: v[1], + b: v[2], + a + }; +} +function rotate(v, deg) { + var h4 = rgb2hsl(v); + h4[0] = hue(h4[0] + deg); + h4 = hsl2rgb(h4); + v.r = h4[0]; + v.g = h4[1]; + v.b = h4[2]; +} +function hslString(v) { + if (!v) { + return; + } + const a = rgb2hsl(v); + const h4 = a[0]; + const s = n2p(a[1]); + const l = n2p(a[2]); + return v.a < 255 ? `hsla(${h4}, ${s}%, ${l}%, ${b2n(v.a)})` : `hsl(${h4}, ${s}%, ${l}%)`; +} +var map = { + x: "dark", + Z: "light", + Y: "re", + X: "blu", + W: "gr", + V: "medium", + U: "slate", + A: "ee", + T: "ol", + S: "or", + B: "ra", + C: "lateg", + D: "ights", + R: "in", + Q: "turquois", + E: "hi", + P: "ro", + O: "al", + N: "le", + M: "de", + L: "yello", + F: "en", + K: "ch", + G: "arks", + H: "ea", + I: "ightg", + J: "wh" +}; +var names$1 = { + OiceXe: "f0f8ff", + antiquewEte: "faebd7", + aqua: "ffff", + aquamarRe: "7fffd4", + azuY: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "0", + blanKedOmond: "ffebcd", + Xe: "ff", + XeviTet: "8a2be2", + bPwn: "a52a2a", + burlywood: "deb887", + caMtXe: "5f9ea0", + KartYuse: "7fff00", + KocTate: "d2691e", + cSO: "ff7f50", + cSnflowerXe: "6495ed", + cSnsilk: "fff8dc", + crimson: "dc143c", + cyan: "ffff", + xXe: "8b", + xcyan: "8b8b", + xgTMnPd: "b8860b", + xWay: "a9a9a9", + xgYF: "6400", + xgYy: "a9a9a9", + xkhaki: "bdb76b", + xmagFta: "8b008b", + xTivegYF: "556b2f", + xSange: "ff8c00", + xScEd: "9932cc", + xYd: "8b0000", + xsOmon: "e9967a", + xsHgYF: "8fbc8f", + xUXe: "483d8b", + xUWay: "2f4f4f", + xUgYy: "2f4f4f", + xQe: "ced1", + xviTet: "9400d3", + dAppRk: "ff1493", + dApskyXe: "bfff", + dimWay: "696969", + dimgYy: "696969", + dodgerXe: "1e90ff", + fiYbrick: "b22222", + flSOwEte: "fffaf0", + foYstWAn: "228b22", + fuKsia: "ff00ff", + gaRsbSo: "dcdcdc", + ghostwEte: "f8f8ff", + gTd: "ffd700", + gTMnPd: "daa520", + Way: "808080", + gYF: "8000", + gYFLw: "adff2f", + gYy: "808080", + honeyMw: "f0fff0", + hotpRk: "ff69b4", + RdianYd: "cd5c5c", + Rdigo: "4b0082", + ivSy: "fffff0", + khaki: "f0e68c", + lavFMr: "e6e6fa", + lavFMrXsh: "fff0f5", + lawngYF: "7cfc00", + NmoncEffon: "fffacd", + ZXe: "add8e6", + ZcSO: "f08080", + Zcyan: "e0ffff", + ZgTMnPdLw: "fafad2", + ZWay: "d3d3d3", + ZgYF: "90ee90", + ZgYy: "d3d3d3", + ZpRk: "ffb6c1", + ZsOmon: "ffa07a", + ZsHgYF: "20b2aa", + ZskyXe: "87cefa", + ZUWay: "778899", + ZUgYy: "778899", + ZstAlXe: "b0c4de", + ZLw: "ffffe0", + lime: "ff00", + limegYF: "32cd32", + lRF: "faf0e6", + magFta: "ff00ff", + maPon: "800000", + VaquamarRe: "66cdaa", + VXe: "cd", + VScEd: "ba55d3", + VpurpN: "9370db", + VsHgYF: "3cb371", + VUXe: "7b68ee", + VsprRggYF: "fa9a", + VQe: "48d1cc", + VviTetYd: "c71585", + midnightXe: "191970", + mRtcYam: "f5fffa", + mistyPse: "ffe4e1", + moccasR: "ffe4b5", + navajowEte: "ffdead", + navy: "80", + Tdlace: "fdf5e6", + Tive: "808000", + TivedBb: "6b8e23", + Sange: "ffa500", + SangeYd: "ff4500", + ScEd: "da70d6", + pOegTMnPd: "eee8aa", + pOegYF: "98fb98", + pOeQe: "afeeee", + pOeviTetYd: "db7093", + papayawEp: "ffefd5", + pHKpuff: "ffdab9", + peru: "cd853f", + pRk: "ffc0cb", + plum: "dda0dd", + powMrXe: "b0e0e6", + purpN: "800080", + YbeccapurpN: "663399", + Yd: "ff0000", + Psybrown: "bc8f8f", + PyOXe: "4169e1", + saddNbPwn: "8b4513", + sOmon: "fa8072", + sandybPwn: "f4a460", + sHgYF: "2e8b57", + sHshell: "fff5ee", + siFna: "a0522d", + silver: "c0c0c0", + skyXe: "87ceeb", + UXe: "6a5acd", + UWay: "708090", + UgYy: "708090", + snow: "fffafa", + sprRggYF: "ff7f", + stAlXe: "4682b4", + tan: "d2b48c", + teO: "8080", + tEstN: "d8bfd8", + tomato: "ff6347", + Qe: "40e0d0", + viTet: "ee82ee", + JHt: "f5deb3", + wEte: "ffffff", + wEtesmoke: "f5f5f5", + Lw: "ffff00", + LwgYF: "9acd32" +}; +function unpack() { + const unpacked = {}; + const keys = Object.keys(names$1); + const tkeys = Object.keys(map); + let i, j, k, ok, nk; + for (i = 0; i < keys.length; i++) { + ok = nk = keys[i]; + for (j = 0; j < tkeys.length; j++) { + k = tkeys[j]; + nk = nk.replace(k, map[k]); + } + k = parseInt(names$1[ok], 16); + unpacked[nk] = [k >> 16 & 255, k >> 8 & 255, k & 255]; + } + return unpacked; +} +var names; +function nameParse(str) { + if (!names) { + names = unpack(); + names.transparent = [0, 0, 0, 0]; + } + const a = names[str.toLowerCase()]; + return a && { + r: a[0], + g: a[1], + b: a[2], + a: a.length === 4 ? a[3] : 255 + }; +} +var RGB_RE = /^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/; +function rgbParse(str) { + const m = RGB_RE.exec(str); + let a = 255; + let r, g, b; + if (!m) { + return; + } + if (m[7] !== r) { + const v = +m[7]; + a = m[8] ? p2b(v) : lim(v * 255, 0, 255); + } + r = +m[1]; + g = +m[3]; + b = +m[5]; + r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255)); + g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255)); + b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255)); + return { + r, + g, + b, + a + }; +} +function rgbString(v) { + return v && (v.a < 255 ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})` : `rgb(${v.r}, ${v.g}, ${v.b})`); +} +var to = (v) => v <= 31308e-7 ? v * 12.92 : Math.pow(v, 1 / 2.4) * 1.055 - 0.055; +var from = (v) => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); +function interpolate2(rgb1, rgb2, t2) { + const r = from(b2n(rgb1.r)); + const g = from(b2n(rgb1.g)); + const b = from(b2n(rgb1.b)); + return { + r: n2b(to(r + t2 * (from(b2n(rgb2.r)) - r))), + g: n2b(to(g + t2 * (from(b2n(rgb2.g)) - g))), + b: n2b(to(b + t2 * (from(b2n(rgb2.b)) - b))), + a: rgb1.a + t2 * (rgb2.a - rgb1.a) + }; +} +function modHSL(v, i, ratio) { + if (v) { + let tmp = rgb2hsl(v); + tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1)); + tmp = hsl2rgb(tmp); + v.r = tmp[0]; + v.g = tmp[1]; + v.b = tmp[2]; + } +} +function clone(v, proto) { + return v ? Object.assign(proto || {}, v) : v; +} +function fromObject(input) { + var v = { r: 0, g: 0, b: 0, a: 255 }; + if (Array.isArray(input)) { + if (input.length >= 3) { + v = { r: input[0], g: input[1], b: input[2], a: 255 }; + if (input.length > 3) { + v.a = n2b(input[3]); + } + } + } else { + v = clone(input, { r: 0, g: 0, b: 0, a: 1 }); + v.a = n2b(v.a); + } + return v; +} +function functionParse(str) { + if (str.charAt(0) === "r") { + return rgbParse(str); + } + return hueParse(str); +} +var Color = class _Color { + constructor(input) { + if (input instanceof _Color) { + return input; + } + const type = typeof input; + let v; + if (type === "object") { + v = fromObject(input); + } else if (type === "string") { + v = hexParse(input) || nameParse(input) || functionParse(input); + } + this._rgb = v; + this._valid = !!v; + } + get valid() { + return this._valid; + } + get rgb() { + var v = clone(this._rgb); + if (v) { + v.a = b2n(v.a); + } + return v; + } + set rgb(obj) { + this._rgb = fromObject(obj); + } + rgbString() { + return this._valid ? rgbString(this._rgb) : void 0; + } + hexString() { + return this._valid ? hexString(this._rgb) : void 0; + } + hslString() { + return this._valid ? hslString(this._rgb) : void 0; + } + mix(color2, weight) { + if (color2) { + const c1 = this.rgb; + const c2 = color2.rgb; + let w2; + const p = weight === w2 ? 0.5 : weight; + const w = 2 * p - 1; + const a = c1.a - c2.a; + const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2; + w2 = 1 - w1; + c1.r = 255 & w1 * c1.r + w2 * c2.r + 0.5; + c1.g = 255 & w1 * c1.g + w2 * c2.g + 0.5; + c1.b = 255 & w1 * c1.b + w2 * c2.b + 0.5; + c1.a = p * c1.a + (1 - p) * c2.a; + this.rgb = c1; + } + return this; + } + interpolate(color2, t2) { + if (color2) { + this._rgb = interpolate2(this._rgb, color2._rgb, t2); + } + return this; + } + clone() { + return new _Color(this.rgb); + } + alpha(a) { + this._rgb.a = n2b(a); + return this; + } + clearer(ratio) { + const rgb = this._rgb; + rgb.a *= 1 - ratio; + return this; + } + greyscale() { + const rgb = this._rgb; + const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11); + rgb.r = rgb.g = rgb.b = val; + return this; + } + opaquer(ratio) { + const rgb = this._rgb; + rgb.a *= 1 + ratio; + return this; + } + negate() { + const v = this._rgb; + v.r = 255 - v.r; + v.g = 255 - v.g; + v.b = 255 - v.b; + return this; + } + lighten(ratio) { + modHSL(this._rgb, 2, ratio); + return this; + } + darken(ratio) { + modHSL(this._rgb, 2, -ratio); + return this; + } + saturate(ratio) { + modHSL(this._rgb, 1, ratio); + return this; + } + desaturate(ratio) { + modHSL(this._rgb, 1, -ratio); + return this; + } + rotate(deg) { + rotate(this._rgb, deg); + return this; + } +}; + +// node_modules/.pnpm/chart.js@4.4.2/node_modules/chart.js/dist/chunks/helpers.segment.js +function noop() { +} +var uid = /* @__PURE__ */ (() => { + let id = 0; + return () => id++; +})(); +function isNullOrUndef(value) { + return value === null || typeof value === "undefined"; +} +function isArray(value) { + if (Array.isArray && Array.isArray(value)) { + return true; + } + const type = Object.prototype.toString.call(value); + if (type.slice(0, 7) === "[object" && type.slice(-6) === "Array]") { + return true; + } + return false; +} +function isObject(value) { + return value !== null && Object.prototype.toString.call(value) === "[object Object]"; +} +function isNumberFinite(value) { + return (typeof value === "number" || value instanceof Number) && isFinite(+value); +} +function finiteOrDefault(value, defaultValue) { + return isNumberFinite(value) ? value : defaultValue; +} +function valueOrDefault(value, defaultValue) { + return typeof value === "undefined" ? defaultValue : value; +} +var toPercentage = (value, dimension) => typeof value === "string" && value.endsWith("%") ? parseFloat(value) / 100 : +value / dimension; +var toDimension = (value, dimension) => typeof value === "string" && value.endsWith("%") ? parseFloat(value) / 100 * dimension : +value; +function callback(fn, args, thisArg) { + if (fn && typeof fn.call === "function") { + return fn.apply(thisArg, args); + } +} +function each(loopable, fn, thisArg, reverse) { + let i, len, keys; + if (isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } +} +function _elementsEqual(a0, a1) { + let i, ilen, v0, v1; + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) { + return false; + } + } + return true; +} +function clone2(source) { + if (isArray(source)) { + return source.map(clone2); + } + if (isObject(source)) { + const target = /* @__PURE__ */ Object.create(null); + const keys = Object.keys(source); + const klen = keys.length; + let k = 0; + for (; k < klen; ++k) { + target[keys[k]] = clone2(source[keys[k]]); + } + return target; + } + return source; +} +function isValidKey(key) { + return [ + "__proto__", + "prototype", + "constructor" + ].indexOf(key) === -1; +} +function _merger(key, target, source, options) { + if (!isValidKey(key)) { + return; + } + const tval = target[key]; + const sval = source[key]; + if (isObject(tval) && isObject(sval)) { + merge(tval, sval, options); + } else { + target[key] = clone2(sval); + } +} +function merge(target, source, options) { + const sources = isArray(source) ? source : [ + source + ]; + const ilen = sources.length; + if (!isObject(target)) { + return target; + } + options = options || {}; + const merger = options.merger || _merger; + let current; + for (let i = 0; i < ilen; ++i) { + current = sources[i]; + if (!isObject(current)) { + continue; + } + const keys = Object.keys(current); + for (let k = 0, klen = keys.length; k < klen; ++k) { + merger(keys[k], target, current, options); + } + } + return target; +} +function mergeIf(target, source) { + return merge(target, source, { + merger: _mergerIf + }); +} +function _mergerIf(key, target, source) { + if (!isValidKey(key)) { + return; + } + const tval = target[key]; + const sval = source[key]; + if (isObject(tval) && isObject(sval)) { + mergeIf(tval, sval); + } else if (!Object.prototype.hasOwnProperty.call(target, key)) { + target[key] = clone2(sval); + } +} +var keyResolvers = { + // Chart.helpers.core resolveObjectKey should resolve empty key to root object + "": (v) => v, + // default resolvers + x: (o) => o.x, + y: (o) => o.y +}; +function _splitKey(key) { + const parts = key.split("."); + const keys = []; + let tmp = ""; + for (const part of parts) { + tmp += part; + if (tmp.endsWith("\\")) { + tmp = tmp.slice(0, -1) + "."; + } else { + keys.push(tmp); + tmp = ""; + } + } + return keys; +} +function _getKeyResolver(key) { + const keys = _splitKey(key); + return (obj) => { + for (const k of keys) { + if (k === "") { + break; + } + obj = obj && obj[k]; + } + return obj; + }; +} +function resolveObjectKey(obj, key) { + const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key)); + return resolver(obj); +} +function _capitalize(str) { + return str.charAt(0).toUpperCase() + str.slice(1); +} +var defined = (value) => typeof value !== "undefined"; +var isFunction = (value) => typeof value === "function"; +var setsEqual = (a, b) => { + if (a.size !== b.size) { + return false; + } + for (const item of a) { + if (!b.has(item)) { + return false; + } + } + return true; +}; +function _isClickEvent(e) { + return e.type === "mouseup" || e.type === "click" || e.type === "contextmenu"; +} +var PI = Math.PI; +var TAU = 2 * PI; +var PITAU = TAU + PI; +var INFINITY = Number.POSITIVE_INFINITY; +var RAD_PER_DEG = PI / 180; +var HALF_PI = PI / 2; +var QUARTER_PI = PI / 4; +var TWO_THIRDS_PI = PI * 2 / 3; +var log10 = Math.log10; +var sign = Math.sign; +function almostEquals(x, y, epsilon) { + return Math.abs(x - y) < epsilon; +} +function niceNum(range) { + const roundedRange = Math.round(range); + range = almostEquals(range, roundedRange, range / 1e3) ? roundedRange : range; + const niceRange = Math.pow(10, Math.floor(log10(range))); + const fraction = range / niceRange; + const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10; + return niceFraction * niceRange; +} +function _factorize(value) { + const result = []; + const sqrt = Math.sqrt(value); + let i; + for (i = 1; i < sqrt; i++) { + if (value % i === 0) { + result.push(i); + result.push(value / i); + } + } + if (sqrt === (sqrt | 0)) { + result.push(sqrt); + } + result.sort((a, b) => a - b).pop(); + return result; +} +function isNumber(n) { + return !isNaN(parseFloat(n)) && isFinite(n); +} +function almostWhole(x, epsilon) { + const rounded = Math.round(x); + return rounded - epsilon <= x && rounded + epsilon >= x; +} +function _setMinAndMaxByKey(array, target, property) { + let i, ilen, value; + for (i = 0, ilen = array.length; i < ilen; i++) { + value = array[i][property]; + if (!isNaN(value)) { + target.min = Math.min(target.min, value); + target.max = Math.max(target.max, value); + } + } +} +function toRadians(degrees) { + return degrees * (PI / 180); +} +function toDegrees(radians) { + return radians * (180 / PI); +} +function _decimalPlaces(x) { + if (!isNumberFinite(x)) { + return; + } + let e = 1; + let p = 0; + while (Math.round(x * e) / e !== x) { + e *= 10; + p++; + } + return p; +} +function getAngleFromPoint(centrePoint, anglePoint) { + const distanceFromXCenter = anglePoint.x - centrePoint.x; + const distanceFromYCenter = anglePoint.y - centrePoint.y; + const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + if (angle < -0.5 * PI) { + angle += TAU; + } + return { + angle, + distance: radialDistanceFromCenter + }; +} +function distanceBetweenPoints(pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); +} +function _normalizeAngle(a) { + return (a % TAU + TAU) % TAU; +} +function _angleBetween(angle, start, end, sameAngleIsFullCircle) { + const a = _normalizeAngle(angle); + const s = _normalizeAngle(start); + const e = _normalizeAngle(end); + const angleToStart = _normalizeAngle(s - a); + const angleToEnd = _normalizeAngle(e - a); + const startToAngle = _normalizeAngle(a - s); + const endToAngle = _normalizeAngle(a - e); + return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle; +} +function _limitValue(value, min, max) { + return Math.max(min, Math.min(max, value)); +} +function _int16Range(value) { + return _limitValue(value, -32768, 32767); +} +function _isBetween(value, start, end, epsilon = 1e-6) { + return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon; +} +function _lookup(table, value, cmp) { + cmp = cmp || ((index) => table[index] < value); + let hi = table.length - 1; + let lo = 0; + let mid; + while (hi - lo > 1) { + mid = lo + hi >> 1; + if (cmp(mid)) { + lo = mid; + } else { + hi = mid; + } + } + return { + lo, + hi + }; +} +var _lookupByKey = (table, key, value, last) => _lookup(table, value, last ? (index) => { + const ti = table[index][key]; + return ti < value || ti === value && table[index + 1][key] === value; +} : (index) => table[index][key] < value); +var _rlookupByKey = (table, key, value) => _lookup(table, value, (index) => table[index][key] >= value); +function _filterBetween(values, min, max) { + let start = 0; + let end = values.length; + while (start < end && values[start] < min) { + start++; + } + while (end > start && values[end - 1] > max) { + end--; + } + return start > 0 || end < values.length ? values.slice(start, end) : values; +} +var arrayEvents = [ + "push", + "pop", + "shift", + "splice", + "unshift" +]; +function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + Object.defineProperty(array, "_chartjs", { + configurable: true, + enumerable: false, + value: { + listeners: [ + listener + ] + } + }); + arrayEvents.forEach((key) => { + const method = "_onData" + _capitalize(key); + const base = array[key]; + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value(...args) { + const res = base.apply(this, args); + array._chartjs.listeners.forEach((object) => { + if (typeof object[method] === "function") { + object[method](...args); + } + }); + return res; + } + }); + }); +} +function unlistenArrayEvents(array, listener) { + const stub = array._chartjs; + if (!stub) { + return; + } + const listeners = stub.listeners; + const index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + if (listeners.length > 0) { + return; + } + arrayEvents.forEach((key) => { + delete array[key]; + }); + delete array._chartjs; +} +function _arrayUnique(items) { + const set2 = new Set(items); + if (set2.size === items.length) { + return items; + } + return Array.from(set2); +} +var requestAnimFrame = function() { + if (typeof window === "undefined") { + return function(callback2) { + return callback2(); + }; + } + return window.requestAnimationFrame; +}(); +function throttled(fn, thisArg) { + let argsToUse = []; + let ticking = false; + return function(...args) { + argsToUse = args; + if (!ticking) { + ticking = true; + requestAnimFrame.call(window, () => { + ticking = false; + fn.apply(thisArg, argsToUse); + }); + } + }; +} +function debounce(fn, delay) { + let timeout; + return function(...args) { + if (delay) { + clearTimeout(timeout); + timeout = setTimeout(fn, delay, args); + } else { + fn.apply(this, args); + } + return delay; + }; +} +var _toLeftRightCenter = (align) => align === "start" ? "left" : align === "end" ? "right" : "center"; +var _alignStartEnd = (align, start, end) => align === "start" ? start : align === "end" ? end : (start + end) / 2; +var _textX = (align, left, right, rtl) => { + const check = rtl ? "left" : "right"; + return align === check ? right : align === "center" ? (left + right) / 2 : left; +}; +var atEdge = (t2) => t2 === 0 || t2 === 1; +var elasticIn = (t2, s, p) => -(Math.pow(2, 10 * (t2 -= 1)) * Math.sin((t2 - s) * TAU / p)); +var elasticOut = (t2, s, p) => Math.pow(2, -10 * t2) * Math.sin((t2 - s) * TAU / p) + 1; +var effects = { + linear: (t2) => t2, + easeInQuad: (t2) => t2 * t2, + easeOutQuad: (t2) => -t2 * (t2 - 2), + easeInOutQuad: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 : -0.5 * (--t2 * (t2 - 2) - 1), + easeInCubic: (t2) => t2 * t2 * t2, + easeOutCubic: (t2) => (t2 -= 1) * t2 * t2 + 1, + easeInOutCubic: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 : 0.5 * ((t2 -= 2) * t2 * t2 + 2), + easeInQuart: (t2) => t2 * t2 * t2 * t2, + easeOutQuart: (t2) => -((t2 -= 1) * t2 * t2 * t2 - 1), + easeInOutQuart: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 * t2 : -0.5 * ((t2 -= 2) * t2 * t2 * t2 - 2), + easeInQuint: (t2) => t2 * t2 * t2 * t2 * t2, + easeOutQuint: (t2) => (t2 -= 1) * t2 * t2 * t2 * t2 + 1, + easeInOutQuint: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 * t2 * t2 : 0.5 * ((t2 -= 2) * t2 * t2 * t2 * t2 + 2), + easeInSine: (t2) => -Math.cos(t2 * HALF_PI) + 1, + easeOutSine: (t2) => Math.sin(t2 * HALF_PI), + easeInOutSine: (t2) => -0.5 * (Math.cos(PI * t2) - 1), + easeInExpo: (t2) => t2 === 0 ? 0 : Math.pow(2, 10 * (t2 - 1)), + easeOutExpo: (t2) => t2 === 1 ? 1 : -Math.pow(2, -10 * t2) + 1, + easeInOutExpo: (t2) => atEdge(t2) ? t2 : t2 < 0.5 ? 0.5 * Math.pow(2, 10 * (t2 * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t2 * 2 - 1)) + 2), + easeInCirc: (t2) => t2 >= 1 ? t2 : -(Math.sqrt(1 - t2 * t2) - 1), + easeOutCirc: (t2) => Math.sqrt(1 - (t2 -= 1) * t2), + easeInOutCirc: (t2) => (t2 /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t2 * t2) - 1) : 0.5 * (Math.sqrt(1 - (t2 -= 2) * t2) + 1), + easeInElastic: (t2) => atEdge(t2) ? t2 : elasticIn(t2, 0.075, 0.3), + easeOutElastic: (t2) => atEdge(t2) ? t2 : elasticOut(t2, 0.075, 0.3), + easeInOutElastic(t2) { + const s = 0.1125; + const p = 0.45; + return atEdge(t2) ? t2 : t2 < 0.5 ? 0.5 * elasticIn(t2 * 2, s, p) : 0.5 + 0.5 * elasticOut(t2 * 2 - 1, s, p); + }, + easeInBack(t2) { + const s = 1.70158; + return t2 * t2 * ((s + 1) * t2 - s); + }, + easeOutBack(t2) { + const s = 1.70158; + return (t2 -= 1) * t2 * ((s + 1) * t2 + s) + 1; + }, + easeInOutBack(t2) { + let s = 1.70158; + if ((t2 /= 0.5) < 1) { + return 0.5 * (t2 * t2 * (((s *= 1.525) + 1) * t2 - s)); + } + return 0.5 * ((t2 -= 2) * t2 * (((s *= 1.525) + 1) * t2 + s) + 2); + }, + easeInBounce: (t2) => 1 - effects.easeOutBounce(1 - t2), + easeOutBounce(t2) { + const m = 7.5625; + const d = 2.75; + if (t2 < 1 / d) { + return m * t2 * t2; + } + if (t2 < 2 / d) { + return m * (t2 -= 1.5 / d) * t2 + 0.75; + } + if (t2 < 2.5 / d) { + return m * (t2 -= 2.25 / d) * t2 + 0.9375; + } + return m * (t2 -= 2.625 / d) * t2 + 0.984375; + }, + easeInOutBounce: (t2) => t2 < 0.5 ? effects.easeInBounce(t2 * 2) * 0.5 : effects.easeOutBounce(t2 * 2 - 1) * 0.5 + 0.5 +}; +function isPatternOrGradient(value) { + if (value && typeof value === "object") { + const type = value.toString(); + return type === "[object CanvasPattern]" || type === "[object CanvasGradient]"; + } + return false; +} +function color(value) { + return isPatternOrGradient(value) ? value : new Color(value); +} +function getHoverColor(value) { + return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString(); +} +var numbers = [ + "x", + "y", + "borderWidth", + "radius", + "tension" +]; +var colors = [ + "color", + "borderColor", + "backgroundColor" +]; +function applyAnimationsDefaults(defaults2) { + defaults2.set("animation", { + delay: void 0, + duration: 1e3, + easing: "easeOutQuart", + fn: void 0, + from: void 0, + loop: void 0, + to: void 0, + type: void 0 + }); + defaults2.describe("animation", { + _fallback: false, + _indexable: false, + _scriptable: (name) => name !== "onProgress" && name !== "onComplete" && name !== "fn" + }); + defaults2.set("animations", { + colors: { + type: "color", + properties: colors + }, + numbers: { + type: "number", + properties: numbers + } + }); + defaults2.describe("animations", { + _fallback: "animation" + }); + defaults2.set("transitions", { + active: { + animation: { + duration: 400 + } + }, + resize: { + animation: { + duration: 0 + } + }, + show: { + animations: { + colors: { + from: "transparent" + }, + visible: { + type: "boolean", + duration: 0 + } + } + }, + hide: { + animations: { + colors: { + to: "transparent" + }, + visible: { + type: "boolean", + easing: "linear", + fn: (v) => v | 0 + } + } + } + }); +} +function applyLayoutsDefaults(defaults2) { + defaults2.set("layout", { + autoPadding: true, + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + }); +} +var intlCache = /* @__PURE__ */ new Map(); +function getNumberFormat(locale2, options) { + options = options || {}; + const cacheKey = locale2 + JSON.stringify(options); + let formatter = intlCache.get(cacheKey); + if (!formatter) { + formatter = new Intl.NumberFormat(locale2, options); + intlCache.set(cacheKey, formatter); + } + return formatter; +} +function formatNumber(num, locale2, options) { + return getNumberFormat(locale2, options).format(num); +} +var formatters = { + values(value) { + return isArray(value) ? value : "" + value; + }, + numeric(tickValue, index, ticks) { + if (tickValue === 0) { + return "0"; + } + const locale2 = this.chart.options.locale; + let notation; + let delta = tickValue; + if (ticks.length > 1) { + const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value)); + if (maxTick < 1e-4 || maxTick > 1e15) { + notation = "scientific"; + } + delta = calculateDelta(tickValue, ticks); + } + const logDelta = log10(Math.abs(delta)); + const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0); + const options = { + notation, + minimumFractionDigits: numDecimal, + maximumFractionDigits: numDecimal + }; + Object.assign(options, this.options.ticks.format); + return formatNumber(tickValue, locale2, options); + }, + logarithmic(tickValue, index, ticks) { + if (tickValue === 0) { + return "0"; + } + const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue))); + if ([ + 1, + 2, + 3, + 5, + 10, + 15 + ].includes(remain) || index > 0.8 * ticks.length) { + return formatters.numeric.call(this, tickValue, index, ticks); + } + return ""; + } +}; +function calculateDelta(tickValue, ticks) { + let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value; + if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) { + delta = tickValue - Math.floor(tickValue); + } + return delta; +} +var Ticks = { + formatters +}; +function applyScaleDefaults(defaults2) { + defaults2.set("scale", { + display: true, + offset: false, + reverse: false, + beginAtZero: false, + bounds: "ticks", + clip: true, + grace: 0, + grid: { + display: true, + lineWidth: 1, + drawOnChartArea: true, + drawTicks: true, + tickLength: 8, + tickWidth: (_ctx, options) => options.lineWidth, + tickColor: (_ctx, options) => options.color, + offset: false + }, + border: { + display: true, + dash: [], + dashOffset: 0, + width: 1 + }, + title: { + display: false, + text: "", + padding: { + top: 4, + bottom: 4 + } + }, + ticks: { + minRotation: 0, + maxRotation: 50, + mirror: false, + textStrokeWidth: 0, + textStrokeColor: "", + padding: 3, + display: true, + autoSkip: true, + autoSkipPadding: 3, + labelOffset: 0, + callback: Ticks.formatters.values, + minor: {}, + major: {}, + align: "center", + crossAlign: "near", + showLabelBackdrop: false, + backdropColor: "rgba(255, 255, 255, 0.75)", + backdropPadding: 2 + } + }); + defaults2.route("scale.ticks", "color", "", "color"); + defaults2.route("scale.grid", "color", "", "borderColor"); + defaults2.route("scale.border", "color", "", "borderColor"); + defaults2.route("scale.title", "color", "", "color"); + defaults2.describe("scale", { + _fallback: false, + _scriptable: (name) => !name.startsWith("before") && !name.startsWith("after") && name !== "callback" && name !== "parser", + _indexable: (name) => name !== "borderDash" && name !== "tickBorderDash" && name !== "dash" + }); + defaults2.describe("scales", { + _fallback: "scale" + }); + defaults2.describe("scale.ticks", { + _scriptable: (name) => name !== "backdropPadding" && name !== "callback", + _indexable: (name) => name !== "backdropPadding" + }); +} +var overrides = /* @__PURE__ */ Object.create(null); +var descriptors = /* @__PURE__ */ Object.create(null); +function getScope$1(node, key) { + if (!key) { + return node; + } + const keys = key.split("."); + for (let i = 0, n = keys.length; i < n; ++i) { + const k = keys[i]; + node = node[k] || (node[k] = /* @__PURE__ */ Object.create(null)); + } + return node; +} +function set(root, scope, values) { + if (typeof scope === "string") { + return merge(getScope$1(root, scope), values); + } + return merge(getScope$1(root, ""), scope); +} +var Defaults = class { + constructor(_descriptors2, _appliers) { + this.animation = void 0; + this.backgroundColor = "rgba(0,0,0,0.1)"; + this.borderColor = "rgba(0,0,0,0.1)"; + this.color = "#666"; + this.datasets = {}; + this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio(); + this.elements = {}; + this.events = [ + "mousemove", + "mouseout", + "click", + "touchstart", + "touchmove" + ]; + this.font = { + family: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + size: 12, + style: "normal", + lineHeight: 1.2, + weight: null + }; + this.hover = {}; + this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor); + this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor); + this.hoverColor = (ctx, options) => getHoverColor(options.color); + this.indexAxis = "x"; + this.interaction = { + mode: "nearest", + intersect: true, + includeInvisible: false + }; + this.maintainAspectRatio = true; + this.onHover = null; + this.onClick = null; + this.parsing = true; + this.plugins = {}; + this.responsive = true; + this.scale = void 0; + this.scales = {}; + this.showLine = true; + this.drawActiveElementsOnTop = true; + this.describe(_descriptors2); + this.apply(_appliers); + } + set(scope, values) { + return set(this, scope, values); + } + get(scope) { + return getScope$1(this, scope); + } + describe(scope, values) { + return set(descriptors, scope, values); + } + override(scope, values) { + return set(overrides, scope, values); + } + route(scope, name, targetScope, targetName) { + const scopeObject = getScope$1(this, scope); + const targetScopeObject = getScope$1(this, targetScope); + const privateName = "_" + name; + Object.defineProperties(scopeObject, { + [privateName]: { + value: scopeObject[name], + writable: true + }, + [name]: { + enumerable: true, + get() { + const local = this[privateName]; + const target = targetScopeObject[targetName]; + if (isObject(local)) { + return Object.assign({}, target, local); + } + return valueOrDefault(local, target); + }, + set(value) { + this[privateName] = value; + } + } + }); + } + apply(appliers) { + appliers.forEach((apply) => apply(this)); + } +}; +var defaults = /* @__PURE__ */ new Defaults({ + _scriptable: (name) => !name.startsWith("on"), + _indexable: (name) => name !== "events", + hover: { + _fallback: "interaction" + }, + interaction: { + _scriptable: false, + _indexable: false + } +}, [ + applyAnimationsDefaults, + applyLayoutsDefaults, + applyScaleDefaults +]); +function toFontString(font) { + if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) { + return null; + } + return (font.style ? font.style + " " : "") + (font.weight ? font.weight + " " : "") + font.size + "px " + font.family; +} +function _measureText(ctx, data, gc, longest, string) { + let textWidth = data[string]; + if (!textWidth) { + textWidth = data[string] = ctx.measureText(string).width; + gc.push(string); + } + if (textWidth > longest) { + longest = textWidth; + } + return longest; +} +function _longestText(ctx, font, arrayOfThings, cache) { + cache = cache || {}; + let data = cache.data = cache.data || {}; + let gc = cache.garbageCollect = cache.garbageCollect || []; + if (cache.font !== font) { + data = cache.data = {}; + gc = cache.garbageCollect = []; + cache.font = font; + } + ctx.save(); + ctx.font = font; + let longest = 0; + const ilen = arrayOfThings.length; + let i, j, jlen, thing, nestedThing; + for (i = 0; i < ilen; i++) { + thing = arrayOfThings[i]; + if (thing !== void 0 && thing !== null && !isArray(thing)) { + longest = _measureText(ctx, data, gc, longest, thing); + } else if (isArray(thing)) { + for (j = 0, jlen = thing.length; j < jlen; j++) { + nestedThing = thing[j]; + if (nestedThing !== void 0 && nestedThing !== null && !isArray(nestedThing)) { + longest = _measureText(ctx, data, gc, longest, nestedThing); + } + } + } + } + ctx.restore(); + const gcLen = gc.length / 2; + if (gcLen > arrayOfThings.length) { + for (i = 0; i < gcLen; i++) { + delete data[gc[i]]; + } + gc.splice(0, gcLen); + } + return longest; +} +function _alignPixel(chart, pixel, width) { + const devicePixelRatio = chart.currentDevicePixelRatio; + const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0; + return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; +} +function clearCanvas(canvas, ctx) { + ctx = ctx || canvas.getContext("2d"); + ctx.save(); + ctx.resetTransform(); + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.restore(); +} +function drawPoint(ctx, options, x, y) { + drawPointLegend(ctx, options, x, y, null); +} +function drawPointLegend(ctx, options, x, y, w) { + let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW; + const style = options.pointStyle; + const rotation = options.rotation; + const radius = options.radius; + let rad = (rotation || 0) * RAD_PER_DEG; + if (style && typeof style === "object") { + type = style.toString(); + if (type === "[object HTMLImageElement]" || type === "[object HTMLCanvasElement]") { + ctx.save(); + ctx.translate(x, y); + ctx.rotate(rad); + ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height); + ctx.restore(); + return; + } + } + if (isNaN(radius) || radius <= 0) { + return; + } + ctx.beginPath(); + switch (style) { + default: + if (w) { + ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU); + } else { + ctx.arc(x, y, radius, 0, TAU); + } + ctx.closePath(); + break; + case "triangle": + width = w ? w / 2 : radius; + ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); + ctx.closePath(); + break; + case "rectRounded": + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size); + yOffset = Math.sin(rad + QUARTER_PI) * size; + yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size); + ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); + break; + case "rect": + if (!rotation) { + size = Math.SQRT1_2 * radius; + width = w ? w / 2 : size; + ctx.rect(x - width, y - size, 2 * width, 2 * size); + break; + } + rad += QUARTER_PI; + case "rectRot": + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); + ctx.closePath(); + break; + case "crossRot": + rad += QUARTER_PI; + case "cross": + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.moveTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); + break; + case "star": + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.moveTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); + rad += QUARTER_PI; + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.moveTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); + break; + case "line": + xOffset = w ? w / 2 : Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + break; + case "dash": + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius); + break; + case false: + ctx.closePath(); + break; + } + ctx.fill(); + if (options.borderWidth > 0) { + ctx.stroke(); + } +} +function _isPointInArea(point, area, margin) { + margin = margin || 0.5; + return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin; +} +function clipArea(ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); +} +function unclipArea(ctx) { + ctx.restore(); +} +function setRenderOpts(ctx, opts) { + if (opts.translation) { + ctx.translate(opts.translation[0], opts.translation[1]); + } + if (!isNullOrUndef(opts.rotation)) { + ctx.rotate(opts.rotation); + } + if (opts.color) { + ctx.fillStyle = opts.color; + } + if (opts.textAlign) { + ctx.textAlign = opts.textAlign; + } + if (opts.textBaseline) { + ctx.textBaseline = opts.textBaseline; + } +} +function decorateText(ctx, x, y, line, opts) { + if (opts.strikethrough || opts.underline) { + const metrics = ctx.measureText(line); + const left = x - metrics.actualBoundingBoxLeft; + const right = x + metrics.actualBoundingBoxRight; + const top = y - metrics.actualBoundingBoxAscent; + const bottom = y + metrics.actualBoundingBoxDescent; + const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom; + ctx.strokeStyle = ctx.fillStyle; + ctx.beginPath(); + ctx.lineWidth = opts.decorationWidth || 2; + ctx.moveTo(left, yDecoration); + ctx.lineTo(right, yDecoration); + ctx.stroke(); + } +} +function drawBackdrop(ctx, opts) { + const oldColor = ctx.fillStyle; + ctx.fillStyle = opts.color; + ctx.fillRect(opts.left, opts.top, opts.width, opts.height); + ctx.fillStyle = oldColor; +} +function renderText(ctx, text, x, y, font, opts = {}) { + const lines = isArray(text) ? text : [ + text + ]; + const stroke = opts.strokeWidth > 0 && opts.strokeColor !== ""; + let i, line; + ctx.save(); + ctx.font = font.string; + setRenderOpts(ctx, opts); + for (i = 0; i < lines.length; ++i) { + line = lines[i]; + if (opts.backdrop) { + drawBackdrop(ctx, opts.backdrop); + } + if (stroke) { + if (opts.strokeColor) { + ctx.strokeStyle = opts.strokeColor; + } + if (!isNullOrUndef(opts.strokeWidth)) { + ctx.lineWidth = opts.strokeWidth; + } + ctx.strokeText(line, x, y, opts.maxWidth); + } + ctx.fillText(line, x, y, opts.maxWidth); + decorateText(ctx, x, y, line, opts); + y += Number(font.lineHeight); + } + ctx.restore(); +} +function addRoundedRectPath(ctx, rect) { + const { x, y, w, h: h4, radius } = rect; + ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true); + ctx.lineTo(x, y + h4 - radius.bottomLeft); + ctx.arc(x + radius.bottomLeft, y + h4 - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true); + ctx.lineTo(x + w - radius.bottomRight, y + h4); + ctx.arc(x + w - radius.bottomRight, y + h4 - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true); + ctx.lineTo(x + w, y + radius.topRight); + ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true); + ctx.lineTo(x + radius.topLeft, y); +} +var LINE_HEIGHT = /^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/; +var FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/; +function toLineHeight(value, size) { + const matches = ("" + value).match(LINE_HEIGHT); + if (!matches || matches[1] === "normal") { + return size * 1.2; + } + value = +matches[2]; + switch (matches[3]) { + case "px": + return value; + case "%": + value /= 100; + break; + } + return size * value; +} +var numberOrZero = (v) => +v || 0; +function _readValueToProps(value, props) { + const ret = {}; + const objProps = isObject(props); + const keys = objProps ? Object.keys(props) : props; + const read = isObject(value) ? objProps ? (prop) => valueOrDefault(value[prop], value[props[prop]]) : (prop) => value[prop] : () => value; + for (const prop of keys) { + ret[prop] = numberOrZero(read(prop)); + } + return ret; +} +function toTRBL(value) { + return _readValueToProps(value, { + top: "y", + right: "x", + bottom: "y", + left: "x" + }); +} +function toTRBLCorners(value) { + return _readValueToProps(value, [ + "topLeft", + "topRight", + "bottomLeft", + "bottomRight" + ]); +} +function toPadding(value) { + const obj = toTRBL(value); + obj.width = obj.left + obj.right; + obj.height = obj.top + obj.bottom; + return obj; +} +function toFont(options, fallback) { + options = options || {}; + fallback = fallback || defaults.font; + let size = valueOrDefault(options.size, fallback.size); + if (typeof size === "string") { + size = parseInt(size, 10); + } + let style = valueOrDefault(options.style, fallback.style); + if (style && !("" + style).match(FONT_STYLE)) { + console.warn('Invalid font style specified: "' + style + '"'); + style = void 0; + } + const font = { + family: valueOrDefault(options.family, fallback.family), + lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size), + size, + style, + weight: valueOrDefault(options.weight, fallback.weight), + string: "" + }; + font.string = toFontString(font); + return font; +} +function resolve(inputs, context, index, info) { + let cacheable = true; + let i, ilen, value; + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === void 0) { + continue; + } + if (context !== void 0 && typeof value === "function") { + value = value(context); + cacheable = false; + } + if (index !== void 0 && isArray(value)) { + value = value[index % value.length]; + cacheable = false; + } + if (value !== void 0) { + if (info && !cacheable) { + info.cacheable = false; + } + return value; + } + } +} +function _addGrace(minmax, grace, beginAtZero) { + const { min, max } = minmax; + const change = toDimension(grace, (max - min) / 2); + const keepZero = (value, add) => beginAtZero && value === 0 ? 0 : value + add; + return { + min: keepZero(min, -Math.abs(change)), + max: keepZero(max, change) + }; +} +function createContext(parentContext, context) { + return Object.assign(Object.create(parentContext), context); +} +function _createResolver(scopes, prefixes = [ + "" +], rootScopes, fallback, getTarget = () => scopes[0]) { + const finalRootScopes = rootScopes || scopes; + if (typeof fallback === "undefined") { + fallback = _resolve("_fallback", scopes); + } + const cache = { + [Symbol.toStringTag]: "Object", + _cacheable: true, + _scopes: scopes, + _rootScopes: finalRootScopes, + _fallback: fallback, + _getTarget: getTarget, + override: (scope) => _createResolver([ + scope, + ...scopes + ], prefixes, finalRootScopes, fallback) + }; + return new Proxy(cache, { + /** + * A trap for the delete operator. + */ + deleteProperty(target, prop) { + delete target[prop]; + delete target._keys; + delete scopes[0][prop]; + return true; + }, + /** + * A trap for getting property values. + */ + get(target, prop) { + return _cached(target, prop, () => _resolveWithPrefixes(prop, prefixes, scopes, target)); + }, + /** + * A trap for Object.getOwnPropertyDescriptor. + * Also used by Object.hasOwnProperty. + */ + getOwnPropertyDescriptor(target, prop) { + return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop); + }, + /** + * A trap for Object.getPrototypeOf. + */ + getPrototypeOf() { + return Reflect.getPrototypeOf(scopes[0]); + }, + /** + * A trap for the in operator. + */ + has(target, prop) { + return getKeysFromAllScopes(target).includes(prop); + }, + /** + * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols. + */ + ownKeys(target) { + return getKeysFromAllScopes(target); + }, + /** + * A trap for setting property values. + */ + set(target, prop, value) { + const storage = target._storage || (target._storage = getTarget()); + target[prop] = storage[prop] = value; + delete target._keys; + return true; + } + }); +} +function _attachContext(proxy, context, subProxy, descriptorDefaults) { + const cache = { + _cacheable: false, + _proxy: proxy, + _context: context, + _subProxy: subProxy, + _stack: /* @__PURE__ */ new Set(), + _descriptors: _descriptors(proxy, descriptorDefaults), + setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults), + override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults) + }; + return new Proxy(cache, { + /** + * A trap for the delete operator. + */ + deleteProperty(target, prop) { + delete target[prop]; + delete proxy[prop]; + return true; + }, + /** + * A trap for getting property values. + */ + get(target, prop, receiver) { + return _cached(target, prop, () => _resolveWithContext(target, prop, receiver)); + }, + /** + * A trap for Object.getOwnPropertyDescriptor. + * Also used by Object.hasOwnProperty. + */ + getOwnPropertyDescriptor(target, prop) { + return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? { + enumerable: true, + configurable: true + } : void 0 : Reflect.getOwnPropertyDescriptor(proxy, prop); + }, + /** + * A trap for Object.getPrototypeOf. + */ + getPrototypeOf() { + return Reflect.getPrototypeOf(proxy); + }, + /** + * A trap for the in operator. + */ + has(target, prop) { + return Reflect.has(proxy, prop); + }, + /** + * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols. + */ + ownKeys() { + return Reflect.ownKeys(proxy); + }, + /** + * A trap for setting property values. + */ + set(target, prop, value) { + proxy[prop] = value; + delete target[prop]; + return true; + } + }); +} +function _descriptors(proxy, defaults2 = { + scriptable: true, + indexable: true +}) { + const { _scriptable = defaults2.scriptable, _indexable = defaults2.indexable, _allKeys = defaults2.allKeys } = proxy; + return { + allKeys: _allKeys, + scriptable: _scriptable, + indexable: _indexable, + isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable, + isIndexable: isFunction(_indexable) ? _indexable : () => _indexable + }; +} +var readKey = (prefix, name) => prefix ? prefix + _capitalize(name) : name; +var needsSubResolver = (prop, value) => isObject(value) && prop !== "adapters" && (Object.getPrototypeOf(value) === null || value.constructor === Object); +function _cached(target, prop, resolve2) { + if (Object.prototype.hasOwnProperty.call(target, prop)) { + return target[prop]; + } + const value = resolve2(); + target[prop] = value; + return value; +} +function _resolveWithContext(target, prop, receiver) { + const { _proxy, _context, _subProxy, _descriptors: descriptors2 } = target; + let value = _proxy[prop]; + if (isFunction(value) && descriptors2.isScriptable(prop)) { + value = _resolveScriptable(prop, value, target, receiver); + } + if (isArray(value) && value.length) { + value = _resolveArray(prop, value, target, descriptors2.isIndexable); + } + if (needsSubResolver(prop, value)) { + value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors2); + } + return value; +} +function _resolveScriptable(prop, getValue, target, receiver) { + const { _proxy, _context, _subProxy, _stack } = target; + if (_stack.has(prop)) { + throw new Error("Recursion detected: " + Array.from(_stack).join("->") + "->" + prop); + } + _stack.add(prop); + let value = getValue(_context, _subProxy || receiver); + _stack.delete(prop); + if (needsSubResolver(prop, value)) { + value = createSubResolver(_proxy._scopes, _proxy, prop, value); + } + return value; +} +function _resolveArray(prop, value, target, isIndexable) { + const { _proxy, _context, _subProxy, _descriptors: descriptors2 } = target; + if (typeof _context.index !== "undefined" && isIndexable(prop)) { + return value[_context.index % value.length]; + } else if (isObject(value[0])) { + const arr = value; + const scopes = _proxy._scopes.filter((s) => s !== arr); + value = []; + for (const item of arr) { + const resolver = createSubResolver(scopes, _proxy, prop, item); + value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors2)); + } + } + return value; +} +function resolveFallback(fallback, prop, value) { + return isFunction(fallback) ? fallback(prop, value) : fallback; +} +var getScope = (key, parent) => key === true ? parent : typeof key === "string" ? resolveObjectKey(parent, key) : void 0; +function addScopes(set2, parentScopes, key, parentFallback, value) { + for (const parent of parentScopes) { + const scope = getScope(key, parent); + if (scope) { + set2.add(scope); + const fallback = resolveFallback(scope._fallback, key, value); + if (typeof fallback !== "undefined" && fallback !== key && fallback !== parentFallback) { + return fallback; + } + } else if (scope === false && typeof parentFallback !== "undefined" && key !== parentFallback) { + return null; + } + } + return false; +} +function createSubResolver(parentScopes, resolver, prop, value) { + const rootScopes = resolver._rootScopes; + const fallback = resolveFallback(resolver._fallback, prop, value); + const allScopes = [ + ...parentScopes, + ...rootScopes + ]; + const set2 = /* @__PURE__ */ new Set(); + set2.add(value); + let key = addScopesFromKey(set2, allScopes, prop, fallback || prop, value); + if (key === null) { + return false; + } + if (typeof fallback !== "undefined" && fallback !== prop) { + key = addScopesFromKey(set2, allScopes, fallback, key, value); + if (key === null) { + return false; + } + } + return _createResolver(Array.from(set2), [ + "" + ], rootScopes, fallback, () => subGetTarget(resolver, prop, value)); +} +function addScopesFromKey(set2, allScopes, key, fallback, item) { + while (key) { + key = addScopes(set2, allScopes, key, fallback, item); + } + return key; +} +function subGetTarget(resolver, prop, value) { + const parent = resolver._getTarget(); + if (!(prop in parent)) { + parent[prop] = {}; + } + const target = parent[prop]; + if (isArray(target) && isObject(value)) { + return value; + } + return target || {}; +} +function _resolveWithPrefixes(prop, prefixes, scopes, proxy) { + let value; + for (const prefix of prefixes) { + value = _resolve(readKey(prefix, prop), scopes); + if (typeof value !== "undefined") { + return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value; + } + } +} +function _resolve(key, scopes) { + for (const scope of scopes) { + if (!scope) { + continue; + } + const value = scope[key]; + if (typeof value !== "undefined") { + return value; + } + } +} +function getKeysFromAllScopes(target) { + let keys = target._keys; + if (!keys) { + keys = target._keys = resolveKeysFromAllScopes(target._scopes); + } + return keys; +} +function resolveKeysFromAllScopes(scopes) { + const set2 = /* @__PURE__ */ new Set(); + for (const scope of scopes) { + for (const key of Object.keys(scope).filter((k) => !k.startsWith("_"))) { + set2.add(key); + } + } + return Array.from(set2); +} +var EPSILON = Number.EPSILON || 1e-14; +function _isDomSupported() { + return typeof window !== "undefined" && typeof document !== "undefined"; +} +function _getParentNode(domNode) { + let parent = domNode.parentNode; + if (parent && parent.toString() === "[object ShadowRoot]") { + parent = parent.host; + } + return parent; +} +function parseMaxStyle(styleValue, node, parentProperty) { + let valueInPixels; + if (typeof styleValue === "string") { + valueInPixels = parseInt(styleValue, 10); + if (styleValue.indexOf("%") !== -1) { + valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; + } + } else { + valueInPixels = styleValue; + } + return valueInPixels; +} +var getComputedStyle2 = (element) => element.ownerDocument.defaultView.getComputedStyle(element, null); +function getStyle(el, property) { + return getComputedStyle2(el).getPropertyValue(property); +} +var positions = [ + "top", + "right", + "bottom", + "left" +]; +function getPositionedStyle(styles, style, suffix) { + const result = {}; + suffix = suffix ? "-" + suffix : ""; + for (let i = 0; i < 4; i++) { + const pos = positions[i]; + result[pos] = parseFloat(styles[style + "-" + pos + suffix]) || 0; + } + result.width = result.left + result.right; + result.height = result.top + result.bottom; + return result; +} +var useOffsetPos = (x, y, target) => (x > 0 || y > 0) && (!target || !target.shadowRoot); +function getCanvasPosition(e, canvas) { + const touches = e.touches; + const source = touches && touches.length ? touches[0] : e; + const { offsetX, offsetY } = source; + let box = false; + let x, y; + if (useOffsetPos(offsetX, offsetY, e.target)) { + x = offsetX; + y = offsetY; + } else { + const rect = canvas.getBoundingClientRect(); + x = source.clientX - rect.left; + y = source.clientY - rect.top; + box = true; + } + return { + x, + y, + box + }; +} +function getRelativePosition(event, chart) { + if ("native" in event) { + return event; + } + const { canvas, currentDevicePixelRatio } = chart; + const style = getComputedStyle2(canvas); + const borderBox = style.boxSizing === "border-box"; + const paddings = getPositionedStyle(style, "padding"); + const borders = getPositionedStyle(style, "border", "width"); + const { x, y, box } = getCanvasPosition(event, canvas); + const xOffset = paddings.left + (box && borders.left); + const yOffset = paddings.top + (box && borders.top); + let { width, height } = chart; + if (borderBox) { + width -= paddings.width + borders.width; + height -= paddings.height + borders.height; + } + return { + x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio), + y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio) + }; +} +function getContainerSize(canvas, width, height) { + let maxWidth, maxHeight; + if (width === void 0 || height === void 0) { + const container = _getParentNode(canvas); + if (!container) { + width = canvas.clientWidth; + height = canvas.clientHeight; + } else { + const rect = container.getBoundingClientRect(); + const containerStyle = getComputedStyle2(container); + const containerBorder = getPositionedStyle(containerStyle, "border", "width"); + const containerPadding = getPositionedStyle(containerStyle, "padding"); + width = rect.width - containerPadding.width - containerBorder.width; + height = rect.height - containerPadding.height - containerBorder.height; + maxWidth = parseMaxStyle(containerStyle.maxWidth, container, "clientWidth"); + maxHeight = parseMaxStyle(containerStyle.maxHeight, container, "clientHeight"); + } + } + return { + width, + height, + maxWidth: maxWidth || INFINITY, + maxHeight: maxHeight || INFINITY + }; +} +var round1 = (v) => Math.round(v * 10) / 10; +function getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) { + const style = getComputedStyle2(canvas); + const margins = getPositionedStyle(style, "margin"); + const maxWidth = parseMaxStyle(style.maxWidth, canvas, "clientWidth") || INFINITY; + const maxHeight = parseMaxStyle(style.maxHeight, canvas, "clientHeight") || INFINITY; + const containerSize = getContainerSize(canvas, bbWidth, bbHeight); + let { width, height } = containerSize; + if (style.boxSizing === "content-box") { + const borders = getPositionedStyle(style, "border", "width"); + const paddings = getPositionedStyle(style, "padding"); + width -= paddings.width + borders.width; + height -= paddings.height + borders.height; + } + width = Math.max(0, width - margins.width); + height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height); + width = round1(Math.min(width, maxWidth, containerSize.maxWidth)); + height = round1(Math.min(height, maxHeight, containerSize.maxHeight)); + if (width && !height) { + height = round1(width / 2); + } + const maintainHeight = bbWidth !== void 0 || bbHeight !== void 0; + if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) { + height = containerSize.height; + width = round1(Math.floor(height * aspectRatio)); + } + return { + width, + height + }; +} +function retinaScale(chart, forceRatio, forceStyle) { + const pixelRatio = forceRatio || 1; + const deviceHeight = Math.floor(chart.height * pixelRatio); + const deviceWidth = Math.floor(chart.width * pixelRatio); + chart.height = Math.floor(chart.height); + chart.width = Math.floor(chart.width); + const canvas = chart.canvas; + if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) { + canvas.style.height = `${chart.height}px`; + canvas.style.width = `${chart.width}px`; + } + if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) { + chart.currentDevicePixelRatio = pixelRatio; + canvas.height = deviceHeight; + canvas.width = deviceWidth; + chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0); + return true; + } + return false; +} +var supportsEventListenerOptions = function() { + let passiveSupported = false; + try { + const options = { + get passive() { + passiveSupported = true; + return false; + } + }; + if (_isDomSupported()) { + window.addEventListener("test", null, options); + window.removeEventListener("test", null, options); + } + } catch (e) { + } + return passiveSupported; +}(); +function readUsedSize(element, property) { + const value = getStyle(element, property); + const matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? +matches[1] : void 0; +} +var getRightToLeftAdapter = function(rectX, width) { + return { + x(x) { + return rectX + rectX + width - x; + }, + setWidth(w) { + width = w; + }, + textAlign(align) { + if (align === "center") { + return align; + } + return align === "right" ? "left" : "right"; + }, + xPlus(x, value) { + return x - value; + }, + leftForLtr(x, itemWidth) { + return x - itemWidth; + } + }; +}; +var getLeftToRightAdapter = function() { + return { + x(x) { + return x; + }, + setWidth(w) { + }, + textAlign(align) { + return align; + }, + xPlus(x, value) { + return x + value; + }, + leftForLtr(x, _itemWidth) { + return x; + } + }; +}; +function getRtlAdapter(rtl, rectX, width) { + return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter(); +} +function overrideTextDirection(ctx, direction) { + let style, original; + if (direction === "ltr" || direction === "rtl") { + style = ctx.canvas.style; + original = [ + style.getPropertyValue("direction"), + style.getPropertyPriority("direction") + ]; + style.setProperty("direction", direction, "important"); + ctx.prevTextDirection = original; + } +} +function restoreTextDirection(ctx, original) { + if (original !== void 0) { + delete ctx.prevTextDirection; + ctx.canvas.style.setProperty("direction", original[0], original[1]); + } +} + +// node_modules/.pnpm/chart.js@4.4.2/node_modules/chart.js/dist/chart.js +var Animator = class { + constructor() { + this._request = null; + this._charts = /* @__PURE__ */ new Map(); + this._running = false; + this._lastDate = void 0; + } + _notify(chart, anims, date, type) { + const callbacks = anims.listeners[type]; + const numSteps = anims.duration; + callbacks.forEach((fn) => fn({ + chart, + initial: anims.initial, + numSteps, + currentStep: Math.min(date - anims.start, numSteps) + })); + } + _refresh() { + if (this._request) { + return; + } + this._running = true; + this._request = requestAnimFrame.call(window, () => { + this._update(); + this._request = null; + if (this._running) { + this._refresh(); + } + }); + } + _update(date = Date.now()) { + let remaining = 0; + this._charts.forEach((anims, chart) => { + if (!anims.running || !anims.items.length) { + return; + } + const items = anims.items; + let i = items.length - 1; + let draw = false; + let item; + for (; i >= 0; --i) { + item = items[i]; + if (item._active) { + if (item._total > anims.duration) { + anims.duration = item._total; + } + item.tick(date); + draw = true; + } else { + items[i] = items[items.length - 1]; + items.pop(); + } + } + if (draw) { + chart.draw(); + this._notify(chart, anims, date, "progress"); + } + if (!items.length) { + anims.running = false; + this._notify(chart, anims, date, "complete"); + anims.initial = false; + } + remaining += items.length; + }); + this._lastDate = date; + if (remaining === 0) { + this._running = false; + } + } + _getAnims(chart) { + const charts = this._charts; + let anims = charts.get(chart); + if (!anims) { + anims = { + running: false, + initial: true, + items: [], + listeners: { + complete: [], + progress: [] + } + }; + charts.set(chart, anims); + } + return anims; + } + listen(chart, event, cb) { + this._getAnims(chart).listeners[event].push(cb); + } + add(chart, items) { + if (!items || !items.length) { + return; + } + this._getAnims(chart).items.push(...items); + } + has(chart) { + return this._getAnims(chart).items.length > 0; + } + start(chart) { + const anims = this._charts.get(chart); + if (!anims) { + return; + } + anims.running = true; + anims.start = Date.now(); + anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0); + this._refresh(); + } + running(chart) { + if (!this._running) { + return false; + } + const anims = this._charts.get(chart); + if (!anims || !anims.running || !anims.items.length) { + return false; + } + return true; + } + stop(chart) { + const anims = this._charts.get(chart); + if (!anims || !anims.items.length) { + return; + } + const items = anims.items; + let i = items.length - 1; + for (; i >= 0; --i) { + items[i].cancel(); + } + anims.items = []; + this._notify(chart, anims, Date.now(), "complete"); + } + remove(chart) { + return this._charts.delete(chart); + } +}; +var animator = /* @__PURE__ */ new Animator(); +var transparent = "transparent"; +var interpolators = { + boolean(from2, to2, factor) { + return factor > 0.5 ? to2 : from2; + }, + color(from2, to2, factor) { + const c0 = color(from2 || transparent); + const c1 = c0.valid && color(to2 || transparent); + return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to2; + }, + number(from2, to2, factor) { + return from2 + (to2 - from2) * factor; + } +}; +var Animation = class { + constructor(cfg, target, prop, to2) { + const currentValue = target[prop]; + to2 = resolve([ + cfg.to, + to2, + currentValue, + cfg.from + ]); + const from2 = resolve([ + cfg.from, + currentValue, + to2 + ]); + this._active = true; + this._fn = cfg.fn || interpolators[cfg.type || typeof from2]; + this._easing = effects[cfg.easing] || effects.linear; + this._start = Math.floor(Date.now() + (cfg.delay || 0)); + this._duration = this._total = Math.floor(cfg.duration); + this._loop = !!cfg.loop; + this._target = target; + this._prop = prop; + this._from = from2; + this._to = to2; + this._promises = void 0; + } + active() { + return this._active; + } + update(cfg, to2, date) { + if (this._active) { + this._notify(false); + const currentValue = this._target[this._prop]; + const elapsed = date - this._start; + const remain = this._duration - elapsed; + this._start = date; + this._duration = Math.floor(Math.max(remain, cfg.duration)); + this._total += elapsed; + this._loop = !!cfg.loop; + this._to = resolve([ + cfg.to, + to2, + currentValue, + cfg.from + ]); + this._from = resolve([ + cfg.from, + currentValue, + to2 + ]); + } + } + cancel() { + if (this._active) { + this.tick(Date.now()); + this._active = false; + this._notify(false); + } + } + tick(date) { + const elapsed = date - this._start; + const duration = this._duration; + const prop = this._prop; + const from2 = this._from; + const loop = this._loop; + const to2 = this._to; + let factor; + this._active = from2 !== to2 && (loop || elapsed < duration); + if (!this._active) { + this._target[prop] = to2; + this._notify(true); + return; + } + if (elapsed < 0) { + this._target[prop] = from2; + return; + } + factor = elapsed / duration % 2; + factor = loop && factor > 1 ? 2 - factor : factor; + factor = this._easing(Math.min(1, Math.max(0, factor))); + this._target[prop] = this._fn(from2, to2, factor); + } + wait() { + const promises = this._promises || (this._promises = []); + return new Promise((res, rej) => { + promises.push({ + res, + rej + }); + }); + } + _notify(resolved) { + const method = resolved ? "res" : "rej"; + const promises = this._promises || []; + for (let i = 0; i < promises.length; i++) { + promises[i][method](); + } + } +}; +var Animations = class { + constructor(chart, config) { + this._chart = chart; + this._properties = /* @__PURE__ */ new Map(); + this.configure(config); + } + configure(config) { + if (!isObject(config)) { + return; + } + const animationOptions = Object.keys(defaults.animation); + const animatedProps = this._properties; + Object.getOwnPropertyNames(config).forEach((key) => { + const cfg = config[key]; + if (!isObject(cfg)) { + return; + } + const resolved = {}; + for (const option of animationOptions) { + resolved[option] = cfg[option]; + } + (isArray(cfg.properties) && cfg.properties || [ + key + ]).forEach((prop) => { + if (prop === key || !animatedProps.has(prop)) { + animatedProps.set(prop, resolved); + } + }); + }); + } + _animateOptions(target, values) { + const newOptions = values.options; + const options = resolveTargetOptions(target, newOptions); + if (!options) { + return []; + } + const animations = this._createAnimations(options, newOptions); + if (newOptions.$shared) { + awaitAll(target.options.$animations, newOptions).then(() => { + target.options = newOptions; + }, () => { + }); + } + return animations; + } + _createAnimations(target, values) { + const animatedProps = this._properties; + const animations = []; + const running = target.$animations || (target.$animations = {}); + const props = Object.keys(values); + const date = Date.now(); + let i; + for (i = props.length - 1; i >= 0; --i) { + const prop = props[i]; + if (prop.charAt(0) === "$") { + continue; + } + if (prop === "options") { + animations.push(...this._animateOptions(target, values)); + continue; + } + const value = values[prop]; + let animation = running[prop]; + const cfg = animatedProps.get(prop); + if (animation) { + if (cfg && animation.active()) { + animation.update(cfg, value, date); + continue; + } else { + animation.cancel(); + } + } + if (!cfg || !cfg.duration) { + target[prop] = value; + continue; + } + running[prop] = animation = new Animation(cfg, target, prop, value); + animations.push(animation); + } + return animations; + } + update(target, values) { + if (this._properties.size === 0) { + Object.assign(target, values); + return; + } + const animations = this._createAnimations(target, values); + if (animations.length) { + animator.add(this._chart, animations); + return true; + } + } +}; +function awaitAll(animations, properties) { + const running = []; + const keys = Object.keys(properties); + for (let i = 0; i < keys.length; i++) { + const anim = animations[keys[i]]; + if (anim && anim.active()) { + running.push(anim.wait()); + } + } + return Promise.all(running); +} +function resolveTargetOptions(target, newOptions) { + if (!newOptions) { + return; + } + let options = target.options; + if (!options) { + target.options = newOptions; + return; + } + if (options.$shared) { + target.options = options = Object.assign({}, options, { + $shared: false, + $animations: {} + }); + } + return options; +} +function scaleClip(scale, allowedOverflow) { + const opts = scale && scale.options || {}; + const reverse = opts.reverse; + const min = opts.min === void 0 ? allowedOverflow : 0; + const max = opts.max === void 0 ? allowedOverflow : 0; + return { + start: reverse ? max : min, + end: reverse ? min : max + }; +} +function defaultClip(xScale, yScale, allowedOverflow) { + if (allowedOverflow === false) { + return false; + } + const x = scaleClip(xScale, allowedOverflow); + const y = scaleClip(yScale, allowedOverflow); + return { + top: y.end, + right: x.end, + bottom: y.start, + left: x.start + }; +} +function toClip(value) { + let t2, r, b, l; + if (isObject(value)) { + t2 = value.top; + r = value.right; + b = value.bottom; + l = value.left; + } else { + t2 = r = b = l = value; + } + return { + top: t2, + right: r, + bottom: b, + left: l, + disabled: value === false + }; +} +function getSortedDatasetIndices(chart, filterVisible) { + const keys = []; + const metasets = chart._getSortedDatasetMetas(filterVisible); + let i, ilen; + for (i = 0, ilen = metasets.length; i < ilen; ++i) { + keys.push(metasets[i].index); + } + return keys; +} +function applyStack(stack, value, dsIndex, options = {}) { + const keys = stack.keys; + const singleMode = options.mode === "single"; + let i, ilen, datasetIndex, otherValue; + if (value === null) { + return; + } + for (i = 0, ilen = keys.length; i < ilen; ++i) { + datasetIndex = +keys[i]; + if (datasetIndex === dsIndex) { + if (options.all) { + continue; + } + break; + } + otherValue = stack.values[datasetIndex]; + if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) { + value += otherValue; + } + } + return value; +} +function convertObjectDataToArray(data) { + const keys = Object.keys(data); + const adata = new Array(keys.length); + let i, ilen, key; + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + adata[i] = { + x: key, + y: data[key] + }; + } + return adata; +} +function isStacked(scale, meta) { + const stacked = scale && scale.options.stacked; + return stacked || stacked === void 0 && meta.stack !== void 0; +} +function getStackKey(indexScale, valueScale, meta) { + return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`; +} +function getUserBounds(scale) { + const { min, max, minDefined, maxDefined } = scale.getUserBounds(); + return { + min: minDefined ? min : Number.NEGATIVE_INFINITY, + max: maxDefined ? max : Number.POSITIVE_INFINITY + }; +} +function getOrCreateStack(stacks, stackKey, indexValue) { + const subStack = stacks[stackKey] || (stacks[stackKey] = {}); + return subStack[indexValue] || (subStack[indexValue] = {}); +} +function getLastIndexInStack(stack, vScale, positive, type) { + for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) { + const value = stack[meta.index]; + if (positive && value > 0 || !positive && value < 0) { + return meta.index; + } + } + return null; +} +function updateStacks(controller, parsed) { + const { chart, _cachedMeta: meta } = controller; + const stacks = chart._stacks || (chart._stacks = {}); + const { iScale, vScale, index: datasetIndex } = meta; + const iAxis = iScale.axis; + const vAxis = vScale.axis; + const key = getStackKey(iScale, vScale, meta); + const ilen = parsed.length; + let stack; + for (let i = 0; i < ilen; ++i) { + const item = parsed[i]; + const { [iAxis]: index, [vAxis]: value } = item; + const itemStacks = item._stacks || (item._stacks = {}); + stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index); + stack[datasetIndex] = value; + stack._top = getLastIndexInStack(stack, vScale, true, meta.type); + stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type); + const visualValues = stack._visualValues || (stack._visualValues = {}); + visualValues[datasetIndex] = value; + } +} +function getFirstScaleId(chart, axis) { + const scales = chart.scales; + return Object.keys(scales).filter((key) => scales[key].axis === axis).shift(); +} +function createDatasetContext(parent, index) { + return createContext(parent, { + active: false, + dataset: void 0, + datasetIndex: index, + index, + mode: "default", + type: "dataset" + }); +} +function createDataContext(parent, index, element) { + return createContext(parent, { + active: false, + dataIndex: index, + parsed: void 0, + raw: void 0, + element, + index, + mode: "default", + type: "data" + }); +} +function clearStacks(meta, items) { + const datasetIndex = meta.controller.index; + const axis = meta.vScale && meta.vScale.axis; + if (!axis) { + return; + } + items = items || meta._parsed; + for (const parsed of items) { + const stacks = parsed._stacks; + if (!stacks || stacks[axis] === void 0 || stacks[axis][datasetIndex] === void 0) { + return; + } + delete stacks[axis][datasetIndex]; + if (stacks[axis]._visualValues !== void 0 && stacks[axis]._visualValues[datasetIndex] !== void 0) { + delete stacks[axis]._visualValues[datasetIndex]; + } + } +} +var isDirectUpdateMode = (mode) => mode === "reset" || mode === "none"; +var cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached); +var createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked && { + keys: getSortedDatasetIndices(chart, true), + values: null +}; +var DatasetController = class { + constructor(chart, datasetIndex) { + this.chart = chart; + this._ctx = chart.ctx; + this.index = datasetIndex; + this._cachedDataOpts = {}; + this._cachedMeta = this.getMeta(); + this._type = this._cachedMeta.type; + this.options = void 0; + this._parsing = false; + this._data = void 0; + this._objectData = void 0; + this._sharedOptions = void 0; + this._drawStart = void 0; + this._drawCount = void 0; + this.enableOptionSharing = false; + this.supportsDecimation = false; + this.$context = void 0; + this._syncList = []; + this.datasetElementType = new.target.datasetElementType; + this.dataElementType = new.target.dataElementType; + this.initialize(); + } + initialize() { + const meta = this._cachedMeta; + this.configure(); + this.linkScales(); + meta._stacked = isStacked(meta.vScale, meta); + this.addElements(); + if (this.options.fill && !this.chart.isPluginEnabled("filler")) { + console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options"); + } + } + updateIndex(datasetIndex) { + if (this.index !== datasetIndex) { + clearStacks(this._cachedMeta); + } + this.index = datasetIndex; + } + linkScales() { + const chart = this.chart; + const meta = this._cachedMeta; + const dataset = this.getDataset(); + const chooseId = (axis, x, y, r) => axis === "x" ? x : axis === "r" ? r : y; + const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, "x")); + const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, "y")); + const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, "r")); + const indexAxis = meta.indexAxis; + const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid); + const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid); + meta.xScale = this.getScaleForId(xid); + meta.yScale = this.getScaleForId(yid); + meta.rScale = this.getScaleForId(rid); + meta.iScale = this.getScaleForId(iid); + meta.vScale = this.getScaleForId(vid); + } + getDataset() { + return this.chart.data.datasets[this.index]; + } + getMeta() { + return this.chart.getDatasetMeta(this.index); + } + getScaleForId(scaleID) { + return this.chart.scales[scaleID]; + } + _getOtherScale(scale) { + const meta = this._cachedMeta; + return scale === meta.iScale ? meta.vScale : meta.iScale; + } + reset() { + this._update("reset"); + } + _destroy() { + const meta = this._cachedMeta; + if (this._data) { + unlistenArrayEvents(this._data, this); + } + if (meta._stacked) { + clearStacks(meta); + } + } + _dataCheck() { + const dataset = this.getDataset(); + const data = dataset.data || (dataset.data = []); + const _data = this._data; + if (isObject(data)) { + this._data = convertObjectDataToArray(data); + } else if (_data !== data) { + if (_data) { + unlistenArrayEvents(_data, this); + const meta = this._cachedMeta; + clearStacks(meta); + meta._parsed = []; + } + if (data && Object.isExtensible(data)) { + listenArrayEvents(data, this); + } + this._syncList = []; + this._data = data; + } + } + addElements() { + const meta = this._cachedMeta; + this._dataCheck(); + if (this.datasetElementType) { + meta.dataset = new this.datasetElementType(); + } + } + buildOrUpdateElements(resetNewElements) { + const meta = this._cachedMeta; + const dataset = this.getDataset(); + let stackChanged = false; + this._dataCheck(); + const oldStacked = meta._stacked; + meta._stacked = isStacked(meta.vScale, meta); + if (meta.stack !== dataset.stack) { + stackChanged = true; + clearStacks(meta); + meta.stack = dataset.stack; + } + this._resyncElements(resetNewElements); + if (stackChanged || oldStacked !== meta._stacked) { + updateStacks(this, meta._parsed); + } + } + configure() { + const config = this.chart.config; + const scopeKeys = config.datasetScopeKeys(this._type); + const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true); + this.options = config.createResolver(scopes, this.getContext()); + this._parsing = this.options.parsing; + this._cachedDataOpts = {}; + } + parse(start, count) { + const { _cachedMeta: meta, _data: data } = this; + const { iScale, _stacked } = meta; + const iAxis = iScale.axis; + let sorted = start === 0 && count === data.length ? true : meta._sorted; + let prev = start > 0 && meta._parsed[start - 1]; + let i, cur, parsed; + if (this._parsing === false) { + meta._parsed = data; + meta._sorted = true; + parsed = data; + } else { + if (isArray(data[start])) { + parsed = this.parseArrayData(meta, data, start, count); + } else if (isObject(data[start])) { + parsed = this.parseObjectData(meta, data, start, count); + } else { + parsed = this.parsePrimitiveData(meta, data, start, count); + } + const isNotInOrderComparedToPrev = () => cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis]; + for (i = 0; i < count; ++i) { + meta._parsed[i + start] = cur = parsed[i]; + if (sorted) { + if (isNotInOrderComparedToPrev()) { + sorted = false; + } + prev = cur; + } + } + meta._sorted = sorted; + } + if (_stacked) { + updateStacks(this, parsed); + } + } + parsePrimitiveData(meta, data, start, count) { + const { iScale, vScale } = meta; + const iAxis = iScale.axis; + const vAxis = vScale.axis; + const labels = iScale.getLabels(); + const singleScale = iScale === vScale; + const parsed = new Array(count); + let i, ilen, index; + for (i = 0, ilen = count; i < ilen; ++i) { + index = i + start; + parsed[i] = { + [iAxis]: singleScale || iScale.parse(labels[index], index), + [vAxis]: vScale.parse(data[index], index) + }; + } + return parsed; + } + parseArrayData(meta, data, start, count) { + const { xScale, yScale } = meta; + const parsed = new Array(count); + let i, ilen, index, item; + for (i = 0, ilen = count; i < ilen; ++i) { + index = i + start; + item = data[index]; + parsed[i] = { + x: xScale.parse(item[0], index), + y: yScale.parse(item[1], index) + }; + } + return parsed; + } + parseObjectData(meta, data, start, count) { + const { xScale, yScale } = meta; + const { xAxisKey = "x", yAxisKey = "y" } = this._parsing; + const parsed = new Array(count); + let i, ilen, index, item; + for (i = 0, ilen = count; i < ilen; ++i) { + index = i + start; + item = data[index]; + parsed[i] = { + x: xScale.parse(resolveObjectKey(item, xAxisKey), index), + y: yScale.parse(resolveObjectKey(item, yAxisKey), index) + }; + } + return parsed; + } + getParsed(index) { + return this._cachedMeta._parsed[index]; + } + getDataElement(index) { + return this._cachedMeta.data[index]; + } + applyStack(scale, parsed, mode) { + const chart = this.chart; + const meta = this._cachedMeta; + const value = parsed[scale.axis]; + const stack = { + keys: getSortedDatasetIndices(chart, true), + values: parsed._stacks[scale.axis]._visualValues + }; + return applyStack(stack, value, meta.index, { + mode + }); + } + updateRangeFromParsed(range, scale, parsed, stack) { + const parsedValue = parsed[scale.axis]; + let value = parsedValue === null ? NaN : parsedValue; + const values = stack && parsed._stacks[scale.axis]; + if (stack && values) { + stack.values = values; + value = applyStack(stack, parsedValue, this._cachedMeta.index); + } + range.min = Math.min(range.min, value); + range.max = Math.max(range.max, value); + } + getMinMax(scale, canStack) { + const meta = this._cachedMeta; + const _parsed = meta._parsed; + const sorted = meta._sorted && scale === meta.iScale; + const ilen = _parsed.length; + const otherScale = this._getOtherScale(scale); + const stack = createStack(canStack, meta, this.chart); + const range = { + min: Number.POSITIVE_INFINITY, + max: Number.NEGATIVE_INFINITY + }; + const { min: otherMin, max: otherMax } = getUserBounds(otherScale); + let i, parsed; + function _skip() { + parsed = _parsed[i]; + const otherValue = parsed[otherScale.axis]; + return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue; + } + for (i = 0; i < ilen; ++i) { + if (_skip()) { + continue; + } + this.updateRangeFromParsed(range, scale, parsed, stack); + if (sorted) { + break; + } + } + if (sorted) { + for (i = ilen - 1; i >= 0; --i) { + if (_skip()) { + continue; + } + this.updateRangeFromParsed(range, scale, parsed, stack); + break; + } + } + return range; + } + getAllParsedValues(scale) { + const parsed = this._cachedMeta._parsed; + const values = []; + let i, ilen, value; + for (i = 0, ilen = parsed.length; i < ilen; ++i) { + value = parsed[i][scale.axis]; + if (isNumberFinite(value)) { + values.push(value); + } + } + return values; + } + getMaxOverflow() { + return false; + } + getLabelAndValue(index) { + const meta = this._cachedMeta; + const iScale = meta.iScale; + const vScale = meta.vScale; + const parsed = this.getParsed(index); + return { + label: iScale ? "" + iScale.getLabelForValue(parsed[iScale.axis]) : "", + value: vScale ? "" + vScale.getLabelForValue(parsed[vScale.axis]) : "" + }; + } + _update(mode) { + const meta = this._cachedMeta; + this.update(mode || "default"); + meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow()))); + } + update(mode) { + } + draw() { + const ctx = this._ctx; + const chart = this.chart; + const meta = this._cachedMeta; + const elements = meta.data || []; + const area = chart.chartArea; + const active = []; + const start = this._drawStart || 0; + const count = this._drawCount || elements.length - start; + const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop; + let i; + if (meta.dataset) { + meta.dataset.draw(ctx, area, start, count); + } + for (i = start; i < start + count; ++i) { + const element = elements[i]; + if (element.hidden) { + continue; + } + if (element.active && drawActiveElementsOnTop) { + active.push(element); + } else { + element.draw(ctx, area); + } + } + for (i = 0; i < active.length; ++i) { + active[i].draw(ctx, area); + } + } + getStyle(index, active) { + const mode = active ? "active" : "default"; + return index === void 0 && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode); + } + getContext(index, active, mode) { + const dataset = this.getDataset(); + let context; + if (index >= 0 && index < this._cachedMeta.data.length) { + const element = this._cachedMeta.data[index]; + context = element.$context || (element.$context = createDataContext(this.getContext(), index, element)); + context.parsed = this.getParsed(index); + context.raw = dataset.data[index]; + context.index = context.dataIndex = index; + } else { + context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index)); + context.dataset = dataset; + context.index = context.datasetIndex = this.index; + } + context.active = !!active; + context.mode = mode; + return context; + } + resolveDatasetElementOptions(mode) { + return this._resolveElementOptions(this.datasetElementType.id, mode); + } + resolveDataElementOptions(index, mode) { + return this._resolveElementOptions(this.dataElementType.id, mode, index); + } + _resolveElementOptions(elementType, mode = "default", index) { + const active = mode === "active"; + const cache = this._cachedDataOpts; + const cacheKey = elementType + "-" + mode; + const cached = cache[cacheKey]; + const sharing = this.enableOptionSharing && defined(index); + if (cached) { + return cloneIfNotShared(cached, sharing); + } + const config = this.chart.config; + const scopeKeys = config.datasetElementScopeKeys(this._type, elementType); + const prefixes = active ? [ + `${elementType}Hover`, + "hover", + elementType, + "" + ] : [ + elementType, + "" + ]; + const scopes = config.getOptionScopes(this.getDataset(), scopeKeys); + const names2 = Object.keys(defaults.elements[elementType]); + const context = () => this.getContext(index, active, mode); + const values = config.resolveNamedOptions(scopes, names2, context, prefixes); + if (values.$shared) { + values.$shared = sharing; + cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing)); + } + return values; + } + _resolveAnimations(index, transition, active) { + const chart = this.chart; + const cache = this._cachedDataOpts; + const cacheKey = `animation-${transition}`; + const cached = cache[cacheKey]; + if (cached) { + return cached; + } + let options; + if (chart.options.animation !== false) { + const config = this.chart.config; + const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition); + const scopes = config.getOptionScopes(this.getDataset(), scopeKeys); + options = config.createResolver(scopes, this.getContext(index, active, transition)); + } + const animations = new Animations(chart, options && options.animations); + if (options && options._cacheable) { + cache[cacheKey] = Object.freeze(animations); + } + return animations; + } + getSharedOptions(options) { + if (!options.$shared) { + return; + } + return this._sharedOptions || (this._sharedOptions = Object.assign({}, options)); + } + includeOptions(mode, sharedOptions) { + return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled; + } + _getSharedOptions(start, mode) { + const firstOpts = this.resolveDataElementOptions(start, mode); + const previouslySharedOptions = this._sharedOptions; + const sharedOptions = this.getSharedOptions(firstOpts); + const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions; + this.updateSharedOptions(sharedOptions, mode, firstOpts); + return { + sharedOptions, + includeOptions + }; + } + updateElement(element, index, properties, mode) { + if (isDirectUpdateMode(mode)) { + Object.assign(element, properties); + } else { + this._resolveAnimations(index, mode).update(element, properties); + } + } + updateSharedOptions(sharedOptions, mode, newOptions) { + if (sharedOptions && !isDirectUpdateMode(mode)) { + this._resolveAnimations(void 0, mode).update(sharedOptions, newOptions); + } + } + _setStyle(element, index, mode, active) { + element.active = active; + const options = this.getStyle(index, active); + this._resolveAnimations(index, mode, active).update(element, { + options: !active && this.getSharedOptions(options) || options + }); + } + removeHoverStyle(element, datasetIndex, index) { + this._setStyle(element, index, "active", false); + } + setHoverStyle(element, datasetIndex, index) { + this._setStyle(element, index, "active", true); + } + _removeDatasetHoverStyle() { + const element = this._cachedMeta.dataset; + if (element) { + this._setStyle(element, void 0, "active", false); + } + } + _setDatasetHoverStyle() { + const element = this._cachedMeta.dataset; + if (element) { + this._setStyle(element, void 0, "active", true); + } + } + _resyncElements(resetNewElements) { + const data = this._data; + const elements = this._cachedMeta.data; + for (const [method, arg1, arg2] of this._syncList) { + this[method](arg1, arg2); + } + this._syncList = []; + const numMeta = elements.length; + const numData = data.length; + const count = Math.min(numData, numMeta); + if (count) { + this.parse(0, count); + } + if (numData > numMeta) { + this._insertElements(numMeta, numData - numMeta, resetNewElements); + } else if (numData < numMeta) { + this._removeElements(numData, numMeta - numData); + } + } + _insertElements(start, count, resetNewElements = true) { + const meta = this._cachedMeta; + const data = meta.data; + const end = start + count; + let i; + const move = (arr) => { + arr.length += count; + for (i = arr.length - 1; i >= end; i--) { + arr[i] = arr[i - count]; + } + }; + move(data); + for (i = start; i < end; ++i) { + data[i] = new this.dataElementType(); + } + if (this._parsing) { + move(meta._parsed); + } + this.parse(start, count); + if (resetNewElements) { + this.updateElements(data, start, count, "reset"); + } + } + updateElements(element, start, count, mode) { + } + _removeElements(start, count) { + const meta = this._cachedMeta; + if (this._parsing) { + const removed = meta._parsed.splice(start, count); + if (meta._stacked) { + clearStacks(meta, removed); + } + } + meta.data.splice(start, count); + } + _sync(args) { + if (this._parsing) { + this._syncList.push(args); + } else { + const [method, arg1, arg2] = args; + this[method](arg1, arg2); + } + this.chart._dataChanges.push([ + this.index, + ...args + ]); + } + _onDataPush() { + const count = arguments.length; + this._sync([ + "_insertElements", + this.getDataset().data.length - count, + count + ]); + } + _onDataPop() { + this._sync([ + "_removeElements", + this._cachedMeta.data.length - 1, + 1 + ]); + } + _onDataShift() { + this._sync([ + "_removeElements", + 0, + 1 + ]); + } + _onDataSplice(start, count) { + if (count) { + this._sync([ + "_removeElements", + start, + count + ]); + } + const newCount = arguments.length - 2; + if (newCount) { + this._sync([ + "_insertElements", + start, + newCount + ]); + } + } + _onDataUnshift() { + this._sync([ + "_insertElements", + 0, + arguments.length + ]); + } +}; +__publicField(DatasetController, "defaults", {}); +__publicField(DatasetController, "datasetElementType", null); +__publicField(DatasetController, "dataElementType", null); +function getAllScaleValues(scale, type) { + if (!scale._cache.$bar) { + const visibleMetas = scale.getMatchingVisibleMetas(type); + let values = []; + for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) { + values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale)); + } + scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b)); + } + return scale._cache.$bar; +} +function computeMinSampleSize(meta) { + const scale = meta.iScale; + const values = getAllScaleValues(scale, meta.type); + let min = scale._length; + let i, ilen, curr, prev; + const updateMinAndPrev = () => { + if (curr === 32767 || curr === -32768) { + return; + } + if (defined(prev)) { + min = Math.min(min, Math.abs(curr - prev) || min); + } + prev = curr; + }; + for (i = 0, ilen = values.length; i < ilen; ++i) { + curr = scale.getPixelForValue(values[i]); + updateMinAndPrev(); + } + prev = void 0; + for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) { + curr = scale.getPixelForTick(i); + updateMinAndPrev(); + } + return min; +} +function computeFitCategoryTraits(index, ruler, options, stackCount) { + const thickness = options.barThickness; + let size, ratio; + if (isNullOrUndef(thickness)) { + size = ruler.min * options.categoryPercentage; + ratio = options.barPercentage; + } else { + size = thickness * stackCount; + ratio = 1; + } + return { + chunk: size / stackCount, + ratio, + start: ruler.pixels[index] - size / 2 + }; +} +function computeFlexCategoryTraits(index, ruler, options, stackCount) { + const pixels = ruler.pixels; + const curr = pixels[index]; + let prev = index > 0 ? pixels[index - 1] : null; + let next = index < pixels.length - 1 ? pixels[index + 1] : null; + const percent = options.categoryPercentage; + if (prev === null) { + prev = curr - (next === null ? ruler.end - ruler.start : next - curr); + } + if (next === null) { + next = curr + curr - prev; + } + const start = curr - (curr - Math.min(prev, next)) / 2 * percent; + const size = Math.abs(next - prev) / 2 * percent; + return { + chunk: size / stackCount, + ratio: options.barPercentage, + start + }; +} +function parseFloatBar(entry, item, vScale, i) { + const startValue = vScale.parse(entry[0], i); + const endValue = vScale.parse(entry[1], i); + const min = Math.min(startValue, endValue); + const max = Math.max(startValue, endValue); + let barStart = min; + let barEnd = max; + if (Math.abs(min) > Math.abs(max)) { + barStart = max; + barEnd = min; + } + item[vScale.axis] = barEnd; + item._custom = { + barStart, + barEnd, + start: startValue, + end: endValue, + min, + max + }; +} +function parseValue(entry, item, vScale, i) { + if (isArray(entry)) { + parseFloatBar(entry, item, vScale, i); + } else { + item[vScale.axis] = vScale.parse(entry, i); + } + return item; +} +function parseArrayOrPrimitive(meta, data, start, count) { + const iScale = meta.iScale; + const vScale = meta.vScale; + const labels = iScale.getLabels(); + const singleScale = iScale === vScale; + const parsed = []; + let i, ilen, item, entry; + for (i = start, ilen = start + count; i < ilen; ++i) { + entry = data[i]; + item = {}; + item[iScale.axis] = singleScale || iScale.parse(labels[i], i); + parsed.push(parseValue(entry, item, vScale, i)); + } + return parsed; +} +function isFloatBar(custom) { + return custom && custom.barStart !== void 0 && custom.barEnd !== void 0; +} +function barSign(size, vScale, actualBase) { + if (size !== 0) { + return sign(size); + } + return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1); +} +function borderProps(properties) { + let reverse, start, end, top, bottom; + if (properties.horizontal) { + reverse = properties.base > properties.x; + start = "left"; + end = "right"; + } else { + reverse = properties.base < properties.y; + start = "bottom"; + end = "top"; + } + if (reverse) { + top = "end"; + bottom = "start"; + } else { + top = "start"; + bottom = "end"; + } + return { + start, + end, + reverse, + top, + bottom + }; +} +function setBorderSkipped(properties, options, stack, index) { + let edge = options.borderSkipped; + const res = {}; + if (!edge) { + properties.borderSkipped = res; + return; + } + if (edge === true) { + properties.borderSkipped = { + top: true, + right: true, + bottom: true, + left: true + }; + return; + } + const { start, end, reverse, top, bottom } = borderProps(properties); + if (edge === "middle" && stack) { + properties.enableBorderRadius = true; + if ((stack._top || 0) === index) { + edge = top; + } else if ((stack._bottom || 0) === index) { + edge = bottom; + } else { + res[parseEdge(bottom, start, end, reverse)] = true; + edge = top; + } + } + res[parseEdge(edge, start, end, reverse)] = true; + properties.borderSkipped = res; +} +function parseEdge(edge, a, b, reverse) { + if (reverse) { + edge = swap(edge, a, b); + edge = startEnd(edge, b, a); + } else { + edge = startEnd(edge, a, b); + } + return edge; +} +function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; +} +function startEnd(v, start, end) { + return v === "start" ? start : v === "end" ? end : v; +} +function setInflateAmount(properties, { inflateAmount }, ratio) { + properties.inflateAmount = inflateAmount === "auto" ? ratio === 1 ? 0.33 : 0 : inflateAmount; +} +var BarController = class extends DatasetController { + parsePrimitiveData(meta, data, start, count) { + return parseArrayOrPrimitive(meta, data, start, count); + } + parseArrayData(meta, data, start, count) { + return parseArrayOrPrimitive(meta, data, start, count); + } + parseObjectData(meta, data, start, count) { + const { iScale, vScale } = meta; + const { xAxisKey = "x", yAxisKey = "y" } = this._parsing; + const iAxisKey = iScale.axis === "x" ? xAxisKey : yAxisKey; + const vAxisKey = vScale.axis === "x" ? xAxisKey : yAxisKey; + const parsed = []; + let i, ilen, item, obj; + for (i = start, ilen = start + count; i < ilen; ++i) { + obj = data[i]; + item = {}; + item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i); + parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i)); + } + return parsed; + } + updateRangeFromParsed(range, scale, parsed, stack) { + super.updateRangeFromParsed(range, scale, parsed, stack); + const custom = parsed._custom; + if (custom && scale === this._cachedMeta.vScale) { + range.min = Math.min(range.min, custom.min); + range.max = Math.max(range.max, custom.max); + } + } + getMaxOverflow() { + return 0; + } + getLabelAndValue(index) { + const meta = this._cachedMeta; + const { iScale, vScale } = meta; + const parsed = this.getParsed(index); + const custom = parsed._custom; + const value = isFloatBar(custom) ? "[" + custom.start + ", " + custom.end + "]" : "" + vScale.getLabelForValue(parsed[vScale.axis]); + return { + label: "" + iScale.getLabelForValue(parsed[iScale.axis]), + value + }; + } + initialize() { + this.enableOptionSharing = true; + super.initialize(); + const meta = this._cachedMeta; + meta.stack = this.getDataset().stack; + } + update(mode) { + const meta = this._cachedMeta; + this.updateElements(meta.data, 0, meta.data.length, mode); + } + updateElements(bars, start, count, mode) { + const reset2 = mode === "reset"; + const { index, _cachedMeta: { vScale } } = this; + const base = vScale.getBasePixel(); + const horizontal = vScale.isHorizontal(); + const ruler = this._getRuler(); + const { sharedOptions, includeOptions } = this._getSharedOptions(start, mode); + for (let i = start; i < start + count; i++) { + const parsed = this.getParsed(i); + const vpixels = reset2 || isNullOrUndef(parsed[vScale.axis]) ? { + base, + head: base + } : this._calculateBarValuePixels(i); + const ipixels = this._calculateBarIndexPixels(i, ruler); + const stack = (parsed._stacks || {})[vScale.axis]; + const properties = { + horizontal, + base: vpixels.base, + enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom, + x: horizontal ? vpixels.head : ipixels.center, + y: horizontal ? ipixels.center : vpixels.head, + height: horizontal ? ipixels.size : Math.abs(vpixels.size), + width: horizontal ? Math.abs(vpixels.size) : ipixels.size + }; + if (includeOptions) { + properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? "active" : mode); + } + const options = properties.options || bars[i].options; + setBorderSkipped(properties, options, stack, index); + setInflateAmount(properties, options, ruler.ratio); + this.updateElement(bars[i], i, properties, mode); + } + } + _getStacks(last, dataIndex) { + const { iScale } = this._cachedMeta; + const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta) => meta.controller.options.grouped); + const stacked = iScale.options.stacked; + const stacks = []; + const skipNull = (meta) => { + const parsed = meta.controller.getParsed(dataIndex); + const val = parsed && parsed[meta.vScale.axis]; + if (isNullOrUndef(val) || isNaN(val)) { + return true; + } + }; + for (const meta of metasets) { + if (dataIndex !== void 0 && skipNull(meta)) { + continue; + } + if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === void 0 && meta.stack === void 0) { + stacks.push(meta.stack); + } + if (meta.index === last) { + break; + } + } + if (!stacks.length) { + stacks.push(void 0); + } + return stacks; + } + _getStackCount(index) { + return this._getStacks(void 0, index).length; + } + _getStackIndex(datasetIndex, name, dataIndex) { + const stacks = this._getStacks(datasetIndex, dataIndex); + const index = name !== void 0 ? stacks.indexOf(name) : -1; + return index === -1 ? stacks.length - 1 : index; + } + _getRuler() { + const opts = this.options; + const meta = this._cachedMeta; + const iScale = meta.iScale; + const pixels = []; + let i, ilen; + for (i = 0, ilen = meta.data.length; i < ilen; ++i) { + pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i)); + } + const barThickness = opts.barThickness; + const min = barThickness || computeMinSampleSize(meta); + return { + min, + pixels, + start: iScale._startPixel, + end: iScale._endPixel, + stackCount: this._getStackCount(), + scale: iScale, + grouped: opts.grouped, + ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage + }; + } + _calculateBarValuePixels(index) { + const { _cachedMeta: { vScale, _stacked, index: datasetIndex }, options: { base: baseValue, minBarLength } } = this; + const actualBase = baseValue || 0; + const parsed = this.getParsed(index); + const custom = parsed._custom; + const floating = isFloatBar(custom); + let value = parsed[vScale.axis]; + let start = 0; + let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value; + let head, size; + if (length !== value) { + start = length - value; + length = value; + } + if (floating) { + value = custom.barStart; + length = custom.barEnd - custom.barStart; + if (value !== 0 && sign(value) !== sign(custom.barEnd)) { + start = 0; + } + start += value; + } + const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start; + let base = vScale.getPixelForValue(startValue); + if (this.chart.getDataVisibility(index)) { + head = vScale.getPixelForValue(start + length); + } else { + head = base; + } + size = head - base; + if (Math.abs(size) < minBarLength) { + size = barSign(size, vScale, actualBase) * minBarLength; + if (value === actualBase) { + base -= size / 2; + } + const startPixel = vScale.getPixelForDecimal(0); + const endPixel = vScale.getPixelForDecimal(1); + const min = Math.min(startPixel, endPixel); + const max = Math.max(startPixel, endPixel); + base = Math.max(Math.min(base, max), min); + head = base + size; + if (_stacked && !floating) { + parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base); + } + } + if (base === vScale.getPixelForValue(actualBase)) { + const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2; + base += halfGrid; + size -= halfGrid; + } + return { + size, + base, + head, + center: head + size / 2 + }; + } + _calculateBarIndexPixels(index, ruler) { + const scale = ruler.scale; + const options = this.options; + const skipNull = options.skipNull; + const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity); + let center, size; + if (ruler.grouped) { + const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount; + const range = options.barThickness === "flex" ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount); + const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : void 0); + center = range.start + range.chunk * stackIndex + range.chunk / 2; + size = Math.min(maxBarThickness, range.chunk * range.ratio); + } else { + center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index); + size = Math.min(maxBarThickness, ruler.min * ruler.ratio); + } + return { + base: center - size / 2, + head: center + size / 2, + center, + size + }; + } + draw() { + const meta = this._cachedMeta; + const vScale = meta.vScale; + const rects = meta.data; + const ilen = rects.length; + let i = 0; + for (; i < ilen; ++i) { + if (this.getParsed(i)[vScale.axis] !== null) { + rects[i].draw(this._ctx); + } + } + } +}; +__publicField(BarController, "id", "bar"); +__publicField(BarController, "defaults", { + datasetElementType: false, + dataElementType: "bar", + categoryPercentage: 0.8, + barPercentage: 0.9, + grouped: true, + animations: { + numbers: { + type: "number", + properties: [ + "x", + "y", + "base", + "width", + "height" + ] + } + } +}); +__publicField(BarController, "overrides", { + scales: { + _index_: { + type: "category", + offset: true, + grid: { + offset: true + } + }, + _value_: { + type: "linear", + beginAtZero: true + } + } +}); +function getRatioAndOffset(rotation, circumference, cutout) { + let ratioX = 1; + let ratioY = 1; + let offsetX = 0; + let offsetY = 0; + if (circumference < TAU) { + const startAngle = rotation; + const endAngle = startAngle + circumference; + const startX = Math.cos(startAngle); + const startY = Math.sin(startAngle); + const endX = Math.cos(endAngle); + const endY = Math.sin(endAngle); + const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout); + const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout); + const maxX = calcMax(0, startX, endX); + const maxY = calcMax(HALF_PI, startY, endY); + const minX = calcMin(PI, startX, endX); + const minY = calcMin(PI + HALF_PI, startY, endY); + ratioX = (maxX - minX) / 2; + ratioY = (maxY - minY) / 2; + offsetX = -(maxX + minX) / 2; + offsetY = -(maxY + minY) / 2; + } + return { + ratioX, + ratioY, + offsetX, + offsetY + }; +} +var DoughnutController = class extends DatasetController { + constructor(chart, datasetIndex) { + super(chart, datasetIndex); + this.enableOptionSharing = true; + this.innerRadius = void 0; + this.outerRadius = void 0; + this.offsetX = void 0; + this.offsetY = void 0; + } + linkScales() { + } + parse(start, count) { + const data = this.getDataset().data; + const meta = this._cachedMeta; + if (this._parsing === false) { + meta._parsed = data; + } else { + let getter = (i2) => +data[i2]; + if (isObject(data[start])) { + const { key = "value" } = this._parsing; + getter = (i2) => +resolveObjectKey(data[i2], key); + } + let i, ilen; + for (i = start, ilen = start + count; i < ilen; ++i) { + meta._parsed[i] = getter(i); + } + } + } + _getRotation() { + return toRadians(this.options.rotation - 90); + } + _getCircumference() { + return toRadians(this.options.circumference); + } + _getRotationExtents() { + let min = TAU; + let max = -TAU; + for (let i = 0; i < this.chart.data.datasets.length; ++i) { + if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) { + const controller = this.chart.getDatasetMeta(i).controller; + const rotation = controller._getRotation(); + const circumference = controller._getCircumference(); + min = Math.min(min, rotation); + max = Math.max(max, rotation + circumference); + } + } + return { + rotation: min, + circumference: max - min + }; + } + update(mode) { + const chart = this.chart; + const { chartArea } = chart; + const meta = this._cachedMeta; + const arcs = meta.data; + const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing; + const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0); + const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1); + const chartWeight = this._getRingWeight(this.index); + const { circumference, rotation } = this._getRotationExtents(); + const { ratioX, ratioY, offsetX, offsetY } = getRatioAndOffset(rotation, circumference, cutout); + const maxWidth = (chartArea.width - spacing) / ratioX; + const maxHeight = (chartArea.height - spacing) / ratioY; + const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0); + const outerRadius = toDimension(this.options.radius, maxRadius); + const innerRadius = Math.max(outerRadius * cutout, 0); + const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal(); + this.offsetX = offsetX * outerRadius; + this.offsetY = offsetY * outerRadius; + meta.total = this.calculateTotal(); + this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index); + this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0); + this.updateElements(arcs, 0, arcs.length, mode); + } + _circumference(i, reset2) { + const opts = this.options; + const meta = this._cachedMeta; + const circumference = this._getCircumference(); + if (reset2 && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) { + return 0; + } + return this.calculateCircumference(meta._parsed[i] * circumference / TAU); + } + updateElements(arcs, start, count, mode) { + const reset2 = mode === "reset"; + const chart = this.chart; + const chartArea = chart.chartArea; + const opts = chart.options; + const animationOpts = opts.animation; + const centerX = (chartArea.left + chartArea.right) / 2; + const centerY = (chartArea.top + chartArea.bottom) / 2; + const animateScale = reset2 && animationOpts.animateScale; + const innerRadius = animateScale ? 0 : this.innerRadius; + const outerRadius = animateScale ? 0 : this.outerRadius; + const { sharedOptions, includeOptions } = this._getSharedOptions(start, mode); + let startAngle = this._getRotation(); + let i; + for (i = 0; i < start; ++i) { + startAngle += this._circumference(i, reset2); + } + for (i = start; i < start + count; ++i) { + const circumference = this._circumference(i, reset2); + const arc = arcs[i]; + const properties = { + x: centerX + this.offsetX, + y: centerY + this.offsetY, + startAngle, + endAngle: startAngle + circumference, + circumference, + outerRadius, + innerRadius + }; + if (includeOptions) { + properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? "active" : mode); + } + startAngle += circumference; + this.updateElement(arc, i, properties, mode); + } + } + calculateTotal() { + const meta = this._cachedMeta; + const metaData = meta.data; + let total = 0; + let i; + for (i = 0; i < metaData.length; i++) { + const value = meta._parsed[i]; + if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) { + total += Math.abs(value); + } + } + return total; + } + calculateCircumference(value) { + const total = this._cachedMeta.total; + if (total > 0 && !isNaN(value)) { + return TAU * (Math.abs(value) / total); + } + return 0; + } + getLabelAndValue(index) { + const meta = this._cachedMeta; + const chart = this.chart; + const labels = chart.data.labels || []; + const value = formatNumber(meta._parsed[index], chart.options.locale); + return { + label: labels[index] || "", + value + }; + } + getMaxBorderWidth(arcs) { + let max = 0; + const chart = this.chart; + let i, ilen, meta, controller, options; + if (!arcs) { + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + arcs = meta.data; + controller = meta.controller; + break; + } + } + } + if (!arcs) { + return 0; + } + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + options = controller.resolveDataElementOptions(i); + if (options.borderAlign !== "inner") { + max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0); + } + } + return max; + } + getMaxOffset(arcs) { + let max = 0; + for (let i = 0, ilen = arcs.length; i < ilen; ++i) { + const options = this.resolveDataElementOptions(i); + max = Math.max(max, options.offset || 0, options.hoverOffset || 0); + } + return max; + } + _getRingWeightOffset(datasetIndex) { + let ringWeightOffset = 0; + for (let i = 0; i < datasetIndex; ++i) { + if (this.chart.isDatasetVisible(i)) { + ringWeightOffset += this._getRingWeight(i); + } + } + return ringWeightOffset; + } + _getRingWeight(datasetIndex) { + return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0); + } + _getVisibleDatasetWeightTotal() { + return this._getRingWeightOffset(this.chart.data.datasets.length) || 1; + } +}; +__publicField(DoughnutController, "id", "doughnut"); +__publicField(DoughnutController, "defaults", { + datasetElementType: false, + dataElementType: "arc", + animation: { + animateRotate: true, + animateScale: false + }, + animations: { + numbers: { + type: "number", + properties: [ + "circumference", + "endAngle", + "innerRadius", + "outerRadius", + "startAngle", + "x", + "y", + "offset", + "borderWidth", + "spacing" + ] + } + }, + cutout: "50%", + rotation: 0, + circumference: 360, + radius: "100%", + spacing: 0, + indexAxis: "r" +}); +__publicField(DoughnutController, "descriptors", { + _scriptable: (name) => name !== "spacing", + _indexable: (name) => name !== "spacing" && !name.startsWith("borderDash") && !name.startsWith("hoverBorderDash") +}); +__publicField(DoughnutController, "overrides", { + aspectRatio: 1, + plugins: { + legend: { + labels: { + generateLabels(chart) { + const data = chart.data; + if (data.labels.length && data.datasets.length) { + const { labels: { pointStyle, color: color2 } } = chart.legend.options; + return data.labels.map((label, i) => { + const meta = chart.getDatasetMeta(0); + const style = meta.controller.getStyle(i); + return { + text: label, + fillStyle: style.backgroundColor, + strokeStyle: style.borderColor, + fontColor: color2, + lineWidth: style.borderWidth, + pointStyle, + hidden: !chart.getDataVisibility(i), + index: i + }; + }); + } + return []; + } + }, + onClick(e, legendItem, legend) { + legend.chart.toggleDataVisibility(legendItem.index); + legend.chart.update(); + } + } + } +}); +var PieController = class extends DoughnutController { +}; +__publicField(PieController, "id", "pie"); +__publicField(PieController, "defaults", { + cutout: 0, + rotation: 0, + circumference: 360, + radius: "100%" +}); +function abstract() { + throw new Error("This method is not implemented: Check that a complete date adapter is provided."); +} +var DateAdapterBase = class _DateAdapterBase { + constructor(options) { + __publicField(this, "options"); + this.options = options || {}; + } + /** + * Override default date adapter methods. + * Accepts type parameter to define options type. + * @example + * Chart._adapters._date.override<{myAdapterOption: string}>({ + * init() { + * console.log(this.options.myAdapterOption); + * } + * }) + */ + static override(members) { + Object.assign(_DateAdapterBase.prototype, members); + } + // eslint-disable-next-line @typescript-eslint/no-empty-function + init() { + } + formats() { + return abstract(); + } + parse() { + return abstract(); + } + format() { + return abstract(); + } + add() { + return abstract(); + } + diff() { + return abstract(); + } + startOf() { + return abstract(); + } + endOf() { + return abstract(); + } +}; +var adapters = { + _date: DateAdapterBase +}; +function binarySearch(metaset, axis, value, intersect) { + const { controller, data, _sorted } = metaset; + const iScale = controller._cachedMeta.iScale; + if (iScale && axis === iScale.axis && axis !== "r" && _sorted && data.length) { + const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey; + if (!intersect) { + return lookupMethod(data, axis, value); + } else if (controller._sharedOptions) { + const el = data[0]; + const range = typeof el.getRange === "function" && el.getRange(axis); + if (range) { + const start = lookupMethod(data, axis, value - range); + const end = lookupMethod(data, axis, value + range); + return { + lo: start.lo, + hi: end.hi + }; + } + } + } + return { + lo: 0, + hi: data.length - 1 + }; +} +function evaluateInteractionItems(chart, axis, position, handler, intersect) { + const metasets = chart.getSortedVisibleDatasetMetas(); + const value = position[axis]; + for (let i = 0, ilen = metasets.length; i < ilen; ++i) { + const { index, data } = metasets[i]; + const { lo, hi } = binarySearch(metasets[i], axis, value, intersect); + for (let j = lo; j <= hi; ++j) { + const element = data[j]; + if (!element.skip) { + handler(element, index, j); + } + } + } +} +function getDistanceMetricForAxis(axis) { + const useX = axis.indexOf("x") !== -1; + const useY = axis.indexOf("y") !== -1; + return function(pt1, pt2) { + const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; +} +function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) { + const items = []; + if (!includeInvisible && !chart.isPointInArea(position)) { + return items; + } + const evaluationFunc = function(element, datasetIndex, index) { + if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) { + return; + } + if (element.inRange(position.x, position.y, useFinalPosition)) { + items.push({ + element, + datasetIndex, + index + }); + } + }; + evaluateInteractionItems(chart, axis, position, evaluationFunc, true); + return items; +} +function getNearestRadialItems(chart, position, axis, useFinalPosition) { + let items = []; + function evaluationFunc(element, datasetIndex, index) { + const { startAngle, endAngle } = element.getProps([ + "startAngle", + "endAngle" + ], useFinalPosition); + const { angle } = getAngleFromPoint(element, { + x: position.x, + y: position.y + }); + if (_angleBetween(angle, startAngle, endAngle)) { + items.push({ + element, + datasetIndex, + index + }); + } + } + evaluateInteractionItems(chart, axis, position, evaluationFunc); + return items; +} +function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) { + let items = []; + const distanceMetric = getDistanceMetricForAxis(axis); + let minDistance = Number.POSITIVE_INFINITY; + function evaluationFunc(element, datasetIndex, index) { + const inRange2 = element.inRange(position.x, position.y, useFinalPosition); + if (intersect && !inRange2) { + return; + } + const center = element.getCenterPoint(useFinalPosition); + const pointInArea = !!includeInvisible || chart.isPointInArea(center); + if (!pointInArea && !inRange2) { + return; + } + const distance = distanceMetric(position, center); + if (distance < minDistance) { + items = [ + { + element, + datasetIndex, + index + } + ]; + minDistance = distance; + } else if (distance === minDistance) { + items.push({ + element, + datasetIndex, + index + }); + } + } + evaluateInteractionItems(chart, axis, position, evaluationFunc); + return items; +} +function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) { + if (!includeInvisible && !chart.isPointInArea(position)) { + return []; + } + return axis === "r" && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible); +} +function getAxisItems(chart, position, axis, intersect, useFinalPosition) { + const items = []; + const rangeMethod = axis === "x" ? "inXRange" : "inYRange"; + let intersectsItem = false; + evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => { + if (element[rangeMethod](position[axis], useFinalPosition)) { + items.push({ + element, + datasetIndex, + index + }); + intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition); + } + }); + if (intersect && !intersectsItem) { + return []; + } + return items; +} +var Interaction = { + evaluateInteractionItems, + modes: { + index(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + const axis = options.axis || "x"; + const includeInvisible = options.includeInvisible || false; + const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible); + const elements = []; + if (!items.length) { + return []; + } + chart.getSortedVisibleDatasetMetas().forEach((meta) => { + const index = items[0].index; + const element = meta.data[index]; + if (element && !element.skip) { + elements.push({ + element, + datasetIndex: meta.index, + index + }); + } + }); + return elements; + }, + dataset(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + const axis = options.axis || "xy"; + const includeInvisible = options.includeInvisible || false; + let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible); + if (items.length > 0) { + const datasetIndex = items[0].datasetIndex; + const data = chart.getDatasetMeta(datasetIndex).data; + items = []; + for (let i = 0; i < data.length; ++i) { + items.push({ + element: data[i], + datasetIndex, + index: i + }); + } + } + return items; + }, + point(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + const axis = options.axis || "xy"; + const includeInvisible = options.includeInvisible || false; + return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible); + }, + nearest(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + const axis = options.axis || "xy"; + const includeInvisible = options.includeInvisible || false; + return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible); + }, + x(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + return getAxisItems(chart, position, "x", options.intersect, useFinalPosition); + }, + y(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + return getAxisItems(chart, position, "y", options.intersect, useFinalPosition); + } + } +}; +var STATIC_POSITIONS = [ + "left", + "top", + "right", + "bottom" +]; +function filterByPosition(array, position) { + return array.filter((v) => v.pos === position); +} +function filterDynamicPositionByAxis(array, axis) { + return array.filter((v) => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis); +} +function sortByWeight(array, reverse) { + return array.sort((a, b) => { + const v0 = reverse ? b : a; + const v1 = reverse ? a : b; + return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight; + }); +} +function wrapBoxes(boxes) { + const layoutBoxes = []; + let i, ilen, box, pos, stack, stackWeight; + for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) { + box = boxes[i]; + ({ position: pos, options: { stack, stackWeight = 1 } } = box); + layoutBoxes.push({ + index: i, + box, + pos, + horizontal: box.isHorizontal(), + weight: box.weight, + stack: stack && pos + stack, + stackWeight + }); + } + return layoutBoxes; +} +function buildStacks(layouts2) { + const stacks = {}; + for (const wrap of layouts2) { + const { stack, pos, stackWeight } = wrap; + if (!stack || !STATIC_POSITIONS.includes(pos)) { + continue; + } + const _stack = stacks[stack] || (stacks[stack] = { + count: 0, + placed: 0, + weight: 0, + size: 0 + }); + _stack.count++; + _stack.weight += stackWeight; + } + return stacks; +} +function setLayoutDims(layouts2, params) { + const stacks = buildStacks(layouts2); + const { vBoxMaxWidth, hBoxMaxHeight } = params; + let i, ilen, layout; + for (i = 0, ilen = layouts2.length; i < ilen; ++i) { + layout = layouts2[i]; + const { fullSize } = layout.box; + const stack = stacks[layout.stack]; + const factor = stack && layout.stackWeight / stack.weight; + if (layout.horizontal) { + layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth; + layout.height = hBoxMaxHeight; + } else { + layout.width = vBoxMaxWidth; + layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight; + } + } + return stacks; +} +function buildLayoutBoxes(boxes) { + const layoutBoxes = wrapBoxes(boxes); + const fullSize = sortByWeight(layoutBoxes.filter((wrap) => wrap.box.fullSize), true); + const left = sortByWeight(filterByPosition(layoutBoxes, "left"), true); + const right = sortByWeight(filterByPosition(layoutBoxes, "right")); + const top = sortByWeight(filterByPosition(layoutBoxes, "top"), true); + const bottom = sortByWeight(filterByPosition(layoutBoxes, "bottom")); + const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, "x"); + const centerVertical = filterDynamicPositionByAxis(layoutBoxes, "y"); + return { + fullSize, + leftAndTop: left.concat(top), + rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal), + chartArea: filterByPosition(layoutBoxes, "chartArea"), + vertical: left.concat(right).concat(centerVertical), + horizontal: top.concat(bottom).concat(centerHorizontal) + }; +} +function getCombinedMax(maxPadding, chartArea, a, b) { + return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]); +} +function updateMaxPadding(maxPadding, boxPadding) { + maxPadding.top = Math.max(maxPadding.top, boxPadding.top); + maxPadding.left = Math.max(maxPadding.left, boxPadding.left); + maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom); + maxPadding.right = Math.max(maxPadding.right, boxPadding.right); +} +function updateDims(chartArea, params, layout, stacks) { + const { pos, box } = layout; + const maxPadding = chartArea.maxPadding; + if (!isObject(pos)) { + if (layout.size) { + chartArea[pos] -= layout.size; + } + const stack = stacks[layout.stack] || { + size: 0, + count: 1 + }; + stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width); + layout.size = stack.size / stack.count; + chartArea[pos] += layout.size; + } + if (box.getPadding) { + updateMaxPadding(maxPadding, box.getPadding()); + } + const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, "left", "right")); + const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, "top", "bottom")); + const widthChanged = newWidth !== chartArea.w; + const heightChanged = newHeight !== chartArea.h; + chartArea.w = newWidth; + chartArea.h = newHeight; + return layout.horizontal ? { + same: widthChanged, + other: heightChanged + } : { + same: heightChanged, + other: widthChanged + }; +} +function handleMaxPadding(chartArea) { + const maxPadding = chartArea.maxPadding; + function updatePos(pos) { + const change = Math.max(maxPadding[pos] - chartArea[pos], 0); + chartArea[pos] += change; + return change; + } + chartArea.y += updatePos("top"); + chartArea.x += updatePos("left"); + updatePos("right"); + updatePos("bottom"); +} +function getMargins(horizontal, chartArea) { + const maxPadding = chartArea.maxPadding; + function marginForPositions(positions2) { + const margin = { + left: 0, + top: 0, + right: 0, + bottom: 0 + }; + positions2.forEach((pos) => { + margin[pos] = Math.max(chartArea[pos], maxPadding[pos]); + }); + return margin; + } + return horizontal ? marginForPositions([ + "left", + "right" + ]) : marginForPositions([ + "top", + "bottom" + ]); +} +function fitBoxes(boxes, chartArea, params, stacks) { + const refitBoxes = []; + let i, ilen, layout, box, refit, changed; + for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) { + layout = boxes[i]; + box = layout.box; + box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea)); + const { same, other } = updateDims(chartArea, params, layout, stacks); + refit |= same && refitBoxes.length; + changed = changed || other; + if (!box.fullSize) { + refitBoxes.push(layout); + } + } + return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed; +} +function setBoxDims(box, left, top, width, height) { + box.top = top; + box.left = left; + box.right = left + width; + box.bottom = top + height; + box.width = width; + box.height = height; +} +function placeBoxes(boxes, chartArea, params, stacks) { + const userPadding = params.padding; + let { x, y } = chartArea; + for (const layout of boxes) { + const box = layout.box; + const stack = stacks[layout.stack] || { + count: 1, + placed: 0, + weight: 1 + }; + const weight = layout.stackWeight / stack.weight || 1; + if (layout.horizontal) { + const width = chartArea.w * weight; + const height = stack.size || box.height; + if (defined(stack.start)) { + y = stack.start; + } + if (box.fullSize) { + setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height); + } else { + setBoxDims(box, chartArea.left + stack.placed, y, width, height); + } + stack.start = y; + stack.placed += width; + y = box.bottom; + } else { + const height = chartArea.h * weight; + const width = stack.size || box.width; + if (defined(stack.start)) { + x = stack.start; + } + if (box.fullSize) { + setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top); + } else { + setBoxDims(box, x, chartArea.top + stack.placed, width, height); + } + stack.start = x; + stack.placed += height; + x = box.right; + } + } + chartArea.x = x; + chartArea.y = y; +} +var layouts = { + addBox(chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + item.fullSize = item.fullSize || false; + item.position = item.position || "top"; + item.weight = item.weight || 0; + item._layers = item._layers || function() { + return [ + { + z: 0, + draw(chartArea) { + item.draw(chartArea); + } + } + ]; + }; + chart.boxes.push(item); + }, + removeBox(chart, layoutItem) { + const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + configure(chart, item, options) { + item.fullSize = options.fullSize; + item.position = options.position; + item.weight = options.weight; + }, + update(chart, width, height, minPadding) { + if (!chart) { + return; + } + const padding = toPadding(chart.options.layout.padding); + const availableWidth = Math.max(width - padding.width, 0); + const availableHeight = Math.max(height - padding.height, 0); + const boxes = buildLayoutBoxes(chart.boxes); + const verticalBoxes = boxes.vertical; + const horizontalBoxes = boxes.horizontal; + each(chart.boxes, (box) => { + if (typeof box.beforeLayout === "function") { + box.beforeLayout(); + } + }); + const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) => wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1; + const params = Object.freeze({ + outerWidth: width, + outerHeight: height, + padding, + availableWidth, + availableHeight, + vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount, + hBoxMaxHeight: availableHeight / 2 + }); + const maxPadding = Object.assign({}, padding); + updateMaxPadding(maxPadding, toPadding(minPadding)); + const chartArea = Object.assign({ + maxPadding, + w: availableWidth, + h: availableHeight, + x: padding.left, + y: padding.top + }, padding); + const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params); + fitBoxes(boxes.fullSize, chartArea, params, stacks); + fitBoxes(verticalBoxes, chartArea, params, stacks); + if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) { + fitBoxes(verticalBoxes, chartArea, params, stacks); + } + handleMaxPadding(chartArea); + placeBoxes(boxes.leftAndTop, chartArea, params, stacks); + chartArea.x += chartArea.w; + chartArea.y += chartArea.h; + placeBoxes(boxes.rightAndBottom, chartArea, params, stacks); + chart.chartArea = { + left: chartArea.left, + top: chartArea.top, + right: chartArea.left + chartArea.w, + bottom: chartArea.top + chartArea.h, + height: chartArea.h, + width: chartArea.w + }; + each(boxes.chartArea, (layout) => { + const box = layout.box; + Object.assign(box, chart.chartArea); + box.update(chartArea.w, chartArea.h, { + left: 0, + top: 0, + right: 0, + bottom: 0 + }); + }); + } +}; +var BasePlatform = class { + acquireContext(canvas, aspectRatio) { + } + releaseContext(context) { + return false; + } + addEventListener(chart, type, listener) { + } + removeEventListener(chart, type, listener) { + } + getDevicePixelRatio() { + return 1; + } + getMaximumSize(element, width, height, aspectRatio) { + width = Math.max(0, width || element.width); + height = height || element.height; + return { + width, + height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height) + }; + } + isAttached(canvas) { + return true; + } + updateConfig(config) { + } +}; +var BasicPlatform = class extends BasePlatform { + acquireContext(item) { + return item && item.getContext && item.getContext("2d") || null; + } + updateConfig(config) { + config.options.animation = false; + } +}; +var EXPANDO_KEY = "$chartjs"; +var EVENT_TYPES = { + touchstart: "mousedown", + touchmove: "mousemove", + touchend: "mouseup", + pointerenter: "mouseenter", + pointerdown: "mousedown", + pointermove: "mousemove", + pointerup: "mouseup", + pointerleave: "mouseout", + pointerout: "mouseout" +}; +var isNullOrEmpty = (value) => value === null || value === ""; +function initCanvas(canvas, aspectRatio) { + const style = canvas.style; + const renderHeight = canvas.getAttribute("height"); + const renderWidth = canvas.getAttribute("width"); + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + style.display = style.display || "block"; + style.boxSizing = style.boxSizing || "border-box"; + if (isNullOrEmpty(renderWidth)) { + const displayWidth = readUsedSize(canvas, "width"); + if (displayWidth !== void 0) { + canvas.width = displayWidth; + } + } + if (isNullOrEmpty(renderHeight)) { + if (canvas.style.height === "") { + canvas.height = canvas.width / (aspectRatio || 2); + } else { + const displayHeight = readUsedSize(canvas, "height"); + if (displayHeight !== void 0) { + canvas.height = displayHeight; + } + } + } + return canvas; +} +var eventListenerOptions = supportsEventListenerOptions ? { + passive: true +} : false; +function addListener(node, type, listener) { + if (node) { + node.addEventListener(type, listener, eventListenerOptions); + } +} +function removeListener(chart, type, listener) { + if (chart && chart.canvas) { + chart.canvas.removeEventListener(type, listener, eventListenerOptions); + } +} +function fromNativeEvent(event, chart) { + const type = EVENT_TYPES[event.type] || event.type; + const { x, y } = getRelativePosition(event, chart); + return { + type, + chart, + native: event, + x: x !== void 0 ? x : null, + y: y !== void 0 ? y : null + }; +} +function nodeListContains(nodeList, canvas) { + for (const node of nodeList) { + if (node === canvas || node.contains(canvas)) { + return true; + } + } +} +function createAttachObserver(chart, type, listener) { + const canvas = chart.canvas; + const observer = new MutationObserver((entries) => { + let trigger = false; + for (const entry of entries) { + trigger = trigger || nodeListContains(entry.addedNodes, canvas); + trigger = trigger && !nodeListContains(entry.removedNodes, canvas); + } + if (trigger) { + listener(); + } + }); + observer.observe(document, { + childList: true, + subtree: true + }); + return observer; +} +function createDetachObserver(chart, type, listener) { + const canvas = chart.canvas; + const observer = new MutationObserver((entries) => { + let trigger = false; + for (const entry of entries) { + trigger = trigger || nodeListContains(entry.removedNodes, canvas); + trigger = trigger && !nodeListContains(entry.addedNodes, canvas); + } + if (trigger) { + listener(); + } + }); + observer.observe(document, { + childList: true, + subtree: true + }); + return observer; +} +var drpListeningCharts = /* @__PURE__ */ new Map(); +var oldDevicePixelRatio = 0; +function onWindowResize() { + const dpr = window.devicePixelRatio; + if (dpr === oldDevicePixelRatio) { + return; + } + oldDevicePixelRatio = dpr; + drpListeningCharts.forEach((resize, chart) => { + if (chart.currentDevicePixelRatio !== dpr) { + resize(); + } + }); +} +function listenDevicePixelRatioChanges(chart, resize) { + if (!drpListeningCharts.size) { + window.addEventListener("resize", onWindowResize); + } + drpListeningCharts.set(chart, resize); +} +function unlistenDevicePixelRatioChanges(chart) { + drpListeningCharts.delete(chart); + if (!drpListeningCharts.size) { + window.removeEventListener("resize", onWindowResize); + } +} +function createResizeObserver(chart, type, listener) { + const canvas = chart.canvas; + const container = canvas && _getParentNode(canvas); + if (!container) { + return; + } + const resize = throttled((width, height) => { + const w = container.clientWidth; + listener(width, height); + if (w < container.clientWidth) { + listener(); + } + }, window); + const observer = new ResizeObserver((entries) => { + const entry = entries[0]; + const width = entry.contentRect.width; + const height = entry.contentRect.height; + if (width === 0 && height === 0) { + return; + } + resize(width, height); + }); + observer.observe(container); + listenDevicePixelRatioChanges(chart, resize); + return observer; +} +function releaseObserver(chart, type, observer) { + if (observer) { + observer.disconnect(); + } + if (type === "resize") { + unlistenDevicePixelRatioChanges(chart); + } +} +function createProxyAndListen(chart, type, listener) { + const canvas = chart.canvas; + const proxy = throttled((event) => { + if (chart.ctx !== null) { + listener(fromNativeEvent(event, chart)); + } + }, chart); + addListener(canvas, type, proxy); + return proxy; +} +var DomPlatform = class extends BasePlatform { + acquireContext(canvas, aspectRatio) { + const context = canvas && canvas.getContext && canvas.getContext("2d"); + if (context && context.canvas === canvas) { + initCanvas(canvas, aspectRatio); + return context; + } + return null; + } + releaseContext(context) { + const canvas = context.canvas; + if (!canvas[EXPANDO_KEY]) { + return false; + } + const initial = canvas[EXPANDO_KEY].initial; + [ + "height", + "width" + ].forEach((prop) => { + const value = initial[prop]; + if (isNullOrUndef(value)) { + canvas.removeAttribute(prop); + } else { + canvas.setAttribute(prop, value); + } + }); + const style = initial.style || {}; + Object.keys(style).forEach((key) => { + canvas.style[key] = style[key]; + }); + canvas.width = canvas.width; + delete canvas[EXPANDO_KEY]; + return true; + } + addEventListener(chart, type, listener) { + this.removeEventListener(chart, type); + const proxies = chart.$proxies || (chart.$proxies = {}); + const handlers = { + attach: createAttachObserver, + detach: createDetachObserver, + resize: createResizeObserver + }; + const handler = handlers[type] || createProxyAndListen; + proxies[type] = handler(chart, type, listener); + } + removeEventListener(chart, type) { + const proxies = chart.$proxies || (chart.$proxies = {}); + const proxy = proxies[type]; + if (!proxy) { + return; + } + const handlers = { + attach: releaseObserver, + detach: releaseObserver, + resize: releaseObserver + }; + const handler = handlers[type] || removeListener; + handler(chart, type, proxy); + proxies[type] = void 0; + } + getDevicePixelRatio() { + return window.devicePixelRatio; + } + getMaximumSize(canvas, width, height, aspectRatio) { + return getMaximumSize(canvas, width, height, aspectRatio); + } + isAttached(canvas) { + const container = _getParentNode(canvas); + return !!(container && container.isConnected); + } +}; +function _detectPlatform(canvas) { + if (!_isDomSupported() || typeof OffscreenCanvas !== "undefined" && canvas instanceof OffscreenCanvas) { + return BasicPlatform; + } + return DomPlatform; +} +var Element = class { + constructor() { + __publicField(this, "x"); + __publicField(this, "y"); + __publicField(this, "active", false); + __publicField(this, "options"); + __publicField(this, "$animations"); + } + tooltipPosition(useFinalPosition) { + const { x, y } = this.getProps([ + "x", + "y" + ], useFinalPosition); + return { + x, + y + }; + } + hasValue() { + return isNumber(this.x) && isNumber(this.y); + } + getProps(props, final) { + const anims = this.$animations; + if (!final || !anims) { + return this; + } + const ret = {}; + props.forEach((prop) => { + ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop]; + }); + return ret; + } +}; +__publicField(Element, "defaults", {}); +__publicField(Element, "defaultRoutes"); +function autoSkip(scale, ticks) { + const tickOpts = scale.options.ticks; + const determinedMaxTicks = determineMaxTicks(scale); + const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks); + const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : []; + const numMajorIndices = majorIndices.length; + const first = majorIndices[0]; + const last = majorIndices[numMajorIndices - 1]; + const newTicks = []; + if (numMajorIndices > ticksLimit) { + skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit); + return newTicks; + } + const spacing = calculateSpacing(majorIndices, ticks, ticksLimit); + if (numMajorIndices > 0) { + let i, ilen; + const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null; + skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first); + for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) { + skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]); + } + skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing); + return newTicks; + } + skip(ticks, newTicks, spacing); + return newTicks; +} +function determineMaxTicks(scale) { + const offset = scale.options.offset; + const tickLength = scale._tickSize(); + const maxScale = scale._length / tickLength + (offset ? 0 : 1); + const maxChart = scale._maxLength / tickLength; + return Math.floor(Math.min(maxScale, maxChart)); +} +function calculateSpacing(majorIndices, ticks, ticksLimit) { + const evenMajorSpacing = getEvenSpacing(majorIndices); + const spacing = ticks.length / ticksLimit; + if (!evenMajorSpacing) { + return Math.max(spacing, 1); + } + const factors = _factorize(evenMajorSpacing); + for (let i = 0, ilen = factors.length - 1; i < ilen; i++) { + const factor = factors[i]; + if (factor > spacing) { + return factor; + } + } + return Math.max(spacing, 1); +} +function getMajorIndices(ticks) { + const result = []; + let i, ilen; + for (i = 0, ilen = ticks.length; i < ilen; i++) { + if (ticks[i].major) { + result.push(i); + } + } + return result; +} +function skipMajors(ticks, newTicks, majorIndices, spacing) { + let count = 0; + let next = majorIndices[0]; + let i; + spacing = Math.ceil(spacing); + for (i = 0; i < ticks.length; i++) { + if (i === next) { + newTicks.push(ticks[i]); + count++; + next = majorIndices[count * spacing]; + } + } +} +function skip(ticks, newTicks, spacing, majorStart, majorEnd) { + const start = valueOrDefault(majorStart, 0); + const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length); + let count = 0; + let length, i, next; + spacing = Math.ceil(spacing); + if (majorEnd) { + length = majorEnd - majorStart; + spacing = length / Math.floor(length / spacing); + } + next = start; + while (next < 0) { + count++; + next = Math.round(start + count * spacing); + } + for (i = Math.max(start, 0); i < end; i++) { + if (i === next) { + newTicks.push(ticks[i]); + count++; + next = Math.round(start + count * spacing); + } + } +} +function getEvenSpacing(arr) { + const len = arr.length; + let i, diff; + if (len < 2) { + return false; + } + for (diff = arr[0], i = 1; i < len; ++i) { + if (arr[i] - arr[i - 1] !== diff) { + return false; + } + } + return diff; +} +var reverseAlign = (align) => align === "left" ? "right" : align === "right" ? "left" : align; +var offsetFromEdge = (scale, edge, offset) => edge === "top" || edge === "left" ? scale[edge] + offset : scale[edge] - offset; +var getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength); +function sample(arr, numItems) { + const result = []; + const increment = arr.length / numItems; + const len = arr.length; + let i = 0; + for (; i < len; i += increment) { + result.push(arr[Math.floor(i)]); + } + return result; +} +function getPixelForGridLine(scale, index, offsetGridLines) { + const length = scale.ticks.length; + const validIndex2 = Math.min(index, length - 1); + const start = scale._startPixel; + const end = scale._endPixel; + const epsilon = 1e-6; + let lineValue = scale.getPixelForTick(validIndex2); + let offset; + if (offsetGridLines) { + if (length === 1) { + offset = Math.max(lineValue - start, end - lineValue); + } else if (index === 0) { + offset = (scale.getPixelForTick(1) - lineValue) / 2; + } else { + offset = (lineValue - scale.getPixelForTick(validIndex2 - 1)) / 2; + } + lineValue += validIndex2 < index ? offset : -offset; + if (lineValue < start - epsilon || lineValue > end + epsilon) { + return; + } + } + return lineValue; +} +function garbageCollect(caches, length) { + each(caches, (cache) => { + const gc = cache.gc; + const gcLen = gc.length / 2; + let i; + if (gcLen > length) { + for (i = 0; i < gcLen; ++i) { + delete cache.data[gc[i]]; + } + gc.splice(0, gcLen); + } + }); +} +function getTickMarkLength(options) { + return options.drawTicks ? options.tickLength : 0; +} +function getTitleHeight(options, fallback) { + if (!options.display) { + return 0; + } + const font = toFont(options.font, fallback); + const padding = toPadding(options.padding); + const lines = isArray(options.text) ? options.text.length : 1; + return lines * font.lineHeight + padding.height; +} +function createScaleContext(parent, scale) { + return createContext(parent, { + scale, + type: "scale" + }); +} +function createTickContext(parent, index, tick) { + return createContext(parent, { + tick, + index, + type: "tick" + }); +} +function titleAlign(align, position, reverse) { + let ret = _toLeftRightCenter(align); + if (reverse && position !== "right" || !reverse && position === "right") { + ret = reverseAlign(ret); + } + return ret; +} +function titleArgs(scale, offset, position, align) { + const { top, left, bottom, right, chart } = scale; + const { chartArea, scales } = chart; + let rotation = 0; + let maxWidth, titleX, titleY; + const height = bottom - top; + const width = right - left; + if (scale.isHorizontal()) { + titleX = _alignStartEnd(align, left, right); + if (isObject(position)) { + const positionAxisID = Object.keys(position)[0]; + const value = position[positionAxisID]; + titleY = scales[positionAxisID].getPixelForValue(value) + height - offset; + } else if (position === "center") { + titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset; + } else { + titleY = offsetFromEdge(scale, position, offset); + } + maxWidth = right - left; + } else { + if (isObject(position)) { + const positionAxisID = Object.keys(position)[0]; + const value = position[positionAxisID]; + titleX = scales[positionAxisID].getPixelForValue(value) - width + offset; + } else if (position === "center") { + titleX = (chartArea.left + chartArea.right) / 2 - width + offset; + } else { + titleX = offsetFromEdge(scale, position, offset); + } + titleY = _alignStartEnd(align, bottom, top); + rotation = position === "left" ? -HALF_PI : HALF_PI; + } + return { + titleX, + titleY, + maxWidth, + rotation + }; +} +var Scale = class _Scale extends Element { + constructor(cfg) { + super(); + this.id = cfg.id; + this.type = cfg.type; + this.options = void 0; + this.ctx = cfg.ctx; + this.chart = cfg.chart; + this.top = void 0; + this.bottom = void 0; + this.left = void 0; + this.right = void 0; + this.width = void 0; + this.height = void 0; + this._margins = { + left: 0, + right: 0, + top: 0, + bottom: 0 + }; + this.maxWidth = void 0; + this.maxHeight = void 0; + this.paddingTop = void 0; + this.paddingBottom = void 0; + this.paddingLeft = void 0; + this.paddingRight = void 0; + this.axis = void 0; + this.labelRotation = void 0; + this.min = void 0; + this.max = void 0; + this._range = void 0; + this.ticks = []; + this._gridLineItems = null; + this._labelItems = null; + this._labelSizes = null; + this._length = 0; + this._maxLength = 0; + this._longestTextCache = {}; + this._startPixel = void 0; + this._endPixel = void 0; + this._reversePixels = false; + this._userMax = void 0; + this._userMin = void 0; + this._suggestedMax = void 0; + this._suggestedMin = void 0; + this._ticksLength = 0; + this._borderValue = 0; + this._cache = {}; + this._dataLimitsCached = false; + this.$context = void 0; + } + init(options) { + this.options = options.setContext(this.getContext()); + this.axis = options.axis; + this._userMin = this.parse(options.min); + this._userMax = this.parse(options.max); + this._suggestedMin = this.parse(options.suggestedMin); + this._suggestedMax = this.parse(options.suggestedMax); + } + parse(raw, index) { + return raw; + } + getUserBounds() { + let { _userMin, _userMax, _suggestedMin, _suggestedMax } = this; + _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY); + _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY); + _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY); + _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY); + return { + min: finiteOrDefault(_userMin, _suggestedMin), + max: finiteOrDefault(_userMax, _suggestedMax), + minDefined: isNumberFinite(_userMin), + maxDefined: isNumberFinite(_userMax) + }; + } + getMinMax(canStack) { + let { min, max, minDefined, maxDefined } = this.getUserBounds(); + let range; + if (minDefined && maxDefined) { + return { + min, + max + }; + } + const metas = this.getMatchingVisibleMetas(); + for (let i = 0, ilen = metas.length; i < ilen; ++i) { + range = metas[i].controller.getMinMax(this, canStack); + if (!minDefined) { + min = Math.min(min, range.min); + } + if (!maxDefined) { + max = Math.max(max, range.max); + } + } + min = maxDefined && min > max ? max : min; + max = minDefined && min > max ? min : max; + return { + min: finiteOrDefault(min, finiteOrDefault(max, min)), + max: finiteOrDefault(max, finiteOrDefault(min, max)) + }; + } + getPadding() { + return { + left: this.paddingLeft || 0, + top: this.paddingTop || 0, + right: this.paddingRight || 0, + bottom: this.paddingBottom || 0 + }; + } + getTicks() { + return this.ticks; + } + getLabels() { + const data = this.chart.data; + return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || []; + } + getLabelItems(chartArea = this.chart.chartArea) { + const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea)); + return items; + } + beforeLayout() { + this._cache = {}; + this._dataLimitsCached = false; + } + beforeUpdate() { + callback(this.options.beforeUpdate, [ + this + ]); + } + update(maxWidth, maxHeight, margins) { + const { beginAtZero, grace, ticks: tickOpts } = this.options; + const sampleSize = tickOpts.sampleSize; + this.beforeUpdate(); + this.maxWidth = maxWidth; + this.maxHeight = maxHeight; + this._margins = margins = Object.assign({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, margins); + this.ticks = null; + this._labelSizes = null; + this._gridLineItems = null; + this._labelItems = null; + this.beforeSetDimensions(); + this.setDimensions(); + this.afterSetDimensions(); + this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom; + if (!this._dataLimitsCached) { + this.beforeDataLimits(); + this.determineDataLimits(); + this.afterDataLimits(); + this._range = _addGrace(this, grace, beginAtZero); + this._dataLimitsCached = true; + } + this.beforeBuildTicks(); + this.ticks = this.buildTicks() || []; + this.afterBuildTicks(); + const samplingEnabled = sampleSize < this.ticks.length; + this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks); + this.configure(); + this.beforeCalculateLabelRotation(); + this.calculateLabelRotation(); + this.afterCalculateLabelRotation(); + if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === "auto")) { + this.ticks = autoSkip(this, this.ticks); + this._labelSizes = null; + this.afterAutoSkip(); + } + if (samplingEnabled) { + this._convertTicksToLabels(this.ticks); + } + this.beforeFit(); + this.fit(); + this.afterFit(); + this.afterUpdate(); + } + configure() { + let reversePixels = this.options.reverse; + let startPixel, endPixel; + if (this.isHorizontal()) { + startPixel = this.left; + endPixel = this.right; + } else { + startPixel = this.top; + endPixel = this.bottom; + reversePixels = !reversePixels; + } + this._startPixel = startPixel; + this._endPixel = endPixel; + this._reversePixels = reversePixels; + this._length = endPixel - startPixel; + this._alignToPixels = this.options.alignToPixels; + } + afterUpdate() { + callback(this.options.afterUpdate, [ + this + ]); + } + beforeSetDimensions() { + callback(this.options.beforeSetDimensions, [ + this + ]); + } + setDimensions() { + if (this.isHorizontal()) { + this.width = this.maxWidth; + this.left = 0; + this.right = this.width; + } else { + this.height = this.maxHeight; + this.top = 0; + this.bottom = this.height; + } + this.paddingLeft = 0; + this.paddingTop = 0; + this.paddingRight = 0; + this.paddingBottom = 0; + } + afterSetDimensions() { + callback(this.options.afterSetDimensions, [ + this + ]); + } + _callHooks(name) { + this.chart.notifyPlugins(name, this.getContext()); + callback(this.options[name], [ + this + ]); + } + beforeDataLimits() { + this._callHooks("beforeDataLimits"); + } + determineDataLimits() { + } + afterDataLimits() { + this._callHooks("afterDataLimits"); + } + beforeBuildTicks() { + this._callHooks("beforeBuildTicks"); + } + buildTicks() { + return []; + } + afterBuildTicks() { + this._callHooks("afterBuildTicks"); + } + beforeTickToLabelConversion() { + callback(this.options.beforeTickToLabelConversion, [ + this + ]); + } + generateTickLabels(ticks) { + const tickOpts = this.options.ticks; + let i, ilen, tick; + for (i = 0, ilen = ticks.length; i < ilen; i++) { + tick = ticks[i]; + tick.label = callback(tickOpts.callback, [ + tick.value, + i, + ticks + ], this); + } + } + afterTickToLabelConversion() { + callback(this.options.afterTickToLabelConversion, [ + this + ]); + } + beforeCalculateLabelRotation() { + callback(this.options.beforeCalculateLabelRotation, [ + this + ]); + } + calculateLabelRotation() { + const options = this.options; + const tickOpts = options.ticks; + const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit); + const minRotation = tickOpts.minRotation || 0; + const maxRotation = tickOpts.maxRotation; + let labelRotation = minRotation; + let tickWidth, maxHeight, maxLabelDiagonal; + if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) { + this.labelRotation = minRotation; + return; + } + const labelSizes = this._getLabelSizes(); + const maxLabelWidth = labelSizes.widest.width; + const maxLabelHeight = labelSizes.highest.height; + const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth); + tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1); + if (maxLabelWidth + 6 > tickWidth) { + tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1)); + maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font); + maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight); + labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1)))); + labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation)); + } + this.labelRotation = labelRotation; + } + afterCalculateLabelRotation() { + callback(this.options.afterCalculateLabelRotation, [ + this + ]); + } + afterAutoSkip() { + } + beforeFit() { + callback(this.options.beforeFit, [ + this + ]); + } + fit() { + const minSize = { + width: 0, + height: 0 + }; + const { chart, options: { ticks: tickOpts, title: titleOpts, grid: gridOpts } } = this; + const display = this._isVisible(); + const isHorizontal = this.isHorizontal(); + if (display) { + const titleHeight = getTitleHeight(titleOpts, chart.options.font); + if (isHorizontal) { + minSize.width = this.maxWidth; + minSize.height = getTickMarkLength(gridOpts) + titleHeight; + } else { + minSize.height = this.maxHeight; + minSize.width = getTickMarkLength(gridOpts) + titleHeight; + } + if (tickOpts.display && this.ticks.length) { + const { first, last, widest, highest } = this._getLabelSizes(); + const tickPadding = tickOpts.padding * 2; + const angleRadians = toRadians(this.labelRotation); + const cos = Math.cos(angleRadians); + const sin = Math.sin(angleRadians); + if (isHorizontal) { + const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height; + minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding); + } else { + const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height; + minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding); + } + this._calculatePadding(first, last, sin, cos); + } + } + this._handleMargins(); + if (isHorizontal) { + this.width = this._length = chart.width - this._margins.left - this._margins.right; + this.height = minSize.height; + } else { + this.width = minSize.width; + this.height = this._length = chart.height - this._margins.top - this._margins.bottom; + } + } + _calculatePadding(first, last, sin, cos) { + const { ticks: { align, padding }, position } = this.options; + const isRotated = this.labelRotation !== 0; + const labelsBelowTicks = position !== "top" && this.axis === "x"; + if (this.isHorizontal()) { + const offsetLeft = this.getPixelForTick(0) - this.left; + const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1); + let paddingLeft = 0; + let paddingRight = 0; + if (isRotated) { + if (labelsBelowTicks) { + paddingLeft = cos * first.width; + paddingRight = sin * last.height; + } else { + paddingLeft = sin * first.height; + paddingRight = cos * last.width; + } + } else if (align === "start") { + paddingRight = last.width; + } else if (align === "end") { + paddingLeft = first.width; + } else if (align !== "inner") { + paddingLeft = first.width / 2; + paddingRight = last.width / 2; + } + this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0); + this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0); + } else { + let paddingTop = last.height / 2; + let paddingBottom = first.height / 2; + if (align === "start") { + paddingTop = 0; + paddingBottom = first.height; + } else if (align === "end") { + paddingTop = last.height; + paddingBottom = 0; + } + this.paddingTop = paddingTop + padding; + this.paddingBottom = paddingBottom + padding; + } + } + _handleMargins() { + if (this._margins) { + this._margins.left = Math.max(this.paddingLeft, this._margins.left); + this._margins.top = Math.max(this.paddingTop, this._margins.top); + this._margins.right = Math.max(this.paddingRight, this._margins.right); + this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom); + } + } + afterFit() { + callback(this.options.afterFit, [ + this + ]); + } + isHorizontal() { + const { axis, position } = this.options; + return position === "top" || position === "bottom" || axis === "x"; + } + isFullSize() { + return this.options.fullSize; + } + _convertTicksToLabels(ticks) { + this.beforeTickToLabelConversion(); + this.generateTickLabels(ticks); + let i, ilen; + for (i = 0, ilen = ticks.length; i < ilen; i++) { + if (isNullOrUndef(ticks[i].label)) { + ticks.splice(i, 1); + ilen--; + i--; + } + } + this.afterTickToLabelConversion(); + } + _getLabelSizes() { + let labelSizes = this._labelSizes; + if (!labelSizes) { + const sampleSize = this.options.ticks.sampleSize; + let ticks = this.ticks; + if (sampleSize < ticks.length) { + ticks = sample(ticks, sampleSize); + } + this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit); + } + return labelSizes; + } + _computeLabelSizes(ticks, length, maxTicksLimit) { + const { ctx, _longestTextCache: caches } = this; + const widths = []; + const heights = []; + const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit)); + let widestLabelSize = 0; + let highestLabelSize = 0; + let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel; + for (i = 0; i < length; i += increment) { + label = ticks[i].label; + tickFont = this._resolveTickFontOptions(i); + ctx.font = fontString = tickFont.string; + cache = caches[fontString] = caches[fontString] || { + data: {}, + gc: [] + }; + lineHeight = tickFont.lineHeight; + width = height = 0; + if (!isNullOrUndef(label) && !isArray(label)) { + width = _measureText(ctx, cache.data, cache.gc, width, label); + height = lineHeight; + } else if (isArray(label)) { + for (j = 0, jlen = label.length; j < jlen; ++j) { + nestedLabel = label[j]; + if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) { + width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel); + height += lineHeight; + } + } + } + widths.push(width); + heights.push(height); + widestLabelSize = Math.max(width, widestLabelSize); + highestLabelSize = Math.max(height, highestLabelSize); + } + garbageCollect(caches, length); + const widest = widths.indexOf(widestLabelSize); + const highest = heights.indexOf(highestLabelSize); + const valueAt = (idx) => ({ + width: widths[idx] || 0, + height: heights[idx] || 0 + }); + return { + first: valueAt(0), + last: valueAt(length - 1), + widest: valueAt(widest), + highest: valueAt(highest), + widths, + heights + }; + } + getLabelForValue(value) { + return value; + } + getPixelForValue(value, index) { + return NaN; + } + getValueForPixel(pixel) { + } + getPixelForTick(index) { + const ticks = this.ticks; + if (index < 0 || index > ticks.length - 1) { + return null; + } + return this.getPixelForValue(ticks[index].value); + } + getPixelForDecimal(decimal) { + if (this._reversePixels) { + decimal = 1 - decimal; + } + const pixel = this._startPixel + decimal * this._length; + return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel); + } + getDecimalForPixel(pixel) { + const decimal = (pixel - this._startPixel) / this._length; + return this._reversePixels ? 1 - decimal : decimal; + } + getBasePixel() { + return this.getPixelForValue(this.getBaseValue()); + } + getBaseValue() { + const { min, max } = this; + return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0; + } + getContext(index) { + const ticks = this.ticks || []; + if (index >= 0 && index < ticks.length) { + const tick = ticks[index]; + return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick)); + } + return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this)); + } + _tickSize() { + const optionTicks = this.options.ticks; + const rot = toRadians(this.labelRotation); + const cos = Math.abs(Math.cos(rot)); + const sin = Math.abs(Math.sin(rot)); + const labelSizes = this._getLabelSizes(); + const padding = optionTicks.autoSkipPadding || 0; + const w = labelSizes ? labelSizes.widest.width + padding : 0; + const h4 = labelSizes ? labelSizes.highest.height + padding : 0; + return this.isHorizontal() ? h4 * cos > w * sin ? w / cos : h4 / sin : h4 * sin < w * cos ? h4 / cos : w / sin; + } + _isVisible() { + const display = this.options.display; + if (display !== "auto") { + return !!display; + } + return this.getMatchingVisibleMetas().length > 0; + } + _computeGridLineItems(chartArea) { + const axis = this.axis; + const chart = this.chart; + const options = this.options; + const { grid, position, border } = options; + const offset = grid.offset; + const isHorizontal = this.isHorizontal(); + const ticks = this.ticks; + const ticksLength = ticks.length + (offset ? 1 : 0); + const tl = getTickMarkLength(grid); + const items = []; + const borderOpts = border.setContext(this.getContext()); + const axisWidth = borderOpts.display ? borderOpts.width : 0; + const axisHalfWidth = axisWidth / 2; + const alignBorderValue = function(pixel) { + return _alignPixel(chart, pixel, axisWidth); + }; + let borderValue, i, lineValue, alignedLineValue; + let tx1, ty1, tx2, ty2, x1, y1, x2, y2; + if (position === "top") { + borderValue = alignBorderValue(this.bottom); + ty1 = this.bottom - tl; + ty2 = borderValue - axisHalfWidth; + y1 = alignBorderValue(chartArea.top) + axisHalfWidth; + y2 = chartArea.bottom; + } else if (position === "bottom") { + borderValue = alignBorderValue(this.top); + y1 = chartArea.top; + y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth; + ty1 = borderValue + axisHalfWidth; + ty2 = this.top + tl; + } else if (position === "left") { + borderValue = alignBorderValue(this.right); + tx1 = this.right - tl; + tx2 = borderValue - axisHalfWidth; + x1 = alignBorderValue(chartArea.left) + axisHalfWidth; + x2 = chartArea.right; + } else if (position === "right") { + borderValue = alignBorderValue(this.left); + x1 = chartArea.left; + x2 = alignBorderValue(chartArea.right) - axisHalfWidth; + tx1 = borderValue + axisHalfWidth; + tx2 = this.left + tl; + } else if (axis === "x") { + if (position === "center") { + borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5); + } else if (isObject(position)) { + const positionAxisID = Object.keys(position)[0]; + const value = position[positionAxisID]; + borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value)); + } + y1 = chartArea.top; + y2 = chartArea.bottom; + ty1 = borderValue + axisHalfWidth; + ty2 = ty1 + tl; + } else if (axis === "y") { + if (position === "center") { + borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2); + } else if (isObject(position)) { + const positionAxisID = Object.keys(position)[0]; + const value = position[positionAxisID]; + borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value)); + } + tx1 = borderValue - axisHalfWidth; + tx2 = tx1 - tl; + x1 = chartArea.left; + x2 = chartArea.right; + } + const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength); + const step = Math.max(1, Math.ceil(ticksLength / limit)); + for (i = 0; i < ticksLength; i += step) { + const context = this.getContext(i); + const optsAtIndex = grid.setContext(context); + const optsAtIndexBorder = border.setContext(context); + const lineWidth = optsAtIndex.lineWidth; + const lineColor = optsAtIndex.color; + const borderDash = optsAtIndexBorder.dash || []; + const borderDashOffset = optsAtIndexBorder.dashOffset; + const tickWidth = optsAtIndex.tickWidth; + const tickColor = optsAtIndex.tickColor; + const tickBorderDash = optsAtIndex.tickBorderDash || []; + const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset; + lineValue = getPixelForGridLine(this, i, offset); + if (lineValue === void 0) { + continue; + } + alignedLineValue = _alignPixel(chart, lineValue, lineWidth); + if (isHorizontal) { + tx1 = tx2 = x1 = x2 = alignedLineValue; + } else { + ty1 = ty2 = y1 = y2 = alignedLineValue; + } + items.push({ + tx1, + ty1, + tx2, + ty2, + x1, + y1, + x2, + y2, + width: lineWidth, + color: lineColor, + borderDash, + borderDashOffset, + tickWidth, + tickColor, + tickBorderDash, + tickBorderDashOffset + }); + } + this._ticksLength = ticksLength; + this._borderValue = borderValue; + return items; + } + _computeLabelItems(chartArea) { + const axis = this.axis; + const options = this.options; + const { position, ticks: optionTicks } = options; + const isHorizontal = this.isHorizontal(); + const ticks = this.ticks; + const { align, crossAlign, padding, mirror } = optionTicks; + const tl = getTickMarkLength(options.grid); + const tickAndPadding = tl + padding; + const hTickAndPadding = mirror ? -padding : tickAndPadding; + const rotation = -toRadians(this.labelRotation); + const items = []; + let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset; + let textBaseline = "middle"; + if (position === "top") { + y = this.bottom - hTickAndPadding; + textAlign = this._getXAxisLabelAlignment(); + } else if (position === "bottom") { + y = this.top + hTickAndPadding; + textAlign = this._getXAxisLabelAlignment(); + } else if (position === "left") { + const ret = this._getYAxisLabelAlignment(tl); + textAlign = ret.textAlign; + x = ret.x; + } else if (position === "right") { + const ret = this._getYAxisLabelAlignment(tl); + textAlign = ret.textAlign; + x = ret.x; + } else if (axis === "x") { + if (position === "center") { + y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding; + } else if (isObject(position)) { + const positionAxisID = Object.keys(position)[0]; + const value = position[positionAxisID]; + y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding; + } + textAlign = this._getXAxisLabelAlignment(); + } else if (axis === "y") { + if (position === "center") { + x = (chartArea.left + chartArea.right) / 2 - tickAndPadding; + } else if (isObject(position)) { + const positionAxisID = Object.keys(position)[0]; + const value = position[positionAxisID]; + x = this.chart.scales[positionAxisID].getPixelForValue(value); + } + textAlign = this._getYAxisLabelAlignment(tl).textAlign; + } + if (axis === "y") { + if (align === "start") { + textBaseline = "top"; + } else if (align === "end") { + textBaseline = "bottom"; + } + } + const labelSizes = this._getLabelSizes(); + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + tick = ticks[i]; + label = tick.label; + const optsAtIndex = optionTicks.setContext(this.getContext(i)); + pixel = this.getPixelForTick(i) + optionTicks.labelOffset; + font = this._resolveTickFontOptions(i); + lineHeight = font.lineHeight; + lineCount = isArray(label) ? label.length : 1; + const halfCount = lineCount / 2; + const color2 = optsAtIndex.color; + const strokeColor = optsAtIndex.textStrokeColor; + const strokeWidth = optsAtIndex.textStrokeWidth; + let tickTextAlign = textAlign; + if (isHorizontal) { + x = pixel; + if (textAlign === "inner") { + if (i === ilen - 1) { + tickTextAlign = !this.options.reverse ? "right" : "left"; + } else if (i === 0) { + tickTextAlign = !this.options.reverse ? "left" : "right"; + } else { + tickTextAlign = "center"; + } + } + if (position === "top") { + if (crossAlign === "near" || rotation !== 0) { + textOffset = -lineCount * lineHeight + lineHeight / 2; + } else if (crossAlign === "center") { + textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight; + } else { + textOffset = -labelSizes.highest.height + lineHeight / 2; + } + } else { + if (crossAlign === "near" || rotation !== 0) { + textOffset = lineHeight / 2; + } else if (crossAlign === "center") { + textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight; + } else { + textOffset = labelSizes.highest.height - lineCount * lineHeight; + } + } + if (mirror) { + textOffset *= -1; + } + if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) { + x += lineHeight / 2 * Math.sin(rotation); + } + } else { + y = pixel; + textOffset = (1 - lineCount) * lineHeight / 2; + } + let backdrop; + if (optsAtIndex.showLabelBackdrop) { + const labelPadding = toPadding(optsAtIndex.backdropPadding); + const height = labelSizes.heights[i]; + const width = labelSizes.widths[i]; + let top = textOffset - labelPadding.top; + let left = 0 - labelPadding.left; + switch (textBaseline) { + case "middle": + top -= height / 2; + break; + case "bottom": + top -= height; + break; + } + switch (textAlign) { + case "center": + left -= width / 2; + break; + case "right": + left -= width; + break; + case "inner": + if (i === ilen - 1) { + left -= width; + } else if (i > 0) { + left -= width / 2; + } + break; + } + backdrop = { + left, + top, + width: width + labelPadding.width, + height: height + labelPadding.height, + color: optsAtIndex.backdropColor + }; + } + items.push({ + label, + font, + textOffset, + options: { + rotation, + color: color2, + strokeColor, + strokeWidth, + textAlign: tickTextAlign, + textBaseline, + translation: [ + x, + y + ], + backdrop + } + }); + } + return items; + } + _getXAxisLabelAlignment() { + const { position, ticks } = this.options; + const rotation = -toRadians(this.labelRotation); + if (rotation) { + return position === "top" ? "left" : "right"; + } + let align = "center"; + if (ticks.align === "start") { + align = "left"; + } else if (ticks.align === "end") { + align = "right"; + } else if (ticks.align === "inner") { + align = "inner"; + } + return align; + } + _getYAxisLabelAlignment(tl) { + const { position, ticks: { crossAlign, mirror, padding } } = this.options; + const labelSizes = this._getLabelSizes(); + const tickAndPadding = tl + padding; + const widest = labelSizes.widest.width; + let textAlign; + let x; + if (position === "left") { + if (mirror) { + x = this.right + padding; + if (crossAlign === "near") { + textAlign = "left"; + } else if (crossAlign === "center") { + textAlign = "center"; + x += widest / 2; + } else { + textAlign = "right"; + x += widest; + } + } else { + x = this.right - tickAndPadding; + if (crossAlign === "near") { + textAlign = "right"; + } else if (crossAlign === "center") { + textAlign = "center"; + x -= widest / 2; + } else { + textAlign = "left"; + x = this.left; + } + } + } else if (position === "right") { + if (mirror) { + x = this.left + padding; + if (crossAlign === "near") { + textAlign = "right"; + } else if (crossAlign === "center") { + textAlign = "center"; + x -= widest / 2; + } else { + textAlign = "left"; + x -= widest; + } + } else { + x = this.left + tickAndPadding; + if (crossAlign === "near") { + textAlign = "left"; + } else if (crossAlign === "center") { + textAlign = "center"; + x += widest / 2; + } else { + textAlign = "right"; + x = this.right; + } + } + } else { + textAlign = "right"; + } + return { + textAlign, + x + }; + } + _computeLabelArea() { + if (this.options.ticks.mirror) { + return; + } + const chart = this.chart; + const position = this.options.position; + if (position === "left" || position === "right") { + return { + top: 0, + left: this.left, + bottom: chart.height, + right: this.right + }; + } + if (position === "top" || position === "bottom") { + return { + top: this.top, + left: 0, + bottom: this.bottom, + right: chart.width + }; + } + } + drawBackground() { + const { ctx, options: { backgroundColor }, left, top, width, height } = this; + if (backgroundColor) { + ctx.save(); + ctx.fillStyle = backgroundColor; + ctx.fillRect(left, top, width, height); + ctx.restore(); + } + } + getLineWidthForValue(value) { + const grid = this.options.grid; + if (!this._isVisible() || !grid.display) { + return 0; + } + const ticks = this.ticks; + const index = ticks.findIndex((t2) => t2.value === value); + if (index >= 0) { + const opts = grid.setContext(this.getContext(index)); + return opts.lineWidth; + } + return 0; + } + drawGrid(chartArea) { + const grid = this.options.grid; + const ctx = this.ctx; + const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea)); + let i, ilen; + const drawLine = (p1, p2, style) => { + if (!style.width || !style.color) { + return; + } + ctx.save(); + ctx.lineWidth = style.width; + ctx.strokeStyle = style.color; + ctx.setLineDash(style.borderDash || []); + ctx.lineDashOffset = style.borderDashOffset; + ctx.beginPath(); + ctx.moveTo(p1.x, p1.y); + ctx.lineTo(p2.x, p2.y); + ctx.stroke(); + ctx.restore(); + }; + if (grid.display) { + for (i = 0, ilen = items.length; i < ilen; ++i) { + const item = items[i]; + if (grid.drawOnChartArea) { + drawLine({ + x: item.x1, + y: item.y1 + }, { + x: item.x2, + y: item.y2 + }, item); + } + if (grid.drawTicks) { + drawLine({ + x: item.tx1, + y: item.ty1 + }, { + x: item.tx2, + y: item.ty2 + }, { + color: item.tickColor, + width: item.tickWidth, + borderDash: item.tickBorderDash, + borderDashOffset: item.tickBorderDashOffset + }); + } + } + } + } + drawBorder() { + const { chart, ctx, options: { border, grid } } = this; + const borderOpts = border.setContext(this.getContext()); + const axisWidth = border.display ? borderOpts.width : 0; + if (!axisWidth) { + return; + } + const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth; + const borderValue = this._borderValue; + let x1, x2, y1, y2; + if (this.isHorizontal()) { + x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2; + x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2; + y1 = y2 = borderValue; + } else { + y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2; + y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2; + x1 = x2 = borderValue; + } + ctx.save(); + ctx.lineWidth = borderOpts.width; + ctx.strokeStyle = borderOpts.color; + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + ctx.restore(); + } + drawLabels(chartArea) { + const optionTicks = this.options.ticks; + if (!optionTicks.display) { + return; + } + const ctx = this.ctx; + const area = this._computeLabelArea(); + if (area) { + clipArea(ctx, area); + } + const items = this.getLabelItems(chartArea); + for (const item of items) { + const renderTextOptions = item.options; + const tickFont = item.font; + const label = item.label; + const y = item.textOffset; + renderText(ctx, label, 0, y, tickFont, renderTextOptions); + } + if (area) { + unclipArea(ctx); + } + } + drawTitle() { + const { ctx, options: { position, title, reverse } } = this; + if (!title.display) { + return; + } + const font = toFont(title.font); + const padding = toPadding(title.padding); + const align = title.align; + let offset = font.lineHeight / 2; + if (position === "bottom" || position === "center" || isObject(position)) { + offset += padding.bottom; + if (isArray(title.text)) { + offset += font.lineHeight * (title.text.length - 1); + } + } else { + offset += padding.top; + } + const { titleX, titleY, maxWidth, rotation } = titleArgs(this, offset, position, align); + renderText(ctx, title.text, 0, 0, font, { + color: title.color, + maxWidth, + rotation, + textAlign: titleAlign(align, position, reverse), + textBaseline: "middle", + translation: [ + titleX, + titleY + ] + }); + } + draw(chartArea) { + if (!this._isVisible()) { + return; + } + this.drawBackground(); + this.drawGrid(chartArea); + this.drawBorder(); + this.drawTitle(); + this.drawLabels(chartArea); + } + _layers() { + const opts = this.options; + const tz = opts.ticks && opts.ticks.z || 0; + const gz = valueOrDefault(opts.grid && opts.grid.z, -1); + const bz = valueOrDefault(opts.border && opts.border.z, 0); + if (!this._isVisible() || this.draw !== _Scale.prototype.draw) { + return [ + { + z: tz, + draw: (chartArea) => { + this.draw(chartArea); + } + } + ]; + } + return [ + { + z: gz, + draw: (chartArea) => { + this.drawBackground(); + this.drawGrid(chartArea); + this.drawTitle(); + } + }, + { + z: bz, + draw: () => { + this.drawBorder(); + } + }, + { + z: tz, + draw: (chartArea) => { + this.drawLabels(chartArea); + } + } + ]; + } + getMatchingVisibleMetas(type) { + const metas = this.chart.getSortedVisibleDatasetMetas(); + const axisID = this.axis + "AxisID"; + const result = []; + let i, ilen; + for (i = 0, ilen = metas.length; i < ilen; ++i) { + const meta = metas[i]; + if (meta[axisID] === this.id && (!type || meta.type === type)) { + result.push(meta); + } + } + return result; + } + _resolveTickFontOptions(index) { + const opts = this.options.ticks.setContext(this.getContext(index)); + return toFont(opts.font); + } + _maxDigits() { + const fontSize = this._resolveTickFontOptions(0).lineHeight; + return (this.isHorizontal() ? this.width : this.height) / fontSize; + } +}; +var TypedRegistry = class { + constructor(type, scope, override) { + this.type = type; + this.scope = scope; + this.override = override; + this.items = /* @__PURE__ */ Object.create(null); + } + isForType(type) { + return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype); + } + register(item) { + const proto = Object.getPrototypeOf(item); + let parentScope; + if (isIChartComponent(proto)) { + parentScope = this.register(proto); + } + const items = this.items; + const id = item.id; + const scope = this.scope + "." + id; + if (!id) { + throw new Error("class does not have id: " + item); + } + if (id in items) { + return scope; + } + items[id] = item; + registerDefaults(item, scope, parentScope); + if (this.override) { + defaults.override(item.id, item.overrides); + } + return scope; + } + get(id) { + return this.items[id]; + } + unregister(item) { + const items = this.items; + const id = item.id; + const scope = this.scope; + if (id in items) { + delete items[id]; + } + if (scope && id in defaults[scope]) { + delete defaults[scope][id]; + if (this.override) { + delete overrides[id]; + } + } + } +}; +function registerDefaults(item, scope, parentScope) { + const itemDefaults = merge(/* @__PURE__ */ Object.create(null), [ + parentScope ? defaults.get(parentScope) : {}, + defaults.get(scope), + item.defaults + ]); + defaults.set(scope, itemDefaults); + if (item.defaultRoutes) { + routeDefaults(scope, item.defaultRoutes); + } + if (item.descriptors) { + defaults.describe(scope, item.descriptors); + } +} +function routeDefaults(scope, routes) { + Object.keys(routes).forEach((property) => { + const propertyParts = property.split("."); + const sourceName = propertyParts.pop(); + const sourceScope = [ + scope + ].concat(propertyParts).join("."); + const parts = routes[property].split("."); + const targetName = parts.pop(); + const targetScope = parts.join("."); + defaults.route(sourceScope, sourceName, targetScope, targetName); + }); +} +function isIChartComponent(proto) { + return "id" in proto && "defaults" in proto; +} +var Registry = class { + constructor() { + this.controllers = new TypedRegistry(DatasetController, "datasets", true); + this.elements = new TypedRegistry(Element, "elements"); + this.plugins = new TypedRegistry(Object, "plugins"); + this.scales = new TypedRegistry(Scale, "scales"); + this._typedRegistries = [ + this.controllers, + this.scales, + this.elements + ]; + } + add(...args) { + this._each("register", args); + } + remove(...args) { + this._each("unregister", args); + } + addControllers(...args) { + this._each("register", args, this.controllers); + } + addElements(...args) { + this._each("register", args, this.elements); + } + addPlugins(...args) { + this._each("register", args, this.plugins); + } + addScales(...args) { + this._each("register", args, this.scales); + } + getController(id) { + return this._get(id, this.controllers, "controller"); + } + getElement(id) { + return this._get(id, this.elements, "element"); + } + getPlugin(id) { + return this._get(id, this.plugins, "plugin"); + } + getScale(id) { + return this._get(id, this.scales, "scale"); + } + removeControllers(...args) { + this._each("unregister", args, this.controllers); + } + removeElements(...args) { + this._each("unregister", args, this.elements); + } + removePlugins(...args) { + this._each("unregister", args, this.plugins); + } + removeScales(...args) { + this._each("unregister", args, this.scales); + } + _each(method, args, typedRegistry) { + [ + ...args + ].forEach((arg) => { + const reg = typedRegistry || this._getRegistryForType(arg); + if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) { + this._exec(method, reg, arg); + } else { + each(arg, (item) => { + const itemReg = typedRegistry || this._getRegistryForType(item); + this._exec(method, itemReg, item); + }); + } + }); + } + _exec(method, registry2, component) { + const camelMethod = _capitalize(method); + callback(component["before" + camelMethod], [], component); + registry2[method](component); + callback(component["after" + camelMethod], [], component); + } + _getRegistryForType(type) { + for (let i = 0; i < this._typedRegistries.length; i++) { + const reg = this._typedRegistries[i]; + if (reg.isForType(type)) { + return reg; + } + } + return this.plugins; + } + _get(id, typedRegistry, type) { + const item = typedRegistry.get(id); + if (item === void 0) { + throw new Error('"' + id + '" is not a registered ' + type + "."); + } + return item; + } +}; +var registry = /* @__PURE__ */ new Registry(); +var PluginService = class { + constructor() { + this._init = []; + } + notify(chart, hook, args, filter) { + if (hook === "beforeInit") { + this._init = this._createDescriptors(chart, true); + this._notify(this._init, chart, "install"); + } + const descriptors2 = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart); + const result = this._notify(descriptors2, chart, hook, args); + if (hook === "afterDestroy") { + this._notify(descriptors2, chart, "stop"); + this._notify(this._init, chart, "uninstall"); + } + return result; + } + _notify(descriptors2, chart, hook, args) { + args = args || {}; + for (const descriptor of descriptors2) { + const plugin = descriptor.plugin; + const method = plugin[hook]; + const params = [ + chart, + args, + descriptor.options + ]; + if (callback(method, params, plugin) === false && args.cancelable) { + return false; + } + } + return true; + } + invalidate() { + if (!isNullOrUndef(this._cache)) { + this._oldCache = this._cache; + this._cache = void 0; + } + } + _descriptors(chart) { + if (this._cache) { + return this._cache; + } + const descriptors2 = this._cache = this._createDescriptors(chart); + this._notifyStateChanges(chart); + return descriptors2; + } + _createDescriptors(chart, all) { + const config = chart && chart.config; + const options = valueOrDefault(config.options && config.options.plugins, {}); + const plugins = allPlugins(config); + return options === false && !all ? [] : createDescriptors(chart, plugins, options, all); + } + _notifyStateChanges(chart) { + const previousDescriptors = this._oldCache || []; + const descriptors2 = this._cache; + const diff = (a, b) => a.filter((x) => !b.some((y) => x.plugin.id === y.plugin.id)); + this._notify(diff(previousDescriptors, descriptors2), chart, "stop"); + this._notify(diff(descriptors2, previousDescriptors), chart, "start"); + } +}; +function allPlugins(config) { + const localIds = {}; + const plugins = []; + const keys = Object.keys(registry.plugins.items); + for (let i = 0; i < keys.length; i++) { + plugins.push(registry.getPlugin(keys[i])); + } + const local = config.plugins || []; + for (let i = 0; i < local.length; i++) { + const plugin = local[i]; + if (plugins.indexOf(plugin) === -1) { + plugins.push(plugin); + localIds[plugin.id] = true; + } + } + return { + plugins, + localIds + }; +} +function getOpts(options, all) { + if (!all && options === false) { + return null; + } + if (options === true) { + return {}; + } + return options; +} +function createDescriptors(chart, { plugins, localIds }, options, all) { + const result = []; + const context = chart.getContext(); + for (const plugin of plugins) { + const id = plugin.id; + const opts = getOpts(options[id], all); + if (opts === null) { + continue; + } + result.push({ + plugin, + options: pluginOpts(chart.config, { + plugin, + local: localIds[id] + }, opts, context) + }); + } + return result; +} +function pluginOpts(config, { plugin, local }, opts, context) { + const keys = config.pluginScopeKeys(plugin); + const scopes = config.getOptionScopes(opts, keys); + if (local && plugin.defaults) { + scopes.push(plugin.defaults); + } + return config.createResolver(scopes, context, [ + "" + ], { + scriptable: false, + indexable: false, + allKeys: true + }); +} +function getIndexAxis(type, options) { + const datasetDefaults = defaults.datasets[type] || {}; + const datasetOptions = (options.datasets || {})[type] || {}; + return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || "x"; +} +function getAxisFromDefaultScaleID(id, indexAxis) { + let axis = id; + if (id === "_index_") { + axis = indexAxis; + } else if (id === "_value_") { + axis = indexAxis === "x" ? "y" : "x"; + } + return axis; +} +function getDefaultScaleIDFromAxis(axis, indexAxis) { + return axis === indexAxis ? "_index_" : "_value_"; +} +function idMatchesAxis(id) { + if (id === "x" || id === "y" || id === "r") { + return id; + } +} +function axisFromPosition(position) { + if (position === "top" || position === "bottom") { + return "x"; + } + if (position === "left" || position === "right") { + return "y"; + } +} +function determineAxis(id, ...scaleOptions) { + if (idMatchesAxis(id)) { + return id; + } + for (const opts of scaleOptions) { + const axis = opts.axis || axisFromPosition(opts.position) || id.length > 1 && idMatchesAxis(id[0].toLowerCase()); + if (axis) { + return axis; + } + } + throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`); +} +function getAxisFromDataset(id, axis, dataset) { + if (dataset[axis + "AxisID"] === id) { + return { + axis + }; + } +} +function retrieveAxisFromDatasets(id, config) { + if (config.data && config.data.datasets) { + const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id); + if (boundDs.length) { + return getAxisFromDataset(id, "x", boundDs[0]) || getAxisFromDataset(id, "y", boundDs[0]); + } + } + return {}; +} +function mergeScaleConfig(config, options) { + const chartDefaults = overrides[config.type] || { + scales: {} + }; + const configScales = options.scales || {}; + const chartIndexAxis = getIndexAxis(config.type, options); + const scales = /* @__PURE__ */ Object.create(null); + Object.keys(configScales).forEach((id) => { + const scaleConf = configScales[id]; + if (!isObject(scaleConf)) { + return console.error(`Invalid scale configuration for scale: ${id}`); + } + if (scaleConf._proxy) { + return console.warn(`Ignoring resolver passed as options for scale: ${id}`); + } + const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]); + const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis); + const defaultScaleOptions = chartDefaults.scales || {}; + scales[id] = mergeIf(/* @__PURE__ */ Object.create(null), [ + { + axis + }, + scaleConf, + defaultScaleOptions[axis], + defaultScaleOptions[defaultId] + ]); + }); + config.data.datasets.forEach((dataset) => { + const type = dataset.type || config.type; + const indexAxis = dataset.indexAxis || getIndexAxis(type, options); + const datasetDefaults = overrides[type] || {}; + const defaultScaleOptions = datasetDefaults.scales || {}; + Object.keys(defaultScaleOptions).forEach((defaultID) => { + const axis = getAxisFromDefaultScaleID(defaultID, indexAxis); + const id = dataset[axis + "AxisID"] || axis; + scales[id] = scales[id] || /* @__PURE__ */ Object.create(null); + mergeIf(scales[id], [ + { + axis + }, + configScales[id], + defaultScaleOptions[defaultID] + ]); + }); + }); + Object.keys(scales).forEach((key) => { + const scale = scales[key]; + mergeIf(scale, [ + defaults.scales[scale.type], + defaults.scale + ]); + }); + return scales; +} +function initOptions(config) { + const options = config.options || (config.options = {}); + options.plugins = valueOrDefault(options.plugins, {}); + options.scales = mergeScaleConfig(config, options); +} +function initData(data) { + data = data || {}; + data.datasets = data.datasets || []; + data.labels = data.labels || []; + return data; +} +function initConfig(config) { + config = config || {}; + config.data = initData(config.data); + initOptions(config); + return config; +} +var keyCache = /* @__PURE__ */ new Map(); +var keysCached = /* @__PURE__ */ new Set(); +function cachedKeys(cacheKey, generate) { + let keys = keyCache.get(cacheKey); + if (!keys) { + keys = generate(); + keyCache.set(cacheKey, keys); + keysCached.add(keys); + } + return keys; +} +var addIfFound = (set2, obj, key) => { + const opts = resolveObjectKey(obj, key); + if (opts !== void 0) { + set2.add(opts); + } +}; +var Config = class { + constructor(config) { + this._config = initConfig(config); + this._scopeCache = /* @__PURE__ */ new Map(); + this._resolverCache = /* @__PURE__ */ new Map(); + } + get platform() { + return this._config.platform; + } + get type() { + return this._config.type; + } + set type(type) { + this._config.type = type; + } + get data() { + return this._config.data; + } + set data(data) { + this._config.data = initData(data); + } + get options() { + return this._config.options; + } + set options(options) { + this._config.options = options; + } + get plugins() { + return this._config.plugins; + } + update() { + const config = this._config; + this.clearCache(); + initOptions(config); + } + clearCache() { + this._scopeCache.clear(); + this._resolverCache.clear(); + } + datasetScopeKeys(datasetType) { + return cachedKeys(datasetType, () => [ + [ + `datasets.${datasetType}`, + "" + ] + ]); + } + datasetAnimationScopeKeys(datasetType, transition) { + return cachedKeys(`${datasetType}.transition.${transition}`, () => [ + [ + `datasets.${datasetType}.transitions.${transition}`, + `transitions.${transition}` + ], + [ + `datasets.${datasetType}`, + "" + ] + ]); + } + datasetElementScopeKeys(datasetType, elementType) { + return cachedKeys(`${datasetType}-${elementType}`, () => [ + [ + `datasets.${datasetType}.elements.${elementType}`, + `datasets.${datasetType}`, + `elements.${elementType}`, + "" + ] + ]); + } + pluginScopeKeys(plugin) { + const id = plugin.id; + const type = this.type; + return cachedKeys(`${type}-plugin-${id}`, () => [ + [ + `plugins.${id}`, + ...plugin.additionalOptionScopes || [] + ] + ]); + } + _cachedScopes(mainScope, resetCache) { + const _scopeCache = this._scopeCache; + let cache = _scopeCache.get(mainScope); + if (!cache || resetCache) { + cache = /* @__PURE__ */ new Map(); + _scopeCache.set(mainScope, cache); + } + return cache; + } + getOptionScopes(mainScope, keyLists, resetCache) { + const { options, type } = this; + const cache = this._cachedScopes(mainScope, resetCache); + const cached = cache.get(keyLists); + if (cached) { + return cached; + } + const scopes = /* @__PURE__ */ new Set(); + keyLists.forEach((keys) => { + if (mainScope) { + scopes.add(mainScope); + keys.forEach((key) => addIfFound(scopes, mainScope, key)); + } + keys.forEach((key) => addIfFound(scopes, options, key)); + keys.forEach((key) => addIfFound(scopes, overrides[type] || {}, key)); + keys.forEach((key) => addIfFound(scopes, defaults, key)); + keys.forEach((key) => addIfFound(scopes, descriptors, key)); + }); + const array = Array.from(scopes); + if (array.length === 0) { + array.push(/* @__PURE__ */ Object.create(null)); + } + if (keysCached.has(keyLists)) { + cache.set(keyLists, array); + } + return array; + } + chartOptionScopes() { + const { options, type } = this; + return [ + options, + overrides[type] || {}, + defaults.datasets[type] || {}, + { + type + }, + defaults, + descriptors + ]; + } + resolveNamedOptions(scopes, names2, context, prefixes = [ + "" + ]) { + const result = { + $shared: true + }; + const { resolver, subPrefixes } = getResolver(this._resolverCache, scopes, prefixes); + let options = resolver; + if (needContext(resolver, names2)) { + result.$shared = false; + context = isFunction(context) ? context() : context; + const subResolver = this.createResolver(scopes, context, subPrefixes); + options = _attachContext(resolver, context, subResolver); + } + for (const prop of names2) { + result[prop] = options[prop]; + } + return result; + } + createResolver(scopes, context, prefixes = [ + "" + ], descriptorDefaults) { + const { resolver } = getResolver(this._resolverCache, scopes, prefixes); + return isObject(context) ? _attachContext(resolver, context, void 0, descriptorDefaults) : resolver; + } +}; +function getResolver(resolverCache, scopes, prefixes) { + let cache = resolverCache.get(scopes); + if (!cache) { + cache = /* @__PURE__ */ new Map(); + resolverCache.set(scopes, cache); + } + const cacheKey = prefixes.join(); + let cached = cache.get(cacheKey); + if (!cached) { + const resolver = _createResolver(scopes, prefixes); + cached = { + resolver, + subPrefixes: prefixes.filter((p) => !p.toLowerCase().includes("hover")) + }; + cache.set(cacheKey, cached); + } + return cached; +} +var hasFunction = (value) => isObject(value) && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key])); +function needContext(proxy, names2) { + const { isScriptable, isIndexable } = _descriptors(proxy); + for (const prop of names2) { + const scriptable = isScriptable(prop); + const indexable = isIndexable(prop); + const value = (indexable || scriptable) && proxy[prop]; + if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) { + return true; + } + } + return false; +} +var version = "4.4.2"; +var KNOWN_POSITIONS = [ + "top", + "bottom", + "left", + "right", + "chartArea" +]; +function positionIsHorizontal(position, axis) { + return position === "top" || position === "bottom" || KNOWN_POSITIONS.indexOf(position) === -1 && axis === "x"; +} +function compare2Level(l1, l2) { + return function(a, b) { + return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1]; + }; +} +function onAnimationsComplete(context) { + const chart = context.chart; + const animationOptions = chart.options.animation; + chart.notifyPlugins("afterRender"); + callback(animationOptions && animationOptions.onComplete, [ + context + ], chart); +} +function onAnimationProgress(context) { + const chart = context.chart; + const animationOptions = chart.options.animation; + callback(animationOptions && animationOptions.onProgress, [ + context + ], chart); +} +function getCanvas(item) { + if (_isDomSupported() && typeof item === "string") { + item = document.getElementById(item); + } else if (item && item.length) { + item = item[0]; + } + if (item && item.canvas) { + item = item.canvas; + } + return item; +} +var instances = {}; +var getChart = (key) => { + const canvas = getCanvas(key); + return Object.values(instances).filter((c) => c.canvas === canvas).pop(); +}; +function moveNumericKeys(obj, start, move) { + const keys = Object.keys(obj); + for (const key of keys) { + const intKey = +key; + if (intKey >= start) { + const value = obj[key]; + delete obj[key]; + if (move > 0 || intKey > start) { + obj[intKey + move] = value; + } + } + } +} +function determineLastEvent(e, lastEvent, inChartArea, isClick) { + if (!inChartArea || e.type === "mouseout") { + return null; + } + if (isClick) { + return lastEvent; + } + return e; +} +function getSizeForArea(scale, chartArea, field) { + return scale.options.clip ? scale[field] : chartArea[field]; +} +function getDatasetArea(meta, chartArea) { + const { xScale, yScale } = meta; + if (xScale && yScale) { + return { + left: getSizeForArea(xScale, chartArea, "left"), + right: getSizeForArea(xScale, chartArea, "right"), + top: getSizeForArea(yScale, chartArea, "top"), + bottom: getSizeForArea(yScale, chartArea, "bottom") + }; + } + return chartArea; +} +var Chart = class { + static register(...items) { + registry.add(...items); + invalidatePlugins(); + } + static unregister(...items) { + registry.remove(...items); + invalidatePlugins(); + } + constructor(item, userConfig) { + const config = this.config = new Config(userConfig); + const initialCanvas = getCanvas(item); + const existingChart = getChart(initialCanvas); + if (existingChart) { + throw new Error("Canvas is already in use. Chart with ID '" + existingChart.id + "' must be destroyed before the canvas with ID '" + existingChart.canvas.id + "' can be reused."); + } + const options = config.createResolver(config.chartOptionScopes(), this.getContext()); + this.platform = new (config.platform || _detectPlatform(initialCanvas))(); + this.platform.updateConfig(config); + const context = this.platform.acquireContext(initialCanvas, options.aspectRatio); + const canvas = context && context.canvas; + const height = canvas && canvas.height; + const width = canvas && canvas.width; + this.id = uid(); + this.ctx = context; + this.canvas = canvas; + this.width = width; + this.height = height; + this._options = options; + this._aspectRatio = this.aspectRatio; + this._layers = []; + this._metasets = []; + this._stacks = void 0; + this.boxes = []; + this.currentDevicePixelRatio = void 0; + this.chartArea = void 0; + this._active = []; + this._lastEvent = void 0; + this._listeners = {}; + this._responsiveListeners = void 0; + this._sortedMetasets = []; + this.scales = {}; + this._plugins = new PluginService(); + this.$proxies = {}; + this._hiddenIndices = {}; + this.attached = false; + this._animationsDisabled = void 0; + this.$context = void 0; + this._doResize = debounce((mode) => this.update(mode), options.resizeDelay || 0); + this._dataChanges = []; + instances[this.id] = this; + if (!context || !canvas) { + console.error("Failed to create chart: can't acquire context from the given item"); + return; + } + animator.listen(this, "complete", onAnimationsComplete); + animator.listen(this, "progress", onAnimationProgress); + this._initialize(); + if (this.attached) { + this.update(); + } + } + get aspectRatio() { + const { options: { aspectRatio, maintainAspectRatio }, width, height, _aspectRatio } = this; + if (!isNullOrUndef(aspectRatio)) { + return aspectRatio; + } + if (maintainAspectRatio && _aspectRatio) { + return _aspectRatio; + } + return height ? width / height : null; + } + get data() { + return this.config.data; + } + set data(data) { + this.config.data = data; + } + get options() { + return this._options; + } + set options(options) { + this.config.options = options; + } + get registry() { + return registry; + } + _initialize() { + this.notifyPlugins("beforeInit"); + if (this.options.responsive) { + this.resize(); + } else { + retinaScale(this, this.options.devicePixelRatio); + } + this.bindEvents(); + this.notifyPlugins("afterInit"); + return this; + } + clear() { + clearCanvas(this.canvas, this.ctx); + return this; + } + stop() { + animator.stop(this); + return this; + } + resize(width, height) { + if (!animator.running(this)) { + this._resize(width, height); + } else { + this._resizeBeforeDraw = { + width, + height + }; + } + } + _resize(width, height) { + const options = this.options; + const canvas = this.canvas; + const aspectRatio = options.maintainAspectRatio && this.aspectRatio; + const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio); + const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio(); + const mode = this.width ? "resize" : "attach"; + this.width = newSize.width; + this.height = newSize.height; + this._aspectRatio = this.aspectRatio; + if (!retinaScale(this, newRatio, true)) { + return; + } + this.notifyPlugins("resize", { + size: newSize + }); + callback(options.onResize, [ + this, + newSize + ], this); + if (this.attached) { + if (this._doResize(mode)) { + this.render(); + } + } + } + ensureScalesHaveIDs() { + const options = this.options; + const scalesOptions = options.scales || {}; + each(scalesOptions, (axisOptions, axisID) => { + axisOptions.id = axisID; + }); + } + buildOrUpdateScales() { + const options = this.options; + const scaleOpts = options.scales; + const scales = this.scales; + const updated = Object.keys(scales).reduce((obj, id) => { + obj[id] = false; + return obj; + }, {}); + let items = []; + if (scaleOpts) { + items = items.concat(Object.keys(scaleOpts).map((id) => { + const scaleOptions = scaleOpts[id]; + const axis = determineAxis(id, scaleOptions); + const isRadial = axis === "r"; + const isHorizontal = axis === "x"; + return { + options: scaleOptions, + dposition: isRadial ? "chartArea" : isHorizontal ? "bottom" : "left", + dtype: isRadial ? "radialLinear" : isHorizontal ? "category" : "linear" + }; + })); + } + each(items, (item) => { + const scaleOptions = item.options; + const id = scaleOptions.id; + const axis = determineAxis(id, scaleOptions); + const scaleType = valueOrDefault(scaleOptions.type, item.dtype); + if (scaleOptions.position === void 0 || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) { + scaleOptions.position = item.dposition; + } + updated[id] = true; + let scale = null; + if (id in scales && scales[id].type === scaleType) { + scale = scales[id]; + } else { + const scaleClass = registry.getScale(scaleType); + scale = new scaleClass({ + id, + type: scaleType, + ctx: this.ctx, + chart: this + }); + scales[scale.id] = scale; + } + scale.init(scaleOptions, options); + }); + each(updated, (hasUpdated, id) => { + if (!hasUpdated) { + delete scales[id]; + } + }); + each(scales, (scale) => { + layouts.configure(this, scale, scale.options); + layouts.addBox(this, scale); + }); + } + _updateMetasets() { + const metasets = this._metasets; + const numData = this.data.datasets.length; + const numMeta = metasets.length; + metasets.sort((a, b) => a.index - b.index); + if (numMeta > numData) { + for (let i = numData; i < numMeta; ++i) { + this._destroyDatasetMeta(i); + } + metasets.splice(numData, numMeta - numData); + } + this._sortedMetasets = metasets.slice(0).sort(compare2Level("order", "index")); + } + _removeUnreferencedMetasets() { + const { _metasets: metasets, data: { datasets } } = this; + if (metasets.length > datasets.length) { + delete this._stacks; + } + metasets.forEach((meta, index) => { + if (datasets.filter((x) => x === meta._dataset).length === 0) { + this._destroyDatasetMeta(index); + } + }); + } + buildOrUpdateControllers() { + const newControllers = []; + const datasets = this.data.datasets; + let i, ilen; + this._removeUnreferencedMetasets(); + for (i = 0, ilen = datasets.length; i < ilen; i++) { + const dataset = datasets[i]; + let meta = this.getDatasetMeta(i); + const type = dataset.type || this.config.type; + if (meta.type && meta.type !== type) { + this._destroyDatasetMeta(i); + meta = this.getDatasetMeta(i); + } + meta.type = type; + meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options); + meta.order = dataset.order || 0; + meta.index = i; + meta.label = "" + dataset.label; + meta.visible = this.isDatasetVisible(i); + if (meta.controller) { + meta.controller.updateIndex(i); + meta.controller.linkScales(); + } else { + const ControllerClass = registry.getController(type); + const { datasetElementType, dataElementType } = defaults.datasets[type]; + Object.assign(ControllerClass, { + dataElementType: registry.getElement(dataElementType), + datasetElementType: datasetElementType && registry.getElement(datasetElementType) + }); + meta.controller = new ControllerClass(this, i); + newControllers.push(meta.controller); + } + } + this._updateMetasets(); + return newControllers; + } + _resetElements() { + each(this.data.datasets, (dataset, datasetIndex) => { + this.getDatasetMeta(datasetIndex).controller.reset(); + }, this); + } + reset() { + this._resetElements(); + this.notifyPlugins("reset"); + } + update(mode) { + const config = this.config; + config.update(); + const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext()); + const animsDisabled = this._animationsDisabled = !options.animation; + this._updateScales(); + this._checkEventBindings(); + this._updateHiddenIndices(); + this._plugins.invalidate(); + if (this.notifyPlugins("beforeUpdate", { + mode, + cancelable: true + }) === false) { + return; + } + const newControllers = this.buildOrUpdateControllers(); + this.notifyPlugins("beforeElementsUpdate"); + let minPadding = 0; + for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) { + const { controller } = this.getDatasetMeta(i); + const reset2 = !animsDisabled && newControllers.indexOf(controller) === -1; + controller.buildOrUpdateElements(reset2); + minPadding = Math.max(+controller.getMaxOverflow(), minPadding); + } + minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0; + this._updateLayout(minPadding); + if (!animsDisabled) { + each(newControllers, (controller) => { + controller.reset(); + }); + } + this._updateDatasets(mode); + this.notifyPlugins("afterUpdate", { + mode + }); + this._layers.sort(compare2Level("z", "_idx")); + const { _active, _lastEvent } = this; + if (_lastEvent) { + this._eventHandler(_lastEvent, true); + } else if (_active.length) { + this._updateHoverStyles(_active, _active, true); + } + this.render(); + } + _updateScales() { + each(this.scales, (scale) => { + layouts.removeBox(this, scale); + }); + this.ensureScalesHaveIDs(); + this.buildOrUpdateScales(); + } + _checkEventBindings() { + const options = this.options; + const existingEvents = new Set(Object.keys(this._listeners)); + const newEvents = new Set(options.events); + if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) { + this.unbindEvents(); + this.bindEvents(); + } + } + _updateHiddenIndices() { + const { _hiddenIndices } = this; + const changes = this._getUniformDataChanges() || []; + for (const { method, start, count } of changes) { + const move = method === "_removeElements" ? -count : count; + moveNumericKeys(_hiddenIndices, start, move); + } + } + _getUniformDataChanges() { + const _dataChanges = this._dataChanges; + if (!_dataChanges || !_dataChanges.length) { + return; + } + this._dataChanges = []; + const datasetCount = this.data.datasets.length; + const makeSet = (idx) => new Set(_dataChanges.filter((c) => c[0] === idx).map((c, i) => i + "," + c.splice(1).join(","))); + const changeSet = makeSet(0); + for (let i = 1; i < datasetCount; i++) { + if (!setsEqual(changeSet, makeSet(i))) { + return; + } + } + return Array.from(changeSet).map((c) => c.split(",")).map((a) => ({ + method: a[1], + start: +a[2], + count: +a[3] + })); + } + _updateLayout(minPadding) { + if (this.notifyPlugins("beforeLayout", { + cancelable: true + }) === false) { + return; + } + layouts.update(this, this.width, this.height, minPadding); + const area = this.chartArea; + const noArea = area.width <= 0 || area.height <= 0; + this._layers = []; + each(this.boxes, (box) => { + if (noArea && box.position === "chartArea") { + return; + } + if (box.configure) { + box.configure(); + } + this._layers.push(...box._layers()); + }, this); + this._layers.forEach((item, index) => { + item._idx = index; + }); + this.notifyPlugins("afterLayout"); + } + _updateDatasets(mode) { + if (this.notifyPlugins("beforeDatasetsUpdate", { + mode, + cancelable: true + }) === false) { + return; + } + for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + this.getDatasetMeta(i).controller.configure(); + } + for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + this._updateDataset(i, isFunction(mode) ? mode({ + datasetIndex: i + }) : mode); + } + this.notifyPlugins("afterDatasetsUpdate", { + mode + }); + } + _updateDataset(index, mode) { + const meta = this.getDatasetMeta(index); + const args = { + meta, + index, + mode, + cancelable: true + }; + if (this.notifyPlugins("beforeDatasetUpdate", args) === false) { + return; + } + meta.controller._update(mode); + args.cancelable = false; + this.notifyPlugins("afterDatasetUpdate", args); + } + render() { + if (this.notifyPlugins("beforeRender", { + cancelable: true + }) === false) { + return; + } + if (animator.has(this)) { + if (this.attached && !animator.running(this)) { + animator.start(this); + } + } else { + this.draw(); + onAnimationsComplete({ + chart: this + }); + } + } + draw() { + let i; + if (this._resizeBeforeDraw) { + const { width, height } = this._resizeBeforeDraw; + this._resize(width, height); + this._resizeBeforeDraw = null; + } + this.clear(); + if (this.width <= 0 || this.height <= 0) { + return; + } + if (this.notifyPlugins("beforeDraw", { + cancelable: true + }) === false) { + return; + } + const layers = this._layers; + for (i = 0; i < layers.length && layers[i].z <= 0; ++i) { + layers[i].draw(this.chartArea); + } + this._drawDatasets(); + for (; i < layers.length; ++i) { + layers[i].draw(this.chartArea); + } + this.notifyPlugins("afterDraw"); + } + _getSortedDatasetMetas(filterVisible) { + const metasets = this._sortedMetasets; + const result = []; + let i, ilen; + for (i = 0, ilen = metasets.length; i < ilen; ++i) { + const meta = metasets[i]; + if (!filterVisible || meta.visible) { + result.push(meta); + } + } + return result; + } + getSortedVisibleDatasetMetas() { + return this._getSortedDatasetMetas(true); + } + _drawDatasets() { + if (this.notifyPlugins("beforeDatasetsDraw", { + cancelable: true + }) === false) { + return; + } + const metasets = this.getSortedVisibleDatasetMetas(); + for (let i = metasets.length - 1; i >= 0; --i) { + this._drawDataset(metasets[i]); + } + this.notifyPlugins("afterDatasetsDraw"); + } + _drawDataset(meta) { + const ctx = this.ctx; + const clip = meta._clip; + const useClip = !clip.disabled; + const area = getDatasetArea(meta, this.chartArea); + const args = { + meta, + index: meta.index, + cancelable: true + }; + if (this.notifyPlugins("beforeDatasetDraw", args) === false) { + return; + } + if (useClip) { + clipArea(ctx, { + left: clip.left === false ? 0 : area.left - clip.left, + right: clip.right === false ? this.width : area.right + clip.right, + top: clip.top === false ? 0 : area.top - clip.top, + bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom + }); + } + meta.controller.draw(); + if (useClip) { + unclipArea(ctx); + } + args.cancelable = false; + this.notifyPlugins("afterDatasetDraw", args); + } + isPointInArea(point) { + return _isPointInArea(point, this.chartArea, this._minPadding); + } + getElementsAtEventForMode(e, mode, options, useFinalPosition) { + const method = Interaction.modes[mode]; + if (typeof method === "function") { + return method(this, e, options, useFinalPosition); + } + return []; + } + getDatasetMeta(datasetIndex) { + const dataset = this.data.datasets[datasetIndex]; + const metasets = this._metasets; + let meta = metasets.filter((x) => x && x._dataset === dataset).pop(); + if (!meta) { + meta = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, + xAxisID: null, + yAxisID: null, + order: dataset && dataset.order || 0, + index: datasetIndex, + _dataset: dataset, + _parsed: [], + _sorted: false + }; + metasets.push(meta); + } + return meta; + } + getContext() { + return this.$context || (this.$context = createContext(null, { + chart: this, + type: "chart" + })); + } + getVisibleDatasetCount() { + return this.getSortedVisibleDatasetMetas().length; + } + isDatasetVisible(datasetIndex) { + const dataset = this.data.datasets[datasetIndex]; + if (!dataset) { + return false; + } + const meta = this.getDatasetMeta(datasetIndex); + return typeof meta.hidden === "boolean" ? !meta.hidden : !dataset.hidden; + } + setDatasetVisibility(datasetIndex, visible) { + const meta = this.getDatasetMeta(datasetIndex); + meta.hidden = !visible; + } + toggleDataVisibility(index) { + this._hiddenIndices[index] = !this._hiddenIndices[index]; + } + getDataVisibility(index) { + return !this._hiddenIndices[index]; + } + _updateVisibility(datasetIndex, dataIndex, visible) { + const mode = visible ? "show" : "hide"; + const meta = this.getDatasetMeta(datasetIndex); + const anims = meta.controller._resolveAnimations(void 0, mode); + if (defined(dataIndex)) { + meta.data[dataIndex].hidden = !visible; + this.update(); + } else { + this.setDatasetVisibility(datasetIndex, visible); + anims.update(meta, { + visible + }); + this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : void 0); + } + } + hide(datasetIndex, dataIndex) { + this._updateVisibility(datasetIndex, dataIndex, false); + } + show(datasetIndex, dataIndex) { + this._updateVisibility(datasetIndex, dataIndex, true); + } + _destroyDatasetMeta(datasetIndex) { + const meta = this._metasets[datasetIndex]; + if (meta && meta.controller) { + meta.controller._destroy(); + } + delete this._metasets[datasetIndex]; + } + _stop() { + let i, ilen; + this.stop(); + animator.remove(this); + for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + this._destroyDatasetMeta(i); + } + } + destroy() { + this.notifyPlugins("beforeDestroy"); + const { canvas, ctx } = this; + this._stop(); + this.config.clearCache(); + if (canvas) { + this.unbindEvents(); + clearCanvas(canvas, ctx); + this.platform.releaseContext(ctx); + this.canvas = null; + this.ctx = null; + } + delete instances[this.id]; + this.notifyPlugins("afterDestroy"); + } + toBase64Image(...args) { + return this.canvas.toDataURL(...args); + } + bindEvents() { + this.bindUserEvents(); + if (this.options.responsive) { + this.bindResponsiveEvents(); + } else { + this.attached = true; + } + } + bindUserEvents() { + const listeners = this._listeners; + const platform = this.platform; + const _add = (type, listener2) => { + platform.addEventListener(this, type, listener2); + listeners[type] = listener2; + }; + const listener = (e, x, y) => { + e.offsetX = x; + e.offsetY = y; + this._eventHandler(e); + }; + each(this.options.events, (type) => _add(type, listener)); + } + bindResponsiveEvents() { + if (!this._responsiveListeners) { + this._responsiveListeners = {}; + } + const listeners = this._responsiveListeners; + const platform = this.platform; + const _add = (type, listener2) => { + platform.addEventListener(this, type, listener2); + listeners[type] = listener2; + }; + const _remove = (type, listener2) => { + if (listeners[type]) { + platform.removeEventListener(this, type, listener2); + delete listeners[type]; + } + }; + const listener = (width, height) => { + if (this.canvas) { + this.resize(width, height); + } + }; + let detached; + const attached = () => { + _remove("attach", attached); + this.attached = true; + this.resize(); + _add("resize", listener); + _add("detach", detached); + }; + detached = () => { + this.attached = false; + _remove("resize", listener); + this._stop(); + this._resize(0, 0); + _add("attach", attached); + }; + if (platform.isAttached(this.canvas)) { + attached(); + } else { + detached(); + } + } + unbindEvents() { + each(this._listeners, (listener, type) => { + this.platform.removeEventListener(this, type, listener); + }); + this._listeners = {}; + each(this._responsiveListeners, (listener, type) => { + this.platform.removeEventListener(this, type, listener); + }); + this._responsiveListeners = void 0; + } + updateHoverStyle(items, mode, enabled) { + const prefix = enabled ? "set" : "remove"; + let meta, item, i, ilen; + if (mode === "dataset") { + meta = this.getDatasetMeta(items[0].datasetIndex); + meta.controller["_" + prefix + "DatasetHoverStyle"](); + } + for (i = 0, ilen = items.length; i < ilen; ++i) { + item = items[i]; + const controller = item && this.getDatasetMeta(item.datasetIndex).controller; + if (controller) { + controller[prefix + "HoverStyle"](item.element, item.datasetIndex, item.index); + } + } + } + getActiveElements() { + return this._active || []; + } + setActiveElements(activeElements) { + const lastActive = this._active || []; + const active = activeElements.map(({ datasetIndex, index }) => { + const meta = this.getDatasetMeta(datasetIndex); + if (!meta) { + throw new Error("No dataset found at index " + datasetIndex); + } + return { + datasetIndex, + element: meta.data[index], + index + }; + }); + const changed = !_elementsEqual(active, lastActive); + if (changed) { + this._active = active; + this._lastEvent = null; + this._updateHoverStyles(active, lastActive); + } + } + notifyPlugins(hook, args, filter) { + return this._plugins.notify(this, hook, args, filter); + } + isPluginEnabled(pluginId) { + return this._plugins._cache.filter((p) => p.plugin.id === pluginId).length === 1; + } + _updateHoverStyles(active, lastActive, replay) { + const hoverOptions = this.options.hover; + const diff = (a, b) => a.filter((x) => !b.some((y) => x.datasetIndex === y.datasetIndex && x.index === y.index)); + const deactivated = diff(lastActive, active); + const activated = replay ? active : diff(active, lastActive); + if (deactivated.length) { + this.updateHoverStyle(deactivated, hoverOptions.mode, false); + } + if (activated.length && hoverOptions.mode) { + this.updateHoverStyle(activated, hoverOptions.mode, true); + } + } + _eventHandler(e, replay) { + const args = { + event: e, + replay, + cancelable: true, + inChartArea: this.isPointInArea(e) + }; + const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type); + if (this.notifyPlugins("beforeEvent", args, eventFilter) === false) { + return; + } + const changed = this._handleEvent(e, replay, args.inChartArea); + args.cancelable = false; + this.notifyPlugins("afterEvent", args, eventFilter); + if (changed || args.changed) { + this.render(); + } + return this; + } + _handleEvent(e, replay, inChartArea) { + const { _active: lastActive = [], options } = this; + const useFinalPosition = replay; + const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition); + const isClick = _isClickEvent(e); + const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick); + if (inChartArea) { + this._lastEvent = null; + callback(options.onHover, [ + e, + active, + this + ], this); + if (isClick) { + callback(options.onClick, [ + e, + active, + this + ], this); + } + } + const changed = !_elementsEqual(active, lastActive); + if (changed || replay) { + this._active = active; + this._updateHoverStyles(active, lastActive, replay); + } + this._lastEvent = lastEvent; + return changed; + } + _getActiveElements(e, lastActive, inChartArea, useFinalPosition) { + if (e.type === "mouseout") { + return []; + } + if (!inChartArea) { + return lastActive; + } + const hoverOptions = this.options.hover; + return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition); + } +}; +__publicField(Chart, "defaults", defaults); +__publicField(Chart, "instances", instances); +__publicField(Chart, "overrides", overrides); +__publicField(Chart, "registry", registry); +__publicField(Chart, "version", version); +__publicField(Chart, "getChart", getChart); +function invalidatePlugins() { + return each(Chart.instances, (chart) => chart._plugins.invalidate()); +} +function clipArc(ctx, element, endAngle) { + const { startAngle, pixelMargin, x, y, outerRadius, innerRadius } = element; + let angleMargin = pixelMargin / outerRadius; + ctx.beginPath(); + ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin); + if (innerRadius > pixelMargin) { + angleMargin = pixelMargin / innerRadius; + ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true); + } else { + ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI); + } + ctx.closePath(); + ctx.clip(); +} +function toRadiusCorners(value) { + return _readValueToProps(value, [ + "outerStart", + "outerEnd", + "innerStart", + "innerEnd" + ]); +} +function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) { + const o = toRadiusCorners(arc.options.borderRadius); + const halfThickness = (outerRadius - innerRadius) / 2; + const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2); + const computeOuterLimit = (val) => { + const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2; + return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit)); + }; + return { + outerStart: computeOuterLimit(o.outerStart), + outerEnd: computeOuterLimit(o.outerEnd), + innerStart: _limitValue(o.innerStart, 0, innerLimit), + innerEnd: _limitValue(o.innerEnd, 0, innerLimit) + }; +} +function rThetaToXY(r, theta, x, y) { + return { + x: x + r * Math.cos(theta), + y: y + r * Math.sin(theta) + }; +} +function pathArc(ctx, element, offset, spacing, end, circular) { + const { x, y, startAngle: start, pixelMargin, innerRadius: innerR } = element; + const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0); + const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0; + let spacingOffset = 0; + const alpha2 = end - start; + if (spacing) { + const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0; + const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0; + const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2; + const adjustedAngle = avNogSpacingRadius !== 0 ? alpha2 * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha2; + spacingOffset = (alpha2 - adjustedAngle) / 2; + } + const beta = Math.max(1e-3, alpha2 * outerRadius - offset / PI) / outerRadius; + const angleOffset = (alpha2 - beta) / 2; + const startAngle = start + angleOffset + spacingOffset; + const endAngle = end - angleOffset - spacingOffset; + const { outerStart, outerEnd, innerStart, innerEnd } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle); + const outerStartAdjustedRadius = outerRadius - outerStart; + const outerEndAdjustedRadius = outerRadius - outerEnd; + const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius; + const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius; + const innerStartAdjustedRadius = innerRadius + innerStart; + const innerEndAdjustedRadius = innerRadius + innerEnd; + const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius; + const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius; + ctx.beginPath(); + if (circular) { + const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2; + ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle); + ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle); + if (outerEnd > 0) { + const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y); + ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI); + } + const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y); + ctx.lineTo(p4.x, p4.y); + if (innerEnd > 0) { + const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y); + ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI); + } + const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2; + ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true); + ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true); + if (innerStart > 0) { + const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y); + ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI); + } + const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y); + ctx.lineTo(p8.x, p8.y); + if (outerStart > 0) { + const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y); + ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle); + } + } else { + ctx.moveTo(x, y); + const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x; + const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y; + ctx.lineTo(outerStartX, outerStartY); + const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x; + const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y; + ctx.lineTo(outerEndX, outerEndY); + } + ctx.closePath(); +} +function drawArc(ctx, element, offset, spacing, circular) { + const { fullCircles, startAngle, circumference } = element; + let endAngle = element.endAngle; + if (fullCircles) { + pathArc(ctx, element, offset, spacing, endAngle, circular); + for (let i = 0; i < fullCircles; ++i) { + ctx.fill(); + } + if (!isNaN(circumference)) { + endAngle = startAngle + (circumference % TAU || TAU); + } + } + pathArc(ctx, element, offset, spacing, endAngle, circular); + ctx.fill(); + return endAngle; +} +function drawBorder(ctx, element, offset, spacing, circular) { + const { fullCircles, startAngle, circumference, options } = element; + const { borderWidth, borderJoinStyle, borderDash, borderDashOffset } = options; + const inner = options.borderAlign === "inner"; + if (!borderWidth) { + return; + } + ctx.setLineDash(borderDash || []); + ctx.lineDashOffset = borderDashOffset; + if (inner) { + ctx.lineWidth = borderWidth * 2; + ctx.lineJoin = borderJoinStyle || "round"; + } else { + ctx.lineWidth = borderWidth; + ctx.lineJoin = borderJoinStyle || "bevel"; + } + let endAngle = element.endAngle; + if (fullCircles) { + pathArc(ctx, element, offset, spacing, endAngle, circular); + for (let i = 0; i < fullCircles; ++i) { + ctx.stroke(); + } + if (!isNaN(circumference)) { + endAngle = startAngle + (circumference % TAU || TAU); + } + } + if (inner) { + clipArc(ctx, element, endAngle); + } + if (!fullCircles) { + pathArc(ctx, element, offset, spacing, endAngle, circular); + ctx.stroke(); + } +} +var ArcElement = class extends Element { + constructor(cfg) { + super(); + __publicField(this, "circumference"); + __publicField(this, "endAngle"); + __publicField(this, "fullCircles"); + __publicField(this, "innerRadius"); + __publicField(this, "outerRadius"); + __publicField(this, "pixelMargin"); + __publicField(this, "startAngle"); + this.options = void 0; + this.circumference = void 0; + this.startAngle = void 0; + this.endAngle = void 0; + this.innerRadius = void 0; + this.outerRadius = void 0; + this.pixelMargin = 0; + this.fullCircles = 0; + if (cfg) { + Object.assign(this, cfg); + } + } + inRange(chartX, chartY, useFinalPosition) { + const point = this.getProps([ + "x", + "y" + ], useFinalPosition); + const { angle, distance } = getAngleFromPoint(point, { + x: chartX, + y: chartY + }); + const { startAngle, endAngle, innerRadius, outerRadius, circumference } = this.getProps([ + "startAngle", + "endAngle", + "innerRadius", + "outerRadius", + "circumference" + ], useFinalPosition); + const rAdjust = (this.options.spacing + this.options.borderWidth) / 2; + const _circumference = valueOrDefault(circumference, endAngle - startAngle); + const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle); + const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust); + return betweenAngles && withinRadius; + } + getCenterPoint(useFinalPosition) { + const { x, y, startAngle, endAngle, innerRadius, outerRadius } = this.getProps([ + "x", + "y", + "startAngle", + "endAngle", + "innerRadius", + "outerRadius" + ], useFinalPosition); + const { offset, spacing } = this.options; + const halfAngle = (startAngle + endAngle) / 2; + const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2; + return { + x: x + Math.cos(halfAngle) * halfRadius, + y: y + Math.sin(halfAngle) * halfRadius + }; + } + tooltipPosition(useFinalPosition) { + return this.getCenterPoint(useFinalPosition); + } + draw(ctx) { + const { options, circumference } = this; + const offset = (options.offset || 0) / 4; + const spacing = (options.spacing || 0) / 2; + const circular = options.circular; + this.pixelMargin = options.borderAlign === "inner" ? 0.33 : 0; + this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0; + if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) { + return; + } + ctx.save(); + const halfAngle = (this.startAngle + this.endAngle) / 2; + ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset); + const fix = 1 - Math.sin(Math.min(PI, circumference || 0)); + const radiusOffset = offset * fix; + ctx.fillStyle = options.backgroundColor; + ctx.strokeStyle = options.borderColor; + drawArc(ctx, this, radiusOffset, spacing, circular); + drawBorder(ctx, this, radiusOffset, spacing, circular); + ctx.restore(); + } +}; +__publicField(ArcElement, "id", "arc"); +__publicField(ArcElement, "defaults", { + borderAlign: "center", + borderColor: "#fff", + borderDash: [], + borderDashOffset: 0, + borderJoinStyle: void 0, + borderRadius: 0, + borderWidth: 2, + offset: 0, + spacing: 0, + angle: void 0, + circular: true +}); +__publicField(ArcElement, "defaultRoutes", { + backgroundColor: "backgroundColor" +}); +__publicField(ArcElement, "descriptors", { + _scriptable: true, + _indexable: (name) => name !== "borderDash" +}); +function getBarBounds(bar, useFinalPosition) { + const { x, y, base, width, height } = bar.getProps([ + "x", + "y", + "base", + "width", + "height" + ], useFinalPosition); + let left, right, top, bottom, half; + if (bar.horizontal) { + half = height / 2; + left = Math.min(x, base); + right = Math.max(x, base); + top = y - half; + bottom = y + half; + } else { + half = width / 2; + left = x - half; + right = x + half; + top = Math.min(y, base); + bottom = Math.max(y, base); + } + return { + left, + top, + right, + bottom + }; +} +function skipOrLimit(skip2, value, min, max) { + return skip2 ? 0 : _limitValue(value, min, max); +} +function parseBorderWidth(bar, maxW, maxH) { + const value = bar.options.borderWidth; + const skip2 = bar.borderSkipped; + const o = toTRBL(value); + return { + t: skipOrLimit(skip2.top, o.top, 0, maxH), + r: skipOrLimit(skip2.right, o.right, 0, maxW), + b: skipOrLimit(skip2.bottom, o.bottom, 0, maxH), + l: skipOrLimit(skip2.left, o.left, 0, maxW) + }; +} +function parseBorderRadius(bar, maxW, maxH) { + const { enableBorderRadius } = bar.getProps([ + "enableBorderRadius" + ]); + const value = bar.options.borderRadius; + const o = toTRBLCorners(value); + const maxR = Math.min(maxW, maxH); + const skip2 = bar.borderSkipped; + const enableBorder = enableBorderRadius || isObject(value); + return { + topLeft: skipOrLimit(!enableBorder || skip2.top || skip2.left, o.topLeft, 0, maxR), + topRight: skipOrLimit(!enableBorder || skip2.top || skip2.right, o.topRight, 0, maxR), + bottomLeft: skipOrLimit(!enableBorder || skip2.bottom || skip2.left, o.bottomLeft, 0, maxR), + bottomRight: skipOrLimit(!enableBorder || skip2.bottom || skip2.right, o.bottomRight, 0, maxR) + }; +} +function boundingRects(bar) { + const bounds = getBarBounds(bar); + const width = bounds.right - bounds.left; + const height = bounds.bottom - bounds.top; + const border = parseBorderWidth(bar, width / 2, height / 2); + const radius = parseBorderRadius(bar, width / 2, height / 2); + return { + outer: { + x: bounds.left, + y: bounds.top, + w: width, + h: height, + radius + }, + inner: { + x: bounds.left + border.l, + y: bounds.top + border.t, + w: width - border.l - border.r, + h: height - border.t - border.b, + radius: { + topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)), + topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)), + bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)), + bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)) + } + } + }; +} +function inRange(bar, x, y, useFinalPosition) { + const skipX = x === null; + const skipY = y === null; + const skipBoth = skipX && skipY; + const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition); + return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom)); +} +function hasRadius(radius) { + return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight; +} +function addNormalRectPath(ctx, rect) { + ctx.rect(rect.x, rect.y, rect.w, rect.h); +} +function inflateRect(rect, amount, refRect = {}) { + const x = rect.x !== refRect.x ? -amount : 0; + const y = rect.y !== refRect.y ? -amount : 0; + const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x; + const h4 = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y; + return { + x: rect.x + x, + y: rect.y + y, + w: rect.w + w, + h: rect.h + h4, + radius: rect.radius + }; +} +var BarElement = class extends Element { + constructor(cfg) { + super(); + this.options = void 0; + this.horizontal = void 0; + this.base = void 0; + this.width = void 0; + this.height = void 0; + this.inflateAmount = void 0; + if (cfg) { + Object.assign(this, cfg); + } + } + draw(ctx) { + const { inflateAmount, options: { borderColor, backgroundColor } } = this; + const { inner, outer } = boundingRects(this); + const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath; + ctx.save(); + if (outer.w !== inner.w || outer.h !== inner.h) { + ctx.beginPath(); + addRectPath(ctx, inflateRect(outer, inflateAmount, inner)); + ctx.clip(); + addRectPath(ctx, inflateRect(inner, -inflateAmount, outer)); + ctx.fillStyle = borderColor; + ctx.fill("evenodd"); + } + ctx.beginPath(); + addRectPath(ctx, inflateRect(inner, inflateAmount)); + ctx.fillStyle = backgroundColor; + ctx.fill(); + ctx.restore(); + } + inRange(mouseX, mouseY, useFinalPosition) { + return inRange(this, mouseX, mouseY, useFinalPosition); + } + inXRange(mouseX, useFinalPosition) { + return inRange(this, mouseX, null, useFinalPosition); + } + inYRange(mouseY, useFinalPosition) { + return inRange(this, null, mouseY, useFinalPosition); + } + getCenterPoint(useFinalPosition) { + const { x, y, base, horizontal } = this.getProps([ + "x", + "y", + "base", + "horizontal" + ], useFinalPosition); + return { + x: horizontal ? (x + base) / 2 : x, + y: horizontal ? y : (y + base) / 2 + }; + } + getRange(axis) { + return axis === "x" ? this.width / 2 : this.height / 2; + } +}; +__publicField(BarElement, "id", "bar"); +__publicField(BarElement, "defaults", { + borderSkipped: "start", + borderWidth: 0, + borderRadius: 0, + inflateAmount: "auto", + pointStyle: void 0 +}); +__publicField(BarElement, "defaultRoutes", { + backgroundColor: "backgroundColor", + borderColor: "borderColor" +}); +var getBoxSize = (labelOpts, fontSize) => { + let { boxHeight = fontSize, boxWidth = fontSize } = labelOpts; + if (labelOpts.usePointStyle) { + boxHeight = Math.min(boxHeight, fontSize); + boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize); + } + return { + boxWidth, + boxHeight, + itemHeight: Math.max(fontSize, boxHeight) + }; +}; +var itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index; +var Legend = class extends Element { + constructor(config) { + super(); + this._added = false; + this.legendHitBoxes = []; + this._hoveredItem = null; + this.doughnutMode = false; + this.chart = config.chart; + this.options = config.options; + this.ctx = config.ctx; + this.legendItems = void 0; + this.columnSizes = void 0; + this.lineWidths = void 0; + this.maxHeight = void 0; + this.maxWidth = void 0; + this.top = void 0; + this.bottom = void 0; + this.left = void 0; + this.right = void 0; + this.height = void 0; + this.width = void 0; + this._margins = void 0; + this.position = void 0; + this.weight = void 0; + this.fullSize = void 0; + } + update(maxWidth, maxHeight, margins) { + this.maxWidth = maxWidth; + this.maxHeight = maxHeight; + this._margins = margins; + this.setDimensions(); + this.buildLabels(); + this.fit(); + } + setDimensions() { + if (this.isHorizontal()) { + this.width = this.maxWidth; + this.left = this._margins.left; + this.right = this.width; + } else { + this.height = this.maxHeight; + this.top = this._margins.top; + this.bottom = this.height; + } + } + buildLabels() { + const labelOpts = this.options.labels || {}; + let legendItems = callback(labelOpts.generateLabels, [ + this.chart + ], this) || []; + if (labelOpts.filter) { + legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data)); + } + if (labelOpts.sort) { + legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data)); + } + if (this.options.reverse) { + legendItems.reverse(); + } + this.legendItems = legendItems; + } + fit() { + const { options, ctx } = this; + if (!options.display) { + this.width = this.height = 0; + return; + } + const labelOpts = options.labels; + const labelFont = toFont(labelOpts.font); + const fontSize = labelFont.size; + const titleHeight = this._computeTitleHeight(); + const { boxWidth, itemHeight } = getBoxSize(labelOpts, fontSize); + let width, height; + ctx.font = labelFont.string; + if (this.isHorizontal()) { + width = this.maxWidth; + height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10; + } else { + height = this.maxHeight; + width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10; + } + this.width = Math.min(width, options.maxWidth || this.maxWidth); + this.height = Math.min(height, options.maxHeight || this.maxHeight); + } + _fitRows(titleHeight, fontSize, boxWidth, itemHeight) { + const { ctx, maxWidth, options: { labels: { padding } } } = this; + const hitboxes = this.legendHitBoxes = []; + const lineWidths = this.lineWidths = [ + 0 + ]; + const lineHeight = itemHeight + padding; + let totalHeight = titleHeight; + ctx.textAlign = "left"; + ctx.textBaseline = "middle"; + let row = -1; + let top = -lineHeight; + this.legendItems.forEach((legendItem, i) => { + const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width; + if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) { + totalHeight += lineHeight; + lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0; + top += lineHeight; + row++; + } + hitboxes[i] = { + left: 0, + top, + row, + width: itemWidth, + height: itemHeight + }; + lineWidths[lineWidths.length - 1] += itemWidth + padding; + }); + return totalHeight; + } + _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) { + const { ctx, maxHeight, options: { labels: { padding } } } = this; + const hitboxes = this.legendHitBoxes = []; + const columnSizes = this.columnSizes = []; + const heightLimit = maxHeight - titleHeight; + let totalWidth = padding; + let currentColWidth = 0; + let currentColHeight = 0; + let left = 0; + let col = 0; + this.legendItems.forEach((legendItem, i) => { + const { itemWidth, itemHeight } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight); + if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) { + totalWidth += currentColWidth + padding; + columnSizes.push({ + width: currentColWidth, + height: currentColHeight + }); + left += currentColWidth + padding; + col++; + currentColWidth = currentColHeight = 0; + } + hitboxes[i] = { + left, + top: currentColHeight, + col, + width: itemWidth, + height: itemHeight + }; + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight + padding; + }); + totalWidth += currentColWidth; + columnSizes.push({ + width: currentColWidth, + height: currentColHeight + }); + return totalWidth; + } + adjustHitBoxes() { + if (!this.options.display) { + return; + } + const titleHeight = this._computeTitleHeight(); + const { legendHitBoxes: hitboxes, options: { align, labels: { padding }, rtl } } = this; + const rtlHelper = getRtlAdapter(rtl, this.left, this.width); + if (this.isHorizontal()) { + let row = 0; + let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]); + for (const hitbox of hitboxes) { + if (row !== hitbox.row) { + row = hitbox.row; + left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]); + } + hitbox.top += this.top + titleHeight + padding; + hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width); + left += hitbox.width + padding; + } + } else { + let col = 0; + let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height); + for (const hitbox of hitboxes) { + if (hitbox.col !== col) { + col = hitbox.col; + top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height); + } + hitbox.top = top; + hitbox.left += this.left + padding; + hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width); + top += hitbox.height + padding; + } + } + } + isHorizontal() { + return this.options.position === "top" || this.options.position === "bottom"; + } + draw() { + if (this.options.display) { + const ctx = this.ctx; + clipArea(ctx, this); + this._draw(); + unclipArea(ctx); + } + } + _draw() { + const { options: opts, columnSizes, lineWidths, ctx } = this; + const { align, labels: labelOpts } = opts; + const defaultColor = defaults.color; + const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width); + const labelFont = toFont(labelOpts.font); + const { padding } = labelOpts; + const fontSize = labelFont.size; + const halfFontSize = fontSize / 2; + let cursor; + this.drawTitle(); + ctx.textAlign = rtlHelper.textAlign("left"); + ctx.textBaseline = "middle"; + ctx.lineWidth = 0.5; + ctx.font = labelFont.string; + const { boxWidth, boxHeight, itemHeight } = getBoxSize(labelOpts, fontSize); + const drawLegendBox = function(x, y, legendItem) { + if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) { + return; + } + ctx.save(); + const lineWidth = valueOrDefault(legendItem.lineWidth, 1); + ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor); + ctx.lineCap = valueOrDefault(legendItem.lineCap, "butt"); + ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0); + ctx.lineJoin = valueOrDefault(legendItem.lineJoin, "miter"); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor); + ctx.setLineDash(valueOrDefault(legendItem.lineDash, [])); + if (labelOpts.usePointStyle) { + const drawOptions = { + radius: boxHeight * Math.SQRT2 / 2, + pointStyle: legendItem.pointStyle, + rotation: legendItem.rotation, + borderWidth: lineWidth + }; + const centerX = rtlHelper.xPlus(x, boxWidth / 2); + const centerY = y + halfFontSize; + drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth); + } else { + const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0); + const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth); + const borderRadius = toTRBLCorners(legendItem.borderRadius); + ctx.beginPath(); + if (Object.values(borderRadius).some((v) => v !== 0)) { + addRoundedRectPath(ctx, { + x: xBoxLeft, + y: yBoxTop, + w: boxWidth, + h: boxHeight, + radius: borderRadius + }); + } else { + ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight); + } + ctx.fill(); + if (lineWidth !== 0) { + ctx.stroke(); + } + } + ctx.restore(); + }; + const fillText = function(x, y, legendItem) { + renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, { + strikethrough: legendItem.hidden, + textAlign: rtlHelper.textAlign(legendItem.textAlign) + }); + }; + const isHorizontal = this.isHorizontal(); + const titleHeight = this._computeTitleHeight(); + if (isHorizontal) { + cursor = { + x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]), + y: this.top + padding + titleHeight, + line: 0 + }; + } else { + cursor = { + x: this.left + padding, + y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height), + line: 0 + }; + } + overrideTextDirection(this.ctx, opts.textDirection); + const lineHeight = itemHeight + padding; + this.legendItems.forEach((legendItem, i) => { + ctx.strokeStyle = legendItem.fontColor; + ctx.fillStyle = legendItem.fontColor; + const textWidth = ctx.measureText(legendItem.text).width; + const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign)); + const width = boxWidth + halfFontSize + textWidth; + let x = cursor.x; + let y = cursor.y; + rtlHelper.setWidth(this.width); + if (isHorizontal) { + if (i > 0 && x + width + padding > this.right) { + y = cursor.y += lineHeight; + cursor.line++; + x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]); + } + } else if (i > 0 && y + lineHeight > this.bottom) { + x = cursor.x = x + columnSizes[cursor.line].width + padding; + cursor.line++; + y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height); + } + const realX = rtlHelper.x(x); + drawLegendBox(realX, y, legendItem); + x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl); + fillText(rtlHelper.x(x), y, legendItem); + if (isHorizontal) { + cursor.x += width + padding; + } else if (typeof legendItem.text !== "string") { + const fontLineHeight = labelFont.lineHeight; + cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding; + } else { + cursor.y += lineHeight; + } + }); + restoreTextDirection(this.ctx, opts.textDirection); + } + drawTitle() { + const opts = this.options; + const titleOpts = opts.title; + const titleFont = toFont(titleOpts.font); + const titlePadding = toPadding(titleOpts.padding); + if (!titleOpts.display) { + return; + } + const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width); + const ctx = this.ctx; + const position = titleOpts.position; + const halfFontSize = titleFont.size / 2; + const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize; + let y; + let left = this.left; + let maxWidth = this.width; + if (this.isHorizontal()) { + maxWidth = Math.max(...this.lineWidths); + y = this.top + topPaddingPlusHalfFontSize; + left = _alignStartEnd(opts.align, left, this.right - maxWidth); + } else { + const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0); + y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight()); + } + const x = _alignStartEnd(position, left, left + maxWidth); + ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position)); + ctx.textBaseline = "middle"; + ctx.strokeStyle = titleOpts.color; + ctx.fillStyle = titleOpts.color; + ctx.font = titleFont.string; + renderText(ctx, titleOpts.text, x, y, titleFont); + } + _computeTitleHeight() { + const titleOpts = this.options.title; + const titleFont = toFont(titleOpts.font); + const titlePadding = toPadding(titleOpts.padding); + return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0; + } + _getLegendItemAt(x, y) { + let i, hitBox, lh; + if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) { + lh = this.legendHitBoxes; + for (i = 0; i < lh.length; ++i) { + hitBox = lh[i]; + if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) { + return this.legendItems[i]; + } + } + } + return null; + } + handleEvent(e) { + const opts = this.options; + if (!isListened(e.type, opts)) { + return; + } + const hoveredItem = this._getLegendItemAt(e.x, e.y); + if (e.type === "mousemove" || e.type === "mouseout") { + const previous = this._hoveredItem; + const sameItem = itemsEqual(previous, hoveredItem); + if (previous && !sameItem) { + callback(opts.onLeave, [ + e, + previous, + this + ], this); + } + this._hoveredItem = hoveredItem; + if (hoveredItem && !sameItem) { + callback(opts.onHover, [ + e, + hoveredItem, + this + ], this); + } + } else if (hoveredItem) { + callback(opts.onClick, [ + e, + hoveredItem, + this + ], this); + } + } +}; +function calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) { + const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx); + const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight); + return { + itemWidth, + itemHeight + }; +} +function calculateItemWidth(legendItem, boxWidth, labelFont, ctx) { + let legendItemText = legendItem.text; + if (legendItemText && typeof legendItemText !== "string") { + legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b); + } + return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width; +} +function calculateItemHeight(_itemHeight, legendItem, fontLineHeight) { + let itemHeight = _itemHeight; + if (typeof legendItem.text !== "string") { + itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight); + } + return itemHeight; +} +function calculateLegendItemHeight(legendItem, fontLineHeight) { + const labelHeight = legendItem.text ? legendItem.text.length : 0; + return fontLineHeight * labelHeight; +} +function isListened(type, opts) { + if ((type === "mousemove" || type === "mouseout") && (opts.onHover || opts.onLeave)) { + return true; + } + if (opts.onClick && (type === "click" || type === "mouseup")) { + return true; + } + return false; +} +var plugin_legend = { + id: "legend", + _element: Legend, + start(chart, _args, options) { + const legend = chart.legend = new Legend({ + ctx: chart.ctx, + options, + chart + }); + layouts.configure(chart, legend, options); + layouts.addBox(chart, legend); + }, + stop(chart) { + layouts.removeBox(chart, chart.legend); + delete chart.legend; + }, + beforeUpdate(chart, _args, options) { + const legend = chart.legend; + layouts.configure(chart, legend, options); + legend.options = options; + }, + afterUpdate(chart) { + const legend = chart.legend; + legend.buildLabels(); + legend.adjustHitBoxes(); + }, + afterEvent(chart, args) { + if (!args.replay) { + chart.legend.handleEvent(args.event); + } + }, + defaults: { + display: true, + position: "top", + align: "center", + fullSize: true, + reverse: false, + weight: 1e3, + onClick(e, legendItem, legend) { + const index = legendItem.datasetIndex; + const ci = legend.chart; + if (ci.isDatasetVisible(index)) { + ci.hide(index); + legendItem.hidden = true; + } else { + ci.show(index); + legendItem.hidden = false; + } + }, + onHover: null, + onLeave: null, + labels: { + color: (ctx) => ctx.chart.options.color, + boxWidth: 40, + padding: 10, + generateLabels(chart) { + const datasets = chart.data.datasets; + const { labels: { usePointStyle, pointStyle, textAlign, color: color2, useBorderRadius, borderRadius } } = chart.legend.options; + return chart._getSortedDatasetMetas().map((meta) => { + const style = meta.controller.getStyle(usePointStyle ? 0 : void 0); + const borderWidth = toPadding(style.borderWidth); + return { + text: datasets[meta.index].label, + fillStyle: style.backgroundColor, + fontColor: color2, + hidden: !meta.visible, + lineCap: style.borderCapStyle, + lineDash: style.borderDash, + lineDashOffset: style.borderDashOffset, + lineJoin: style.borderJoinStyle, + lineWidth: (borderWidth.width + borderWidth.height) / 4, + strokeStyle: style.borderColor, + pointStyle: pointStyle || style.pointStyle, + rotation: style.rotation, + textAlign: textAlign || style.textAlign, + borderRadius: useBorderRadius && (borderRadius || style.borderRadius), + datasetIndex: meta.index + }; + }, this); + } + }, + title: { + color: (ctx) => ctx.chart.options.color, + display: false, + position: "center", + text: "" + } + }, + descriptors: { + _scriptable: (name) => !name.startsWith("on"), + labels: { + _scriptable: (name) => ![ + "generateLabels", + "filter", + "sort" + ].includes(name) + } + } +}; +var Title = class extends Element { + constructor(config) { + super(); + this.chart = config.chart; + this.options = config.options; + this.ctx = config.ctx; + this._padding = void 0; + this.top = void 0; + this.bottom = void 0; + this.left = void 0; + this.right = void 0; + this.width = void 0; + this.height = void 0; + this.position = void 0; + this.weight = void 0; + this.fullSize = void 0; + } + update(maxWidth, maxHeight) { + const opts = this.options; + this.left = 0; + this.top = 0; + if (!opts.display) { + this.width = this.height = this.right = this.bottom = 0; + return; + } + this.width = this.right = maxWidth; + this.height = this.bottom = maxHeight; + const lineCount = isArray(opts.text) ? opts.text.length : 1; + this._padding = toPadding(opts.padding); + const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height; + if (this.isHorizontal()) { + this.height = textSize; + } else { + this.width = textSize; + } + } + isHorizontal() { + const pos = this.options.position; + return pos === "top" || pos === "bottom"; + } + _drawArgs(offset) { + const { top, left, bottom, right, options } = this; + const align = options.align; + let rotation = 0; + let maxWidth, titleX, titleY; + if (this.isHorizontal()) { + titleX = _alignStartEnd(align, left, right); + titleY = top + offset; + maxWidth = right - left; + } else { + if (options.position === "left") { + titleX = left + offset; + titleY = _alignStartEnd(align, bottom, top); + rotation = PI * -0.5; + } else { + titleX = right - offset; + titleY = _alignStartEnd(align, top, bottom); + rotation = PI * 0.5; + } + maxWidth = bottom - top; + } + return { + titleX, + titleY, + maxWidth, + rotation + }; + } + draw() { + const ctx = this.ctx; + const opts = this.options; + if (!opts.display) { + return; + } + const fontOpts = toFont(opts.font); + const lineHeight = fontOpts.lineHeight; + const offset = lineHeight / 2 + this._padding.top; + const { titleX, titleY, maxWidth, rotation } = this._drawArgs(offset); + renderText(ctx, opts.text, 0, 0, fontOpts, { + color: opts.color, + maxWidth, + rotation, + textAlign: _toLeftRightCenter(opts.align), + textBaseline: "middle", + translation: [ + titleX, + titleY + ] + }); + } +}; +function createTitle(chart, titleOpts) { + const title = new Title({ + ctx: chart.ctx, + options: titleOpts, + chart + }); + layouts.configure(chart, title, titleOpts); + layouts.addBox(chart, title); + chart.titleBlock = title; +} +var plugin_title = { + id: "title", + _element: Title, + start(chart, _args, options) { + createTitle(chart, options); + }, + stop(chart) { + const titleBlock = chart.titleBlock; + layouts.removeBox(chart, titleBlock); + delete chart.titleBlock; + }, + beforeUpdate(chart, _args, options) { + const title = chart.titleBlock; + layouts.configure(chart, title, options); + title.options = options; + }, + defaults: { + align: "center", + display: false, + font: { + weight: "bold" + }, + fullSize: true, + padding: 10, + position: "top", + text: "", + weight: 2e3 + }, + defaultRoutes: { + color: "color" + }, + descriptors: { + _scriptable: true, + _indexable: false + } +}; +var map2 = /* @__PURE__ */ new WeakMap(); +var plugin_subtitle = { + id: "subtitle", + start(chart, _args, options) { + const title = new Title({ + ctx: chart.ctx, + options, + chart + }); + layouts.configure(chart, title, options); + layouts.addBox(chart, title); + map2.set(chart, title); + }, + stop(chart) { + layouts.removeBox(chart, map2.get(chart)); + map2.delete(chart); + }, + beforeUpdate(chart, _args, options) { + const title = map2.get(chart); + layouts.configure(chart, title, options); + title.options = options; + }, + defaults: { + align: "center", + display: false, + font: { + weight: "normal" + }, + fullSize: true, + padding: 0, + position: "top", + text: "", + weight: 1500 + }, + defaultRoutes: { + color: "color" + }, + descriptors: { + _scriptable: true, + _indexable: false + } +}; +var positioners = { + average(items) { + if (!items.length) { + return false; + } + let i, len; + let xSet = /* @__PURE__ */ new Set(); + let y = 0; + let count = 0; + for (i = 0, len = items.length; i < len; ++i) { + const el = items[i].element; + if (el && el.hasValue()) { + const pos = el.tooltipPosition(); + xSet.add(pos.x); + y += pos.y; + ++count; + } + } + const xAverage = [ + ...xSet + ].reduce((a, b) => a + b) / xSet.size; + return { + x: xAverage, + y: y / count + }; + }, + nearest(items, eventPosition) { + if (!items.length) { + return false; + } + let x = eventPosition.x; + let y = eventPosition.y; + let minDistance = Number.POSITIVE_INFINITY; + let i, len, nearestElement; + for (i = 0, len = items.length; i < len; ++i) { + const el = items[i].element; + if (el && el.hasValue()) { + const center = el.getCenterPoint(); + const d = distanceBetweenPoints(eventPosition, center); + if (d < minDistance) { + minDistance = d; + nearestElement = el; + } + } + } + if (nearestElement) { + const tp = nearestElement.tooltipPosition(); + x = tp.x; + y = tp.y; + } + return { + x, + y + }; + } +}; +function pushOrConcat(base, toPush) { + if (toPush) { + if (isArray(toPush)) { + Array.prototype.push.apply(base, toPush); + } else { + base.push(toPush); + } + } + return base; +} +function splitNewlines(str) { + if ((typeof str === "string" || str instanceof String) && str.indexOf("\n") > -1) { + return str.split("\n"); + } + return str; +} +function createTooltipItem(chart, item) { + const { element, datasetIndex, index } = item; + const controller = chart.getDatasetMeta(datasetIndex).controller; + const { label, value } = controller.getLabelAndValue(index); + return { + chart, + label, + parsed: controller.getParsed(index), + raw: chart.data.datasets[datasetIndex].data[index], + formattedValue: value, + dataset: controller.getDataset(), + dataIndex: index, + datasetIndex, + element + }; +} +function getTooltipSize(tooltip, options) { + const ctx = tooltip.chart.ctx; + const { body, footer, title } = tooltip; + const { boxWidth, boxHeight } = options; + const bodyFont = toFont(options.bodyFont); + const titleFont = toFont(options.titleFont); + const footerFont = toFont(options.footerFont); + const titleLineCount = title.length; + const footerLineCount = footer.length; + const bodyLineItemCount = body.length; + const padding = toPadding(options.padding); + let height = padding.height; + let width = 0; + let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0); + combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length; + if (titleLineCount) { + height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom; + } + if (combinedBodyLength) { + const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight; + height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing; + } + if (footerLineCount) { + height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing; + } + let widthPadding = 0; + const maxLineWidth = function(line) { + width = Math.max(width, ctx.measureText(line).width + widthPadding); + }; + ctx.save(); + ctx.font = titleFont.string; + each(tooltip.title, maxLineWidth); + ctx.font = bodyFont.string; + each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth); + widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0; + each(body, (bodyItem) => { + each(bodyItem.before, maxLineWidth); + each(bodyItem.lines, maxLineWidth); + each(bodyItem.after, maxLineWidth); + }); + widthPadding = 0; + ctx.font = footerFont.string; + each(tooltip.footer, maxLineWidth); + ctx.restore(); + width += padding.width; + return { + width, + height + }; +} +function determineYAlign(chart, size) { + const { y, height } = size; + if (y < height / 2) { + return "top"; + } else if (y > chart.height - height / 2) { + return "bottom"; + } + return "center"; +} +function doesNotFitWithAlign(xAlign, chart, options, size) { + const { x, width } = size; + const caret = options.caretSize + options.caretPadding; + if (xAlign === "left" && x + width + caret > chart.width) { + return true; + } + if (xAlign === "right" && x - width - caret < 0) { + return true; + } +} +function determineXAlign(chart, options, size, yAlign) { + const { x, width } = size; + const { width: chartWidth, chartArea: { left, right } } = chart; + let xAlign = "center"; + if (yAlign === "center") { + xAlign = x <= (left + right) / 2 ? "left" : "right"; + } else if (x <= width / 2) { + xAlign = "left"; + } else if (x >= chartWidth - width / 2) { + xAlign = "right"; + } + if (doesNotFitWithAlign(xAlign, chart, options, size)) { + xAlign = "center"; + } + return xAlign; +} +function determineAlignment(chart, options, size) { + const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size); + return { + xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign), + yAlign + }; +} +function alignX(size, xAlign) { + let { x, width } = size; + if (xAlign === "right") { + x -= width; + } else if (xAlign === "center") { + x -= width / 2; + } + return x; +} +function alignY(size, yAlign, paddingAndSize) { + let { y, height } = size; + if (yAlign === "top") { + y += paddingAndSize; + } else if (yAlign === "bottom") { + y -= height + paddingAndSize; + } else { + y -= height / 2; + } + return y; +} +function getBackgroundPoint(options, size, alignment, chart) { + const { caretSize, caretPadding, cornerRadius } = options; + const { xAlign, yAlign } = alignment; + const paddingAndSize = caretSize + caretPadding; + const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(cornerRadius); + let x = alignX(size, xAlign); + const y = alignY(size, yAlign, paddingAndSize); + if (yAlign === "center") { + if (xAlign === "left") { + x += paddingAndSize; + } else if (xAlign === "right") { + x -= paddingAndSize; + } + } else if (xAlign === "left") { + x -= Math.max(topLeft, bottomLeft) + caretSize; + } else if (xAlign === "right") { + x += Math.max(topRight, bottomRight) + caretSize; + } + return { + x: _limitValue(x, 0, chart.width - size.width), + y: _limitValue(y, 0, chart.height - size.height) + }; +} +function getAlignedX(tooltip, align, options) { + const padding = toPadding(options.padding); + return align === "center" ? tooltip.x + tooltip.width / 2 : align === "right" ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left; +} +function getBeforeAfterBodyLines(callback2) { + return pushOrConcat([], splitNewlines(callback2)); +} +function createTooltipContext(parent, tooltip, tooltipItems) { + return createContext(parent, { + tooltip, + tooltipItems, + type: "tooltip" + }); +} +function overrideCallbacks(callbacks, context) { + const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks; + return override ? callbacks.override(override) : callbacks; +} +var defaultCallbacks = { + beforeTitle: noop, + title(tooltipItems) { + if (tooltipItems.length > 0) { + const item = tooltipItems[0]; + const labels = item.chart.data.labels; + const labelCount = labels ? labels.length : 0; + if (this && this.options && this.options.mode === "dataset") { + return item.dataset.label || ""; + } else if (item.label) { + return item.label; + } else if (labelCount > 0 && item.dataIndex < labelCount) { + return labels[item.dataIndex]; + } + } + return ""; + }, + afterTitle: noop, + beforeBody: noop, + beforeLabel: noop, + label(tooltipItem) { + if (this && this.options && this.options.mode === "dataset") { + return tooltipItem.label + ": " + tooltipItem.formattedValue || tooltipItem.formattedValue; + } + let label = tooltipItem.dataset.label || ""; + if (label) { + label += ": "; + } + const value = tooltipItem.formattedValue; + if (!isNullOrUndef(value)) { + label += value; + } + return label; + }, + labelColor(tooltipItem) { + const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex); + const options = meta.controller.getStyle(tooltipItem.dataIndex); + return { + borderColor: options.borderColor, + backgroundColor: options.backgroundColor, + borderWidth: options.borderWidth, + borderDash: options.borderDash, + borderDashOffset: options.borderDashOffset, + borderRadius: 0 + }; + }, + labelTextColor() { + return this.options.bodyColor; + }, + labelPointStyle(tooltipItem) { + const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex); + const options = meta.controller.getStyle(tooltipItem.dataIndex); + return { + pointStyle: options.pointStyle, + rotation: options.rotation + }; + }, + afterLabel: noop, + afterBody: noop, + beforeFooter: noop, + footer: noop, + afterFooter: noop +}; +function invokeCallbackWithFallback(callbacks, name, ctx, arg) { + const result = callbacks[name].call(ctx, arg); + if (typeof result === "undefined") { + return defaultCallbacks[name].call(ctx, arg); + } + return result; +} +var Tooltip = class extends Element { + constructor(config) { + super(); + this.opacity = 0; + this._active = []; + this._eventPosition = void 0; + this._size = void 0; + this._cachedAnimations = void 0; + this._tooltipItems = []; + this.$animations = void 0; + this.$context = void 0; + this.chart = config.chart; + this.options = config.options; + this.dataPoints = void 0; + this.title = void 0; + this.beforeBody = void 0; + this.body = void 0; + this.afterBody = void 0; + this.footer = void 0; + this.xAlign = void 0; + this.yAlign = void 0; + this.x = void 0; + this.y = void 0; + this.height = void 0; + this.width = void 0; + this.caretX = void 0; + this.caretY = void 0; + this.labelColors = void 0; + this.labelPointStyles = void 0; + this.labelTextColors = void 0; + } + initialize(options) { + this.options = options; + this._cachedAnimations = void 0; + this.$context = void 0; + } + _resolveAnimations() { + const cached = this._cachedAnimations; + if (cached) { + return cached; + } + const chart = this.chart; + const options = this.options.setContext(this.getContext()); + const opts = options.enabled && chart.options.animation && options.animations; + const animations = new Animations(this.chart, opts); + if (opts._cacheable) { + this._cachedAnimations = Object.freeze(animations); + } + return animations; + } + getContext() { + return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems)); + } + getTitle(context, options) { + const { callbacks } = options; + const beforeTitle = invokeCallbackWithFallback(callbacks, "beforeTitle", this, context); + const title = invokeCallbackWithFallback(callbacks, "title", this, context); + const afterTitle = invokeCallbackWithFallback(callbacks, "afterTitle", this, context); + let lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeTitle)); + lines = pushOrConcat(lines, splitNewlines(title)); + lines = pushOrConcat(lines, splitNewlines(afterTitle)); + return lines; + } + getBeforeBody(tooltipItems, options) { + return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, "beforeBody", this, tooltipItems)); + } + getBody(tooltipItems, options) { + const { callbacks } = options; + const bodyItems = []; + each(tooltipItems, (context) => { + const bodyItem = { + before: [], + lines: [], + after: [] + }; + const scoped = overrideCallbacks(callbacks, context); + pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, "beforeLabel", this, context))); + pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, "label", this, context)); + pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, "afterLabel", this, context))); + bodyItems.push(bodyItem); + }); + return bodyItems; + } + getAfterBody(tooltipItems, options) { + return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, "afterBody", this, tooltipItems)); + } + getFooter(tooltipItems, options) { + const { callbacks } = options; + const beforeFooter = invokeCallbackWithFallback(callbacks, "beforeFooter", this, tooltipItems); + const footer = invokeCallbackWithFallback(callbacks, "footer", this, tooltipItems); + const afterFooter = invokeCallbackWithFallback(callbacks, "afterFooter", this, tooltipItems); + let lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeFooter)); + lines = pushOrConcat(lines, splitNewlines(footer)); + lines = pushOrConcat(lines, splitNewlines(afterFooter)); + return lines; + } + _createItems(options) { + const active = this._active; + const data = this.chart.data; + const labelColors = []; + const labelPointStyles = []; + const labelTextColors = []; + let tooltipItems = []; + let i, len; + for (i = 0, len = active.length; i < len; ++i) { + tooltipItems.push(createTooltipItem(this.chart, active[i])); + } + if (options.filter) { + tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data)); + } + if (options.itemSort) { + tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data)); + } + each(tooltipItems, (context) => { + const scoped = overrideCallbacks(options.callbacks, context); + labelColors.push(invokeCallbackWithFallback(scoped, "labelColor", this, context)); + labelPointStyles.push(invokeCallbackWithFallback(scoped, "labelPointStyle", this, context)); + labelTextColors.push(invokeCallbackWithFallback(scoped, "labelTextColor", this, context)); + }); + this.labelColors = labelColors; + this.labelPointStyles = labelPointStyles; + this.labelTextColors = labelTextColors; + this.dataPoints = tooltipItems; + return tooltipItems; + } + update(changed, replay) { + const options = this.options.setContext(this.getContext()); + const active = this._active; + let properties; + let tooltipItems = []; + if (!active.length) { + if (this.opacity !== 0) { + properties = { + opacity: 0 + }; + } + } else { + const position = positioners[options.position].call(this, active, this._eventPosition); + tooltipItems = this._createItems(options); + this.title = this.getTitle(tooltipItems, options); + this.beforeBody = this.getBeforeBody(tooltipItems, options); + this.body = this.getBody(tooltipItems, options); + this.afterBody = this.getAfterBody(tooltipItems, options); + this.footer = this.getFooter(tooltipItems, options); + const size = this._size = getTooltipSize(this, options); + const positionAndSize = Object.assign({}, position, size); + const alignment = determineAlignment(this.chart, options, positionAndSize); + const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart); + this.xAlign = alignment.xAlign; + this.yAlign = alignment.yAlign; + properties = { + opacity: 1, + x: backgroundPoint.x, + y: backgroundPoint.y, + width: size.width, + height: size.height, + caretX: position.x, + caretY: position.y + }; + } + this._tooltipItems = tooltipItems; + this.$context = void 0; + if (properties) { + this._resolveAnimations().update(this, properties); + } + if (changed && options.external) { + options.external.call(this, { + chart: this.chart, + tooltip: this, + replay + }); + } + } + drawCaret(tooltipPoint, ctx, size, options) { + const caretPosition = this.getCaretPosition(tooltipPoint, size, options); + ctx.lineTo(caretPosition.x1, caretPosition.y1); + ctx.lineTo(caretPosition.x2, caretPosition.y2); + ctx.lineTo(caretPosition.x3, caretPosition.y3); + } + getCaretPosition(tooltipPoint, size, options) { + const { xAlign, yAlign } = this; + const { caretSize, cornerRadius } = options; + const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(cornerRadius); + const { x: ptX, y: ptY } = tooltipPoint; + const { width, height } = size; + let x1, x2, x3, y1, y2, y3; + if (yAlign === "center") { + y2 = ptY + height / 2; + if (xAlign === "left") { + x1 = ptX; + x2 = x1 - caretSize; + y1 = y2 + caretSize; + y3 = y2 - caretSize; + } else { + x1 = ptX + width; + x2 = x1 + caretSize; + y1 = y2 - caretSize; + y3 = y2 + caretSize; + } + x3 = x1; + } else { + if (xAlign === "left") { + x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize; + } else if (xAlign === "right") { + x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize; + } else { + x2 = this.caretX; + } + if (yAlign === "top") { + y1 = ptY; + y2 = y1 - caretSize; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else { + y1 = ptY + height; + y2 = y1 + caretSize; + x1 = x2 + caretSize; + x3 = x2 - caretSize; + } + y3 = y1; + } + return { + x1, + x2, + x3, + y1, + y2, + y3 + }; + } + drawTitle(pt, ctx, options) { + const title = this.title; + const length = title.length; + let titleFont, titleSpacing, i; + if (length) { + const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); + pt.x = getAlignedX(this, options.titleAlign, options); + ctx.textAlign = rtlHelper.textAlign(options.titleAlign); + ctx.textBaseline = "middle"; + titleFont = toFont(options.titleFont); + titleSpacing = options.titleSpacing; + ctx.fillStyle = options.titleColor; + ctx.font = titleFont.string; + for (i = 0; i < length; ++i) { + ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2); + pt.y += titleFont.lineHeight + titleSpacing; + if (i + 1 === length) { + pt.y += options.titleMarginBottom - titleSpacing; + } + } + } + } + _drawColorBox(ctx, pt, i, rtlHelper, options) { + const labelColor = this.labelColors[i]; + const labelPointStyle = this.labelPointStyles[i]; + const { boxHeight, boxWidth } = options; + const bodyFont = toFont(options.bodyFont); + const colorX = getAlignedX(this, "left", options); + const rtlColorX = rtlHelper.x(colorX); + const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0; + const colorY = pt.y + yOffSet; + if (options.usePointStyle) { + const drawOptions = { + radius: Math.min(boxWidth, boxHeight) / 2, + pointStyle: labelPointStyle.pointStyle, + rotation: labelPointStyle.rotation, + borderWidth: 1 + }; + const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2; + const centerY = colorY + boxHeight / 2; + ctx.strokeStyle = options.multiKeyBackground; + ctx.fillStyle = options.multiKeyBackground; + drawPoint(ctx, drawOptions, centerX, centerY); + ctx.strokeStyle = labelColor.borderColor; + ctx.fillStyle = labelColor.backgroundColor; + drawPoint(ctx, drawOptions, centerX, centerY); + } else { + ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : labelColor.borderWidth || 1; + ctx.strokeStyle = labelColor.borderColor; + ctx.setLineDash(labelColor.borderDash || []); + ctx.lineDashOffset = labelColor.borderDashOffset || 0; + const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth); + const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2); + const borderRadius = toTRBLCorners(labelColor.borderRadius); + if (Object.values(borderRadius).some((v) => v !== 0)) { + ctx.beginPath(); + ctx.fillStyle = options.multiKeyBackground; + addRoundedRectPath(ctx, { + x: outerX, + y: colorY, + w: boxWidth, + h: boxHeight, + radius: borderRadius + }); + ctx.fill(); + ctx.stroke(); + ctx.fillStyle = labelColor.backgroundColor; + ctx.beginPath(); + addRoundedRectPath(ctx, { + x: innerX, + y: colorY + 1, + w: boxWidth - 2, + h: boxHeight - 2, + radius: borderRadius + }); + ctx.fill(); + } else { + ctx.fillStyle = options.multiKeyBackground; + ctx.fillRect(outerX, colorY, boxWidth, boxHeight); + ctx.strokeRect(outerX, colorY, boxWidth, boxHeight); + ctx.fillStyle = labelColor.backgroundColor; + ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2); + } + } + ctx.fillStyle = this.labelTextColors[i]; + } + drawBody(pt, ctx, options) { + const { body } = this; + const { bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding } = options; + const bodyFont = toFont(options.bodyFont); + let bodyLineHeight = bodyFont.lineHeight; + let xLinePadding = 0; + const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); + const fillLineOfText = function(line) { + ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2); + pt.y += bodyLineHeight + bodySpacing; + }; + const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign); + let bodyItem, textColor, lines, i, j, ilen, jlen; + ctx.textAlign = bodyAlign; + ctx.textBaseline = "middle"; + ctx.font = bodyFont.string; + pt.x = getAlignedX(this, bodyAlignForCalculation, options); + ctx.fillStyle = options.bodyColor; + each(this.beforeBody, fillLineOfText); + xLinePadding = displayColors && bodyAlignForCalculation !== "right" ? bodyAlign === "center" ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0; + for (i = 0, ilen = body.length; i < ilen; ++i) { + bodyItem = body[i]; + textColor = this.labelTextColors[i]; + ctx.fillStyle = textColor; + each(bodyItem.before, fillLineOfText); + lines = bodyItem.lines; + if (displayColors && lines.length) { + this._drawColorBox(ctx, pt, i, rtlHelper, options); + bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight); + } + for (j = 0, jlen = lines.length; j < jlen; ++j) { + fillLineOfText(lines[j]); + bodyLineHeight = bodyFont.lineHeight; + } + each(bodyItem.after, fillLineOfText); + } + xLinePadding = 0; + bodyLineHeight = bodyFont.lineHeight; + each(this.afterBody, fillLineOfText); + pt.y -= bodySpacing; + } + drawFooter(pt, ctx, options) { + const footer = this.footer; + const length = footer.length; + let footerFont, i; + if (length) { + const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); + pt.x = getAlignedX(this, options.footerAlign, options); + pt.y += options.footerMarginTop; + ctx.textAlign = rtlHelper.textAlign(options.footerAlign); + ctx.textBaseline = "middle"; + footerFont = toFont(options.footerFont); + ctx.fillStyle = options.footerColor; + ctx.font = footerFont.string; + for (i = 0; i < length; ++i) { + ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2); + pt.y += footerFont.lineHeight + options.footerSpacing; + } + } + } + drawBackground(pt, ctx, tooltipSize, options) { + const { xAlign, yAlign } = this; + const { x, y } = pt; + const { width, height } = tooltipSize; + const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(options.cornerRadius); + ctx.fillStyle = options.backgroundColor; + ctx.strokeStyle = options.borderColor; + ctx.lineWidth = options.borderWidth; + ctx.beginPath(); + ctx.moveTo(x + topLeft, y); + if (yAlign === "top") { + this.drawCaret(pt, ctx, tooltipSize, options); + } + ctx.lineTo(x + width - topRight, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + topRight); + if (yAlign === "center" && xAlign === "right") { + this.drawCaret(pt, ctx, tooltipSize, options); + } + ctx.lineTo(x + width, y + height - bottomRight); + ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height); + if (yAlign === "bottom") { + this.drawCaret(pt, ctx, tooltipSize, options); + } + ctx.lineTo(x + bottomLeft, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft); + if (yAlign === "center" && xAlign === "left") { + this.drawCaret(pt, ctx, tooltipSize, options); + } + ctx.lineTo(x, y + topLeft); + ctx.quadraticCurveTo(x, y, x + topLeft, y); + ctx.closePath(); + ctx.fill(); + if (options.borderWidth > 0) { + ctx.stroke(); + } + } + _updateAnimationTarget(options) { + const chart = this.chart; + const anims = this.$animations; + const animX = anims && anims.x; + const animY = anims && anims.y; + if (animX || animY) { + const position = positioners[options.position].call(this, this._active, this._eventPosition); + if (!position) { + return; + } + const size = this._size = getTooltipSize(this, options); + const positionAndSize = Object.assign({}, position, this._size); + const alignment = determineAlignment(chart, options, positionAndSize); + const point = getBackgroundPoint(options, positionAndSize, alignment, chart); + if (animX._to !== point.x || animY._to !== point.y) { + this.xAlign = alignment.xAlign; + this.yAlign = alignment.yAlign; + this.width = size.width; + this.height = size.height; + this.caretX = position.x; + this.caretY = position.y; + this._resolveAnimations().update(this, point); + } + } + } + _willRender() { + return !!this.opacity; + } + draw(ctx) { + const options = this.options.setContext(this.getContext()); + let opacity = this.opacity; + if (!opacity) { + return; + } + this._updateAnimationTarget(options); + const tooltipSize = { + width: this.width, + height: this.height + }; + const pt = { + x: this.x, + y: this.y + }; + opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity; + const padding = toPadding(options.padding); + const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length; + if (options.enabled && hasTooltipContent) { + ctx.save(); + ctx.globalAlpha = opacity; + this.drawBackground(pt, ctx, tooltipSize, options); + overrideTextDirection(ctx, options.textDirection); + pt.y += padding.top; + this.drawTitle(pt, ctx, options); + this.drawBody(pt, ctx, options); + this.drawFooter(pt, ctx, options); + restoreTextDirection(ctx, options.textDirection); + ctx.restore(); + } + } + getActiveElements() { + return this._active || []; + } + setActiveElements(activeElements, eventPosition) { + const lastActive = this._active; + const active = activeElements.map(({ datasetIndex, index }) => { + const meta = this.chart.getDatasetMeta(datasetIndex); + if (!meta) { + throw new Error("Cannot find a dataset at index " + datasetIndex); + } + return { + datasetIndex, + element: meta.data[index], + index + }; + }); + const changed = !_elementsEqual(lastActive, active); + const positionChanged = this._positionChanged(active, eventPosition); + if (changed || positionChanged) { + this._active = active; + this._eventPosition = eventPosition; + this._ignoreReplayEvents = true; + this.update(true); + } + } + handleEvent(e, replay, inChartArea = true) { + if (replay && this._ignoreReplayEvents) { + return false; + } + this._ignoreReplayEvents = false; + const options = this.options; + const lastActive = this._active || []; + const active = this._getActiveElements(e, lastActive, replay, inChartArea); + const positionChanged = this._positionChanged(active, e); + const changed = replay || !_elementsEqual(active, lastActive) || positionChanged; + if (changed) { + this._active = active; + if (options.enabled || options.external) { + this._eventPosition = { + x: e.x, + y: e.y + }; + this.update(true, replay); + } + } + return changed; + } + _getActiveElements(e, lastActive, replay, inChartArea) { + const options = this.options; + if (e.type === "mouseout") { + return []; + } + if (!inChartArea) { + return lastActive.filter((i) => this.chart.data.datasets[i.datasetIndex] && this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== void 0); + } + const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay); + if (options.reverse) { + active.reverse(); + } + return active; + } + _positionChanged(active, e) { + const { caretX, caretY, options } = this; + const position = positioners[options.position].call(this, active, e); + return position !== false && (caretX !== position.x || caretY !== position.y); + } +}; +__publicField(Tooltip, "positioners", positioners); +var plugin_tooltip = { + id: "tooltip", + _element: Tooltip, + positioners, + afterInit(chart, _args, options) { + if (options) { + chart.tooltip = new Tooltip({ + chart, + options + }); + } + }, + beforeUpdate(chart, _args, options) { + if (chart.tooltip) { + chart.tooltip.initialize(options); + } + }, + reset(chart, _args, options) { + if (chart.tooltip) { + chart.tooltip.initialize(options); + } + }, + afterDraw(chart) { + const tooltip = chart.tooltip; + if (tooltip && tooltip._willRender()) { + const args = { + tooltip + }; + if (chart.notifyPlugins("beforeTooltipDraw", { + ...args, + cancelable: true + }) === false) { + return; + } + tooltip.draw(chart.ctx); + chart.notifyPlugins("afterTooltipDraw", args); + } + }, + afterEvent(chart, args) { + if (chart.tooltip) { + const useFinalPosition = args.replay; + if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) { + args.changed = true; + } + } + }, + defaults: { + enabled: true, + external: null, + position: "average", + backgroundColor: "rgba(0,0,0,0.8)", + titleColor: "#fff", + titleFont: { + weight: "bold" + }, + titleSpacing: 2, + titleMarginBottom: 6, + titleAlign: "left", + bodyColor: "#fff", + bodySpacing: 2, + bodyFont: {}, + bodyAlign: "left", + footerColor: "#fff", + footerSpacing: 2, + footerMarginTop: 6, + footerFont: { + weight: "bold" + }, + footerAlign: "left", + padding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + boxHeight: (ctx, opts) => opts.bodyFont.size, + boxWidth: (ctx, opts) => opts.bodyFont.size, + multiKeyBackground: "#fff", + displayColors: true, + boxPadding: 0, + borderColor: "rgba(0,0,0,0)", + borderWidth: 0, + animation: { + duration: 400, + easing: "easeOutQuart" + }, + animations: { + numbers: { + type: "number", + properties: [ + "x", + "y", + "width", + "height", + "caretX", + "caretY" + ] + }, + opacity: { + easing: "linear", + duration: 200 + } + }, + callbacks: defaultCallbacks + }, + defaultRoutes: { + bodyFont: "font", + footerFont: "font", + titleFont: "font" + }, + descriptors: { + _scriptable: (name) => name !== "filter" && name !== "itemSort" && name !== "external", + _indexable: false, + callbacks: { + _scriptable: false, + _indexable: false + }, + animation: { + _fallback: false + }, + animations: { + _fallback: "animation" + } + }, + additionalOptionScopes: [ + "interaction" + ] +}; +var addIfString = (labels, raw, index, addedLabels) => { + if (typeof raw === "string") { + index = labels.push(raw) - 1; + addedLabels.unshift({ + index, + label: raw + }); + } else if (isNaN(raw)) { + index = null; + } + return index; +}; +function findOrAddLabel(labels, raw, index, addedLabels) { + const first = labels.indexOf(raw); + if (first === -1) { + return addIfString(labels, raw, index, addedLabels); + } + const last = labels.lastIndexOf(raw); + return first !== last ? index : first; +} +var validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max); +function _getLabelForValue(value) { + const labels = this.getLabels(); + if (value >= 0 && value < labels.length) { + return labels[value]; + } + return value; +} +var CategoryScale = class extends Scale { + constructor(cfg) { + super(cfg); + this._startValue = void 0; + this._valueRange = 0; + this._addedLabels = []; + } + init(scaleOptions) { + const added = this._addedLabels; + if (added.length) { + const labels = this.getLabels(); + for (const { index, label } of added) { + if (labels[index] === label) { + labels.splice(index, 1); + } + } + this._addedLabels = []; + } + super.init(scaleOptions); + } + parse(raw, index) { + if (isNullOrUndef(raw)) { + return null; + } + const labels = this.getLabels(); + index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels); + return validIndex(index, labels.length - 1); + } + determineDataLimits() { + const { minDefined, maxDefined } = this.getUserBounds(); + let { min, max } = this.getMinMax(true); + if (this.options.bounds === "ticks") { + if (!minDefined) { + min = 0; + } + if (!maxDefined) { + max = this.getLabels().length - 1; + } + } + this.min = min; + this.max = max; + } + buildTicks() { + const min = this.min; + const max = this.max; + const offset = this.options.offset; + const ticks = []; + let labels = this.getLabels(); + labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1); + this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1); + this._startValue = this.min - (offset ? 0.5 : 0); + for (let value = min; value <= max; value++) { + ticks.push({ + value + }); + } + return ticks; + } + getLabelForValue(value) { + return _getLabelForValue.call(this, value); + } + configure() { + super.configure(); + if (!this.isHorizontal()) { + this._reversePixels = !this._reversePixels; + } + } + getPixelForValue(value) { + if (typeof value !== "number") { + value = this.parse(value); + } + return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange); + } + getPixelForTick(index) { + const ticks = this.ticks; + if (index < 0 || index > ticks.length - 1) { + return null; + } + return this.getPixelForValue(ticks[index].value); + } + getValueForPixel(pixel) { + return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange); + } + getBasePixel() { + return this.bottom; + } +}; +__publicField(CategoryScale, "id", "category"); +__publicField(CategoryScale, "defaults", { + ticks: { + callback: _getLabelForValue + } +}); +function generateTicks$1(generationOptions, dataRange) { + const ticks = []; + const MIN_SPACING = 1e-14; + const { bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds } = generationOptions; + const unit = step || 1; + const maxSpaces = maxTicks - 1; + const { min: rmin, max: rmax } = dataRange; + const minDefined = !isNullOrUndef(min); + const maxDefined = !isNullOrUndef(max); + const countDefined = !isNullOrUndef(count); + const minSpacing = (rmax - rmin) / (maxDigits + 1); + let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit; + let factor, niceMin, niceMax, numSpaces; + if (spacing < MIN_SPACING && !minDefined && !maxDefined) { + return [ + { + value: rmin + }, + { + value: rmax + } + ]; + } + numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); + if (numSpaces > maxSpaces) { + spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit; + } + if (!isNullOrUndef(precision)) { + factor = Math.pow(10, precision); + spacing = Math.ceil(spacing * factor) / factor; + } + if (bounds === "ticks") { + niceMin = Math.floor(rmin / spacing) * spacing; + niceMax = Math.ceil(rmax / spacing) * spacing; + } else { + niceMin = rmin; + niceMax = rmax; + } + if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1e3)) { + numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks)); + spacing = (max - min) / numSpaces; + niceMin = min; + niceMax = max; + } else if (countDefined) { + niceMin = minDefined ? min : niceMin; + niceMax = maxDefined ? max : niceMax; + numSpaces = count - 1; + spacing = (niceMax - niceMin) / numSpaces; + } else { + numSpaces = (niceMax - niceMin) / spacing; + if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1e3)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); + } + } + const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin)); + factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision); + niceMin = Math.round(niceMin * factor) / factor; + niceMax = Math.round(niceMax * factor) / factor; + let j = 0; + if (minDefined) { + if (includeBounds && niceMin !== min) { + ticks.push({ + value: min + }); + if (niceMin < min) { + j++; + } + if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) { + j++; + } + } else if (niceMin < min) { + j++; + } + } + for (; j < numSpaces; ++j) { + const tickValue = Math.round((niceMin + j * spacing) * factor) / factor; + if (maxDefined && tickValue > max) { + break; + } + ticks.push({ + value: tickValue + }); + } + if (maxDefined && includeBounds && niceMax !== max) { + if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) { + ticks[ticks.length - 1].value = max; + } else { + ticks.push({ + value: max + }); + } + } else if (!maxDefined || niceMax === max) { + ticks.push({ + value: niceMax + }); + } + return ticks; +} +function relativeLabelSize(value, minSpacing, { horizontal, minRotation }) { + const rad = toRadians(minRotation); + const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 1e-3; + const length = 0.75 * minSpacing * ("" + value).length; + return Math.min(minSpacing / ratio, length); +} +var LinearScaleBase = class extends Scale { + constructor(cfg) { + super(cfg); + this.start = void 0; + this.end = void 0; + this._startValue = void 0; + this._endValue = void 0; + this._valueRange = 0; + } + parse(raw, index) { + if (isNullOrUndef(raw)) { + return null; + } + if ((typeof raw === "number" || raw instanceof Number) && !isFinite(+raw)) { + return null; + } + return +raw; + } + handleTickRangeOptions() { + const { beginAtZero } = this.options; + const { minDefined, maxDefined } = this.getUserBounds(); + let { min, max } = this; + const setMin = (v) => min = minDefined ? min : v; + const setMax = (v) => max = maxDefined ? max : v; + if (beginAtZero) { + const minSign = sign(min); + const maxSign = sign(max); + if (minSign < 0 && maxSign < 0) { + setMax(0); + } else if (minSign > 0 && maxSign > 0) { + setMin(0); + } + } + if (min === max) { + let offset = max === 0 ? 1 : Math.abs(max * 0.05); + setMax(max + offset); + if (!beginAtZero) { + setMin(min - offset); + } + } + this.min = min; + this.max = max; + } + getTickLimit() { + const tickOpts = this.options.ticks; + let { maxTicksLimit, stepSize } = tickOpts; + let maxTicks; + if (stepSize) { + maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1; + if (maxTicks > 1e3) { + console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`); + maxTicks = 1e3; + } + } else { + maxTicks = this.computeTickLimit(); + maxTicksLimit = maxTicksLimit || 11; + } + if (maxTicksLimit) { + maxTicks = Math.min(maxTicksLimit, maxTicks); + } + return maxTicks; + } + computeTickLimit() { + return Number.POSITIVE_INFINITY; + } + buildTicks() { + const opts = this.options; + const tickOpts = opts.ticks; + let maxTicks = this.getTickLimit(); + maxTicks = Math.max(2, maxTicks); + const numericGeneratorOptions = { + maxTicks, + bounds: opts.bounds, + min: opts.min, + max: opts.max, + precision: tickOpts.precision, + step: tickOpts.stepSize, + count: tickOpts.count, + maxDigits: this._maxDigits(), + horizontal: this.isHorizontal(), + minRotation: tickOpts.minRotation || 0, + includeBounds: tickOpts.includeBounds !== false + }; + const dataRange = this._range || this; + const ticks = generateTicks$1(numericGeneratorOptions, dataRange); + if (opts.bounds === "ticks") { + _setMinAndMaxByKey(ticks, this, "value"); + } + if (opts.reverse) { + ticks.reverse(); + this.start = this.max; + this.end = this.min; + } else { + this.start = this.min; + this.end = this.max; + } + return ticks; + } + configure() { + const ticks = this.ticks; + let start = this.min; + let end = this.max; + super.configure(); + if (this.options.offset && ticks.length) { + const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2; + start -= offset; + end += offset; + } + this._startValue = start; + this._endValue = end; + this._valueRange = end - start; + } + getLabelForValue(value) { + return formatNumber(value, this.chart.options.locale, this.options.ticks.format); + } +}; +var LinearScale = class extends LinearScaleBase { + determineDataLimits() { + const { min, max } = this.getMinMax(true); + this.min = isNumberFinite(min) ? min : 0; + this.max = isNumberFinite(max) ? max : 1; + this.handleTickRangeOptions(); + } + computeTickLimit() { + const horizontal = this.isHorizontal(); + const length = horizontal ? this.width : this.height; + const minRotation = toRadians(this.options.ticks.minRotation); + const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 1e-3; + const tickFont = this._resolveTickFontOptions(0); + return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio)); + } + getPixelForValue(value) { + return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange); + } + getValueForPixel(pixel) { + return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange; + } +}; +__publicField(LinearScale, "id", "linear"); +__publicField(LinearScale, "defaults", { + ticks: { + callback: Ticks.formatters.numeric + } +}); +var log10Floor = (v) => Math.floor(log10(v)); +var changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m); +function isMajor(tickVal) { + const remain = tickVal / Math.pow(10, log10Floor(tickVal)); + return remain === 1; +} +function steps(min, max, rangeExp) { + const rangeStep = Math.pow(10, rangeExp); + const start = Math.floor(min / rangeStep); + const end = Math.ceil(max / rangeStep); + return end - start; +} +function startExp(min, max) { + const range = max - min; + let rangeExp = log10Floor(range); + while (steps(min, max, rangeExp) > 10) { + rangeExp++; + } + while (steps(min, max, rangeExp) < 10) { + rangeExp--; + } + return Math.min(rangeExp, log10Floor(min)); +} +function generateTicks(generationOptions, { min, max }) { + min = finiteOrDefault(generationOptions.min, min); + const ticks = []; + const minExp = log10Floor(min); + let exp = startExp(min, max); + let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; + const stepSize = Math.pow(10, exp); + const base = minExp > exp ? Math.pow(10, minExp) : 0; + const start = Math.round((min - base) * precision) / precision; + const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10; + let significand = Math.floor((start - offset) / Math.pow(10, exp)); + let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision); + while (value < max) { + ticks.push({ + value, + major: isMajor(value), + significand + }); + if (significand >= 10) { + significand = significand < 15 ? 15 : 20; + } else { + significand++; + } + if (significand >= 20) { + exp++; + significand = 2; + precision = exp >= 0 ? 1 : precision; + } + value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision; + } + const lastTick = finiteOrDefault(generationOptions.max, value); + ticks.push({ + value: lastTick, + major: isMajor(lastTick), + significand + }); + return ticks; +} +var LogarithmicScale = class extends Scale { + constructor(cfg) { + super(cfg); + this.start = void 0; + this.end = void 0; + this._startValue = void 0; + this._valueRange = 0; + } + parse(raw, index) { + const value = LinearScaleBase.prototype.parse.apply(this, [ + raw, + index + ]); + if (value === 0) { + this._zero = true; + return void 0; + } + return isNumberFinite(value) && value > 0 ? value : null; + } + determineDataLimits() { + const { min, max } = this.getMinMax(true); + this.min = isNumberFinite(min) ? Math.max(0, min) : null; + this.max = isNumberFinite(max) ? Math.max(0, max) : null; + if (this.options.beginAtZero) { + this._zero = true; + } + if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) { + this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0); + } + this.handleTickRangeOptions(); + } + handleTickRangeOptions() { + const { minDefined, maxDefined } = this.getUserBounds(); + let min = this.min; + let max = this.max; + const setMin = (v) => min = minDefined ? min : v; + const setMax = (v) => max = maxDefined ? max : v; + if (min === max) { + if (min <= 0) { + setMin(1); + setMax(10); + } else { + setMin(changeExponent(min, -1)); + setMax(changeExponent(max, 1)); + } + } + if (min <= 0) { + setMin(changeExponent(max, -1)); + } + if (max <= 0) { + setMax(changeExponent(min, 1)); + } + this.min = min; + this.max = max; + } + buildTicks() { + const opts = this.options; + const generationOptions = { + min: this._userMin, + max: this._userMax + }; + const ticks = generateTicks(generationOptions, this); + if (opts.bounds === "ticks") { + _setMinAndMaxByKey(ticks, this, "value"); + } + if (opts.reverse) { + ticks.reverse(); + this.start = this.max; + this.end = this.min; + } else { + this.start = this.min; + this.end = this.max; + } + return ticks; + } + getLabelForValue(value) { + return value === void 0 ? "0" : formatNumber(value, this.chart.options.locale, this.options.ticks.format); + } + configure() { + const start = this.min; + super.configure(); + this._startValue = log10(start); + this._valueRange = log10(this.max) - log10(start); + } + getPixelForValue(value) { + if (value === void 0 || value === 0) { + value = this.min; + } + if (value === null || isNaN(value)) { + return NaN; + } + return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange); + } + getValueForPixel(pixel) { + const decimal = this.getDecimalForPixel(pixel); + return Math.pow(10, this._startValue + decimal * this._valueRange); + } +}; +__publicField(LogarithmicScale, "id", "logarithmic"); +__publicField(LogarithmicScale, "defaults", { + ticks: { + callback: Ticks.formatters.logarithmic, + major: { + enabled: true + } + } +}); +function getTickBackdropHeight(opts) { + const tickOpts = opts.ticks; + if (tickOpts.display && opts.display) { + const padding = toPadding(tickOpts.backdropPadding); + return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height; + } + return 0; +} +function measureLabelSize(ctx, font, label) { + label = isArray(label) ? label : [ + label + ]; + return { + w: _longestText(ctx, font.string, label), + h: label.length * font.lineHeight + }; +} +function determineLimits(angle, pos, size, min, max) { + if (angle === min || angle === max) { + return { + start: pos - size / 2, + end: pos + size / 2 + }; + } else if (angle < min || angle > max) { + return { + start: pos - size, + end: pos + }; + } + return { + start: pos, + end: pos + size + }; +} +function fitWithPointLabels(scale) { + const orig = { + l: scale.left + scale._padding.left, + r: scale.right - scale._padding.right, + t: scale.top + scale._padding.top, + b: scale.bottom - scale._padding.bottom + }; + const limits = Object.assign({}, orig); + const labelSizes = []; + const padding = []; + const valueCount = scale._pointLabels.length; + const pointLabelOpts = scale.options.pointLabels; + const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0; + for (let i = 0; i < valueCount; i++) { + const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i)); + padding[i] = opts.padding; + const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle); + const plFont = toFont(opts.font); + const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]); + labelSizes[i] = textSize; + const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle); + const angle = Math.round(toDegrees(angleRadians)); + const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); + const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); + updateLimits(limits, orig, angleRadians, hLimits, vLimits); + } + scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b); + scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding); +} +function updateLimits(limits, orig, angle, hLimits, vLimits) { + const sin = Math.abs(Math.sin(angle)); + const cos = Math.abs(Math.cos(angle)); + let x = 0; + let y = 0; + if (hLimits.start < orig.l) { + x = (orig.l - hLimits.start) / sin; + limits.l = Math.min(limits.l, orig.l - x); + } else if (hLimits.end > orig.r) { + x = (hLimits.end - orig.r) / sin; + limits.r = Math.max(limits.r, orig.r + x); + } + if (vLimits.start < orig.t) { + y = (orig.t - vLimits.start) / cos; + limits.t = Math.min(limits.t, orig.t - y); + } else if (vLimits.end > orig.b) { + y = (vLimits.end - orig.b) / cos; + limits.b = Math.max(limits.b, orig.b + y); + } +} +function createPointLabelItem(scale, index, itemOpts) { + const outerDistance = scale.drawingArea; + const { extra, additionalAngle, padding, size } = itemOpts; + const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle); + const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI))); + const y = yForAngle(pointLabelPosition.y, size.h, angle); + const textAlign = getTextAlignForAngle(angle); + const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign); + return { + visible: true, + x: pointLabelPosition.x, + y, + textAlign, + left, + top: y, + right: left + size.w, + bottom: y + size.h + }; +} +function isNotOverlapped(item, area) { + if (!area) { + return true; + } + const { left, top, right, bottom } = item; + const apexesInArea = _isPointInArea({ + x: left, + y: top + }, area) || _isPointInArea({ + x: left, + y: bottom + }, area) || _isPointInArea({ + x: right, + y: top + }, area) || _isPointInArea({ + x: right, + y: bottom + }, area); + return !apexesInArea; +} +function buildPointLabelItems(scale, labelSizes, padding) { + const items = []; + const valueCount = scale._pointLabels.length; + const opts = scale.options; + const { centerPointLabels, display } = opts.pointLabels; + const itemOpts = { + extra: getTickBackdropHeight(opts) / 2, + additionalAngle: centerPointLabels ? PI / valueCount : 0 + }; + let area; + for (let i = 0; i < valueCount; i++) { + itemOpts.padding = padding[i]; + itemOpts.size = labelSizes[i]; + const item = createPointLabelItem(scale, i, itemOpts); + items.push(item); + if (display === "auto") { + item.visible = isNotOverlapped(item, area); + if (item.visible) { + area = item; + } + } + } + return items; +} +function getTextAlignForAngle(angle) { + if (angle === 0 || angle === 180) { + return "center"; + } else if (angle < 180) { + return "left"; + } + return "right"; +} +function leftForTextAlign(x, w, align) { + if (align === "right") { + x -= w; + } else if (align === "center") { + x -= w / 2; + } + return x; +} +function yForAngle(y, h4, angle) { + if (angle === 90 || angle === 270) { + y -= h4 / 2; + } else if (angle > 270 || angle < 90) { + y -= h4; + } + return y; +} +function drawPointLabelBox(ctx, opts, item) { + const { left, top, right, bottom } = item; + const { backdropColor } = opts; + if (!isNullOrUndef(backdropColor)) { + const borderRadius = toTRBLCorners(opts.borderRadius); + const padding = toPadding(opts.backdropPadding); + ctx.fillStyle = backdropColor; + const backdropLeft = left - padding.left; + const backdropTop = top - padding.top; + const backdropWidth = right - left + padding.width; + const backdropHeight = bottom - top + padding.height; + if (Object.values(borderRadius).some((v) => v !== 0)) { + ctx.beginPath(); + addRoundedRectPath(ctx, { + x: backdropLeft, + y: backdropTop, + w: backdropWidth, + h: backdropHeight, + radius: borderRadius + }); + ctx.fill(); + } else { + ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight); + } + } +} +function drawPointLabels(scale, labelCount) { + const { ctx, options: { pointLabels } } = scale; + for (let i = labelCount - 1; i >= 0; i--) { + const item = scale._pointLabelItems[i]; + if (!item.visible) { + continue; + } + const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i)); + drawPointLabelBox(ctx, optsAtIndex, item); + const plFont = toFont(optsAtIndex.font); + const { x, y, textAlign } = item; + renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, { + color: optsAtIndex.color, + textAlign, + textBaseline: "middle" + }); + } +} +function pathRadiusLine(scale, radius, circular, labelCount) { + const { ctx } = scale; + if (circular) { + ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU); + } else { + let pointPosition = scale.getPointPosition(0, radius); + ctx.moveTo(pointPosition.x, pointPosition.y); + for (let i = 1; i < labelCount; i++) { + pointPosition = scale.getPointPosition(i, radius); + ctx.lineTo(pointPosition.x, pointPosition.y); + } + } +} +function drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) { + const ctx = scale.ctx; + const circular = gridLineOpts.circular; + const { color: color2, lineWidth } = gridLineOpts; + if (!circular && !labelCount || !color2 || !lineWidth || radius < 0) { + return; + } + ctx.save(); + ctx.strokeStyle = color2; + ctx.lineWidth = lineWidth; + ctx.setLineDash(borderOpts.dash); + ctx.lineDashOffset = borderOpts.dashOffset; + ctx.beginPath(); + pathRadiusLine(scale, radius, circular, labelCount); + ctx.closePath(); + ctx.stroke(); + ctx.restore(); +} +function createPointLabelContext(parent, index, label) { + return createContext(parent, { + label, + index, + type: "pointLabel" + }); +} +var RadialLinearScale = class extends LinearScaleBase { + constructor(cfg) { + super(cfg); + this.xCenter = void 0; + this.yCenter = void 0; + this.drawingArea = void 0; + this._pointLabels = []; + this._pointLabelItems = []; + } + setDimensions() { + const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2); + const w = this.width = this.maxWidth - padding.width; + const h4 = this.height = this.maxHeight - padding.height; + this.xCenter = Math.floor(this.left + w / 2 + padding.left); + this.yCenter = Math.floor(this.top + h4 / 2 + padding.top); + this.drawingArea = Math.floor(Math.min(w, h4) / 2); + } + determineDataLimits() { + const { min, max } = this.getMinMax(false); + this.min = isNumberFinite(min) && !isNaN(min) ? min : 0; + this.max = isNumberFinite(max) && !isNaN(max) ? max : 0; + this.handleTickRangeOptions(); + } + computeTickLimit() { + return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); + } + generateTickLabels(ticks) { + LinearScaleBase.prototype.generateTickLabels.call(this, ticks); + this._pointLabels = this.getLabels().map((value, index) => { + const label = callback(this.options.pointLabels.callback, [ + value, + index + ], this); + return label || label === 0 ? label : ""; + }).filter((v, i) => this.chart.getDataVisibility(i)); + } + fit() { + const opts = this.options; + if (opts.display && opts.pointLabels.display) { + fitWithPointLabels(this); + } else { + this.setCenterPoint(0, 0, 0, 0); + } + } + setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) { + this.xCenter += Math.floor((leftMovement - rightMovement) / 2); + this.yCenter += Math.floor((topMovement - bottomMovement) / 2); + this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement)); + } + getIndexAngle(index) { + const angleMultiplier = TAU / (this._pointLabels.length || 1); + const startAngle = this.options.startAngle || 0; + return _normalizeAngle(index * angleMultiplier + toRadians(startAngle)); + } + getDistanceFromCenterForValue(value) { + if (isNullOrUndef(value)) { + return NaN; + } + const scalingFactor = this.drawingArea / (this.max - this.min); + if (this.options.reverse) { + return (this.max - value) * scalingFactor; + } + return (value - this.min) * scalingFactor; + } + getValueForDistanceFromCenter(distance) { + if (isNullOrUndef(distance)) { + return NaN; + } + const scaledDistance = distance / (this.drawingArea / (this.max - this.min)); + return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance; + } + getPointLabelContext(index) { + const pointLabels = this._pointLabels || []; + if (index >= 0 && index < pointLabels.length) { + const pointLabel = pointLabels[index]; + return createPointLabelContext(this.getContext(), index, pointLabel); + } + } + getPointPosition(index, distanceFromCenter, additionalAngle = 0) { + const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle; + return { + x: Math.cos(angle) * distanceFromCenter + this.xCenter, + y: Math.sin(angle) * distanceFromCenter + this.yCenter, + angle + }; + } + getPointPositionForValue(index, value) { + return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); + } + getBasePosition(index) { + return this.getPointPositionForValue(index || 0, this.getBaseValue()); + } + getPointLabelPosition(index) { + const { left, top, right, bottom } = this._pointLabelItems[index]; + return { + left, + top, + right, + bottom + }; + } + drawBackground() { + const { backgroundColor, grid: { circular } } = this.options; + if (backgroundColor) { + const ctx = this.ctx; + ctx.save(); + ctx.beginPath(); + pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length); + ctx.closePath(); + ctx.fillStyle = backgroundColor; + ctx.fill(); + ctx.restore(); + } + } + drawGrid() { + const ctx = this.ctx; + const opts = this.options; + const { angleLines, grid, border } = opts; + const labelCount = this._pointLabels.length; + let i, offset, position; + if (opts.pointLabels.display) { + drawPointLabels(this, labelCount); + } + if (grid.display) { + this.ticks.forEach((tick, index) => { + if (index !== 0 || index === 0 && this.min < 0) { + offset = this.getDistanceFromCenterForValue(tick.value); + const context = this.getContext(index); + const optsAtIndex = grid.setContext(context); + const optsAtIndexBorder = border.setContext(context); + drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder); + } + }); + } + if (angleLines.display) { + ctx.save(); + for (i = labelCount - 1; i >= 0; i--) { + const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i)); + const { color: color2, lineWidth } = optsAtIndex; + if (!lineWidth || !color2) { + continue; + } + ctx.lineWidth = lineWidth; + ctx.strokeStyle = color2; + ctx.setLineDash(optsAtIndex.borderDash); + ctx.lineDashOffset = optsAtIndex.borderDashOffset; + offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max); + position = this.getPointPosition(i, offset); + ctx.beginPath(); + ctx.moveTo(this.xCenter, this.yCenter); + ctx.lineTo(position.x, position.y); + ctx.stroke(); + } + ctx.restore(); + } + } + drawBorder() { + } + drawLabels() { + const ctx = this.ctx; + const opts = this.options; + const tickOpts = opts.ticks; + if (!tickOpts.display) { + return; + } + const startAngle = this.getIndexAngle(0); + let offset, width; + ctx.save(); + ctx.translate(this.xCenter, this.yCenter); + ctx.rotate(startAngle); + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + this.ticks.forEach((tick, index) => { + if (index === 0 && this.min >= 0 && !opts.reverse) { + return; + } + const optsAtIndex = tickOpts.setContext(this.getContext(index)); + const tickFont = toFont(optsAtIndex.font); + offset = this.getDistanceFromCenterForValue(this.ticks[index].value); + if (optsAtIndex.showLabelBackdrop) { + ctx.font = tickFont.string; + width = ctx.measureText(tick.label).width; + ctx.fillStyle = optsAtIndex.backdropColor; + const padding = toPadding(optsAtIndex.backdropPadding); + ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height); + } + renderText(ctx, tick.label, 0, -offset, tickFont, { + color: optsAtIndex.color, + strokeColor: optsAtIndex.textStrokeColor, + strokeWidth: optsAtIndex.textStrokeWidth + }); + }); + ctx.restore(); + } + drawTitle() { + } +}; +__publicField(RadialLinearScale, "id", "radialLinear"); +__publicField(RadialLinearScale, "defaults", { + display: true, + animate: true, + position: "chartArea", + angleLines: { + display: true, + lineWidth: 1, + borderDash: [], + borderDashOffset: 0 + }, + grid: { + circular: false + }, + startAngle: 0, + ticks: { + showLabelBackdrop: true, + callback: Ticks.formatters.numeric + }, + pointLabels: { + backdropColor: void 0, + backdropPadding: 2, + display: true, + font: { + size: 10 + }, + callback(label) { + return label; + }, + padding: 5, + centerPointLabels: false + } +}); +__publicField(RadialLinearScale, "defaultRoutes", { + "angleLines.color": "borderColor", + "pointLabels.color": "color", + "ticks.color": "color" +}); +__publicField(RadialLinearScale, "descriptors", { + angleLines: { + _fallback: "grid" + } +}); +var INTERVALS = { + millisecond: { + common: true, + size: 1, + steps: 1e3 + }, + second: { + common: true, + size: 1e3, + steps: 60 + }, + minute: { + common: true, + size: 6e4, + steps: 60 + }, + hour: { + common: true, + size: 36e5, + steps: 24 + }, + day: { + common: true, + size: 864e5, + steps: 30 + }, + week: { + common: false, + size: 6048e5, + steps: 4 + }, + month: { + common: true, + size: 2628e6, + steps: 12 + }, + quarter: { + common: false, + size: 7884e6, + steps: 4 + }, + year: { + common: true, + size: 3154e7 + } +}; +var UNITS = /* @__PURE__ */ Object.keys(INTERVALS); +function sorter(a, b) { + return a - b; +} +function parse(scale, input) { + if (isNullOrUndef(input)) { + return null; + } + const adapter = scale._adapter; + const { parser, round: round2, isoWeekday } = scale._parseOpts; + let value = input; + if (typeof parser === "function") { + value = parser(value); + } + if (!isNumberFinite(value)) { + value = typeof parser === "string" ? adapter.parse(value, parser) : adapter.parse(value); + } + if (value === null) { + return null; + } + if (round2) { + value = round2 === "week" && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, "isoWeek", isoWeekday) : adapter.startOf(value, round2); + } + return +value; +} +function determineUnitForAutoTicks(minUnit, min, max, capacity) { + const ilen = UNITS.length; + for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { + const interval = INTERVALS[UNITS[i]]; + const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER; + if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { + return UNITS[i]; + } + } + return UNITS[ilen - 1]; +} +function determineUnitForFormatting(scale, numTicks, minUnit, min, max) { + for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) { + const unit = UNITS[i]; + if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) { + return unit; + } + } + return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; +} +function determineMajorUnit(unit) { + for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { + if (INTERVALS[UNITS[i]].common) { + return UNITS[i]; + } + } +} +function addTick(ticks, time, timestamps) { + if (!timestamps) { + ticks[time] = true; + } else if (timestamps.length) { + const { lo, hi } = _lookup(timestamps, time); + const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi]; + ticks[timestamp] = true; + } +} +function setMajorTicks(scale, ticks, map3, majorUnit) { + const adapter = scale._adapter; + const first = +adapter.startOf(ticks[0].value, majorUnit); + const last = ticks[ticks.length - 1].value; + let major, index; + for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) { + index = map3[major]; + if (index >= 0) { + ticks[index].major = true; + } + } + return ticks; +} +function ticksFromTimestamps(scale, values, majorUnit) { + const ticks = []; + const map3 = {}; + const ilen = values.length; + let i, value; + for (i = 0; i < ilen; ++i) { + value = values[i]; + map3[value] = i; + ticks.push({ + value, + major: false + }); + } + return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map3, majorUnit); +} +var TimeScale = class extends Scale { + constructor(props) { + super(props); + this._cache = { + data: [], + labels: [], + all: [] + }; + this._unit = "day"; + this._majorUnit = void 0; + this._offsets = {}; + this._normalized = false; + this._parseOpts = void 0; + } + init(scaleOpts, opts = {}) { + const time = scaleOpts.time || (scaleOpts.time = {}); + const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date); + adapter.init(opts); + mergeIf(time.displayFormats, adapter.formats()); + this._parseOpts = { + parser: time.parser, + round: time.round, + isoWeekday: time.isoWeekday + }; + super.init(scaleOpts); + this._normalized = opts.normalized; + } + parse(raw, index) { + if (raw === void 0) { + return null; + } + return parse(this, raw); + } + beforeLayout() { + super.beforeLayout(); + this._cache = { + data: [], + labels: [], + all: [] + }; + } + determineDataLimits() { + const options = this.options; + const adapter = this._adapter; + const unit = options.time.unit || "day"; + let { min, max, minDefined, maxDefined } = this.getUserBounds(); + function _applyBounds(bounds) { + if (!minDefined && !isNaN(bounds.min)) { + min = Math.min(min, bounds.min); + } + if (!maxDefined && !isNaN(bounds.max)) { + max = Math.max(max, bounds.max); + } + } + if (!minDefined || !maxDefined) { + _applyBounds(this._getLabelBounds()); + if (options.bounds !== "ticks" || options.ticks.source !== "labels") { + _applyBounds(this.getMinMax(false)); + } + } + min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit); + max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1; + this.min = Math.min(min, max - 1); + this.max = Math.max(min + 1, max); + } + _getLabelBounds() { + const arr = this.getLabelTimestamps(); + let min = Number.POSITIVE_INFINITY; + let max = Number.NEGATIVE_INFINITY; + if (arr.length) { + min = arr[0]; + max = arr[arr.length - 1]; + } + return { + min, + max + }; + } + buildTicks() { + const options = this.options; + const timeOpts = options.time; + const tickOpts = options.ticks; + const timestamps = tickOpts.source === "labels" ? this.getLabelTimestamps() : this._generate(); + if (options.bounds === "ticks" && timestamps.length) { + this.min = this._userMin || timestamps[0]; + this.max = this._userMax || timestamps[timestamps.length - 1]; + } + const min = this.min; + const max = this.max; + const ticks = _filterBetween(timestamps, min, max); + this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max)); + this._majorUnit = !tickOpts.major.enabled || this._unit === "year" ? void 0 : determineMajorUnit(this._unit); + this.initOffsets(timestamps); + if (options.reverse) { + ticks.reverse(); + } + return ticksFromTimestamps(this, ticks, this._majorUnit); + } + afterAutoSkip() { + if (this.options.offsetAfterAutoskip) { + this.initOffsets(this.ticks.map((tick) => +tick.value)); + } + } + initOffsets(timestamps = []) { + let start = 0; + let end = 0; + let first, last; + if (this.options.offset && timestamps.length) { + first = this.getDecimalForValue(timestamps[0]); + if (timestamps.length === 1) { + start = 1 - first; + } else { + start = (this.getDecimalForValue(timestamps[1]) - first) / 2; + } + last = this.getDecimalForValue(timestamps[timestamps.length - 1]); + if (timestamps.length === 1) { + end = last; + } else { + end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2; + } + } + const limit = timestamps.length < 3 ? 0.5 : 0.25; + start = _limitValue(start, 0, limit); + end = _limitValue(end, 0, limit); + this._offsets = { + start, + end, + factor: 1 / (start + 1 + end) + }; + } + _generate() { + const adapter = this._adapter; + const min = this.min; + const max = this.max; + const options = this.options; + const timeOpts = options.time; + const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min)); + const stepSize = valueOrDefault(options.ticks.stepSize, 1); + const weekday = minor === "week" ? timeOpts.isoWeekday : false; + const hasWeekday = isNumber(weekday) || weekday === true; + const ticks = {}; + let first = min; + let time, count; + if (hasWeekday) { + first = +adapter.startOf(first, "isoWeek", weekday); + } + first = +adapter.startOf(first, hasWeekday ? "day" : minor); + if (adapter.diff(max, min, minor) > 1e5 * stepSize) { + throw new Error(min + " and " + max + " are too far apart with stepSize of " + stepSize + " " + minor); + } + const timestamps = options.ticks.source === "data" && this.getDataTimestamps(); + for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) { + addTick(ticks, time, timestamps); + } + if (time === max || options.bounds === "ticks" || count === 1) { + addTick(ticks, time, timestamps); + } + return Object.keys(ticks).sort(sorter).map((x) => +x); + } + getLabelForValue(value) { + const adapter = this._adapter; + const timeOpts = this.options.time; + if (timeOpts.tooltipFormat) { + return adapter.format(value, timeOpts.tooltipFormat); + } + return adapter.format(value, timeOpts.displayFormats.datetime); + } + format(value, format) { + const options = this.options; + const formats = options.time.displayFormats; + const unit = this._unit; + const fmt = format || formats[unit]; + return this._adapter.format(value, fmt); + } + _tickFormatFunction(time, index, ticks, format) { + const options = this.options; + const formatter = options.ticks.callback; + if (formatter) { + return callback(formatter, [ + time, + index, + ticks + ], this); + } + const formats = options.time.displayFormats; + const unit = this._unit; + const majorUnit = this._majorUnit; + const minorFormat = unit && formats[unit]; + const majorFormat = majorUnit && formats[majorUnit]; + const tick = ticks[index]; + const major = majorUnit && majorFormat && tick && tick.major; + return this._adapter.format(time, format || (major ? majorFormat : minorFormat)); + } + generateTickLabels(ticks) { + let i, ilen, tick; + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + tick = ticks[i]; + tick.label = this._tickFormatFunction(tick.value, i, ticks); + } + } + getDecimalForValue(value) { + return value === null ? NaN : (value - this.min) / (this.max - this.min); + } + getPixelForValue(value) { + const offsets = this._offsets; + const pos = this.getDecimalForValue(value); + return this.getPixelForDecimal((offsets.start + pos) * offsets.factor); + } + getValueForPixel(pixel) { + const offsets = this._offsets; + const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end; + return this.min + pos * (this.max - this.min); + } + _getLabelSize(label) { + const ticksOpts = this.options.ticks; + const tickLabelWidth = this.ctx.measureText(label).width; + const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation); + const cosRotation = Math.cos(angle); + const sinRotation = Math.sin(angle); + const tickFontSize = this._resolveTickFontOptions(0).size; + return { + w: tickLabelWidth * cosRotation + tickFontSize * sinRotation, + h: tickLabelWidth * sinRotation + tickFontSize * cosRotation + }; + } + _getLabelCapacity(exampleTime) { + const timeOpts = this.options.time; + const displayFormats = timeOpts.displayFormats; + const format = displayFormats[timeOpts.unit] || displayFormats.millisecond; + const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [ + exampleTime + ], this._majorUnit), format); + const size = this._getLabelSize(exampleLabel); + const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1; + return capacity > 0 ? capacity : 1; + } + getDataTimestamps() { + let timestamps = this._cache.data || []; + let i, ilen; + if (timestamps.length) { + return timestamps; + } + const metas = this.getMatchingVisibleMetas(); + if (this._normalized && metas.length) { + return this._cache.data = metas[0].controller.getAllParsedValues(this); + } + for (i = 0, ilen = metas.length; i < ilen; ++i) { + timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this)); + } + return this._cache.data = this.normalize(timestamps); + } + getLabelTimestamps() { + const timestamps = this._cache.labels || []; + let i, ilen; + if (timestamps.length) { + return timestamps; + } + const labels = this.getLabels(); + for (i = 0, ilen = labels.length; i < ilen; ++i) { + timestamps.push(parse(this, labels[i])); + } + return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps); + } + normalize(values) { + return _arrayUnique(values.sort(sorter)); + } +}; +__publicField(TimeScale, "id", "time"); +__publicField(TimeScale, "defaults", { + bounds: "data", + adapters: {}, + time: { + parser: false, + unit: false, + round: false, + isoWeekday: false, + minUnit: "millisecond", + displayFormats: {} + }, + ticks: { + source: "auto", + callback: false, + major: { + enabled: false + } + } +}); +function interpolate3(table, val, reverse) { + let lo = 0; + let hi = table.length - 1; + let prevSource, nextSource, prevTarget, nextTarget; + if (reverse) { + if (val >= table[lo].pos && val <= table[hi].pos) { + ({ lo, hi } = _lookupByKey(table, "pos", val)); + } + ({ pos: prevSource, time: prevTarget } = table[lo]); + ({ pos: nextSource, time: nextTarget } = table[hi]); + } else { + if (val >= table[lo].time && val <= table[hi].time) { + ({ lo, hi } = _lookupByKey(table, "time", val)); + } + ({ time: prevSource, pos: prevTarget } = table[lo]); + ({ time: nextSource, pos: nextTarget } = table[hi]); + } + const span = nextSource - prevSource; + return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget; +} +var TimeSeriesScale = class extends TimeScale { + constructor(props) { + super(props); + this._table = []; + this._minPos = void 0; + this._tableRange = void 0; + } + initOffsets() { + const timestamps = this._getTimestampsForTable(); + const table = this._table = this.buildLookupTable(timestamps); + this._minPos = interpolate3(table, this.min); + this._tableRange = interpolate3(table, this.max) - this._minPos; + super.initOffsets(timestamps); + } + buildLookupTable(timestamps) { + const { min, max } = this; + const items = []; + const table = []; + let i, ilen, prev, curr, next; + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr >= min && curr <= max) { + items.push(curr); + } + } + if (items.length < 2) { + return [ + { + time: min, + pos: 0 + }, + { + time: max, + pos: 1 + } + ]; + } + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + if (Math.round((next + prev) / 2) !== curr) { + table.push({ + time: curr, + pos: i / (ilen - 1) + }); + } + } + return table; + } + _generate() { + const min = this.min; + const max = this.max; + let timestamps = super.getDataTimestamps(); + if (!timestamps.includes(min) || !timestamps.length) { + timestamps.splice(0, 0, min); + } + if (!timestamps.includes(max) || timestamps.length === 1) { + timestamps.push(max); + } + return timestamps.sort((a, b) => a - b); + } + _getTimestampsForTable() { + let timestamps = this._cache.all || []; + if (timestamps.length) { + return timestamps; + } + const data = this.getDataTimestamps(); + const label = this.getLabelTimestamps(); + if (data.length && label.length) { + timestamps = this.normalize(data.concat(label)); + } else { + timestamps = data.length ? data : label; + } + timestamps = this._cache.all = timestamps; + return timestamps; + } + getDecimalForValue(value) { + return (interpolate3(this._table, value) - this._minPos) / this._tableRange; + } + getValueForPixel(pixel) { + const offsets = this._offsets; + const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end; + return interpolate3(this._table, decimal * this._tableRange + this._minPos, true); + } +}; +__publicField(TimeSeriesScale, "id", "timeseries"); +__publicField(TimeSeriesScale, "defaults", TimeScale.defaults); + +// src/gui/StatsModal.tsx +Chart.register( + BarElement, + BarController, + plugin_legend, + plugin_title, + plugin_tooltip, + plugin_subtitle, + CategoryScale, + LinearScale, + PieController, + ArcElement +); +var StatsModal = class extends import_obsidian7.Modal { + constructor(app, plugin) { + super(app); + this.plugin = plugin; + this.titleEl.setText(`${t("STATS_TITLE")} `); + this.titleEl.addClass("sr-centered"); + this.titleEl.innerHTML += /* @__PURE__ */ (0, import_vhtml2.default)("select", { id: "sr-chart-period" }, /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "month", selected: true }, t("MONTH")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "quarter" }, t("QUARTER")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "year" }, t("YEAR")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "lifetime" }, t("LIFETIME"))); + this.modalEl.style.height = "100%"; + this.modalEl.style.width = "100%"; + if (import_obsidian7.Platform.isMobile) { + this.contentEl.style.display = "block"; + } + } + onOpen() { + const { contentEl } = this; + contentEl.style.textAlign = "center"; + const cardStats = this.plugin.cardStats; + let maxN = cardStats.delayedDays.getMaxValue(); + for (let dueOffset = 0; dueOffset <= maxN; dueOffset++) { + cardStats.delayedDays.clearCountIfMissing(dueOffset); + } + const dueDatesFlashcardsCopy = { 0: 0 }; + for (const [dueOffset, dueCount] of getTypedObjectEntries(cardStats.delayedDays.dict)) { + if (dueOffset <= 0) { + dueDatesFlashcardsCopy[0] += dueCount; + } else { + dueDatesFlashcardsCopy[dueOffset] = dueCount; + } + } + const scheduledCount = cardStats.youngCount + cardStats.matureCount; + maxN = Math.max(maxN, 1); + contentEl.innerHTML += /* @__PURE__ */ (0, import_vhtml2.default)("div", null, /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "forecastChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "forecastChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "intervalsChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "intervalsChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "easesChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "easesChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "cardTypesChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "cardTypesChartSummary" })); + createStatsChart( + "bar", + "forecastChart", + t("FORECAST"), + t("FORECAST_DESC"), + Object.keys(dueDatesFlashcardsCopy), + Object.values(dueDatesFlashcardsCopy), + t("REVIEWS_PER_DAY", { avg: (scheduledCount / maxN).toFixed(1) }), + t("SCHEDULED"), + t("DAYS"), + t("NUMBER_OF_CARDS") + ); + maxN = cardStats.intervals.getMaxValue(); + for (let interval = 0; interval <= maxN; interval++) { + cardStats.intervals.clearCountIfMissing(interval); + } + const average_interval = textInterval( + Math.round( + cardStats.intervals.getTotalOfValueMultiplyCount() / scheduledCount * 10 + ) / 10 || 0, + false + ), longest_interval = textInterval(cardStats.intervals.getMaxValue(), false); + createStatsChart( + "bar", + "intervalsChart", + t("INTERVALS"), + t("INTERVALS_DESC"), + Object.keys(cardStats.intervals.dict), + Object.values(cardStats.intervals.dict), + t("INTERVALS_SUMMARY", { avg: average_interval, longest: longest_interval }), + t("COUNT"), + t("DAYS"), + t("NUMBER_OF_CARDS") + ); + const eases = getKeysPreserveType(cardStats.eases.dict); + for (let ease = Math.min(...eases); ease <= Math.max(...eases); ease++) { + cardStats.eases.clearCountIfMissing(ease); + } + const average_ease = Math.round(cardStats.eases.getTotalOfValueMultiplyCount() / scheduledCount) || 0; + createStatsChart( + "bar", + "easesChart", + t("EASES"), + "", + Object.keys(cardStats.eases.dict), + Object.values(cardStats.eases.dict), + t("EASES_SUMMARY", { avgEase: average_ease }), + t("COUNT"), + t("EASES"), + t("NUMBER_OF_CARDS") + ); + const totalCardsCount = this.plugin.deckTree.getDistinctCardCount( + 2 /* All */, + true + ); + createStatsChart( + "pie", + "cardTypesChart", + t("CARD_TYPES"), + t("CARD_TYPES_DESC"), + [ + `${t("CARD_TYPE_NEW")} - ${Math.round( + cardStats.newCount / totalCardsCount * 100 + )}%`, + `${t("CARD_TYPE_YOUNG")} - ${Math.round( + cardStats.youngCount / totalCardsCount * 100 + )}%`, + `${t("CARD_TYPE_MATURE")} - ${Math.round( + cardStats.matureCount / totalCardsCount * 100 + )}%` + ], + [cardStats.newCount, cardStats.youngCount, cardStats.matureCount], + t("CARD_TYPES_SUMMARY", { totalCardsCount }) + ); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; +function createStatsChart(type, canvasId, title, subtitle, labels, data, summary, seriesTitle = "", xAxisTitle = "", yAxisTitle = "") { + const style = getComputedStyle(document.body); + const textColor = style.getPropertyValue("--text-normal"); + let scales = {}, backgroundColor = ["#2196f3"]; + if (type !== "pie") { + scales = { + x: { + title: { + display: true, + text: xAxisTitle, + color: textColor + } + }, + y: { + title: { + display: true, + text: yAxisTitle, + color: textColor + } + } + }; + } else { + backgroundColor = ["#2196f3", "#4caf50", "green"]; + } + const shouldFilter = canvasId === "forecastChart" || canvasId === "intervalsChart"; + const statsChart = new Chart(document.getElementById(canvasId), { + type, + data: { + labels: shouldFilter ? labels.slice(0, 31) : labels, + datasets: [ + { + label: seriesTitle, + backgroundColor, + data: shouldFilter ? data.slice(0, 31) : data + } + ] + }, + options: { + scales, + plugins: { + title: { + display: true, + text: title, + font: { + size: 22 + }, + color: textColor + }, + subtitle: { + display: true, + text: subtitle, + font: { + size: 16, + style: "italic" + }, + color: textColor + }, + legend: { + display: false + } + }, + aspectRatio: 2 + } + }); + if (shouldFilter) { + const chartPeriodEl = document.getElementById("sr-chart-period"); + chartPeriodEl.addEventListener("click", () => { + let filteredLabels, filteredData; + const chartPeriod = chartPeriodEl.value; + if (chartPeriod === "month") { + filteredLabels = labels.slice(0, 31); + filteredData = data.slice(0, 31); + } else if (chartPeriod === "quarter") { + filteredLabels = labels.slice(0, 91); + filteredData = data.slice(0, 91); + } else if (chartPeriod === "year") { + filteredLabels = labels.slice(0, 366); + filteredData = data.slice(0, 366); + } else { + filteredLabels = labels; + filteredData = data; + } + statsChart.data.labels = filteredLabels; + statsChart.data.datasets[0] = { + label: seriesTitle, + backgroundColor, + data: filteredData + }; + statsChart.update(); + }); + } + document.getElementById(`${canvasId}Summary`).innerText = summary; +} + +// src/gui/Sidebar.tsx +var import_obsidian8 = require("obsidian"); +var REVIEW_QUEUE_VIEW_TYPE = "review-queue-list-view"; +var ReviewQueueListView = class extends import_obsidian8.ItemView { + constructor(leaf, plugin) { + super(leaf); + this.plugin = plugin; + this.registerEvent(this.app.workspace.on("file-open", () => this.redraw())); + this.registerEvent(this.app.vault.on("rename", () => this.redraw())); + } + getViewType() { + return REVIEW_QUEUE_VIEW_TYPE; + } + getDisplayText() { + return t("NOTES_REVIEW_QUEUE"); + } + getIcon() { + return "SpacedRepIcon"; + } + onHeaderMenu(menu) { + menu.addItem((item) => { + item.setTitle(t("CLOSE")).setIcon("cross").onClick(() => { + this.app.workspace.detachLeavesOfType(REVIEW_QUEUE_VIEW_TYPE); + }); + }); + } + redraw() { + const activeFile = this.app.workspace.getActiveFile(); + const rootEl = createDiv("nav-folder mod-root"); + const childrenEl = rootEl.createDiv("nav-folder-children"); + for (const deckKey in this.plugin.reviewDecks) { + const deck = this.plugin.reviewDecks[deckKey]; + const deckCollapsed = !deck.activeFolders.has(deck.deckName); + const deckFolderEl = this.createRightPaneFolder( + childrenEl, + deckKey, + deckCollapsed, + false, + deck + ).getElementsByClassName("nav-folder-children")[0]; + if (deck.newNotes.length > 0) { + const newNotesFolderEl = this.createRightPaneFolder( + deckFolderEl, + t("NEW"), + !deck.activeFolders.has(t("NEW")), + deckCollapsed, + deck + ); + for (const newFile of deck.newNotes) { + const fileIsOpen = activeFile && newFile.path === activeFile.path; + if (fileIsOpen) { + deck.activeFolders.add(deck.deckName); + deck.activeFolders.add(t("NEW")); + this.changeFolderIconToExpanded(newNotesFolderEl); + this.changeFolderIconToExpanded(deckFolderEl); + } + this.createRightPaneFile( + newNotesFolderEl, + newFile, + fileIsOpen, + !deck.activeFolders.has(t("NEW")), + deck, + this.plugin + ); + } + } + if (deck.scheduledNotes.length > 0) { + const now = Date.now(); + let currUnix = -1; + let schedFolderEl = null, folderTitle = ""; + const maxDaysToRender = this.plugin.data.settings.maxNDaysNotesReviewQueue; + for (const sNote of deck.scheduledNotes) { + if (sNote.dueUnix != currUnix) { + const nDays = Math.ceil((sNote.dueUnix - now) / (24 * 3600 * 1e3)); + if (nDays > maxDaysToRender) { + break; + } + if (nDays === -1) { + folderTitle = t("YESTERDAY"); + } else if (nDays === 0) { + folderTitle = t("TODAY"); + } else if (nDays === 1) { + folderTitle = t("TOMORROW"); + } else { + folderTitle = new Date(sNote.dueUnix).toDateString(); + } + schedFolderEl = this.createRightPaneFolder( + deckFolderEl, + folderTitle, + !deck.activeFolders.has(folderTitle), + deckCollapsed, + deck + ); + currUnix = sNote.dueUnix; + } + const fileIsOpen = activeFile && sNote.note.path === activeFile.path; + if (fileIsOpen) { + deck.activeFolders.add(deck.deckName); + deck.activeFolders.add(folderTitle); + this.changeFolderIconToExpanded(schedFolderEl); + this.changeFolderIconToExpanded(deckFolderEl); + } + this.createRightPaneFile( + schedFolderEl, + sNote.note, + fileIsOpen, + !deck.activeFolders.has(folderTitle), + deck, + this.plugin + ); + } + } + } + const contentEl = this.containerEl.children[1]; + contentEl.empty(); + contentEl.appendChild(rootEl); + } + createRightPaneFolder(parentEl, folderTitle, collapsed, hidden, deck) { + const folderEl = parentEl.createDiv("nav-folder"); + const folderTitleEl = folderEl.createDiv("nav-folder-title"); + const childrenEl = folderEl.createDiv("nav-folder-children"); + const collapseIconEl = folderTitleEl.createDiv( + "nav-folder-collapse-indicator collapse-icon" + ); + collapseIconEl.innerHTML = COLLAPSE_ICON; + if (collapsed) { + collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)"; + } + folderTitleEl.createDiv("nav-folder-title-content").setText(folderTitle); + if (hidden) { + folderEl.style.display = "none"; + } + folderTitleEl.onClickEvent(() => { + for (const child of childrenEl.childNodes) { + if (child.style.display === "block" || child.style.display === "") { + child.style.display = "none"; + collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)"; + deck.activeFolders.delete(folderTitle); + } else { + child.style.display = "block"; + collapseIconEl.childNodes[0].style.transform = ""; + deck.activeFolders.add(folderTitle); + } + } + }); + return folderEl; + } + createRightPaneFile(folderEl, file, fileElActive, hidden, deck, plugin) { + const navFileEl = folderEl.getElementsByClassName("nav-folder-children")[0].createDiv("nav-file"); + if (hidden) { + navFileEl.style.display = "none"; + } + const navFileTitle = navFileEl.createDiv("nav-file-title"); + if (fileElActive) { + navFileTitle.addClass("is-active"); + } + navFileTitle.createDiv("nav-file-title-content").setText(file.basename); + navFileTitle.addEventListener( + "click", + async (event) => { + event.preventDefault(); + plugin.lastSelectedReviewDeck = deck.deckName; + await this.app.workspace.getLeaf().openFile(file); + return false; + }, + false + ); + navFileTitle.addEventListener( + "contextmenu", + (event) => { + event.preventDefault(); + const fileMenu = new import_obsidian8.Menu(); + this.app.workspace.trigger("file-menu", fileMenu, file, "my-context-menu", null); + fileMenu.showAtPosition({ + x: event.pageX, + y: event.pageY + }); + return false; + }, + false + ); + } + changeFolderIconToExpanded(folderEl) { + const collapseIconEl = folderEl.find("div.nav-folder-collapse-indicator"); + collapseIconEl.childNodes[0].style.transform = ""; + } +}; + +// src/ReviewDeck.ts +var import_obsidian9 = require("obsidian"); +var ReviewDeck = class { + constructor(name) { + this.newNotes = []; + this.scheduledNotes = []; + this.dueNotesCount = 0; + this.deckName = name; + this.activeFolders = /* @__PURE__ */ new Set([this.deckName, t("TODAY")]); + } + sortNotes(pageranks) { + this.newNotes = this.newNotes.sort( + (a, b) => (pageranks[b.path] || 0) - (pageranks[a.path] || 0) + ); + this.scheduledNotes = this.scheduledNotes.sort((a, b) => { + const result = a.dueUnix - b.dueUnix; + if (result != 0) { + return result; + } + return (pageranks[b.note.path] || 0) - (pageranks[a.note.path] || 0); + }); + } +}; +var ReviewDeckSelectionModal = class extends import_obsidian9.FuzzySuggestModal { + constructor(app, deckKeys) { + super(app); + this.deckKeys = []; + this.deckKeys = deckKeys; + } + getItems() { + return this.deckKeys; + } + getItemText(item) { + return item; + } + onChooseItem(deckKey, _) { + this.close(); + this.submitCallback(deckKey); + } +}; + +// src/icons/appicon.ts +var import_obsidian10 = require("obsidian"); +function appIcon() { + (0, import_obsidian10.addIcon)( + "SpacedRepIcon", + ` + + + ` + ); +} + +// src/util/RandomNumberProvider.ts +var RandomNumberProvider = class { + getInteger(lowerBound, upperBound) { + const range = upperBound - lowerBound + 1; + return Math.floor(Math.random() * range) + lowerBound; + } +}; +var StaticRandomNumberProvider = class { + getInteger(lowerBound, upperBound) { + if (lowerBound != this.expectedLowerBound || upperBound != this.expectedUpperBound) + throw `lowerBound: A${lowerBound}/E${this.expectedLowerBound}, upperBound: A${upperBound}/E${this.expectedUpperBound}`; + return this.next; + } +}; +var WeightedRandomNumber = class _WeightedRandomNumber { + constructor(provider) { + this.provider = provider; + } + static create() { + return new _WeightedRandomNumber(globalRandomNumberProvider); + } + // + // weights is a dictionary: + // first number - a key that can be returned + // second number - the "bucket size" - this is a weight that influences the probability of the + // first number being returned + // + // returns: + // first number - one of the keys from the weights parameter + // second number - an "index" value; 0 <= index < bucketSize + getRandomValues(weights) { + const total = _WeightedRandomNumber.calcTotalOfCount(weights); + if (Object.values(weights).some((i) => !Number.isInteger(i) || i < 0)) + throw "All weights must be positive integers"; + const v = this.provider.getInteger(0, total - 1); + let x = 0; + for (const kvp in weights) { + const [value, count] = [Number(kvp), weights[kvp]]; + if (v < x + count) { + const index = v - x; + return [value, index]; + } + x += count; + } + throw ""; + } + static calcTotalOfCount(weights) { + const total = getTypedObjectEntries(weights).map(([_, count]) => count).reduce((a, b) => a + b, 0) || 0; + return total; + } +}; +var globalRandomNumberProvider = new RandomNumberProvider(); +var staticRandomNumberProvider = new StaticRandomNumberProvider(); + +// src/DeckTreeIterator.ts +var CardOrder = /* @__PURE__ */ ((CardOrder2) => { + CardOrder2[CardOrder2["NewFirstSequential"] = 0] = "NewFirstSequential"; + CardOrder2[CardOrder2["NewFirstRandom"] = 1] = "NewFirstRandom"; + CardOrder2[CardOrder2["DueFirstSequential"] = 2] = "DueFirstSequential"; + CardOrder2[CardOrder2["DueFirstRandom"] = 3] = "DueFirstRandom"; + CardOrder2[CardOrder2["EveryCardRandomDeckAndCard"] = 4] = "EveryCardRandomDeckAndCard"; + return CardOrder2; +})(CardOrder || {}); +var DeckOrder = /* @__PURE__ */ ((DeckOrder2) => { + DeckOrder2[DeckOrder2["PrevDeckComplete_Sequential"] = 0] = "PrevDeckComplete_Sequential"; + DeckOrder2[DeckOrder2["PrevDeckComplete_Random"] = 1] = "PrevDeckComplete_Random"; + return DeckOrder2; +})(DeckOrder || {}); +var SingleDeckIterator = class _SingleDeckIterator { + get hasCurrentCard() { + return this.cardIdx != null; + } + get currentCard() { + let result = null; + if (this.cardIdx != null) + result = this.deck.getCard(this.cardIdx, this.cardListType); + return result; + } + constructor(iteratorOrder) { + this.iteratorOrder = iteratorOrder; + this.preferredCardListType = _SingleDeckIterator.getCardListTypeForIterator( + this.iteratorOrder + ); + this.weightedRandomNumber = WeightedRandomNumber.create(); + } + setDeck(deck) { + this.deck = deck; + this.setCardListType(null); + } + // + // 0 <= cardIndex < newFlashcards.length + dueFlashcards.length + // + setNewOrDueCardIdx(cardIndex) { + let cardListType = 0 /* NewCard */; + let index = cardIndex; + if (cardIndex >= this.deck.newFlashcards.length) { + cardListType = 1 /* DueCard */; + index = cardIndex - this.deck.newFlashcards.length; + } + this.setCardListType(cardListType, index); + } + setCardListType(cardListType, cardIdx = null) { + this.cardListType = cardListType; + this.cardIdx = cardIdx; + } + nextCard() { + if (this.iteratorOrder.cardOrder == 4 /* EveryCardRandomDeckAndCard */) { + this.nextRandomCard(); + } else { + if (this.cardListType == null) { + this.setCardListType(this.preferredCardListType); + } + if (!this.nextCardWithinCurrentList()) { + if (this.cardListType == this.preferredCardListType) { + this.setCardListType(Deck2.otherListType(this.cardListType)); + if (!this.nextCardWithinCurrentList()) { + this.setCardListType(null); + } + } else { + this.cardIdx = null; + } + } + } + return this.cardIdx != null; + } + nextRandomCard() { + const newCount = this.deck.newFlashcards.length; + const dueCount = this.deck.dueFlashcards.length; + if (newCount + dueCount > 0) { + const weights = {}; + if (newCount > 0) + weights[0 /* NewCard */] = newCount; + if (dueCount > 0) + weights[1 /* DueCard */] = dueCount; + const [cardListType, index] = this.weightedRandomNumber.getRandomValues(weights); + this.setCardListType(cardListType, index); + } else { + this.setCardListType(null); + } + } + nextCardWithinCurrentList() { + const cardList = this.deck.getCardListForCardType(this.cardListType); + const result = cardList.length > 0; + if (result) { + switch (this.iteratorOrder.cardOrder) { + case 2 /* DueFirstSequential */: + case 0 /* NewFirstSequential */: + this.cardIdx = 0; + break; + case 3 /* DueFirstRandom */: + case 1 /* NewFirstRandom */: + this.cardIdx = globalRandomNumberProvider.getInteger(0, cardList.length - 1); + break; + } + } + return result; + } + moveCurrentCardToEndOfList() { + this.ensureCurrentCard(); + const cardList = this.deck.getCardListForCardType(this.cardListType); + if (cardList.length <= 1) + return; + const card = this.currentCard; + this.deck.deleteCardAtIndex(this.cardIdx, this.cardListType); + this.deck.appendCardToRootDeck(card); + this.setNoCurrentCard(); + } + setNoCurrentCard() { + this.cardIdx = null; + } + ensureCurrentCard() { + if (this.cardIdx == null || this.cardListType == null) + throw "no current card"; + } + static getCardListTypeForIterator(iteratorOrder) { + let result = null; + switch (iteratorOrder.cardOrder) { + case 3 /* DueFirstRandom */: + case 2 /* DueFirstSequential */: + result = 1 /* DueCard */; + break; + case 1 /* NewFirstRandom */: + case 0 /* NewFirstSequential */: + result = 0 /* NewCard */; + break; + } + return result; + } +}; +var DeckTreeIterator = class _DeckTreeIterator { + get hasCurrentCard() { + return this.deckIdx != null && this.singleDeckIterator.hasCurrentCard; + } + get currentTopicPath() { + var _a; + return (_a = this.currentDeck) == null ? void 0 : _a.getTopicPath(); + } + get currentDeck() { + if (this.deckIdx == null) + return null; + return this.deckArray[this.deckIdx]; + } + get currentCard() { + let result = null; + if (this.deckIdx != null && this.singleDeckIterator.hasCurrentCard) + result = this.singleDeckIterator.currentCard; + return result; + } + get currentQuestion() { + var _a; + return (_a = this.currentCard) == null ? void 0 : _a.question; + } + constructor(iteratorOrder, baseDeckTree) { + this.singleDeckIterator = new SingleDeckIterator(iteratorOrder); + this.iteratorOrder = iteratorOrder; + this.weightedRandomNumber = WeightedRandomNumber.create(); + this.setBaseDeck(baseDeckTree); + } + setBaseDeck(baseDeck) { + this.baseDeckTree = baseDeck; + this.singleDeckIterator.setNoCurrentCard(); + } + setIteratorTopicPath(topicPath) { + const iteratorDeck = this.baseDeckTree.getDeck(topicPath); + this.deckArray = _DeckTreeIterator.filterForDecksWithCards(iteratorDeck.toDeckArray()); + this.setDeckIdx(null); + } + static filterForDecksWithCards(sourceArray) { + const result = []; + for (let idx = 0; idx < sourceArray.length; idx++) { + const deck = sourceArray[idx]; + const hasAnyCards = deck.getCardCount(2 /* All */, false) > 0; + if (hasAnyCards) { + result.push(deck); + } + } + return result; + } + setDeckIdx(deckIdx) { + this.deckIdx = deckIdx; + if (deckIdx != null) + this.singleDeckIterator.setDeck(this.deckArray[deckIdx]); + } + nextCard() { + let result = false; + if (this.hasCurrentCard) { + this.baseDeckTree.deleteCardFromAllDecks(this.currentCard, true); + } + if (this.iteratorOrder.cardOrder == 4 /* EveryCardRandomDeckAndCard */) { + result = this.nextCard_EveryCardRandomDeck(); + } else { + if (this.deckIdx == null) { + this.chooseNextDeck(true); + } + while (this.deckIdx < this.deckArray.length) { + if (this.singleDeckIterator.nextCard()) { + result = true; + break; + } + this.chooseNextDeck(false); + } + } + if (!result) + this.deckIdx = null; + return result; + } + chooseNextDeck(firstTime) { + switch (this.iteratorOrder.deckOrder) { + case 0 /* PrevDeckComplete_Sequential */: + this.deckIdx = firstTime ? 0 : this.deckIdx + 1; + break; + case 1 /* PrevDeckComplete_Random */: { + const weights = {}; + let hasDeck = false; + for (let i = 0; i < this.deckArray.length; i++) { + if (this.deckArray[i].getCardCount(2 /* All */, false)) { + weights[i] = 1; + hasDeck = true; + } + } + if (hasDeck) { + const [deckIdx, _] = this.weightedRandomNumber.getRandomValues(weights); + this.deckIdx = deckIdx; + } else { + this.deckIdx = this.deckArray.length; + } + break; + } + } + if (this.deckIdx < this.deckArray.length) { + this.singleDeckIterator.setDeck(this.deckArray[this.deckIdx]); + } + } + nextCard_EveryCardRandomDeck() { + const weights = {}; + for (let i = 0; i < this.deckArray.length; i++) { + const cardCount = this.deckArray[i].getCardCount(2 /* All */, false); + if (cardCount) { + weights[i] = cardCount; + } + } + if (Object.keys(weights).length == 0) + return false; + const [deckIdx, cardIdx] = this.weightedRandomNumber.getRandomValues(weights); + this.setDeckIdx(deckIdx); + this.singleDeckIterator.setNewOrDueCardIdx(cardIdx); + return true; + } + deleteCurrentQuestionFromAllDecks() { + this.singleDeckIterator.ensureCurrentCard(); + this.baseDeckTree.deleteQuestionFromAllDecks(this.currentQuestion, false); + this.singleDeckIterator.setNoCurrentCard(); + return this.nextCard(); + } + deleteCurrentCardFromAllDecks() { + this.singleDeckIterator.ensureCurrentCard(); + this.baseDeckTree.deleteCardFromAllDecks(this.currentCard, true); + this.singleDeckIterator.setNoCurrentCard(); + return this.nextCard(); + } + moveCurrentCardToEndOfList() { + this.singleDeckIterator.moveCurrentCardToEndOfList(); + } + removeCurrentDeckIfEmpty() { + if (this.currentDeck.getCardCount(2 /* All */, false) == 0) { + this.deckArray.splice(this.deckIdx, 1); + if (this.deckIdx < this.deckArray.length) + this.setDeckIdx(this.deckIdx); + } + } +}; + +// src/Note.ts +var Note = class { + get hasChanged() { + return this.questionList.some((question) => question.hasChanged); + } + get filePath() { + return this.file.path; + } + constructor(file, questionList) { + this.file = file; + this.questionList = questionList; + questionList.forEach((question) => question.note = this); + } + appendCardsToDeck(deck) { + for (const question of this.questionList) { + for (const card of question.cards) { + deck.appendCard(question.topicPathList, card); + } + } + } + debugLogToConsole(desc = "") { + var _a; + let str = `Note: ${desc}: ${this.questionList.length} questions\r +`; + for (let i = 0; i < this.questionList.length; i++) { + const q = this.questionList[i]; + str += `[${i}]: ${q.questionType}: ${q.lineNo}: ${(_a = q.topicPathList) == null ? void 0 : _a.format("|")}: ${q.questionText.original}\r +`; + } + console.debug(str); + } + async writeNoteFile(settings) { + let fileText = await this.file.read(); + for (const question of this.questionList) { + if (question.hasChanged) { + fileText = question.updateQuestionText(fileText, settings); + } + } + await this.file.write(fileText); + this.questionList.forEach((question) => question.hasChanged = false); + } +}; + +// src/Card.ts +var Card = class { + // scheduling + get hasSchedule() { + return this.scheduleInfo != null; + } + constructor(init) { + Object.assign(this, init); + } + get cardListType() { + return this.isNew ? 0 /* NewCard */ : 1 /* DueCard */; + } + get isNew() { + return !this.hasSchedule || this.scheduleInfo.isDummyScheduleForNewCard(); + } + get isDue() { + return this.hasSchedule && this.scheduleInfo.isDue(); + } + formatSchedule() { + let result = ""; + if (this.hasSchedule) + result = this.scheduleInfo.formatSchedule(); + else + result = "New"; + return result; + } +}; + +// src/parser.ts +var ParsedQuestionInfo = class { + constructor(cardType, text, firstLineNum, lastLineNum) { + this.cardType = cardType; + this.text = text; + this.firstLineNum = firstLineNum; + this.lastLineNum = lastLineNum; + } + isQuestionLineNum(lineNum) { + return lineNum >= this.firstLineNum && lineNum <= this.lastLineNum; + } +}; +function parseEx(text, singlelineCardSeparator, singlelineReversedCardSeparator, multilineCardSeparator, multilineReversedCardSeparator, convertHighlightsToClozes, convertBoldTextToClozes, convertCurlyBracketsToClozes) { + let cardText = ""; + const cards = []; + let cardType = null; + let firstLineNo = 0; + let lastLineNo = 0; + const lines = text.replaceAll("\r\n", "\n").split("\n"); + for (let i = 0; i < lines.length; i++) { + const currentLine = lines[i]; + if (currentLine.length === 0) { + if (cardType) { + lastLineNo = i - 1; + cards.push(new ParsedQuestionInfo(cardType, cardText, firstLineNo, lastLineNo)); + cardType = null; + } + cardText = ""; + continue; + } else if (currentLine.startsWith("")) + i++; + i++; + continue; + } + if (cardText.length > 0) { + cardText += "\n"; + } else if (cardText.length === 0) { + firstLineNo = i; + } + cardText += currentLine.trimEnd(); + if (currentLine.includes(singlelineReversedCardSeparator) || currentLine.includes(singlelineCardSeparator)) { + cardType = lines[i].includes(singlelineReversedCardSeparator) ? 1 /* SingleLineReversed */ : 0 /* SingleLineBasic */; + cardText = lines[i]; + firstLineNo = i; + if (i + 1 < lines.length && lines[i + 1].startsWith(" + +What is DynamoDB DAX::a managed service that provides in-memory acceleration for our DynamoDB tables + + +How much of an improvement does DAX provide on read operations::From milliseconds to microseconds + + +On what compute platform does DynamoDB DAX run::EC2 + + +What security mechanisms are required for using DAX +? +(1) The IAM role for the DAX instance must have permissions to access DynamoDB. +(2) the IAM role for the EC2 instance requires permissions to access both DynamoDB and DAX +(3) the security group needs to allow TCP 8000 and TCP 8111. + +Why is it easier to use DAX for speeding up access to DynamoDB rather than Elasticache::DAX accepts the same api as DynamoDB itself, therefore no code change required + + + + diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB Global Tables.md b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB Global Tables.md new file mode 100644 index 00000000..8c23000d --- /dev/null +++ b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB Global Tables.md @@ -0,0 +1,20 @@ +#course/aws/developer-associate + +Welcome to this lesson. In this lesson, I'm going to cover DynamoDB Global Tables. + +[[Global Tables|Global tables]] is a fully managed solution for deploying a multi-region and multi-master database. When you create a global table, you specify the regions you want the table to be available in. And DynamoDB performs all the necessary tasks to create identical tables and propagate any ongoing changes to all of those tables. And changes can be made in any of those tables in any region that your global table is replicated to. So let's have a look at a diagram. + +We've got region A and region B and also region C here. We've got DynamoDB and our application server here and it's reading and writing data in the table. We can then have a replica of the DynamoDB table in each of the other regions as well. And we can perform read and writes to all of those tables and the changes will be replicated across the tables in each of these three regions. + +![[Pasted image 20240508134406.png]] + +Global tables uses asynchronous replication. Global tables is therefore a multi-region, multi-master database. Each replica table stores the same set of data items. And you can use logic in the application layer to failover to a replica region as well. So that gives you really high availability and fault tolerance. + +---- + + +# Questions + +In the context of AWS DynamoDB global tables, what does "multi master" mean?::Each replica of the DynamoDB table (in different AWS Regions) can serve both **read** and **write** requests independently. + + diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB Streams.md b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB Streams.md new file mode 100644 index 00000000..f3968aa7 --- /dev/null +++ b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB Streams.md @@ -0,0 +1,39 @@ +#course/aws/developer-associate + +Hi guys. In this lesson, I'm going to cover [[Amazon DynamoDB Streams|DynamoDB streams]]. So what is streams? Well, let's have a look at an example. So we have an application here, a DynamoDB table and then DynamoDB streams. Our application is writing items to the table. Maybe it's inserting, updating, or deleting an item. So we can see that as the first operation here. + +A record is written to the DynamoDB stream. So after a change is made to the DynamoDB table, all changes are then projected into the DynamoDB stream. We might then have a lambda function being triggered and it will do something like process the information in the stream and write something to CloudWatch Logs. So just an example of using a stream. + +![[Pasted image 20240507224507.png]] + +So streams captures a time-ordered sequence of item level modifications in a DynamoDB table. And the information is stored in a log for up to 24 hours. Applications can access that log and view the data items as they appeared before and after they were modified in near real time. You can also use the create table or update table API operations to enable or modify a stream. + +#### StreamSpecification + +The stream specification parameter determines how the stream is configured. + +So stream enabled specifies that a stream is enabled if it's true or disabled if it's false. + +Stream view type specifies the information that will be written to the stream whenever data in the table is modified. So what we can do is we can decide what information we want to replicate into streams: +- Either keys only, that means only the key attributes of the modified item. +- New image. So the entire item as it appears after it was modified +- Old image. The entire item as it appeared before it was modified. Or +- new and old images and that's both the new and old images of the item + +So this is a great way to record the information that's changed in your table. Maybe you want to take the old items so you can archive it in some way. So you've got a record of the items before they were modified. Or maybe you want to take the new information and process that outside of DynamoDB by using a Lambda function or some other processing element to read from the stream. + +---- +# Questions + +What is the maximum time that information is stored in a DynamoDB stream:: 24 hours + + +Is there any order to the items in a DynamoDB stream:: yes - they are a time ordered sequence + + +Are DynamoDB streams considered (1) real time (2) near real time (3) batch::Near real time + + +What options are there over the content of items in a DynamoDB stream:: (1) the keys only (2) only the old values of the item (3) only the new values (4) both old and new + + diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB.md b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB.md new file mode 100644 index 00000000..1ca6a811 --- /dev/null +++ b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/Amazon DynamoDB.md @@ -0,0 +1,9 @@ +--- +sr-due: 2024-08-03 +sr-interval: 4 +sr-ease: 270 +--- + + #review + +Hi guys in this lesson, we're going to go over some of the fundamentals of Amazon DynamoDB. So what is DynamoDB. Well, it's a fully managed NoSQL database service. So it's more of an unstructured database compared to SQL which has more of a rigid structure. It's a key value store and also a document store. It's non-relational, key value. It's fully serverless and you get push button scaling. So that means it's very easy to adjust how your database scales by adjusting the throughput, which will look at in this section. So you have a DynamoDB table and it's essentially scaling horizontally as you give it more throughput. And on the backend that's happening across various partitions in the Amazon data center. So data is stored in partitions and they are replicated across multiple AZs within a single region. DynamoDB provides low latency. So it's in the range of milliseconds. If you need lower latency, like microsecond and these are keywords to look for in exam questions then you would need to use DynamoDB accelerator which we'll also cover in this section. All data gets stored on SSD storage. So it's solid state drives which are high performance. Data gets replicated as we mentioned in the previous slide across multiple AZs within a region. And there's a feature called Global Tables and that will synchronize your tables across regions if you need to have replication across regions. Maybe you're running an application in another region or you might be using it in a DR HA set up. Now, let's look at some of the features of DynamoDB. So as I mentioned, it is fully serverless, it's fully managed, and it's fault tolerant. It's highly available with four nines availability and five nines if you use Global Tables. It's a NoSQL type of database with a name/value structure, has a flexible schemer, which is good for when your data is not well structured or it's unpredictable. Scaling is horizontal by adjusting the throughput. And then AWS takes care of how it actually scales your database across partitions on the backend. And you can also use Auto Scaling. DynamoDB streams is a feature that allows you to capture a time-ordered sequence of item level modifications in a table and it stores that information for up to 24 hours. DynamoDB accelerator is a fully managed in-memory cache for DynamoDB. So that reduces the latency to microseconds. And that runs on EC2 instances. There are various transaction options, including strongly consistent and eventually consistent reads and support for ACID transactions. We'll go into more detail about that. For backup, you get point in time recovery down to the second in the last 35 days and also on-demand backup and restore. And global tables is a fully managed multi-region, multi-master solution. So with global tables you can make changes in each of the regions your table is replicated to. So let's look at the core components of DynamoDB. Firstly we have a table. So everything you see here would constitute the contents of a table. Then we have items. An item is essentially a row in the DynamoDB table. And then we have attributes. The attribute is the information that's associated with each of the items in the database. For the exam it's worth understanding some of the API actions. Now all operations are categorized as control plane or data plane. So let's have a look at some control plane. API actions. For instance create table to create a new table, describe table to get information about an existing table, and list tables will return the names of all your tables in a list. Update table is where you're able to modify the settings of a table or its indexes. And then delete table will delete the table and all the contents. Data plane API actions can be performed using PartiQL, which is SQL compatible or classic DynamoDB, create, read, update, delete or CRUD APIs. So let's have a look at some examples. You've got PutItem to write a single item into a table. BatchWriteItem so you can actually write up to 25 items to a table. So that's more efficient. And then GetItem which will retrieve a single item from a table. BatchGetItem retrieves up to 100 items from one or more tables. So the batch options give you more efficiency when you have large reads or large writes. Update item will modify one or more attributes in an item. And we have delete item to delete a single item from a table. Now let's have a look at some of the supported data types. DynamoDB does support many data types and they're categorized as follows. We've got scalar. A scalar type can represent exactly one value. And those are number, string, binary, boolean, and null. We've then got document types. Those are list and map. And we've got set types. A set type represents multiple scalar values and those are set, number set, and binary set. Now there are a couple of classes of table we can use. We've got the standard which is the default and it's recommended for most workloads. We've then got DynamoDB Standard Infrequent Access or DynamoDB Standard IA. This is lower cost storage for tables that store infrequently accessed data. For example, application logs, old social media posts, E-commerce order history, or past gaming achievements. Let's move on to access control. Access control is managed using IAM. So its identity-based policies that we're using to control access to DynamoDB. You can attach a permissions policy to a user or a group in your account and you can apply a permissions policy to a role. And you can grant cross-account permissions through that option as well. DynamoDB does not support resource-based policies. you can use a special IAM condition to restrict user access to only their own records. The primary DynamoDB resources are tables but it also supports additional resource types, indexes, and streams. You can create indexes and streams only in the context of an existing table. So there are several resources of the actual DynamoDB table. The resources and sub resources will have unique ARNs of their own. And we can see in the table here what the format is. So we've got a table, an index, and a stream and you can see the format of the ARN. Of course where it's highlighted in red that's that's where you would actually replace these values with your region, your account ID, and then your table name or your stream label. Now let's have a look at a couple of example policies. The following example policy grants permissions for one DynamoDB action. That's DynamoDB list tables. So we can see the policy here. The effect is allow. The action is DynamoDB list tables. The resource in this case is *, so any DynamoDB table. The resource is * so that means any table. So it's not specifying a specific ARN. Let's look at another policy. This one grants permissions for three DynamoDB actions. And we can see those are DynamoDB describe table, query, and scan and in this case we're actually specifying the ARN of one individual table. That table is named Books. So the actions that are allowed through this policy will only be allowed on that specific table. So that's it for some of the core fundamentals of DynamoDB. We've got lots more to get on with, and I'll see you in the next lesson. \ No newline at end of file diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Capacity Units (RCU-WCU).md b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Capacity Units (RCU-WCU).md new file mode 100644 index 00000000..a229538b --- /dev/null +++ b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Capacity Units (RCU-WCU).md @@ -0,0 +1,212 @@ +#course/aws/developer-associate + +Hi guys, in this lesson I'm going to cover DynamoDB capacity units, RCUs and WCUs. For the exam you need to know what these are and also how to calculate them. + +So there's a couple of [[DynamoDB Capacity Modes|modes]] that we can apply to our table. + +# Provisioned Capacity + +The first is known as [[DynamoDB Provisioned|provision capacity]] and this is the default setting. In this case you specify the reads and writes per second. You can also enable Auto Scaling for dynamic adjustments. And the capacity is specified using both read capacity units and write capacity units. + +So in the example here we can see we've got read capacity and write capacity, we've got Auto Scaling on, and we've specified the minimum and the maximum and also a target utilization, so what is the utilization that we want to target? + +![[Pasted image 20240506143842.png]] + +## RCUs + +So let's look into some more detail of RCUs, read capacity units. + +- Each API called to read data from your table is a read request. +- Read requests can be strongly consistent, eventually consistent, or transactional. + +Now think of these as credit. So an RCU is essentially a credit that gives you the ability to use some of the capacity of DynamoDB. Now for items up to 4 KB in size one RCU will equal: +- one strongly consistent read per second, +- two eventually consistent reads per second or +- 0.5 transactional read requests per second. + +For items that are larger than 4 KB, these will require additional RCUs. Now you do need to understand how to calculate RCUs for a given use case. So let's have a look. On the left, we have the requirements and on the right the RCUs needed. So based on the information on the previous slide, we know how to calculate. + +- So in this case we've got 10 strongly consistent reads per second of 4 KB each. So that's 10 * 4 KB / 4 KB = 10 RCUs. And we know this is correct because one RCU equals one strongly consistent read. +- In the next example we require 10 strongly consistent reads per second of 11 KB each. Now we need to round 11 up to 12 because one RCU is up to 4 KB. So we've got 10 * 12 and then we're dividing it by 4 KB. So we need 30 RCUs. +- In the next example we need 20 eventually consistent reads per second of 12 KB each. Now in this case the calculation is 20/2 * 12/4 and that also equals 30 RCUs. Remember that one RCU equals two eventually consistent reads per second. +- In the next example we have 36 eventually consistent reads per second of 16 KB each. So in this case it's 36/2 * 16/4 and we need 72 RCU. + +![[Pasted image 20240506145524.png]] + +Now there is a nice tool in the console where you can put in your requirements and it tells you the RCU or WCUs you need. So we'll look at that in the hands-on. + +## WCUs + +Now let's move on to write capacity units. Each API call to write data is a write request. For items up to 1 KB in size one WCU can perform: +- one standard write requests per second or +- 0.5 transactional write requests per second. + +Items larger than 1 KB require additional WCUs. So let's look at some examples. + +- In the first requirement we need 10 standard writes per second of 4 KB each. That's simply 10 * 4=40 WCUs. +- 12 standard writes per second of 9.5 KB each gets rounded up to 10. So we've got 12 * 10 which is simply 120 WCUs. It's a bit easier with WCUs. +- Next we have 12 transactional writes per second of four KB each. In this case it's 10 * 2 * 4= 80 WCU. And that's because one WCU equals 0.5 transactional write requests per second. +- In the last example we have 12 transactional write requests per second of 9.5 KB so that will get rounded up to 10. That's 12 * 2 * 10=240 WCU. + +![[Pasted image 20240506150447.png]] +# On-demand Capacity + +If we don't want to use provision capacity, we can also use on-demand capacity. With on-demand, you don't need to specify your requirements. DynamoDB instantly scales up and down based on the activity of your application. So this is really good for unpredictable or spiky workloads or new workloads where you don't really understand the resource requirements well. You pay for what you use and that's per request. And you can see here where you can specify whether you want to use on-demand or provisioned and you can change between these. + +---- + +# Questions + +What is the block size for DynamoDB RCU/WCU accounting:: 4KB/1KB + + +What are the DynamoDB read types (consistency models etc), and how many RCUs does it take to read 4KB item +? +(1) one strongly consistent read per second +(2) two eventually consistent reads per second or +(3) 0.5 transactional read requests per second. + +How many RCUs are needed for 10 strongly consistent reads per second of 11 KB each::Now we need to round 11 up to 12 because one RCU is up to 4 KB. So we've got 10 * 12 and then we're dividing it by 4 KB. So we need 30 RCUs. + + +What are the DynamoDB write types, and how many WCUs does it take to write 1KB item +? +(1) one standard write per second +(2) 0.5 transactional write requests per second. + + +How many WCUs are needed for 12 transactional write requests per second of 9.5 KB::so that will get rounded up to 10. That's 12 * 2 * 10=240 WCU. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Consistency Models and Transactions.md b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Consistency Models and Transactions.md new file mode 100644 index 00000000..dbe80ba1 --- /dev/null +++ b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Consistency Models and Transactions.md @@ -0,0 +1,57 @@ +#course/aws/developer-associate + +In this lesson, I'm going to cover [[DynamoDB Consistency Models|DynamoDB consistency models]] and transactions. + +# Consistency Models + +DynamoDB supports eventually consistent as well as strongly consistent reads. + +Now, [[Eventually Consistent Read|eventually consistent reads]] means that when you read data from a table, the response might not reflect the results of a recently completed write operation. The response might include some stale data. And if you repeat your read request after a short time, the response should return the latest data. + +We then have the [[Strongly Consistent Read|strongly consistent read]]. In this case, a response is returned with the most up to date data reflecting the updates from all prior write operations that were successful. + +A strongly consistent read may not be available if there is a network delay or outage. In that case you might get a server error with an HTTP 500 code. + +Strongly consistent reads also have higher latency than eventually consistent reads. Strongly consistent reads are not supported on [[Global Secondary Index (GSI)|global secondary indexes]] and they use more throughput capacity than eventually consistent reads and we'll be able to calculate that soon. + +So let's look at a diagram to visualize what I'm talking about. Here we have an application, our DynamoDB table, and the actual backend of the table is spread across three availability zones within a region. + +![[Pasted image 20240504223518.png]] + +So the application puts an item into the table. That item is then written into the table and it's going to get replicated. Now let's say you immediately perform a get item straight after the put item. And in this case DynamoDB has sent the read request to a partition over in table A here or a partition that doesn't have the replicated data in it at this point because we can see the full sync has not happened. Now in this case, it's an eventually consistent read. So we actually get a failure. + +Now a short while later the replication continues. That's all complete. And if we try and read again then we get a success. With a strongly consistent read, data will always be returned when reading after a successful write and eventually consistent reads are the default. + +Now, how do you configure strongly consistent reads? Well, you can do so with the API when you issue get item query and scan APIs. And you need to set the consistent read to true. + +# Transactions + +Next we have something called [[DynamoDB Transactions|DynamoDB transactions]]. In this case, the table will make coordinated all or nothing changes to multiple items within and across tables. + +Transactions provide ACID compliance. So that's atomicity, consistency, isolation, and durability. + +It enables reading and writing of multiple items across multiple tables as an all or nothing operation. So in other words it either succeeds everywhere or nowhere. + +DynamoDB checks for a prerequisite condition before writing to the table. With the transaction write API, you can group multiple Put, Update, Delete, and ConditionCheck actions. And you can submit them as a single TransactWriteItems operation that either succeeds or it fails. The same is true for multiple Get actions which you can group and submit as a single TransactGetItems operation. There's no additional cost to enable transactions for DynamoDB tables and you only pay for the reads or writes that are part of your transaction. + +DynamoDB performs two underlying reads or writes of every item in the transaction. That's one to prepare the transaction and then one to commit the transaction. + +So let's see it in action. We have an Amazon EC2 instance here. And we have two different tables across two different accounts account A and account B. Now we used to transact write items API to try and write to both tables simultaneously. Now the write in account A fails. That means the write in account B will fail as well because it's an all or nothing transaction. In another case, we rerun the TransactWriteItems and in this case it succeeds in both locations. So because it succeeds in both locations, all is good. If one fails, both fails, so remember that. Everything has to succeed all or nothing. And that's it for this lesson. + +---- +# Questions + +What are the two consistency models supported by DynamoDB::Eventually consistent read, strongly consistent read + + +Are strongly consistent reads supported for reads involving (1) local secondary indexes (2) global secondary indexes (3) neither (4) both:: local secondary indexes only + + +With DynamoDB where is the consistency model specified::for individual query and scan operations + + +What does the acronym ACID mean::atomicity, consistency, isolation, and durability + + +What types of APIs can be grouped together within a single DynamoDB transaction:: (1) multiple Put, Update, Delete, and ConditionCheck actions (2) multiple get actions. + \ No newline at end of file diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB LSI and GSI.md b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB LSI and GSI.md new file mode 100644 index 00000000..323c30b6 --- /dev/null +++ b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB LSI and GSI.md @@ -0,0 +1,56 @@ +--- +sr-due: 2024-08-01 +sr-interval: 3 +sr-ease: 269 +--- + +#course/aws/developer-associate #review + +In this lesson, I'm going to cover what are called [[Local Secondary Index (LSI)|Local Secondary Indexes]] and [[Global Secondary Index (GSI)|Global Secondary Indexes]], LSIs and GSIs. + +# Local Secondary Indexes + +So firstly let's look at the LSIs]]. These provide an alternative sort key to use for scans and queries. + +You can create up to five LSIs per table. And they must be created at the creation time for your DynamoDB table. You cannot add, remove, or modify them later on. + +The LSI has the same partition key as your original table, but it has a different sort key. So this helps you being able to perform scans and queries that you can't do in your primary table. Essentially it gives you a different view of your data organized by the alternative sort key. + +Any queries based on the sort key are much faster using the index than the main table. So let's have a look at the diagram. We have our primary table. And I'm not showing the attributes. I'm just showing the partition key and the sort key here. + +So we have client ID and then we have created. Now what we might want to do is create an index from our primary table. And this LSI has a partition key and the partition key is always going to be the same, so it's client ID. But in this case the sort key is the SKU. + +![[Pasted image 20240507170722.png]] + +Attributes can be optionally [[Attribute Projection|projected]] and that means that they will be actually put into the LSI as well. So it really depends what exactly you're searching for. So remember the sort key is different on the LSI, but the partition key is always the same. + +Now let's have a look at a couple of examples of querying. So in this example, querying the main table we must use the partition key client ID and the sort key created. But in another example with an LSI, we can query the index for any orders made by a certain user with the SKU because we can have a different sort key than the main table. + +# GSI + +Next we have the Global Secondary Index. This is used to speed up queries on non-key attributes. So those are not part of the partition key. You can create these when you create your table or at any time. And you can specify a different partition key as well as a different sort key. It gives a completely different view of the data. And it speeds up any queries relating to this alternative partition key and sort key. + +So again, let's have a look at an example. We have a primary table here with a partition key or client ID. And a sort key is created. The index is created again from the primary table. And with the GSI, in this case we've got a completely different partition key and a different sort key. And again optionally, we can project attributes into the GSI if we wish to. So let's look at an example. And in this one we can query the index for orders of the SKU where the quantity is greater than one. + +And that's because we have a different partition key and a different sort key. + +---- + +# Questions + +What are 3 limitations of DynamoDB LSIs +? +(1) must have the same partition key as the table itself +(2) a maximum of five LSIs per table +(3) the LSIs must be specified at the time that the table is created, can't be changed afterwards + + +What is DynamoDB attribute projection::Attributes that are actually stored within the LSI + + +Which is more flexible - DynamoDB LSIs or GSIs and give 2 reasons +? +GSIs are more flexible - +(1) they can be created at any time, not just when the table is created +(2) they can have a different partition key than the base table + diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Optimistic Locking and Conditional Updates.md b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Optimistic Locking and Conditional Updates.md new file mode 100644 index 00000000..84fb3166 --- /dev/null +++ b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Optimistic Locking and Conditional Updates.md @@ -0,0 +1,34 @@ +#course/aws/developer-associate + +In this lesson, we're going to look at two different strategies for protecting the consistency of our data in DynamoDB. One's called optimistic locking and then we'll talk about conditional updates. + +# Optimistic Locking + +So first [[Optimistic Locking|optimistic locking]]. This is a strategy to ensure that the client-side item you're updating or deleting is the same as the item in DynamoDB. And it protects the database writes from being overwritten by the writes of others or vice versa. + +So best to understand by using an example. So we have a DynamoDB table and we can see some of the items in that table. And here we have a SKU and a price. Now what's happening is application instance here on the left wants to update SKU 1 from 1,299 to 1,499. And that's successful. But then application instance two here then tries to update the SKU 1 to 1,399 and that's also successful. Now perhaps the application on the right hand side here was supposed to write that update before the subsequent update to 1499 but maybe there was some kind of delay in processing. + +So now we've got the wrong price in the table. Now, a way to resolve that is now what we do with optimistic locking is we specify update SKU 1 to 1,499 if the item version equals one. So it gets updated. Then the other application instance comes along, but it was also given instructions to update SKU 1 to 1399 if item version is one. + +And that fails because the item was already updated. So that's optimistic locking. + +![[Pasted image 20240507215621.png]] + +# Conditional Updates + +Next we have [[Conditional Write|conditional updates]]. To manipulate data in DynamoDB tables you use the put item, update item, and delete item API operations. You can optionally specify a condition expression to determine which items should be modified. And if the condition expression evaluates to true, the operation succeeds. Otherwise the operation will fail. So let's have a look at an example. + +This CLI command allows the right to proceed only if the item in question does not already have the same key. In another example, the CLI command uses attribute not exist to delete a product only if it does not have a price attribute. So in both cases we've got attribute not exists, here we've got ID, and here we've got price. + +![[Pasted image 20240507215928.png]] + +In another example, the CLI command only deletes an item if the product category is either sporting goods or gardening supplies and the price is between 500 and 600. So we've got multiple conditions here, product category in cat one and cat two and price between the low and the high that we specify. + +---- + +# Questions + +What is "optimistic" about DynamoDB's optimistic locking +? +At the start of the read - modify - write process, the item is simply read and no resource wasted to lock the record from use by other applications + \ No newline at end of file diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Partitions and Primary Keys.md b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Partitions and Primary Keys.md new file mode 100644 index 00000000..672d6b59 --- /dev/null +++ b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Partitions and Primary Keys.md @@ -0,0 +1,116 @@ +#course/aws/dynamo-db + + Hi guys. In this lesson, we're going to cover DynamoDB Partitions and Primary Keys. And this stuff is really important to understand so you can design your table for throughput and also searchability. + + DynamoDB stores data in partitions. And a partition is an allocation of storage for a table that's automatically replicated across multiple AZs within the region. DynamoDB manages the partitions fully for you. DynamoDB will always allocate sufficient partitions to support the provision throughput requirements. + + So when you specify the throughput you need on the frontend, and we'll see how to do that in this section, then DynamoDB will automatically take care of spreading your data across the relevant partitions. DynamoDB allocates additional partitions to a table in various situations. So if you increase the table's provisioned throughput settings beyond what the existing partitions can support, or if an existing partition fills to capacity and more storage is actually required. + + Now, for primary keys, there are two different types of primary key. We've got the partition keys and composite keys. + + A partition key must be a unique attribute such as a user ID. So every user will have their own individual ID. The value of the partition key is input to an internal hash function and that determines the partition or physical location on which the data is stored. If you're using the partition key as your primary key, we'll see what all this means in a moment, then no two items can have the same partition key. + + So let's look at an example table. On the left hand side here, we have a partition key. Now, in this case this is using a post ID, so maybe it's something like a forum. And there's a unique ID for each entry in the forum. And then on the right we have the attributes. And those are the information associated with each of these entries in the table. + + + You can also have something called a composite key. That is a partition key plus a {{sort key}} in combination. + + + So an example is a user posting to a forum. The partition key would be the user ID and the sort key would be the timestamp of the post. The two together mean that you can have multiple items in the table with the same partition key but they're going to have a different sort key and that creates uniqueness. Two items may have the same partition key but they must have a different sort key. + + All items with the same partition key are stored together and then they're sorted according to the sort key value. So that's why I said it's important to understand how this works in terms of performance and searchability. Using a composite key allows you to store multiple items with the same partition key. If you don't have a composite key with a sort key then you can only ever have one item in the table for each partition key entry. So let's have a look at an example. We've got a partition key here which is the client ID. We've then got a sort key which is the created timestamp. And together they form the primary key or composite key as it has both a partition key and a sort key together. + + So then we can have entries in the table such as this, where we have the email address of the user under the client ID and then some kind of timestamp in the created field. So we've got multiple items in the table. And we can of course in this situation with a composite key have multiple items from the same client ID, the same partition key. + + Then we might have our various attributes. And in this case we've got a whole range of different attributes. Now notice that the data structure here can be unpredictable. So for some items there are no attributes assigned. And that's because this is a store. We've got the SKU, S-K-U and then we've got the category, size, color and weight. And some of those don't apply to some entries in the table. DynamoDB evenly distributes provisions throughput using what's called a read capacity unit and a write capacity unit. + + So these are values you can specify. If your access pattern exceeds 3000 RCU or 1000 WCU for a single partition key value, your requests may be throttled. And reading or writing above the limit can be caused by a variety of issues including: + - uneven distribution of data due to the wrong choice of partition key, + - frequent access of the same key in a partition, the most popular item which is sometimes known as a hot key, or + - a request rate greater than the provision throughput. + + Let's go over some best practices for partition keys: + - Use [[High Cardinality|high cardinality]] attributes, things like mail ID, employee number, customer ID, session ID, and so on. So these are things which should be completely unique. So that gives you high cardinality. + - Use composite attributes so your customer ID plus your products ID plus your country code giving even more uniqueness. And then you might have the order date as the sort key. + - Cache popular items using DynamoDB accelerator for caching reads. And that will offload some of the impacts on your database. + - Add random numbers or digits from a predetermined range for write heavy use cases. For example, you might add a random suffix to an invoice number such as this one. So we've got the invoice number and then in red we have some random value that we're going to add to it. That will help with spreading the rights across different partitions. + + That's it for this lesson. I will see you in the next one. + +---- + +# Questions + +What is needed to have DynamoDB partitions replicated across multiple AZs::Nothing - happens automatically + + +DynamoDB allocates additional partitions to a table in which 2 situations +? +(1) So if you increase the table's provisioned throughput settings beyond what the existing partitions can support, or +(2) if an existing partition fills to capacity and more storage is actually required. + + +What are the two different types of primary key::We've got the partition keys and composite keys. + + +In what situation must the partition key be unique within a table::If the primary key is configured as a partition key and not a composite key + + +The elements present in a composite key are::Partition key and sort key + + +How can you add an item into a DynamoDB table with the same partition key/sort key combination as an existing item::Can't be done - the combination must be unique + + +What configuration of a DynamoDB table is necessary so that items with the same partition key can be spread over multiple partitions +? +Can't be done - All items with the same partition key are stored together + + +What are the RCU and WCU limits for a single partition key value::3000 RCU, 1000 WCU + +What are 3 causes of reading or writing above the RCU/WCU limits +? +(1) uneven distribution of data due to the wrong choice of partition key, +(2) frequent access of the same key in a partition, the most popular item which is sometimes known as a hot key, or +(3) a request rate greater than the provision throughput. + + +What is the definition of high cardinality::A data field that contains many distinct values + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Performance and Throttling.md b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Performance and Throttling.md new file mode 100644 index 00000000..c9f43bd0 --- /dev/null +++ b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Performance and Throttling.md @@ -0,0 +1,33 @@ +#course/aws/developer-associate + +In this lesson, I'm going to cover DynamoDB performance and throttling. + +# Throttling + +With throttling, this will occur when the configured RCU or WCU is exceeded. And you can get this error. So it's a `ProvisionedThroughputExceededException` error. and that indicates that the request rate is too high for the read/write capacity that's provisioned for the table. + +The AWS SDKs for DynamoDB will automatically retry requests that exceed this exception. The request is eventually successful unless the retry queue is too large to finish. Let's have a look at some possible causes of performance issues. + +- Firstly we've got hot keys. That simply means that one partition key is being read too often. +- We can also have hot partitions where our data access patterns are imbalanced. So we're trying to get a higher amount of read and writes going to one particular partition. And this comes back to how we designed our partition keys and are sort keys and our composite keys which we looked at earlier on in this section. +- Also the items may be too large and they're consuming more RCUs and WCUs because of the size. + +So what are the potential resolutions?: +- Well, you can reduce the frequency of requests and use exponential backoff. +- You can try and design your application for uniform activity across all logical partition keys in the table and any secondary indexes. + +# Burst Capacity + +You can use [[Burst Capacity|burst capacity]] effectively. And this is because DynamoDB will retain up to five minutes, so 300 seconds of unused read and write capacity which can be consumed in a short period of time. Say, if your workload is bursty rather than consistently high, that might save you. + +You should also ensure that adaptive capacity is enabled and it is the default. This feature will minimize throttling due to throughput exceptions. Now, that's it for this lesson. Just a few tips on performance and throttling. + +---- + +What is a benefit of using the AWS SDK when accessing DynamoDB tables configured for provisioned capacity mode::In the event of a ProvisionedThroughputExceededException, the SDK will automatically retry + + +Apart from price reduction, what is another benefit of minimizing data still in DynamoDB tables configured for provisioned capacity::Less data can mean less RCUs and WCUs (if it leads to a reduction in the number of blocks) + + +Over what duration will DynamoDB retained unused read and write capacity which can be consumed as burst capacity:: 5 minutes \ No newline at end of file diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Scan and Query API.md b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Scan and Query API.md new file mode 100644 index 00000000..fec2c5e9 --- /dev/null +++ b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/DynamoDB Scan and Query API.md @@ -0,0 +1,52 @@ +#course/aws/developer-associate + +When searching for data in our DynamoDB tables we can use the scan API and the query API. And these come up in exam questions where you need to know the benefits and drawbacks of each and when to use them. So let's start with the scan API. + +# Scan + +The [[scan|scan]] operation returns one or more items and attributes by accessing every item in a table or a secondary index. + +To have DynamoDB return fewer items, you can provide a filter expression operation. Now note that accessing every item in a table or secondary index does incur costs because we're actually reading those items. A single scan operation reads up to the maximum number of items set if you use the limit parameter or a maximum of one megabyte. + +Scan APIs can use a lot of RCUs as they access every single item in your table. Scan operations proceed sequentially. + +Applications can request parallel scans using the segment and total segments parameters. The scan uses eventually consistent reads when accessing the data in a table. If you need a consistent copy of the data as of the time the scam begins you can set the consistent read parameter to true. + +So let's see what happens with a scan. In this case, the developer has sent a scan API request. And in this case there's only a few items in our table but all of them are actually accessed. Of course in a big table that's going to be a lot of RCUs. And then the results are returned. Now in this case, all items and all attributes are returned. + +![[Pasted image 20240506155555.png]] + +You can use a scan with a [[Projection Expression|projection expression]]. In this example, the scan returns all posts in the forum that were posted within a date range and they have more than 50 replies. So this is the scan. You can see here, we're doing this through the console. We're choosing a scan, sorting by post ID, filtering by replies and last post time. And we've got a date range here and a max number of replies. So let's see what a scan API with a projection expression looks like. So we issue the scan API with our projection expression. + +In this case, all of the items in the table are accessed using lots of RCUs. But in the results, select attributes are returned. + +# Query + +Next we have the query API. A [[query|query]] operation finds items in your table based on the primary key attribute and a distinct value to search for. + +So for example, you might search for the user ID and then all attributes related to that item would be returned. You can optionally use a sort key name and value to refine the results. + +So for example, if you're sort key is a timestamp, you can refine the query to only select items with a timestamp within the last seven days. All attributes are returned for the items by default. You can also use the projection expression parameter as we did with the scan API to just return the select attributes we need. + +By default, queries are eventually consistent. To use strongly consistent you need to explicitly set this in the query. + +So let's look at using a query API. A developer uses a query API request with a projection expression. Now in this case, select items with select attributes to access, consuming far fewer RCUs. And then those results are returned. In another example, the query returns only items with the client ID of chris@example.com that were created within a certain date range and that are in the category of pen. So here we can see how we're creating the query through the console. We've chosen the product orders table with client ID and created, we've specified as the string here chrisexample.com and then between a specific date range. We've also specified a filter for the category which is a string and it's equal to pen. So that's it for this lesson. Make sure you fully understand the differences between the scan and the query API before you sit the exam. + +---- + +# Questions + +When performing a DynamoDB scan operation, what limits are there on the amount of returned data::(1) the item limit specified in the scan request (2) 1 megabyte + + +What is the benefit of using a projection expression in a DynamoDB scan request given that it still reads all attributes and therefore no reduction in RCUs +? +It only returns the requested attributes, meaning less data transfer, less data to process by the client. + + +What is the disadvantage of the DynamoDB query operation compared with scan::It can only retrieve items with the specified partition key + + +How does DynamoDB scan and query compare regarding the projection expression::Both only return the requested attributes, but scan still reads all, whilst query only reads those requested. + + diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240504223518.png b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240504223518.png new file mode 100644 index 0000000000000000000000000000000000000000..1d9dba4355d1b89e96d5580fd9a2ec0e40092610 GIT binary patch literal 57247 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 literal 0 HcmV?d00001 diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240506143842.png b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240506143842.png new file mode 100644 index 0000000000000000000000000000000000000000..f6ddf5230e719007baf21552234cef47f46fc9a6 GIT binary patch literal 74738 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 E0gN13%m4rY literal 0 HcmV?d00001 diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240506145524.png b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240506145524.png new file mode 100644 index 0000000000000000000000000000000000000000..88fe47ffa8fac40e8bf49b1cb9422146e49d2da6 GIT binary patch literal 30165 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

anI>zi06*8?D@OroP}hod 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 K7q1l4_xmqy>7?ccMa|kC<>RZd~(j{d+zPq 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 literal 0 HcmV?d00001 diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240506155555.png b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240506155555.png new file mode 100644 index 0000000000000000000000000000000000000000..619eda67f8d0d4e7f7d3c0ddef9a0982ba25a04d GIT binary patch literal 38754 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

$z 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 CBZpxxrx81O5g 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240507215621.png b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240507215621.png new file mode 100644 index 0000000000000000000000000000000000000000..896bcb3afdac80a2feafca3c33d098ca86e20900 GIT binary patch literal 23762 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

2b<;KG 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%0DxkY)!}J>dTfQJzzZ5niCBt_j;bU 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 literal 0 HcmV?d00001 diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240508132354.png b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240508132354.png new file mode 100644 index 0000000000000000000000000000000000000000..cb15fb8d5fc118eb086a0861576a31b027fc21fa GIT binary patch literal 26294 zcmdpeRa{(8wYT1GNSNH4` zzWX%?lRff#zIBH)9_b2jGRHtvQCO0nzn7*kKi&j#qr<6wT>4x?uJ{>rL2M*eSR8a6 zl||+gCg?@9hyMSMFBr;b2-kXVzf0QOIN&*1ck zP(?$(Q-YdtEI{__MIO}k7lDU-w;2bkKzFWytignz7o?1I*Z)k@MF5u2q?-;cQB1{i*{t z%8;XVrH)VuRMS?VkZt^9TZ5CbPvLAoB}99HV>BDla9=?*g3-QsUQ!X4JCbQ?;NdtH zgc&6PnY>Sb?9(KaFS3Sfz>;X;!>Nkp((vIB0AnYyV|k$)GWbyu#a{HNSFs6lbB;N5 zMcQm&ksBF==KhMl;E9KPsjCQ2&5w=ASE+8xqPF z!)h(G!cd8AS{Mt~h1h@qV-juy&OCghbuiruNDDsL5QOkglyr_SMCl9b7xv+IW)rKz z;{*_iUfy>J!I|G!Sx*WmOZ#7U&SSE~U`ZIESS7^S@pKWOiKSH^@GnFL^{7{fUKSHS zO%gJPf09tSD9;L>x`X6q8527fvE4F6Vt5e?0y6DA@W2_U9&(R;JNg1qPl!jOBJ0Sr z6;~RLDq73>VV|KKxQ4N9JBGziTkRHWR3NH}&+>^^2=n-ae$2Z}=;GZ#;wyTYSZpRya!$0Id8oW|M7vp`W!BH%Ly$FqSVy9FI*1 zuD@VmBDuVq7M22HW?(9GLPRtf$~Mo7r_u-2(pQ3t$z0tIyddJv?g*^!0M> z(o-=4gSV|R0)>;o-<_NT1miO2j3w_5&qgfzmbwaW#rl`ZtK*lW`^nh6*6YRlDT%)* z)0O_|kwJsS!tS88snglMZ=CSG^(feJl#+F-W?N%k3g+C$Nu!3T_ zDi#;?=n$wk{0ytDWv7U`jL=NkG}h3YAqdO0sj!q9A_LV~Qp&x^A6pjv2k5U&b@x}Z z<5V#mcTVuIKG7)GHOBo?#N3gBLD$LLj}<$Vh(C@_+bpozT*(cYN)SyxIanJ#l&-i7 zT_3oQrr&O&n&dEpI1e+QmRbM=54QxvoZ}BgAB8TEe|YXMwK@P5 zfbYOsImNy-Cya?bqsi&4f2ZRe)eAo9@;RyDq78giDwKG@@VtWZ{q-3a!=@`U9b;v+ zBc!+EIWl!vn4>A;z3Zh_j(%MkK2KZoK~K=lO`Kbm?sO{029iE6YeFtWX*%V;2d5gG zTW`D`ub%EH)>xpccwYUtBu~k{PoKB)!5Y_s$nJW5Al3RXmCfb+$u-q9#q!u>K);=l zPJdj*h*>NPS5>LovV5{1a>GmN%Lw^IYqu|YU)3qg4lX1ULR)v}7N$eZ=##O<<#-buzkLu(wCZicO;p8rOwUYLJ@hPo@ z@Hpz^%}1f9?R`3b3vPO^@ns7C(k5d%lD^A!fAX_mMAV5T&Z}QHa`Yy)H znjs?LOMCUklh$Deiq!nyJ+z%D=R*L49%7#erzDJ&dFRyeX3>PdlYob#r zk9$BjO9TF_&4qhLCVFn^s~a9q(7yEO&J&Q&6C9m)&NoWW{P|9`n;|UkOYJGIe zXZ}}`nr(F~j@`03X#=hzg@%%%V8cuPNuAyh54^h^bq$9&u*y2wn=-9yD2b`6~T| zAcZAjc1qr@zLZT z7eC6Uq)?;5lLobEO7%~hKmAiWTxum5nKiT{>5tPxo0_Oji|IU|>FUc(*IU>Q)?;sR z-q`WGBYJnssot--9)@q|@V#dDBMc31PM|oPMsy|5TElWF0&B67u{s2+j!9Nisheq@Wx3hZ7U z*L|{6-LgKztSyDTmTb)YfWy&s7`oN=9|LpCLiE1cR`qH(nd+FM$E&QLcOXu$Wx40*k>(Sj4?OPZ1`Cl-D zpnb~~8}q#{d~w^Ne%{>0!SykLOVrBz^Yz&QF1^r`%QncgC9AfzFA5IIZpH1Nr8}M5 zL5PmWr98LYe(dJCBLZ7rSH^B{^yO@{pponv=lpe#@M=s`Vi=Sshe|Ln{QNRoX#W@6 z;LoV6Xl}uo6(XSr!{R0F?;gx<7~m~RvQ>|m^^wvLwoFnL=e*jr756h^rYAFu)gyg* zC_Vpt92HSZh{zJ2x3iq9Qup>q`Yl*)F%}DpDI&T)p9B!bX9#^!gV|12fgoG_w7Tyt zx-LMH^{#qoqM;?2KGfA8b2&QewlVz&&}(dNNDMj(&p&ES7HwSAzw)i#CR#{HDY~$(CgvSrcRlUCmE&}}_6oZI(NrP2MLd(!WfyQ?`(A4&c-KY6`jvi96>Y8j<-F>>Q`P{7YVF)Rs? zhp!7r;sK$7+-c&?6eYEhH2&byK^vuoeb7u5>K77CT2XQ>v=h<=;KrpF@wZ zUK?y(%QEq6@>VUl?0{e&LLBkVu9bRuhbiLg;Lp8Mn5M-yhH*I}^r6TVbWh!aqF={k zUHjw7e}NA3HC|)fXeidE*D-x&;&sD3+vh?XFE?ITHq!?JmFNk>>s!72He~VZwV)Jj zi!`b-)s;lRuRxk$#ktnsTyFb3Bi3w%V=~>d>B!-#m?O*o6u%+e_%v44x@8-WmtbWi zw)JOX`7+@nr{(c-0wVJD;7f%CV|Ajnqr&_`hY3$fxBebO+u&h>Sl8cY&CHh6T@(~@ zk-90yQ*x*vYu?Dzu~w=+$c`9nqTEW}042byzh<0!=KAoJwTaaOso}ZAy(5hFycIH| z;Qo4d&byYhUT1;j!aiA@3|A~moWS9sV*U=t*=TqKujc<5#Kq#WXYtkh`>^e|L2SIG za?KM2-;{e+h-^ceE1!;g#r+)xDC}oO==`m4Tau4wIM%GIfS<5ES?HlM)s`G&ji(`7 za@ZJ-In7fQ*!u;;kAH;8ay=S?ouDL| zEB5{)StE4P;Wp$3_Cxm>5u0eC&TYq1QBqy(nh7zXuSnkuSC%49hPU!-a zBxJU5!k4x#al>(@qm>6qNKWp%Z(Pe@n(7VD0*Z<_qrzfK>t*pK&iz$_qBeujs~qaQENbLwqjpdmUUWF zDw)ko`VThj%D58Oz15Bk4`0)neU)m~_>`7QM(ZKJvSUsl#d1QA0AO{zjPTmc?Ft9F zqxtm38bxUPT*fPB**&8GUhv0eK03L{y{VazA-5rpcP?UvyooE7g;Qc13w`8Fx=stsD6%N+MWW??o2$7e^>nyaDK$U823vBI!4dU zcT}5^(Tdo@sz8FaA*wmOXDDiUe)!B99D8Eb|LxxsXOBevTSeRYfHm7s>#42f~lCb!@gp zmzCZHS*FM3_7Zf0jI}w7!PYR3a_Kx)8yNjeg~x&--Lbctm$&-{o&E|FM8BwOw;gPs zNWAa(%R7l)B#gc&-_$Uh@$sqVG%%rBM63c^1iG-3SCxE912iKFG6}oL--wx7*CO-< zxzkP?ge&>Bz2Ba9gKpApz1|*XA^$2|R-59gSm1B0_YHIT4Biq8416II#&mm6ALUco z`v-9gQOA@(oVT>qyOLcBYsBX)hvJA^;d(Qo3x56(B3%m<=^|C-eSp>?9@%wk}_ zd%dHx3jyaIuf>Wg+!!|30j($!nc(ZHPzQlKl5B)GF`TpM%ABv2YR&B|F8^N@PqmWK z9oEy)U4BkxB2b|7NW#V<5NOjgee(1rB(^enpOIx9!#z>2biBmNf4!6c7g8&+5bJT2Cl0cy^>MwsUbnRO^VO1jwNU5C&`Ql52!#waohGoozUhzN zm{ypG_I-YPT+m8)b+dajvG%d12gthvfb={rw)4vIdJqylBT=?FPUb_qZH8*8BAe%g z=uIP*!b*(ZH@W4t{@2>tda zk1#)g@&qAgF@az$IsTO~X_Oj2g_5?D zn+F=FW9oxHxQK|gIBw*EZegw;Y5Kk^o(C45zrf~5ls&Z`hs zs$~K1DOu<(Us^fSj(NaWl=9IWFs=nz{+OSJ;j1HY{UtQhMmhU3evrkYJ;)%M2^N%C zU^!Jgux8ba9qt~^xbottIqFJMHRelyVb^_Zh3CRg7o6kq^4u%l;VR<9a*{V1s*)a} z`2MSoToIG>?pqcqq=EXzIN^yS3*LbdA~a=1BG2NJ2++MWQiaq@7TU9UOeJsDbNlXk zAK6(ps&XO=H76L7HfMC0wdjR;P})t{aH$HOv*mT4KVK(ckt%~?I$Qbv{g7lGeWTNe4(wdr9S4X? z1@Tu44o)>F)at51wf5KRDD)N*t&Dt=xs`(YrgTJ#Y@9Squ5`Evg_0UGwIbHU;~2g{ z#B#rS15h?@$WCs*yoVe96i&lWH0_>(1ZG(lcSdZyGMLl`tCo0Ui(%-(R z>eKw}W(m2a1_dnNp0TK3HDJ5cG3V#w_ilH3mSX#UV4}Ksba%aNgwR3fK+09p$M~P^ z97;#T5L0R57_)89I(aXR4XqF9p4|T`{EHe96T`{IgGH7ik${mKo5>2n zARp#yYyG}wR4ou)4rd~7j@QAvDJEj7BdR0QA!~<>RtW$38FbuQja4XH$x78$7B3Am zNDi~mz}Ki)l^)GSEBkP=?V%uJ-V)*?k5WgC*&KdVLWL^Muu@++q-|Fg21cD zwEqZ8E0F#Cj_kCEk!(4`e{4YdqZ)}83P>$Vn_A1V*T@O#RU_KdXoSl$(7;$Ly86jg z=*U?-Qek_oo)?niehxOtb8t~TvPq#C^j@j$%Dgzlq_TaPYp8_ri8uZi-Y|jQBPU@1 zX!qqf#R!Yn(t!FMCvdT~i4E$_Kxd(Y-}R0ndjlipYi-p%%;%n{M38NQ_9?Tyo`>fm zjG{Hk(we71I7nZYE6-{AmPIRe{GqBifZWpU{gaKjK-?3PIqBTLZ=mML#ef3MoVZCo z=KniQRmVU0a;jL(GF_n5MCBvh)g5nlF`ej`^R^fm*B#nA)Ku#K7a8Jke1>B1!LEQb z4wP5z(LNB5|7UUmvxS1=PtF(jJ>4|pk6c^wUE}G=OqhBv1 zwS;3T+>|UjJxp7UfY|(f9|IE;$CiPgducL*6)iqDEZIKK>H_1nBh6N{TG%G-P3dhm zYjXCvt%4*=SfGW*pGcGXI?Y|_2$x2Xf$QvWUbz2>U|cAWjMld*DtSOoKzi}&w8$ZS zUS`dMZc!Caa$gTu_+Qe-0Mv;KKX2<<9*sM2*3xrZGP0h1O9s>QqeZ^0(qO%>A@hT= z;Fn2kmv@EEF#@S!ucO@Q@OL|Z+{auZQB38(SX>b={GH{0TQIYf`|d%q#0sa{L%~Gg z>RIK8YvG_9R!tYX8ZZ3#(;2y(H9FY_4#sDLce}09#zI5bH6T{#^@@?QKf)l|B4q z6Y*H7C$^!z2s0i!;ZnDquUMCy&1A{xhQBeROl|+WRMQ4JmNl=4Xo2-jm+al2f)BRE zpxziH+6dV09)ip6x$3#QEH2)E78L^>GK_Yce+}7WuEI5&t?v)9i~p+c(F=%%d^T(v z6%3r@fp4OFlbc+WPh;^D+AlYGEcH{Re?S7zU$TLcF-xd-lQ9pNzporN4enHOt9;l(!g%5y7VVh=h+b$EjM8$DLGDrt zgQHd#8pdOo{IJCG#Q&g@$z8^$4Eq@*jW^b61~c!)J)8DR zrY!x1NS?)&o}C0w4qaTy^)=69b*Nf)3?Z{9jBcJ|wc zPmWa-6^`E)$77iQF~8ZuI$kcMA51uW=(x4#*I5M9-MHA^noz2PSuT%^Mov$WPP#5H zR)vV+>-uAic4c=jqsAiKqeOLvK%pV264Dyqi6<cXJIQUv; zSIG;c+)W_e*b|bvc+8~yr^bLw7El;uhC0XB!+cUD%!2baJ zW3fTaKHfZz+^-$cOI$W&`WUkL8ZR33dTyT@OTnQ$`?oMXnzpm?le^xxgXTRhhha=> zUa_)xfha!j@D2!`BatT`tfAhw4$bv_fW928^_9)`EMa=%JS0Dv=7v!J8ogJ^`t5%7-HDO{>_KAk?` zGx!F=)1jPF|Gh$Ii(rM3iV6U9f)^$cLyu|k4m9)4Soiii%jlsvHV_enLD&Ud5@p6J359b2#ZJJ8*N=U@g z$aRH8*?k3+@>{V%ApZ;Qf7Azo$^a(8`jN3~9Wliac-(a|6jSnzU`3_jYqwe^`SZJB&F0m02S$ruAr5+l-*~F zDd<46&#_9MMME714klPw<)vUJTS0D}0}h&5a_nNxQr&0vCuE$df1CPW^*-D%4a0+j z+tu#%s0<>Y4ky9*I$oReN^Jcw+SdpBO35)XGi)M?n_6@_8dbEm7bbL#l`Qcei>H-CJ-!B%ce!!8KW}+`&UN*jT?Pj%JtEp;;T}hq~}R+kR!= zD&c0+E73sZB>_=pcNb7uRoGB723WF0XL*H(TS$v|f<7*W{l`NL@{K^_U%=8_W)V8gO?UwmO^nDA{2WCKnU~cV2%bEK7(J10H3$h;rUhe zz}Prmgk%kDmJvmP=&HILHz2p3o2?AA8hsyYf7fGl5;n-78+Bb^@p9g2PDDH1R2&fH z!l&uVEQR#CMW>T!wAFvQjq~H;`eco^`aY9}FGuCn)?ql)Jo5&U*vE6GyCD_G<5AL7 z(*qz|8z?g&>y`zdQx8$dnOY@)SH1xohHpCwOCOdqj*SU4=V~}{x=iWpL0Q5byO5MJ zmB|iBClmanj*dMob?t&?5B}P7;9$2faGzT$^$x=3k&amJB^DqD^zJj z%^8g?CnmwmDz0t?dBcxVJIjL~ln`Gw_K79=3Cv85)%#tqc>UKmO=jSTpJTUN+W}$w zPC^cMZi^U|SDwI)97hUcQ{JXNCEyTB&DJlMiNSS3-f3m0L~Ll=AeT!E0u|AH2~+)| z2o17+n1^9IAq}Vc*ffljrxdRh$zL916^?RWQ2rhxot7{+s(fn7E(ZcuE3B`+Nk70&h${?`6kL zeAq0zx|k~E3#!aw$ene0J!mF^`(*AtXCVL}LZs{(2Oa{kZXGT*E?7*d3+67fES#c4 zrlT=MdlGlJiMKrxesVyOE|(vxOH}Nn+Of1P@!+nPuwN~h!!x&Q&}5*QpA{Yf)q6Lh zF-KK?ku3d|p#;_Lxih2Z%o~XwId_Y(5(ie(-x__pNev(ii%I=L#!b;Es(P<@Q*~g* z3(1!@qu3BfB;7}iR{9Zj_lsstRbh=~;|IohoAU#(o_q>rBlxgP8W@6B}(zdFDYf z9j`;Sm;g3xA09OhJ47KbIG9>zVNqaT-zPk3a7QRdiU+JBcQ84XiP;NU8fjbEa6JWe z$`^eK^V)E7l@EIBdhQ4!A=Qoy&zw9ols`;fPBEJf50AFl`V&L)s^W}6qPU185};2_ zbbkhs8b^3?LY27LS}csn5ucZdI@_0q8#c+73jiJN?v5QFN?6<(-n*7NXL}rx|7^#H zoCDLkzotk5h}b^m!YzMi+TE?HQ6L9;vPBg ztxxiw=1O+xe`?dcT5!q#6C@VL&%Vw|rc@?eBW73&c~23?!5wg;6%F{J2{(q4^i($pug z02QU&PdIt`((bAz6v`BE>OaK`-T-Jx6G5#C-oE1w)sy2k(dVKS7W%>njWlboNfJUG zjjk1zN1b=uca(hZ3wn8or!&&nH5jD9wQs`W2*&cHE(ee;+NAhSgtM>$e6%`j+8wEL{{hRh%j*kwCZTh+y zPs!(V9&i4E86eAq6elgBaKIfM8QAa0F}^HpbM!^k#m1Wbm<_gXAHG-IyUG0tJ_;*s z%YY`%0vShIESg>%%c>);0+FnmL6kv%b6_bZf+Q|V`wVa!SjEqpD#{78K~TnszgV%& zCSl?=O{bHu1&e6IUpv~OL{RQp!Fbk_C zCgsRbDo*A?k3&oTo-xw;8@ZZ4T@aGsPbLT-@yg9Fp~~S~evpN)I5~-dBnRlua>ez| zNXao|TzjmHoT4>khE;;d>Yb$M7Jt4oi6$uOJDd>Kn3$ZnHIR@XF=w_aJeH*NjIgqU z69|<#=!q%ofc}d!pXoa;;<+TOv+LH=&_Q~oBLRHAz$pbwF2%)(ROeTN;b}hyGN}95 zIj>_-T>iZ}2S+uXaCOqThGd{hH}SqaA0`E$sC`e%(;;D`0Ida_LQXz4N4NQL>0~aA z_g18y`yI1G+Gt;PE;uqKKDX15xN$;wzhU3;ZPsT0DOXIQy2!cUVQbq1c}T>F>t)UX zwBu}GKDEv)338I;=3f%R5S6bQ0-dt(&^eNYf#mYkcw^z`qyY3OdupNj z#2(~sMY&7YjNZCCn|ZHKaKAKi3i~GB0u(XGDBOG``^bAUx8>Q6k?Ua0*Hc$!Rs=be z%Tc$wYM+F~=RakK&CU#LEENG-U(3-+(N{CN~p z7yo0P;jE?a`H#9ii@Xv<%S*b^OM=KU$~KOt#L4tUb$3Ee2ZqH8*15xf-y#1hHLJ0L zN}4AjwS2PBQbmc?07fk40tLdta2p8UsRfjznz{$)R@IUrI9YkWn*mM8IYhG4CZ(O4 z61t&~q4$j{EeB}`^w_*9xHr>s9uy~~Y99|)ipVH>)eukelvaDgrwcAtH))6HUJr1( zuY18cQW8>G=t!}ehMeP;99VI^ydztVz{1V94(hSLow23{-gG{+?Hb)YvJmxGxdQ+; zz^_lnwnqnep7NT%c;*m~6bD}+0AQVdb)$K0v;Dxn^KkyR4klI}`c)y(^rSiBLNV_N zi+nYe_<>J>oiuWeo{U1Pd}fa0@+QmH#3fv=EQ)?2mpMm*h~fT94Yt>T&dG9u(O9$# zBk&TrC=HTdHCjcmsm3nj4+!m)W1+2*lia@G z8VA+0u#d|1R{20EdOI?JC5Qua@aWA_8|G5wBs*S_z+l=vbEJ-DLD^n9ucowA6{HY0 zSr&Q<$=pJuUwFBqg^8A2921>rdWAZ1A+-}5bznfk#44xnGWy0qb{ryM?B6>p0M-({~GSxD`b@1Gf}uYLi@G{Hn_K}h->rP}w>tn@;-pN11Mk}TKR&$Rg!;?&z?%4+3SS3~m zHmZUSvb;C?AoUt#K>5bKIe}2oRonSulV_ISovsc6Pi$Y+Pi#ziVrw8UTm{}F&QGAF z_4|m)6ff<~@fxz6#^9=2&~#BQZu)~G8M2En<7!#$v8CzgeuCv%x$>@)UryE$^vp%1 zL-yc$ykc=d<}HFn)6r54VzUXPL|n>M_1@!G+Mf#k0x{Ze+aa|I=b`KS#y)FfiRH1N zpC%-OCRPl=RKrmK2bVgVAb2&O)xZpzm_e|&6Ma|5K@Pe*{n*;q|SY{aJpz zfr8Q1%(Ij%@>udwsWY?V4tH?0t<8B63P$ z@gQQ|$;<4lA72F4WKEpmiCaC;DwZSs!6SJ7CM5N<7-a>GrqL~4)B)mVO&kN5__d|W z&ZrV>vBblQ#}8R~9gQY9$Uu=VPK6Y^cy0rg?vT%5;E~wX_B4oa9*hcrT{k35!NEYN z?J2rrXJHOgwc$EB>E3`cQfL_ix4yLOSvQmcI&x@@y0}QjWJ*v}3tdRMzR1lhVJfm` zxUwO(EJ=&D+?@>1E@~X*HI9t?b%B9*e6Ap79}PCY$SszCx(y@Cf?4p$LIV!_b{ZHd z0>QYVtFC5~W<9IKvsZEhj>KjYHu&idvS}f0;*jOvu(aA0Q55ohnq#*})x9fy|CRG> z+w(45J@WEfYpAqYL>1o?R+=m>?|ZFu>nzwIZ94O$?X=3Bg4iTt`UeCUul~&kJJhw7eBGNrHRE7SgMSZwYytLzr92Q%4Y( za`R*<;mr;2N6pc}(F(JLjz^_Bda^*j%M~{bK7uhYC>T0!EgkuUZqZ*9uB*J1aVY^% zjEv_Q-@NrW3JCN@BoJ1c9~+HDd0SjGu6NbBckgnt3}A7<$(r$mHN1pv1-=kM=}s%D zQp8I0EXxTwF)6k^BX6uemKn0Nthsy#ky6i(#0&G@Kl*jIq{AaVMnI-3tbsz@tA#7; zp+q1E@mOFfd@cX5hd>=;AB2jXKMO-^{;*YX93u|vM8WHljrJE7JnChewe58+dT!B*Ygp*zFu&@)lRi6nNadnw7)1T+`~*XbwCxr=EZ`;VFI zR}1ap6EQNM!AJrd#XjJ%d*l%A9oQ(~Z1P}5Z}%uWW3e7orRc31t)!;JuE^rI)%j=f zB2DK{evhF{WmQd9GKR+|7X@=kC2?QO68@XP84$+j*2{)DX9$-C5Ia3riI%~wIm*GP z{hELuiY^{fkCXZ=cV6Q}r`-&n6lj-{_p+HUFsf(0FUI9zVj0TczTGBrA{b+vNEV3d z^kIj9JhX1c$UHv6qRT`W#aQq%y08Xfr&>G`o*)oh zu4d9k*!L^U(6?GG93hg-Y8AaiZ&mT6Gk6VTY08eQ@F^9%!uE-s2lE-6_@w|3Oo~=5 z8zWv`5-~P9>W0gCo0d-o%1&p*j(;?V%C2xyI%-sQF5wEA{&6<@K}cFf2kq+UPg>Lg z+0?GOwi_+V<@i7mcY9vlyZ9KO&BjKyGJ!RE`-Hzgct;v-0|0z|IIFd*Honp}q4%sd|38U;WifZi=!tp`2lTX(of?7ztE8YCsOi%;%uHBU@DOXfA+s{9Q z0kNWX*+YXrgM1aJ-v7j@(VSr5f#@hKb&t7E|sTD=rx<6f!y6*TPxz> z+vhF*e>~K`ZU9NRGXYjf5jJaMdQ0ltMB{U`^MkCh=Uo#5P}1~Xk8b(?365H?))yC( z>V9oDdMn&s&!;35JptTOo#~Pi#}-Pqv55>9mk1UI?m<~ml_|WF7)~rFAii)3@|Y?D z4Sw=xGi7tr^VP;CkK2uGZS0 z_95QO&rY)2cTLFfkXNeg2#-ZexC-Z%E*Y}*VDN09`dhS}_ou-|VZB|i*@X%g~1i;+5!>z7oFiJx1OSx$O2_gr<{xm^SZYiIM?-Z1Uu-oFUlXVkNDTDU z;_MPEb__H`3DuVea9ti=C=@o3WbNG!s~8SwvA>K?Fdo-hBH&w%qt8 ze_fhH6e%XA#}aBYl3QYIn+?aBn|LnXa!LFe&8(dBTM6&*pD0oGV31ie$__OOGnAMG z{nB5X7vb4AJa zojPo|KqN&3L*Q?B+9aM^xHrL8tkM2h~$J@zeUez*7(9MPr+^?4z63X zeN$+;1gYJzC@$(BH?ns4$0ah?3vYqG(-OWpeED=g?X-ZJPjf7rEH7T8*tLz5ebm?d z3UWVd*69msxRNM@X*YOye#nqI+4Zb+0|3;G-5X<=u(*=wDno$)?hBy25VD{i1yz^? zRq-;hp@4Nhq`eF;KnY?svN(By1L8o!aW*L56`YKkcH^rCL}98H+Z`mKBSox;l6is* z^|vC;NJUXhlAq&ead5Kkrl`Hqsh8wz8hY|g{TObot}c>u#L{6aGa4tMhEse2+*-y_ zC)Y=bXE?N^dYl+vW9k;6*hKEu#Gi9sv~49`iP^rQuk zL+IT=$P`uzFqDIZrYOckEA>ud9`G8fKY)10X_S^!KtkV1-G$yArBDm}*DR;gL1WoUU|Hxk1_P_BiU^o_E=67FwB z-|R!bjq7X{CbRdBHV>4DYFT3LH(l257;tG>aXAqTlp%NukEkqV^7W7_@E@AXu z(xNhE1dCyH3^WyNQVr>^Vsfw~m%>@)pRcS$9r3lh9CY~$5Eq` zM%oO0&MdHDt|{8PFG3F zxy3oaM4&3XvZ!qw1p>%Jm$i(tNK4ek<5Y=$_Flwr7p`1owxBmNz(h!RvGjHbq^EhW3H}R3S8N zO5xcy)=NrqQ06I>xYGE~JQ;PdGtE0n6`zj;f*C>wsk61mU}A~?`25hPq~<=;#T2I<#ubbPvEThw^qODyhBR=n*sJ(HdYJd4+F(xO@>eZ!e+ zd~D7&cL@IDvPME$1Iyj{KN>sBu(qOYT^A_s?pC}&ao6JR?w;cA5Q?{GDbnIzoFK*B ziv}<5?iw6!*n8je?0cSj?%lugXC`Z9WzI3*?;CTBL=>{+c$q5r?P$ovAWt~5J$^?= zWcw^FOV(W1ey9HQjz8s^;~aU>GxcXitd##g7YFn~^i5ki$MqqcSsc;N3eOV@##k$# zP{j4A^fk`{ZLRu+L(2qmG86(JUK$o+^bH5Ke~|fgGM82|&kip8YbRFq36V&h_=K~t zg5E)4Nc~3}Dve*N>qd)k6xochT@a-W#)`w>awt7tR4T?zu(hdCb`?yytG}Zl4GYjJ z@x`Au)Bl?*=ysS?EU0+w(KH+K)0kh$Ep(n)h~n51?gu#Ut|V_=vZ1c8-iHgOCqO>~ znI`1%jMq7KYDr+^I56#xyc2)1%;cgs`g*%6cGVMi#zV-P89BcPVBDqsrB4*wPc8@A zr%@KZsg^y=%7VyaUkf;fO>D0>(_H#{ws2Q89{T|@_L@jUI}rnm1ACl@&cbCL zRP58)69LkDw0!r7PKAv(Q?1+$tB#^#)M+<5kuXG~N8jbmk7M*8%lU-Ba(R9U{i1=NJj?4&s|wK*c54nbWwXUr zvRK8xH-OtBu_R?K=W8HH(E7-VRz1%SYq`6SZ_laaP5>(;{9B34&>qIl^f$?x;!LYXU;1~?&Z$*dp7}Yf^Wj(s1UzTE^Aw+|NdWb zW4ebapUGk7KdY@s*W*+=oIkNuUg(5QXn65-)KZ95m-uw;XH}5T877Waq2-?SbtIi3 zAV}4l&l+(6+VlP>y~!a&+>=>y6u$jmfu&o38juSPm-eQf-7@@QnXDf61LaULl^A{6 z=*jv>#vR&9cIy~|uk>BLHn1hlyq&aUFjH8;#}Z*db$8QyscM=Q=Mkctw0wcD^^FpD z(EoUc%NxRp0iHg)dvLzon04nnDuF)YzL1g_ui^tZt-<*SjMWvC!g+0l53^0(Fqr0x z2QUb%D&n<`HnlpI(z@b05?{qop~vd74b+ve+AI$qJSf@Xd@~50=YU~VgO*5Kf;%?Z zUxo5NgDw?`Kqr0qaTW4lKF&f*vEV(-7a7ph*S9Z@`1=jy><6=*4tjQxs#{`uSNE_e zQ!ir^1`k&>KEarhb&JSE^-)(BvdF4|p}FYf_Yxe13%q&@jGgQmf>&IC_d(lpI6*d! zZ9Xl0R8qBcnqm@PY<-+ONmt#VcEjJ{V?P>JVWx56Tq<=tJWcOLXGa5DA z+#{A4TG@X4U3Mj2d+~Hj1bPT%$wsD-N2RN5PPhk#oAfNLRYv!1nSh!K9q`5hL0b%l z^#{+x92ueH+$^s5A<FbuO>zIMjM#|)eZR2BZ*nK5_pMG3j;oPa zqf@4SXf92$A(u}`%1D3P;B#lH#vXjTV+zfc6WrdPw*WdLVU)fKz(br^Ff#jo!{F1l zVf~4wH$v@MU<-kBH`^|z(n+cBpP0(764+F?^~T|MWwPCF7N`4m-P{y-xgO?>Y`v5` z8YIVlxAo4wzGLRf)bR3w(N);MFA^k!b00;VYu0;4ADky-*EBdcqj}bYHXcIKbR`Xr`q($-X*j2gBtmgh zY%G>nO5b&cHEX-Td2vUK#=4@^S*2gj_zBEU$(NzFW?*_8JW^Qvx|u1{b8qT4YKZqc zp~6b;a*jfXoR!^r%;%ULW(B!|x~BMNM4T%OkYbw{&|Oo-@{U)?Yubx?b6_$zz77ys z=}U}Nf||T)-HV@mdr*zFN6d3+ZM8?v{quG_yJbWYXZi0(cehJ2`62ae81GeKae@GQ zO9F3&W;K78I?a1aLW27Ii_z)se2<(*EMGgoDD^tNeIJ1@6kp@{BEQES!=ySleWc-= z6pJcK-^Tr;;zb~`{-9&H3^t^_k&(1i`m9A6Fi z%{rT6qvi=qxU9YRuq1pO@2|H_f~Fgr2!;A)7&@-ZO<&EH|D?B3>zx2vnZ*GYafJhA zcauE0fI)M~KY!F{;Bl1U^SjCX`h>tH_lk0D$WsOwGnd+7JBUXr?B+h{=W0i3YVP8tLqW)Ekn7EM9a>ynj4HR)qKWwv@FGdjd2H zgk}Ld%Bozo3nFSHg{2U26qp{FjU2yZFxVI*8lS()(t5=9?drr}a;QYpU0l}O@~eb@ z^6Cezm4#z1_fFYm@>Cg?YicO=r7PVfr2=c0<(0sYHX+3T1T*y+?h~C78t z(-9Iig-OKh{gs$Ou$3wG9HvLP$gw6!NBGk+0$1h5Vk#%z0h2J_?(zK7fh?ZNAW~`P=vAgB+Cq)jCSH^cyt;W1vlzI? zD$%JmZQVcwi~Fh94gUdy2Vyo~UIK!2nlbnp)^}U1xi^Eac-}7Q^iFtoX$3yLg+^Z? z9~#;e;ZGKrG4*I^gpoEBT7T7jnIozWbQ9xip;Ow1f6l#$V@fnBfr4~kH!utE(Sih( zu~1DjrhZ)l#Z&7W;Wc%FaTZ{9L(ll`h?zt*=+LqIg1Jh^J+bDLM|Pq@ed2F+;{{wx z-il4IRwMN1o`_kpAx}}_DUdEFzf^hJbwwZw(LP2x z>6?8r4oql2rbWb@nE_RMgZ6u@#zTi*ht6ZaeV^;)C3$lSUqYFf0xcw_cY}>nYsuE0 zZSk2~F$D8CQC|*ob2nvUoe1XZ)E7Z~(TPj|D#D~snd)Y-_GflaBF7Ve6k1%GuuniJ zR0mPm=rF2EZ*uILZW*9i)}NX^Ay!nav7aiZja)89?+Ywvn+>eIjTp1ZxG*G8b(^}$ zx!9qzRHi)4`qd^N7WuGw-i6H~qeLz4_z(Cb*ZZh3ZY8`ThDLC$g}`nf4G|}L(w_1? zUptL$WI}|Md?Ge(#>Px0rBE;07xBmFihDYDsolJQ=z4m_^|R1rYL;JJ=QNzk&`86C zV|8;w%gvsJ-^bUS*EwzxLPgJ-w?ngV0hq<8kZN0#7te&2^_qQmbipNvK~_t|;8Jn{ z(2K95R?nBphFa&b2f@1G@ko<2^tG*xc)Wd4Q?pej92gT`I)-6TSC89r)2>MJXuLQ;g-E2z}I- zr`?=DfZuW>iwtz8WkCxHbG~zK)3m1Y6L1~-*62E$8{T2-RR;rer}R9{Sk#8jkIRr^ zC)8}71q^?oo9(pD(3%SLoe!h)^gL#^7T1-(bg0?L(6YCyTYkQHa+v#NeipMUr@{hV zeoh685bTthW|f=^Eav`WfYhV|LLDq4T~HtqWwIAFyBB(JIpAlxCiK89u7-r^5-(FO zo76CkSau#$L0J3iN_b9!&O_*H*x*+5gP{7?`kap-#(x3?`H^>l z4Ew14DN%ACl-3s&0*T4K#H-}rOCzs;irS6z#i@Gc&O}eATB%xwmF>7|Ju)Awq*A>{ zq<3k)Oq5BZfzZqi5WCgR>1YqFEfKygmf2w6H?B{CSU>waW9cn(ENEryTy|FT7Y86O z>qx9NMc>YWb9XGCME24o;szd&Ng0)_hxu;Uy9ZE=Ko%8mB!UstHX}m%3lTnm$pK z2i2`2Z)~{pJKGL?>xxPn?I6_D@XBPC?$D6I{-FTMXJy@K^;I>l?a3T0NG42Z_rio< zP~mSv<7_uxj{OMNocoWZDxG8vR8a^fXo<|Udzn2h-cf%j+d8_x?~jOp0%8`fV*mAu zkCI2f5a$Hd;yBdO!E<|8gpHT3^zmSz!1{R7n*ANa+80qcwaocB6@{PvqmT^c0@{Nb zarhGK@-HzHBA2h?pLm#x*h=O=cmQ2-mHz#u;Ct`Cq;Obo9Es^Vv|$P7>ks`uEMj&| zO{{^n1(I)QO6Iv!R-Ew9H3f!~ki~OD3^DnVEd(rho7-PS*ZfqNq z>p+Uz21+y>vL*?`7#T>OihoBIZmceTtq zj)aUC*}4g^7f|>eo0ly7&ZS%P`yf)f(m492WXx})e?~}y;&z`#0W+BKdO{i*k-6S; zoh4A%rR?ROmVF>Jh?(Sw^)9LC64?8fv4{;|dSF1XK(QA4P4D8Qu3ICw@OQCZ zgXumvqj?&|&|heCv1M^W#g}qn(n1CHj9FF{e_{wioq=8{F;T=!ew&;fmqOGrav|&% zG;VR@!sm5-pM^8r-Y9BriM2+yA!s(cl9Ao>bbh;rL_qTkD@SLK^G)fillHUmnM`CU zdkv&LMevVphl^tmb*!GUQ*U7E(S6cEhs>@A$(b*slv8fVSzmZiIh**L_d7Ohqufw# z;-{9IzQTiB^8OlnZ_G%Vtj>#po`67&o0#FatSvIk@rros(X+`|CE~iYj3MT&fHg_y zRjc=JYQ6Bue7bNWIlf*s&DU}JutnT&tlJE1zb-s*XJJ{kg_HIUGxRpJ?DY78q%%8b z)$B8N#>`JTQND-JZ=OG!SFz8|Nc9YPcdSKX#Bx50V01^sKKw2(Ws8&7W2eR!oJ_e>*$~dqTe$+jNce+7?X5P5T zdIJ|e`iZ}zEP()B3KXv19*P?8yWBx(d=Iu@=)Y}rh-jSeY#mb9)gIVlhw>c)97%os zxdz)^VlNTBv2<^_WL1s(m2CS$wTTOUgTFAB=QucXniAOUk00mui$ovnmm$?8SF#wb zm6Ce@`l)dos8?^#&#LCj__YB-(4}0t-QK^XSdpJqbfzRgF8hE@eiV^kjhp_;=0gVd zjwm>=d-`pm@R;8IZ&09y;HmUQ15m-OOFIWYewuhQ>4kVWQBhsly>KemN5Yc36FVia zD*ZdmCei9X(S&*WpQ4b~Vo%!StFB#nQa7YQXZNo_OCUDXVU&?&7Jky(gE4F+#7Qv?-dMxoB)r3Ib>|yLDXhbH zK}o`#C^V)609*CI5Uz3fkt7`t_$Z&xqQ>PV!k1jD+}mCwnQGVUo4xhIQA6N_EW>WO znN1c>eBIMn+zbJ~*mO+#?U4i1dBS0l< zXQn#1&~CPQ7Z((oNWpU?CcZ(9r4oDFFA>S@TmlEX(G3s6^+m-D+8a zDHcM-*EZ0Q#@-bwv!X7ndqoE1R@}%M|3nmP#ToK*nFPk4d$M|dQUvC%DFOP?_r`yB za4TG*os{v!nW%F0x5JL+ZhDT{#+C&kxzF5uOaBhs^hkd)J*Tjflm}8gz&KQ>r5WdM zY2dayI=iv{O>ko`!aW`-!m@_Ol9tHz|9osUd)h` zOr&UiqAYeo1pmWx>j{SZ%UoW1ck0QTogV#*C{)^)=*DiZ7+^n~EYxXb{ak(Y?r17| zpWhD$ywJcaYVyTK0(#z%Nc$sDiT1QE9lSI@%>O9tvW@5!_&e%pDN+_Lf7r`mo#w}G zDn3axJ>Ga0ga5T#$~I*PKItBzV5~M`|3O2CcjEC6riXpWy!-Z%rP9^uj=Lnjytrx6 z)rrK6e2~+qOuOjYJ@yoyCd*gHiCC(=Re}%w&A05q_HOyBfU{Rs{kD19ouSVmdi5*V zKT#h_XA8`_jJrm-S)14?#4Ch_WUK88eAhV$dn32WrtB0?m$81)@Ejz?X+))-m_k0z z(t_60<%9FOt7#d(OrlM3G2jqTyRX{m$C9uh64dP zcwcpU{g$viNs8X{OkSbu(Mdst^-N-W_#Q0_E=U!H8&XSA$=v-#|`}jf?hWwxy5A)%rZIO^V zt-;Xol+|(Tv;Y`J|Csm{@J=19YRfJ;dG)0H6@4Ya-gk-@A2euBqIdMzkq4Dirsc$b zUp{jv$`?`QBCjj4#ajP7?KhYQ?MMJcr8SohZp1DBOvhufhB%cDDP0rclAJG;boYgJ z%-#srmef-ANbMe4^*ZtzXm3 zxVytsrv7J*-6IoJdc3Aa6aUp>_f@dHQYyPXv_*i}KNKE%+MgLa`XaUqs1R#lWlnQZ z6>*4@XF_$wY-`MiMIh zIIW}jbwl;`Zr%y$RX@e+*0BvY@yL`vI=yG=(hl@SOJ5B>;aQVf4iZvf5Vgmh$l{e5 zD<>@)T(%rP8vp&8+mJ(MtWxQGQCBAIi(sye4a(o{|#T8vWNyGJ9ss`kMp zAozz*P!`uhukIe`g4S#qgof^;V44aM1T=I+g%17bTh(Jfk?vS99Uo#qI@8Tn#whHt zBVa~Z-~x_mHcpZht!X=?TdL|;Y?xd-B9g($eZ46(oY($+y&@+T5|}~F7wxExdRq3d z)jB*o**+3HaV1deL5-wGr)!D+%Gdr_E#<={g;){P(3ELYNUyy|3c2h^jCgz3uW8uKai~g zW3h0{x7Hj{S>q+N^S-Tnm=p}OQTea@0Pm;T8-ETu>%UDJSIpLUt|eE3P_h}*{J2u1 ze??InwhRFB@v8(b20!vNVrGS`u9zNRYL&K7k(NYj{OsQlsJ1dXjUDLC;(73X39mS8 zUw`$+$gjZ+FI*`Mra1!z;k_LqaTMXESOobnA8H)`-qhW|hoV$C5_7Y~Sysce5~VA3 z{Ww1wo&fwRO(!||n3yhOGs4xFc34aHs{N+}b-s~wMg1XK&ek83$!m+TDk*(dDyuc& z(JxLzn`8(pvu_ao4T)aUoAGi7gjj4a{ek9=4vmE!PI)fG(Q6fF8^fUtx_x?k%f`UR z5a&W@kN1Jv%4z`nWLq{s=RL7`kNQtc24T9?n5x0I%k1s%HR-}Wp+KwuQD+D-`4EkR zGV9xjI1aiZ5T?!ho)q|lxIw{r7O&*k8%oD;E4WA{#i+Xb^aZ4@Vmj77UB~iUq?44o zI!G_Lru6%T*o>}5yKwvxqc9$5{ta#5WB@e(cnbQ{w3I44pnZMC`i_-1+=#;B zTOfx#Wq?lLXfx*%=HAeiF4OX#B=xevl2(Z^MA0jV@-J9+d)=;JLSa{;M7iwo`4~;$ z@P@q873RWMuN*$M(HT{~RQ+6G{L$VVHvUE68%uK4OR#*czH2c$P3!W3mGi&RonIl> z&(8w+pIQ#l?=exgFHIE$+MmfyM#@1k#{Z4+YEW~5Z{8s2zy3!6l=tKd-nU#4)$V|| z;i16|mlwN%H*GZhnCNMQC1vC_D5BW&f*4rNX~|_(>9^_tL;!v9fTLZhC3evSZrl-G zWb=dni1vo^|9`X>ySHrdjHGF_;A#;>@4Ic9nB_lXc0cer6?XUmy}cKVr&-#DIqZdA z1pgkB?tFIT9sB9mQdxVT+(S%bH_8x%{?a-(1!I|FL-h0ijDXrLp`5!+!kQ`r6F@1% zmi13pBNb`}i_-@An%}U*!3SVgpTIE9Mp1TY z%$XQ{hkmfGVb+vKzpOg>`@IEaJm%;xN~qZE$mQt*&wM8%mg4g~L_A{R2qn0ax#{p& zwXpYxZSoDg$~L3#Dzu`d35Ce!0R^Zho?}j?VS*mn6B8(^Vg!Dj1gGI)+qyaYjbS6w z&uqONa{7d^Z zo?ZWliXGP?AmwD$q&L0nQ^2`b_5cJAKNuGm`t7@J8G861X+MFj&vcG} zlc+ZvSO#2^3v7A8mbx`!9)1-ZX37k2M$|lxl=$5L@C9HvE?BN=!_<*H)ctS%>Y9P_ z*90T90=k>g_>>GmX-zo@fT!*JhOV{1RB4fjz{9_h%Pe-Gsl|!p08_)YB#E=Oe#zP1 ziZ!l@>!W&mOye%mpy3A&a}QG%MNVXLUJbr*&La`XUQrO<2Qa5BIi*Wwa9tpc(EbCSZ{H!?#Da z4U|QWdtywo>i*-pH~lryRjNV1HuvO(?N=9WeW;}pU-wIO{H+10iA6}1n?u>9ZLcP3Sd`xF>qQZ5dN~97INv*o>7~hOhGI?)KKz?QTlK;1b>64q3uaf5 z_JiBPrI#g;Y!w)t(z)rl;h{OXTLx&McwSca1)_&keV33MtMkII4IbaveGgWh$Zt(< zZxG?KH~U5uGD38#=O0iK^0&0N7U}+Bn=$2L<-s(Uyyu#+RJx@x39kDu(8;8NrxMCk zUR@e)Og7!)WSwFi)PHam{eG%TZGfh)#4Hu9_7OOOT5R#0(?baCP8txs3&jAE4s}p> zJENepCgV$Ro4%Is|EFdgbR5?I)2;jG0ENBimiHa;7fz-jP@uwn?I~hkz*PqI)gxZ< z4SKnMhpX53bX)yD=<7cn0HSo26>j?T_>aqeA=qORL1=uufd-e?D~54!UcXxV|5v{I lPp|Ml6XO5*3D+;2BO3cC84J45|D$;$FRda~DPb1!zW_PS-ADic literal 0 HcmV?d00001 diff --git a/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240508134406.png b/docs/user-doco-vault/en/Computing/AWS/DynamoDB/files/Pasted image 20240508134406.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc6eb001f68dfb8ae466d56462a53fcfeeb00ec GIT binary patch literal 52825 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 + diff --git a/docs/user-doco-vault/en/Math/Ellipse/Ellipse.md b/docs/user-doco-vault/en/Math/Ellipse/Ellipse.md new file mode 100644 index 00000000..c913f34f --- /dev/null +++ b/docs/user-doco-vault/en/Math/Ellipse/Ellipse.md @@ -0,0 +1,22 @@ +https://en.wikipedia.org/wiki/Ellipse + + +In mathematics, an ellipse is a: +- closed curve that +- is symmetric with respect to two perpendicular axes. +- It can be defined as the set of all points in a plane, such that the sum of the distances from any point on the curve to two fixed points (called the [[Focus|foci]]) is constant. +- The fixed points are called the foci and are denoted by F and F'. + +# See Also + +[[Ellipse Equation]] + +---- +#flashcards/math +# Questions + +In terms of the two foci of an ellipse, define an ellipse::It can be defined as the set of all points in a plane, such that the sum of the distances from any point on the curve to two fixed points is constant. + + + + diff --git a/docs/user-doco-vault/en/Math/Ellipse/Focus.md b/docs/user-doco-vault/en/Math/Ellipse/Focus.md new file mode 100644 index 00000000..a8d572b9 --- /dev/null +++ b/docs/user-doco-vault/en/Math/Ellipse/Focus.md @@ -0,0 +1,7 @@ +The ellipse has two foci and their coordinates are F(c, o), and F'(-c, 0). The distance between the foci is thus equal to 2c. + +---- +#flashcards/math +# Questions + +How many foci does an ellipse have:: 2 \ No newline at end of file diff --git a/docs/user-doco-vault/en/Math/Ellipse/Major Axis.md b/docs/user-doco-vault/en/Math/Ellipse/Major Axis.md new file mode 100644 index 00000000..2080b6a8 --- /dev/null +++ b/docs/user-doco-vault/en/Math/Ellipse/Major Axis.md @@ -0,0 +1,3 @@ +Major axis is the longest diameter of an ellipse. + +The length of the major axis of the ellipse is 2a units, and the end vertices of this major axis is (a, 0), (-a, 0) respectively. diff --git a/docs/user-doco-vault/en/Math/Ellipse/Minor Axis.md b/docs/user-doco-vault/en/Math/Ellipse/Minor Axis.md new file mode 100644 index 00000000..a189939a --- /dev/null +++ b/docs/user-doco-vault/en/Math/Ellipse/Minor Axis.md @@ -0,0 +1 @@ +Minor axis is the shortest diameter of an ellipse. The length of the minor axis of the ellipse is 2b units and the end vertices of the minor axis is (0, b), and (0, -b) respectively diff --git a/docs/user-doco-vault/en/Math/Ellipse/Semi-Major Axis.md b/docs/user-doco-vault/en/Math/Ellipse/Semi-Major Axis.md new file mode 100644 index 00000000..7fc649cd --- /dev/null +++ b/docs/user-doco-vault/en/Math/Ellipse/Semi-Major Axis.md @@ -0,0 +1 @@ +half of the length of the [[major axis]] \ No newline at end of file diff --git a/docs/user-doco-vault/en/Math/Ellipse/Semi-Minor Axis.md b/docs/user-doco-vault/en/Math/Ellipse/Semi-Minor Axis.md new file mode 100644 index 00000000..dd8b8476 --- /dev/null +++ b/docs/user-doco-vault/en/Math/Ellipse/Semi-Minor Axis.md @@ -0,0 +1 @@ +half of the length of the [[minor axis]] diff --git a/docs/user-doco-vault/en/Math/Ellipse/files/Pasted image 20230828144739.png b/docs/user-doco-vault/en/Math/Ellipse/files/Pasted image 20230828144739.png new file mode 100644 index 0000000000000000000000000000000000000000..3fedf711b4d43bb09ed2bce1c5f9dc33ab5266f0 GIT binary patch literal 46642 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 literal 0 HcmV?d00001 diff --git a/docs/user-doco-vault/en/Math/Singular Matrix.md b/docs/user-doco-vault/en/Math/Singular Matrix.md new file mode 100644 index 00000000..e220c1ab --- /dev/null +++ b/docs/user-doco-vault/en/Math/Singular Matrix.md @@ -0,0 +1,18 @@ +https://www.coursera.org/learn/machine-learning-course/lecture/FuSWY/inverse-and-transpose + +A [[Matrix]] for which there is no [[Matrix Inverse]]. + +For example, the following does not have an inverse: + +![[Pasted image 20221018122853.png]] + +Similar to how with real numbers, 0 does not have an inverse. + +---- +#flashcards/math +# Questions + +What is a matrix that doesn't have an inverse called::Singular matrix + +What is a singular matrix::A matrix that doesn't have an inverse + \ No newline at end of file diff --git a/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Diagram.md b/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Diagram.md new file mode 100644 index 00000000..01f2287b --- /dev/null +++ b/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Diagram.md @@ -0,0 +1,10 @@ +https://www.khanacademy.org/science/ap-physics-2/ap-2-electric-charge-electric-force-and-voltage/electric-field-ap2/v/electric-field-definition + +![[Pasted image 20230828112605.png]] + +---- +#flashcards/science/physics +# Questions + +On an electric field diagram, what is one way that the relative field strength at different parts is represented::By the length of the arrow + \ No newline at end of file diff --git a/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Simulation.md b/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Simulation.md new file mode 100644 index 00000000..e26525ad --- /dev/null +++ b/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Simulation.md @@ -0,0 +1,10 @@ +--- +sr-due: 2024-08-31 +sr-interval: 1 +sr-ease: 230 +--- + + #review + +[[charges-and-fields_en.html]] + diff --git a/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Strength and Charge Equation.md b/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Strength and Charge Equation.md new file mode 100644 index 00000000..5f2ec91b --- /dev/null +++ b/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Strength and Charge Equation.md @@ -0,0 +1,12 @@ +https://youtu.be/-LtvW5783zE + +![[Pasted image 20230919225731.png]] + + $\huge E = \frac {k \cdot Q} {r^2}$ + +---- +#flashcards/science/physics +# Questions + +In the equation $\huge E = \frac {k \cdot Q} {r^2}$, what is $\large k$ called and what is its value::Coulomb's constant, approximately $\large 8.99 \times 10 ^ 9$ + diff --git a/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Strength and Force Equation.md b/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Strength and Force Equation.md new file mode 100644 index 00000000..5bb6e4f9 --- /dev/null +++ b/docs/user-doco-vault/en/Physics/Electric Field/Electric Field Strength and Force Equation.md @@ -0,0 +1,18 @@ + + + +The field is denoted by E, and as it is a vector $\large \vec E$ it is given by the formula: + + $\huge \vec E = \frac {\vec F_e} C$ + + +---- +#flashcards/science/physics +# Questions + + +In terms of the field strength $\large \vec E$ at a particular point, what is the force experienced by a particle with charge $\large C$:: $\large \vec F_e = \vec E \times C$ + + +In the equation $\large \vec F_e = \vec E \times C$, both $\large \vec F_e$ and $\large \vec E$ are vectors. What is the relationship of the direction of the two?::For a positive charge, the force is in the same direction as the field, for a negative charge the force is in the opposite direction + diff --git a/docs/user-doco-vault/en/Physics/Electric Field/Electric Field.md b/docs/user-doco-vault/en/Physics/Electric Field/Electric Field.md new file mode 100644 index 00000000..38f7b187 --- /dev/null +++ b/docs/user-doco-vault/en/Physics/Electric Field/Electric Field.md @@ -0,0 +1,27 @@ +https://www.physicsclassroom.com/Class/estatics/u8l4a.cfm + +An electric field is a type of [[Field]]. + +Charges can either repel or attract when held some distance apart. + +The electric field is present around a charge regardless of whether or not there is another charge in the vicinity. + + + +![[Pasted image 20230828112824.png]] + +---- +#flashcards/science/physics +# Questions + +What symbol represents an electric field:: $\large \vec E$ + + +At a particular distance from charge $\large Q_1$ there is an electric field strength of $\large \vec E_1$. How is the field strength $\large \vec E_1$ altered by the placement of another charge $\large Q_2$ at that same position + +In what direction is the electric field around a positive charge::Radially away from the charge + + +What type of electric charge has an electric field pointing radially towards it::A negative charge + + diff --git a/docs/user-doco-vault/en/Physics/Electric Field/Obsidian Testing.md b/docs/user-doco-vault/en/Physics/Electric Field/Obsidian Testing.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/user-doco-vault/en/Physics/Electric Field/files/Pasted image 20230828112605.png b/docs/user-doco-vault/en/Physics/Electric Field/files/Pasted image 20230828112605.png new file mode 100644 index 0000000000000000000000000000000000000000..5d08600f7cb7239fabc77ef3921346b01345eb4d GIT binary patch literal 59490 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ĺ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

e;y!0>$74_8RapmMfyF;pVUoqyi-}r7s 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 bSJwskj>ou$Yk_m_uU*qr)rD6oTSoj3%v%&0 literal 0 HcmV?d00001 diff --git a/docs/user-doco-vault/en/Physics/Electric Field/files/Pasted image 20230919225731.png b/docs/user-doco-vault/en/Physics/Electric Field/files/Pasted image 20230919225731.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa8e151fff5a6dc88d89141f634b28b2de6ec8d GIT binary patch literal 109059 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 C+o{t4 literal 0 HcmV?d00001 diff --git a/docs/media/en/note-frontmatter.jpg b/docs/media/en/note-frontmatter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..470f2a3560130a65ca30ec7bdaf85a443e390df1 GIT binary patch literal 10786 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 literal 0 HcmV?d00001 diff --git a/docs/media/en/note-review-queue-context-menu.jpg b/docs/media/en/note-review-queue-context-menu.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bc6e872f727685fc5d927937659374ddde423445 GIT binary patch literal 30723 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

=X&sJ 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 XC2N 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 he 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 literal 0 HcmV?d00001 diff --git a/docs/user-doco-vault/en/Physics/Electric Field/files/charges-and-fields_en.html b/docs/user-doco-vault/en/Physics/Electric Field/files/charges-and-fields_en.html new file mode 100644 index 00000000..41963f12 --- /dev/null +++ b/docs/user-doco-vault/en/Physics/Electric Field/files/charges-and-fields_en.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + + + + + ‪Charges and Fields‬ 1.0.58 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/user-doco-vault/en/User Guide/Cloze with blank lines.md b/docs/user-doco-vault/en/User Guide/Cloze with blank lines.md new file mode 100644 index 00000000..23f9ec11 --- /dev/null +++ b/docs/user-doco-vault/en/User Guide/Cloze with blank lines.md @@ -0,0 +1,9 @@ +#flashcards + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. ==Nam efficitur et nulla vel porttitor. Nam a neque in massa egestas rutrum.== Maecenas in nulla ipsum. Donec a lobortis justo. Donec tincidunt lorem dui. Praesent nulla nisi, facilisis vitae tincidunt nec, mollis id eros. + +Duis eget volutpat magna. Nam sit amet est ac diam venenatis sollicitudin. Aliquam finibus ante quis bibendum dignissim. ==Maecenas quis semper risus==. Nam condimentum a tellus et vestibulum. Nullam porta arcu in orci efficitur, sed suscipit urna imperdiet. + +Phasellus sodales dictum erat sit amet posuere. ==Vestibulum volutpat, turpis at bibendum mollis, turpis leo elementum lacus, ac finibus mi orci ac enim.== Quisque porta eleifend diam, sit amet sagittis odio pulvinar sed. Aenean tristique enim eu dui pulvinar, eget ornare ante scelerisque. + ++++ diff --git a/docs/user-doco-vault/en/User Guide/Cloze with table using+++.md b/docs/user-doco-vault/en/User Guide/Cloze with table using+++.md new file mode 100644 index 00000000..ed5fbb34 --- /dev/null +++ b/docs/user-doco-vault/en/User Guide/Cloze with table using+++.md @@ -0,0 +1,13 @@ + +#flashcards + + +| Name | Description | +| ------------------------ | ------------------------------------------------------------------------------------ | +| ==[[Amazon Inspector]]== | ==Automated and continual vulnerability management at scale (within EC2 instances)== | +| [[AWS GuardDuty]] | Protect your AWS accounts with intelligent threat detection | +| [[AWS Security Hub]] | ==Automate AWS security checks and centralize security alerts== | +| [[AWS Shield]] | Maximize application availability and responsiveness with managed DDoS protection | + ++++ + diff --git a/docs/user-doco-vault/en/User Guide/Context.md b/docs/user-doco-vault/en/User Guide/Context.md new file mode 100644 index 00000000..80436b6a --- /dev/null +++ b/docs/user-doco-vault/en/User Guide/Context.md @@ -0,0 +1,15 @@ + +#flashcards + +# Trivia + +## Capitals + +### Africa + +Kenya::Nairobi + + +### North America + +Canada::Ottawa diff --git a/docs/user-doco-vault/en/User Guide/Multiline with blank lines in answer.md b/docs/user-doco-vault/en/User Guide/Multiline with blank lines in answer.md new file mode 100644 index 00000000..ab91ca9e --- /dev/null +++ b/docs/user-doco-vault/en/User Guide/Multiline with blank lines in answer.md @@ -0,0 +1,28 @@ +#flashcards + +# Table with no preceding blank line + +List 4 AWS security related services +? +| Name | Description | +| -------------------- | --------------------------------------------------------------------------------- | +| [[Amazon Inspector]] | Automated and continual vulnerability management at scale (within EC2 instances) | +| [[AWS GuardDuty]] | Protect your AWS accounts with intelligent threat detection | +| [[AWS Security Hub]] | Automate AWS security checks and centralize security alerts | +| [[AWS Shield]] | Maximize application availability and responsiveness with managed DDoS protection | + +# Table with preceding blank line + +List 4 AWS security related services +? + +| Name | Description | +| -------------------- | --------------------------------------------------------------------------------- | +| [[Amazon Inspector]] | Automated and continual vulnerability management at scale (within EC2 instances) | +| [[AWS GuardDuty]] | Protect your AWS accounts with intelligent threat detection | +| [[AWS Security Hub]] | Automate AWS security checks and centralize security alerts | +| [[AWS Shield]] | Maximize application availability and responsiveness with managed DDoS protection | + + + + diff --git a/docs/user-doco-vault/en/User Guide/Table with preceding blank line and+++.md b/docs/user-doco-vault/en/User Guide/Table with preceding blank line and+++.md new file mode 100644 index 00000000..72088ce7 --- /dev/null +++ b/docs/user-doco-vault/en/User Guide/Table with preceding blank line and+++.md @@ -0,0 +1,14 @@ +#flashcards + +List 4 AWS security related services +? + +| Name | Description | +| -------------------- | --------------------------------------------------------------------------------- | +| [[Amazon Inspector]] | Automated and continual vulnerability management at scale (within EC2 instances) | +| [[AWS GuardDuty]] | Protect your AWS accounts with intelligent threat detection | +| [[AWS Security Hub]] | Automate AWS security checks and centralize security alerts | +| [[AWS Shield]] | Maximize application availability and responsiveness with managed DDoS protection | + ++++ + diff --git a/docs/user-doco-vault/en/Welcome.md b/docs/user-doco-vault/en/Welcome.md new file mode 100644 index 00000000..f9bca288 --- /dev/null +++ b/docs/user-doco-vault/en/Welcome.md @@ -0,0 +1,5 @@ +This is your new *vault*. + +Make a note of something, [[create a link]], or try [the Importer](https://help.obsidian.md/Plugins/Importer)! + +When you're ready, delete this note and make the vault your own. \ No newline at end of file diff --git a/manifest.json b/manifest.json index 122ef14d..a00b02e3 100644 --- a/manifest.json +++ b/manifest.json @@ -1,8 +1,8 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.12.4.9", - "minAppVersion": "0.15.4", + "version": "1.12.5.10", + "minAppVersion": "1.2.8", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", "authorUrl": "https://github.com/Newdea", diff --git a/mkdocs.yml b/mkdocs.yml index 6537cdbd..c329547d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -7,6 +7,8 @@ site_description: >- repo_name: st3v3nmw/obsidian-spaced-repetition repo_url: https://github.com/st3v3nmw/obsidian-spaced-repetition/ edit_uri: "" +docs_dir: docs/docs +# use_directory_urls: false theme: name: material @@ -25,25 +27,42 @@ theme: name: Switch to light mode features: - navigation.top + - navigation.expand - toc.follow nav: - Index: index.md - - Flashcards: flashcards.md + - Flashcards: + - Flashcards Overview: flashcards/flashcards-overview.md + - Question & Answer Cards: flashcards/qanda-cards.md + - Cloze Cards: flashcards/basic-cloze-cards.md + - Cards with Blank Lines: flashcards/cards-with-blank-lines.md + - Organizing into Decks: flashcards/decks.md + - Reviewing & Cramming: flashcards/reviewing.md + - Statistics: flashcards/statistics.md - Notes: notes.md - - Contributing: contributing.md - - Algorithms: algorithms.md - - Changelog: changelog.md - - License: license.md + - User Options & Commands: + - User Options: user-options.md + - Commands: plugin-commands.md + - Algorithms & Data Storage: + - Repetition Algorithms: algorithms.md + - Data Storage: data-storage.md + - Additional: + - Spaced Repetition Guides: resources.md + - Contributing: contributing.md + - Changelog: changelog.md + - License: license.md plugins: - search - i18n: docs_structure: folder languages: - en: English - zh: 简体中文 - default_language: en + - locale: en + name: English + default: true + - locale: zh + name: 简体中文 markdown_extensions: - toc: @@ -58,8 +77,12 @@ markdown_extensions: - attr_list - footnotes - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - md_in_html + +extra_css: + - stylesheets/extra.css remote_branch: gh-pages remote_name: origin diff --git a/package.json b/package.json index 5e9861c5..3871ceaf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.12.4.9", + "version": "1.12.5.10", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { @@ -22,17 +22,17 @@ "devDependencies": { "@popperjs/core": "^2.11.8", "@types/jest": "^29.5.12", - "@types/node": "^20.14.7", + "@types/node": "^20.16.2", "@types/vhtml": "^2.2.9", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "@wdio/cli": "^8.39.0", - "@wdio/local-runner": "^8.39.0", - "@wdio/mocha-framework": "^8.39.0", - "@wdio/spec-reporter": "^8.39.0", + "@wdio/cli": "^8.40.5", + "@wdio/local-runner": "^8.40.5", + "@wdio/mocha-framework": "^8.40.3", + "@wdio/spec-reporter": "^8.40.3", "auto-changelog": "^2.4.0", "builtin-modules": "^3.3.0", - "chai": "^4.4.1", + "chai": "^4.5.0", "deepcopy": "^2.1.0", "esbuild": "~0.19.12", "eslint": "^8.57.0", @@ -40,18 +40,19 @@ "jest-environment-jsdom": "^29.7.0", "jest-expect-message": "^1.1.3", "moment": "^2.30.1", - "obsidian": "^1.5.7", - "prettier": "^3.3.2", - "ts-fsrs": "^3.5.7", - "ts-jest": "^29.1.5", + "obsidian": "^1.6.6", + "prettier": "^3.3.3", + "ts-fsrs": "^4.1.2", + "ts-jest": "^29.2.5", "tslib": "2.6.1", "typescript": "5.1.6", "vhtml": "^2.2.0", "wdio-chromedriver-service": "^8.1.1" }, "dependencies": { - "chart.js": "^4.4.3", - "pagerank.js": "^1.0.2" + "chart.js": "^4.4.4", + "pagerank.js": "^1.0.2", + "peggy": "^4.0.3" }, "packageManager": "^pnpm@8.15.4" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41bce6f6..e59ffa4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,11 +6,14 @@ settings: dependencies: chart.js: - specifier: ^4.4.3 - version: 4.4.3 + specifier: ^4.4.4 + version: 4.4.4 pagerank.js: specifier: ^1.0.2 version: 1.0.2 + peggy: + specifier: ^4.0.3 + version: 4.0.3 devDependencies: '@popperjs/core': @@ -20,8 +23,8 @@ devDependencies: specifier: ^29.5.12 version: 29.5.12 '@types/node': - specifier: ^20.14.7 - version: 20.14.7 + specifier: ^20.16.2 + version: 20.16.2 '@types/vhtml': specifier: ^2.2.9 version: 2.2.9 @@ -32,17 +35,17 @@ devDependencies: specifier: ^6.21.0 version: 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@wdio/cli': - specifier: ^8.39.0 - version: 8.39.0(typescript@5.1.6) + specifier: ^8.40.5 + version: 8.40.5 '@wdio/local-runner': - specifier: ^8.39.0 - version: 8.39.0(typescript@5.1.6) + specifier: ^8.40.5 + version: 8.40.5 '@wdio/mocha-framework': - specifier: ^8.39.0 - version: 8.39.0 + specifier: ^8.40.3 + version: 8.40.3 '@wdio/spec-reporter': - specifier: ^8.39.0 - version: 8.39.0 + specifier: ^8.40.3 + version: 8.40.3 auto-changelog: specifier: ^2.4.0 version: 2.4.0 @@ -50,8 +53,8 @@ devDependencies: specifier: ^3.3.0 version: 3.3.0 chai: - specifier: ^4.4.1 - version: 4.4.1 + specifier: ^4.5.0 + version: 4.5.0 deepcopy: specifier: ^2.1.0 version: 2.1.0 @@ -63,7 +66,7 @@ devDependencies: version: 8.57.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.14.7) + version: 29.7.0(@types/node@20.16.2) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -74,17 +77,17 @@ devDependencies: specifier: ^2.30.1 version: 2.30.1 obsidian: - specifier: ^1.5.7 - version: 1.5.7(@codemirror/state@6.4.1)(@codemirror/view@6.28.2) + specifier: ^1.6.6 + version: 1.6.6(@codemirror/state@6.4.1)(@codemirror/view@6.33.0) prettier: - specifier: ^3.3.2 - version: 3.3.2 + specifier: ^3.3.3 + version: 3.3.3 ts-fsrs: - specifier: ^3.5.7 - version: 3.5.7 + specifier: ^4.1.2 + version: 4.1.2 ts-jest: - specifier: ^29.1.5 - version: 29.1.5(@babel/core@7.24.7)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6) + specifier: ^29.2.5 + version: 29.2.5(@babel/core@7.25.2)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6) tslib: specifier: 2.6.1 version: 2.6.1 @@ -96,7 +99,7 @@ devDependencies: version: 2.2.0 wdio-chromedriver-service: specifier: ^8.1.1 - version: 8.1.1(webdriverio@8.39.0) + version: 8.1.1(webdriverio@8.40.5) packages: @@ -116,27 +119,27 @@ packages: picocolors: 1.0.1 dev: true - /@babel/compat-data@7.24.7: - resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} + /@babel/compat-data@7.25.4: + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.24.7: - resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} + /@babel/core@7.25.2: + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-compilation-targets': 7.24.7 - '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) - '@babel/helpers': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/template': 7.24.7 - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -144,77 +147,54 @@ packages: - supports-color dev: true - /@babel/generator@7.24.7: - resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} + /@babel/generator@7.25.6: + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets@7.24.7: - resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} + /@babel/helper-compilation-targets@7.25.2: + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.24.7 - '@babel/helper-validator-option': 7.24.7 - browserslist: 4.23.1 + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-environment-visitor@7.24.7: - resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.7 - dev: true - - /@babel/helper-function-name@7.24.7: - resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 - dev: true - - /@babel/helper-hoist-variables@7.24.7: - resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.7 - dev: true - /@babel/helper-module-imports@7.24.7: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} + /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 + '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-plugin-utils@7.24.7: - resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} + /@babel/helper-plugin-utils@7.24.8: + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} dev: true @@ -222,21 +202,14 @@ packages: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-split-export-declaration@7.24.7: - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.7 - dev: true - - /@babel/helper-string-parser@7.24.7: - resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + /@babel/helper-string-parser@7.24.8: + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} dev: true @@ -245,17 +218,17 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.24.7: - resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} + /@babel/helper-validator-option@7.24.8: + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.24.7: - resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} + /@babel/helpers@7.25.0: + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 dev: true /@babel/highlight@7.24.7: @@ -268,175 +241,202 @@ packages: picocolors: 1.0.1 dev: true - /@babel/parser@7.24.7: - resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + /@babel/parser@7.25.6: + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7): + /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7): + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + /@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/template@7.24.7: - resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + /@babel/template@7.25.0: + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 dev: true - /@babel/traverse@7.24.7: - resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} + /@babel/traverse@7.25.6: + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-hoist-variables': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - debug: 4.3.5 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + debug: 4.3.6(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.24.7: - resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + /@babel/types@7.25.6: + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.24.7 + '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 dev: true @@ -449,8 +449,8 @@ packages: resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} dev: true - /@codemirror/view@6.28.2: - resolution: {integrity: sha512-A3DmyVfjgPsGIjiJqM/zvODUAPQdQl3ci0ghehYNnbt5x+o76xq+dL5+mMBuysDXnI3kapgOkoeJ0sbtL/3qPw==} + /@codemirror/view@6.33.0: + resolution: {integrity: sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ==} dependencies: '@codemirror/state': 6.4.1 style-mod: 4.1.2 @@ -674,8 +674,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.10.1: - resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} + /@eslint-community/regexpp@4.11.0: + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -684,10 +684,10 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -707,7 +707,7 @@ packages: deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -756,7 +756,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.7 + '@types/node': 20.16.2 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -777,14 +777,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.7 + '@types/node': 20.16.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.7) + jest-config: 29.7.0(@types/node@20.16.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -796,7 +796,7 @@ packages: jest-util: 29.7.0 jest-validate: 29.7.0 jest-watcher: 29.7.0 - micromatch: 4.0.7 + micromatch: 4.0.8 pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 @@ -812,7 +812,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.7 + '@types/node': 20.16.2 jest-mock: 29.7.0 dev: true @@ -839,7 +839,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.14.7 + '@types/node': 20.16.2 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -872,14 +872,14 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.14.7 + '@types/node': 20.16.2 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 + istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.7 @@ -889,7 +889,7 @@ packages: slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.2.0 + v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color dev: true @@ -934,7 +934,7 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -945,7 +945,7 @@ packages: jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 - micromatch: 4.0.7 + micromatch: 4.0.8 pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 @@ -960,8 +960,8 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.14.7 - '@types/yargs': 17.0.32 + '@types/node': 20.16.2 + '@types/yargs': 17.0.33 chalk: 4.1.2 dev: true @@ -970,7 +970,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 dev: true @@ -984,15 +984,15 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} dev: true /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 dev: true /@kurkle/color@0.3.2: @@ -1027,6 +1027,13 @@ packages: fastq: 1.17.1 dev: true + /@peggyjs/from-mem@1.3.0: + resolution: {integrity: sha512-kzGoIRJjkg3KuGI4bopz9UvF3KguzfxalHRDEIdqEZUe45xezsQ6cx30e0RKuxPUexojQRBfu89Okn7f4/QXsw==} + engines: {node: '>=18'} + dependencies: + semver: 7.6.0 + dev: false + /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1038,32 +1045,10 @@ packages: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: true - /@promptbook/utils@0.57.0: - resolution: {integrity: sha512-+6JCuNlUYWgCjwOaPnTaw7o8HyMwaLN23UinZcSMPxeKfdsEeM8xpbHn8g6AOf3nUG50Yk5O6GGK7z/9AxsX4g==} + /@promptbook/utils@0.67.5: + resolution: {integrity: sha512-aYKt+Rl4A8XkAsQK2klMifne97ovySnTku5DykwgQ2tLDFpepR5RT/O4JciVeUaaH2856G1HngM9J9FfcGQP8g==} dependencies: - spacetrim: 0.11.27 - dev: true - - /@puppeteer/browsers@1.4.6(typescript@5.1.6): - resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==} - engines: {node: '>=16.3.0'} - hasBin: true - peerDependencies: - typescript: '>= 4.7.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - debug: 4.3.4(supports-color@8.1.1) - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.3.0 - tar-fs: 3.0.4 - typescript: 5.1.6 - unbzip2-stream: 1.4.3 - yargs: 17.7.1 - transitivePeerDependencies: - - supports-color + spacetrim: 0.11.39 dev: true /@puppeteer/browsers@1.9.1: @@ -1071,7 +1056,7 @@ packages: engines: {node: '>=16.3.0'} hasBin: true dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.3.1 @@ -1122,8 +1107,8 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 @@ -1132,20 +1117,20 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 dev: true /@types/babel__traverse@7.20.6: resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 dev: true /@types/codemirror@5.60.8: @@ -1161,7 +1146,7 @@ packages: /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.14.7 + '@types/node': 20.16.2 dev: true /@types/http-cache-semantics@4.0.4: @@ -1194,7 +1179,7 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 20.14.7 + '@types/node': 20.16.2 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 dev: true @@ -1203,14 +1188,20 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true - /@types/mocha@10.0.6: - resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} + /@types/mocha@10.0.7: + resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==} dev: true - /@types/node@20.14.7: - resolution: {integrity: sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==} + /@types/node@20.16.2: + resolution: {integrity: sha512-91s/n4qUPV/wg8eE9KHYW1kouTfDk2FPGjXbBMfRWP/2vg1rCXNQL1OCabwGs0XSdukuK+MwCDXE30QpSeMUhQ==} dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 + dev: true + + /@types/node@22.5.1: + resolution: {integrity: sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==} + dependencies: + undici-types: 6.19.8 dev: true /@types/normalize-package-data@2.4.4: @@ -1243,18 +1234,18 @@ packages: resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} dev: true - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + /@types/ws@8.5.12: + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} dependencies: - '@types/node': 20.14.7 + '@types/node': 20.16.2 dev: true /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} dev: true - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + /@types/yargs@17.0.33: + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} dependencies: '@types/yargs-parser': 21.0.3 dev: true @@ -1263,7 +1254,7 @@ packages: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 20.14.7 + '@types/node': 20.16.2 dev: true optional: true @@ -1278,18 +1269,18 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.10.1 + '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.1.6) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.6.2 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: @@ -1310,7 +1301,7 @@ packages: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.1.6) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 typescript: 5.1.6 transitivePeerDependencies: @@ -1337,7 +1328,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.1.6) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.1.6) - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.1.6) typescript: 5.1.6 @@ -1361,11 +1352,11 @@ packages: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.2 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: @@ -1385,7 +1376,7 @@ packages: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.1.6) eslint: 8.57.0 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -1403,27 +1394,33 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitest/snapshot@1.6.0: - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + /@vitest/pretty-format@2.0.5: + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + dependencies: + tinyrainbow: 1.2.0 + dev: true + + /@vitest/snapshot@2.0.5: + resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} dependencies: - magic-string: 0.30.10 + '@vitest/pretty-format': 2.0.5 + magic-string: 0.30.11 pathe: 1.1.2 - pretty-format: 29.7.0 dev: true - /@wdio/cli@8.39.0(typescript@5.1.6): - resolution: {integrity: sha512-kAd+8TYjJWRN6gZaRGiSu6Yj3k4+ULRt2NWAgNtGhnr0/Rwlr3j9bjAIhXGL574VqrH+rSnrevDdeGuLcZa1xg==} + /@wdio/cli@8.40.5: + resolution: {integrity: sha512-DtWbZnC6q5tv7TZpXD+lRno5eRa3LIysfvofnEwatMI6fibdLMnh6xJmTwzcDXhET965n+RUEQ1vnXcEscJ3jA==} engines: {node: ^16.13 || >=18} hasBin: true dependencies: - '@types/node': 20.14.7 - '@vitest/snapshot': 1.6.0 - '@wdio/config': 8.39.0 - '@wdio/globals': 8.39.0(typescript@5.1.6) + '@types/node': 22.5.1 + '@vitest/snapshot': 2.0.5 + '@wdio/config': 8.40.3 + '@wdio/globals': 8.40.5 '@wdio/logger': 8.38.0 - '@wdio/protocols': 8.38.0 - '@wdio/types': 8.39.0 - '@wdio/utils': 8.39.0 + '@wdio/protocols': 8.40.3 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 async-exit-hook: 2.0.1 chalk: 5.3.0 chokidar: 3.6.0 @@ -1438,56 +1435,54 @@ packages: lodash.union: 4.6.0 read-pkg-up: 10.0.0 recursive-readdir: 2.2.3 - webdriverio: 8.39.0(typescript@5.1.6) + webdriverio: 8.40.5 yargs: 17.7.2 transitivePeerDependencies: - bufferutil - devtools - encoding - supports-color - - typescript - utf-8-validate dev: true - /@wdio/config@8.39.0: - resolution: {integrity: sha512-yNuGPMPibY91s936gnJCHWlStvIyDrwLwGfLC/NCdTin4F7HL4Gp5iJnHWkJFty1/DfFi8jjoIUBNLM8HEez+A==} + /@wdio/config@8.40.3: + resolution: {integrity: sha512-HIi+JnHEDAExhzGRQuZOXw1HWIpe/bsVFHwNISJhY6wS4Nijaigmegs2p14Rv16ydOF19hGrxdKsl8k5STIP2A==} engines: {node: ^16.13 || >=18} dependencies: '@wdio/logger': 8.38.0 - '@wdio/types': 8.39.0 - '@wdio/utils': 8.39.0 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 decamelize: 6.0.0 deepmerge-ts: 5.1.0 - glob: 10.4.2 + glob: 10.4.5 import-meta-resolve: 4.1.0 transitivePeerDependencies: - supports-color dev: true - /@wdio/globals@8.39.0(typescript@5.1.6): - resolution: {integrity: sha512-qZo6JjRCIOtdvba6fdSqj6b91TnWXD6rmamyud93FTqbcspnhBvr8lmgOs5wnslTKeeTTigCjpsT310b4/AyHA==} + /@wdio/globals@8.40.5: + resolution: {integrity: sha512-pHWNDhAO25BqfuxXmEwBceUeGzfEjkym9I4EzfUlPpoi39BRasDXbWSpX3us/5snUv5Xk+NWMDv4aTpTxfDQrA==} engines: {node: ^16.13 || >=18} optionalDependencies: - expect-webdriverio: 4.15.1(typescript@5.1.6) - webdriverio: 8.39.0(typescript@5.1.6) + expect-webdriverio: 4.15.4 + webdriverio: 8.40.5 transitivePeerDependencies: - bufferutil - devtools - encoding - supports-color - - typescript - utf-8-validate dev: true - /@wdio/local-runner@8.39.0(typescript@5.1.6): - resolution: {integrity: sha512-TSGJVVWqshH7IO13OKw7G/364q3FczZDEh4h6bYe+GAs91KpZrEhZanyALgjh5F3crWtlffX+GA2HUwpi8X0sA==} + /@wdio/local-runner@8.40.5: + resolution: {integrity: sha512-/0RXdFU4OH/FZgRGgVYpYWfJIk5ht6VqF2hwuVtS8URBv2riDUKa+Hl+fu5Y8GUQzAs2reNPG0ES2OyNjXxugw==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.14.7 + '@types/node': 22.5.1 '@wdio/logger': 8.38.0 - '@wdio/repl': 8.24.12 - '@wdio/runner': 8.39.0(typescript@5.1.6) - '@wdio/types': 8.39.0 + '@wdio/repl': 8.40.3 + '@wdio/runner': 8.40.5 + '@wdio/types': 8.40.3 async-exit-hook: 2.0.1 split2: 4.2.0 stream-buffers: 3.0.3 @@ -1496,7 +1491,6 @@ packages: - devtools - encoding - supports-color - - typescript - utf-8-validate dev: true @@ -1510,98 +1504,107 @@ packages: strip-ansi: 7.1.0 dev: true - /@wdio/mocha-framework@8.39.0: - resolution: {integrity: sha512-OFau1dd5mUAqC70gkx0WeZ8rJG191Snb4qhOTS18FpszUoZgoHtgjFICC0cxqZBFtmT9j7+22hNrj6d4sQVPJw==} + /@wdio/logger@9.0.4: + resolution: {integrity: sha512-b6gcu0PTVb3fgK4kyAH/k5UUWN5FOUdAfhA4PAY/IZvxZTMFYMqnrZb0WRWWWqL6nu9pcrOVtCOdPBvj0cb+Nw==} + engines: {node: '>=18'} + dependencies: + chalk: 5.3.0 + loglevel: 1.9.1 + loglevel-plugin-prefix: 0.8.4 + strip-ansi: 7.1.0 + dev: true + + /@wdio/mocha-framework@8.40.3: + resolution: {integrity: sha512-u8toUYRroA5MgCQZPHiQQv88RbeLjJFXSeowXQX6hwMTLurqDLfrqKtaTweFO6QJRFROeq/M0iNJbK008EXXMQ==} engines: {node: ^16.13 || >=18} dependencies: - '@types/mocha': 10.0.6 - '@types/node': 20.14.7 + '@types/mocha': 10.0.7 + '@types/node': 22.5.1 '@wdio/logger': 8.38.0 - '@wdio/types': 8.39.0 - '@wdio/utils': 8.39.0 - mocha: 10.4.0 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 + mocha: 10.7.3 transitivePeerDependencies: - supports-color dev: true - /@wdio/protocols@8.38.0: - resolution: {integrity: sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA==} + /@wdio/protocols@8.40.3: + resolution: {integrity: sha512-wK7+eyrB3TAei8RwbdkcyoNk2dPu+mduMBOdPJjp8jf/mavd15nIUXLID1zA+w5m1Qt1DsT1NbvaeO9+aJQ33A==} dev: true - /@wdio/repl@8.24.12: - resolution: {integrity: sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==} + /@wdio/repl@8.40.3: + resolution: {integrity: sha512-mWEiBbaC7CgxvSd2/ozpbZWebnRIc8KRu/J81Hlw/txUWio27S7IpXBlZGVvhEsNzq0+cuxB/8gDkkXvMPbesw==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.14.7 + '@types/node': 22.5.1 dev: true - /@wdio/reporter@8.39.0: - resolution: {integrity: sha512-XahXhmaA1okdwg4/ThHFSqy/41KywxhbtszPcTzyXB+9INaqFNHA1b1vvWs0mrD5+tTtKbg4caTcEHVJU4iv0w==} + /@wdio/reporter@8.40.3: + resolution: {integrity: sha512-icoUnlyIqLKgxB215OPdDTHG+hlu+U+t/sO6S9eI0ZTYBYaDIQBWVCilkUWRvgfcNSiXYo+1VlVt6waIgIHKwQ==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.14.7 + '@types/node': 22.5.1 '@wdio/logger': 8.38.0 - '@wdio/types': 8.39.0 + '@wdio/types': 8.40.3 diff: 5.2.0 - object-inspect: 1.13.1 + object-inspect: 1.13.2 dev: true - /@wdio/runner@8.39.0(typescript@5.1.6): - resolution: {integrity: sha512-M1ixrrCtuwxHVzwsOKGMWBZCteafV0ztoS9+evMWGQtj0ZEsmhjAhWR3n2nZftt24vWOs+eNLGe2p+IO9Sm9bA==} + /@wdio/runner@8.40.5: + resolution: {integrity: sha512-5sKORwwps0fvuPDfBbBz+jm8RV2xBV4xBGOLHiad6Mpruzc7+uDwxz6ILkE+CErQhJoNdB99YOOm2foh+aO4Ww==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.14.7 - '@wdio/config': 8.39.0 - '@wdio/globals': 8.39.0(typescript@5.1.6) + '@types/node': 22.5.1 + '@wdio/config': 8.40.3 + '@wdio/globals': 8.40.5 '@wdio/logger': 8.38.0 - '@wdio/types': 8.39.0 - '@wdio/utils': 8.39.0 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 deepmerge-ts: 5.1.0 - expect-webdriverio: 4.15.1(typescript@5.1.6) + expect-webdriverio: 4.15.4 gaze: 1.1.3 - webdriver: 8.39.0 - webdriverio: 8.39.0(typescript@5.1.6) + webdriver: 8.40.3 + webdriverio: 8.40.5 transitivePeerDependencies: - bufferutil - devtools - encoding - supports-color - - typescript - utf-8-validate dev: true - /@wdio/spec-reporter@8.39.0: - resolution: {integrity: sha512-2DX0+xvP+PyeVTBd6iGCH/RU66WXaa8HL+HpsJXZu5rSkZ4+6B2Tv8JB3ZE/pOWGNpI+B4ac/NfDs1DrX9sB7A==} + /@wdio/spec-reporter@8.40.3: + resolution: {integrity: sha512-Qp8hI4ZqxOLQAeqpt1wmOzR0QgarsoT35NOVfEA7gSy8FcF+H/axrPwEToOLRSQIU4bKEh5/khJ7j81GaVqtVg==} engines: {node: ^16.13 || >=18} dependencies: - '@wdio/reporter': 8.39.0 - '@wdio/types': 8.39.0 + '@wdio/reporter': 8.40.3 + '@wdio/types': 8.40.3 chalk: 5.3.0 easy-table: 1.2.0 pretty-ms: 7.0.1 dev: true - /@wdio/types@8.39.0: - resolution: {integrity: sha512-86lcYROTapOJuFd9ouomFDfzDnv3Kn+jE0RmqfvN9frZAeLVJ5IKjX9M6HjplsyTZhjGO1uCaehmzx+HJus33Q==} + /@wdio/types@8.40.3: + resolution: {integrity: sha512-zK17uyON3Ise3m+XwiF5VrrdZcXXmvqB8AWXoKe88DiksFUPMVoCOuVL2SSX1KnA2YLlZBA55qcFZT99GORVKQ==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.14.7 + '@types/node': 22.5.1 dev: true - /@wdio/utils@8.39.0: - resolution: {integrity: sha512-jY+n6jlGeK+9Tx8T659PKLwMQTGpLW5H78CSEWgZLbjbVSr2LfGR8Lx0CRktNXxAtqEVZPj16Pi74OtAhvhE6Q==} + /@wdio/utils@8.40.3: + resolution: {integrity: sha512-pv/848KGfPN3YXU4QRfTYGkAu4/lejIfoGzGpvGNDcACiVxgZhyRZkJ2xVaSnGaXzF0R7pMozrkU5/DnEhcxMg==} engines: {node: ^16.13 || >=18} dependencies: '@puppeteer/browsers': 1.9.1 '@wdio/logger': 8.38.0 - '@wdio/types': 8.39.0 + '@wdio/types': 8.40.3 decamelize: 6.0.0 deepmerge-ts: 5.1.0 - edgedriver: 5.6.0 - geckodriver: 4.4.1 + edgedriver: 5.6.1 + geckodriver: 4.4.3 get-port: 7.1.0 import-meta-resolve: 4.1.0 - locate-app: 2.4.18 + locate-app: 2.4.32 safaridriver: 0.1.2 split2: 4.2.0 wait-port: 1.1.0 @@ -1609,8 +1612,8 @@ packages: - supports-color dev: true - /@zip.js/zip.js@2.7.45: - resolution: {integrity: sha512-Mm2EXF33DJQ/3GWWEWeP1UCqzpQ5+fiMvT3QWspsXY05DyqqxWu7a9awSzU4/spHMHVFrTjani1PR0vprgZpow==} + /@zip.js/zip.js@2.7.52: + resolution: {integrity: sha512-+5g7FQswvrCHwYKNMd/KFxZSObctLSsQOgqBSi0LzwHo3li9Eh1w5cF5ndjQw9Zbr3ajVnd2+XyiX85gAetx1Q==} engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} dev: true @@ -1629,27 +1632,27 @@ packages: /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.12.0 + acorn: 8.12.1 acorn-walk: 8.3.3 dev: true - /acorn-jsx@5.3.2(acorn@8.12.0): + /acorn-jsx@5.3.2(acorn@8.12.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.12.0 + acorn: 8.12.1 dev: true /acorn-walk@8.3.3: resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} dependencies: - acorn: 8.12.0 + acorn: 8.12.1 dev: true - /acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -1658,7 +1661,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -1667,7 +1670,7 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true @@ -1681,8 +1684,8 @@ packages: uri-js: 4.4.1 dev: true - /ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true @@ -1739,7 +1742,7 @@ packages: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} dependencies: - glob: 10.4.2 + glob: 10.4.5 graceful-fs: 4.2.11 is-stream: 2.0.1 lazystream: 1.0.1 @@ -1753,7 +1756,7 @@ packages: engines: {node: '>= 14'} dependencies: archiver-utils: 5.0.2 - async: 3.2.5 + async: 3.2.6 buffer-crc32: 1.0.0 readable-stream: 4.5.2 readdir-glob: 1.1.3 @@ -1798,8 +1801,8 @@ packages: engines: {node: '>=0.12.0'} dev: true - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + /async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} dev: true /asynckit@0.4.0: @@ -1814,8 +1817,8 @@ packages: commander: 7.2.0 handlebars: 4.7.8 node-fetch: 2.7.0 - parse-github-url: 1.0.2 - semver: 7.6.2 + parse-github-url: 1.0.3 + semver: 7.6.3 transitivePeerDependencies: - encoding dev: true @@ -1824,17 +1827,17 @@ packages: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} dev: true - /babel-jest@29.7.0(@babel/core@7.24.7): + /babel-jest@29.7.0(@babel/core@7.25.2): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.7) + babel-preset-jest: 29.6.3(@babel/core@7.25.2) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -1846,7 +1849,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -1859,41 +1862,44 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + /babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.2): + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.24.7): + '@babel/core': 7.25.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.25.2): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) dev: true /balanced-match@1.0.2: @@ -1906,18 +1912,18 @@ packages: dev: true optional: true - /bare-fs@2.3.1: - resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==} + /bare-fs@2.3.2: + resolution: {integrity: sha512-Kcq/FG3lhspzGHK+Q0IMfImuFOmaW/jFofBAUJuuG7H67879JeaPUppUHhgLjJKenfxiO6Ix2AGSd47Pf7mRxg==} requiresBuild: true dependencies: bare-events: 2.4.2 bare-path: 2.1.3 - bare-stream: 2.1.3 + bare-stream: 2.2.0 dev: true optional: true - /bare-os@2.4.0: - resolution: {integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==} + /bare-os@2.4.1: + resolution: {integrity: sha512-yQC/blMP/eUdULsF7hrcC9tUFXlUmAWRbSQndEln77nOIh/N4Loaqch/MA4hyoDKhw1Zd1Wj+uLV/bT6lC/4BQ==} requiresBuild: true dev: true optional: true @@ -1926,15 +1932,15 @@ packages: resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} requiresBuild: true dependencies: - bare-os: 2.4.0 + bare-os: 2.4.1 dev: true optional: true - /bare-stream@2.1.3: - resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==} + /bare-stream@2.2.0: + resolution: {integrity: sha512-+o9MG5bPRRBlkVSpfFlMag3n7wMaIZb4YZasU2+/96f+3HTQ4F9DKQeu3K/Sjz1W0umu6xvVq1ON0ipWdMlr3A==} requiresBuild: true dependencies: - streamx: 2.18.0 + streamx: 2.19.0 dev: true optional: true @@ -1984,15 +1990,15 @@ packages: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true - /browserslist@4.23.1: - resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + /browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001636 - electron-to-chromium: 1.4.808 - node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.1) + caniuse-lite: 1.0.30001653 + electron-to-chromium: 1.5.13 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) dev: true /bs-logger@0.2.6: @@ -2084,12 +2090,12 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001636: - resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} + /caniuse-lite@1.0.30001653: + resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==} dev: true - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + /chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 @@ -2098,7 +2104,7 @@ packages: get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 - type-detect: 4.0.8 + type-detect: 4.1.0 dev: true /chalk@2.4.2: @@ -2132,8 +2138,8 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /chart.js@4.4.3: - resolution: {integrity: sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==} + /chart.js@4.4.4: + resolution: {integrity: sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==} engines: {pnpm: '>=8'} dependencies: '@kurkle/color': 0.3.2 @@ -2145,21 +2151,6 @@ packages: get-func-name: 2.0.2 dev: true - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -2175,13 +2166,14 @@ packages: fsevents: 2.3.3 dev: true - /chromium-bidi@0.4.16(devtools-protocol@0.0.1147663): - resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==} + /chromium-bidi@0.5.8(devtools-protocol@0.0.1232444): + resolution: {integrity: sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==} peerDependencies: devtools-protocol: '*' dependencies: - devtools-protocol: 0.0.1147663 - mitt: 3.0.0 + devtools-protocol: 0.0.1232444 + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 dev: true /ci-info@3.9.0: @@ -2189,8 +2181,8 @@ packages: engines: {node: '>=8'} dev: true - /cjs-module-lexer@1.3.1: - resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + /cjs-module-lexer@1.4.0: + resolution: {integrity: sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==} dev: true /cli-cursor@3.1.0: @@ -2270,6 +2262,11 @@ packages: delayed-stream: 1.0.0 dev: true + /commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + dev: false + /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -2317,7 +2314,7 @@ packages: readable-stream: 4.5.2 dev: true - /create-jest@29.7.0(@types/node@20.14.7): + /create-jest@29.7.0(@types/node@20.16.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2326,7 +2323,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.14.7) + jest-config: 29.7.0(@types/node@20.16.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -2407,7 +2404,7 @@ packages: ms: 2.1.2 dev: true - /debug@4.3.4(supports-color@8.1.1): + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -2417,11 +2414,10 @@ packages: optional: true dependencies: ms: 2.1.2 - supports-color: 8.1.1 dev: true - /debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + /debug@4.3.6(supports-color@8.1.1): + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2430,6 +2426,7 @@ packages: optional: true dependencies: ms: 2.1.2 + supports-color: 8.1.1 dev: true /decamelize@4.0.0: @@ -2466,7 +2463,7 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} dependencies: - type-detect: 4.0.8 + type-detect: 4.1.0 dev: true /deep-is@0.1.4: @@ -2476,8 +2473,7 @@ packages: /deepcopy@2.1.0: resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==} dependencies: - clone: 1.0.4 - type-detect: 4.0.8 + type-detect: 4.1.0 dev: true /deepmerge-ts@5.1.0: @@ -2535,12 +2531,12 @@ packages: engines: {node: '>=8'} dev: true - /devtools-protocol@0.0.1147663: - resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} + /devtools-protocol@0.0.1232444: + resolution: {integrity: sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==} dev: true - /devtools-protocol@0.0.1302984: - resolution: {integrity: sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA==} + /devtools-protocol@0.0.1342118: + resolution: {integrity: sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w==} dev: true /diff-sequences@29.6.3: @@ -2548,11 +2544,6 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true - /diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - dev: true - /diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} @@ -2605,15 +2596,16 @@ packages: which: 2.0.2 dev: true - /edgedriver@5.6.0: - resolution: {integrity: sha512-IeJXEczG+DNYBIa9gFgVYTqrawlxmc9SUqUsWU2E98jOsO/amA7wzabKOS8Bwgr/3xWoyXCJ6yGFrbFKrilyyQ==} + /edgedriver@5.6.1: + resolution: {integrity: sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==} hasBin: true requiresBuild: true dependencies: '@wdio/logger': 8.38.0 - '@zip.js/zip.js': 2.7.45 + '@zip.js/zip.js': 2.7.52 decamelize: 6.0.0 edge-paths: 3.0.5 + fast-xml-parser: 4.4.1 node-fetch: 3.3.2 which: 4.0.0 dev: true @@ -2623,11 +2615,11 @@ packages: engines: {node: '>=0.10.0'} hasBin: true dependencies: - jake: 10.9.1 + jake: 10.9.2 dev: true - /electron-to-chromium@1.4.808: - resolution: {integrity: sha512-0ItWyhPYnww2VOuCGF4s1LTfbrdAV2ajy/TN+ZTuhR23AHI6rWHCrBXJ/uxoXOvRRqw8qjYVrG81HFI7x/2wdQ==} + /electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} dev: true /emittery@0.13.1: @@ -2759,7 +2751,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.1 + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -2769,13 +2761,13 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -2783,7 +2775,7 @@ packages: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -2804,8 +2796,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.12.0 - acorn-jsx: 5.3.2(acorn@8.12.0) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 dev: true @@ -2815,8 +2807,8 @@ packages: hasBin: true dev: true - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -2884,24 +2876,23 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /expect-webdriverio@4.15.1(typescript@5.1.6): - resolution: {integrity: sha512-xtBSidt7Whs1fsUC+utxVzfmkmaStXWW17b+BcMCiCltx0Yku6l7BTv1Y14DEKX8L6rttaDQobYyRtBKbi4ssg==} + /expect-webdriverio@4.15.4: + resolution: {integrity: sha512-Op1xZoevlv1pohCq7g2Og5Gr3xP2NhY7MQueOApmopVxgweoJ/BqJxyvMNP0A//QsMg8v0WsN/1j81Sx2er9Wg==} engines: {node: '>=16 || >=18 || >=20'} dependencies: - '@vitest/snapshot': 1.6.0 + '@vitest/snapshot': 2.0.5 expect: 29.7.0 jest-matcher-utils: 29.7.0 lodash.isequal: 4.5.0 optionalDependencies: - '@wdio/globals': 8.39.0(typescript@5.1.6) + '@wdio/globals': 8.40.5 '@wdio/logger': 8.38.0 - webdriverio: 8.39.0(typescript@5.1.6) + webdriverio: 8.40.5 transitivePeerDependencies: - bufferutil - devtools - encoding - supports-color - - typescript - utf-8-validate dev: true @@ -2930,7 +2921,7 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -2959,7 +2950,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 dev: true /fast-json-stable-stringify@2.1.0: @@ -2970,6 +2961,13 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-xml-parser@4.4.1: + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: true + /fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: @@ -3066,8 +3064,8 @@ packages: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true - /foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + /foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 @@ -3127,17 +3125,17 @@ packages: globule: 1.3.4 dev: true - /geckodriver@4.4.1: - resolution: {integrity: sha512-nnAdIrwLkMcDu4BitWXF23pEMeZZ0Cj7HaWWFdSpeedBP9z6ft150JYiGO2mwzw6UiR823Znk1JeIf07RyzloA==} + /geckodriver@4.4.3: + resolution: {integrity: sha512-79rvaq8pvKVUtuM9XBjQApb04kOVkl3TFRX+zTt1wlmL+wqpt85ocWCdqiENU/3zIzg2Me21eClUcnE7F1kL2w==} engines: {node: ^16.13 || >=18 || >=20} hasBin: true requiresBuild: true dependencies: - '@wdio/logger': 8.38.0 - '@zip.js/zip.js': 2.7.45 + '@wdio/logger': 9.0.4 + '@zip.js/zip.js': 2.7.52 decamelize: 6.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.5 node-fetch: 3.3.2 tar-fs: 3.0.6 which: 4.0.0 @@ -3203,7 +3201,7 @@ packages: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 fs-extra: 11.2.0 transitivePeerDependencies: - supports-color @@ -3223,14 +3221,13 @@ packages: is-glob: 4.0.3 dev: true - /glob@10.4.2: - resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} - engines: {node: '>=16 || 14 >=14.18'} + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true dependencies: - foreground-child: 3.2.1 - jackspeak: 3.4.0 - minimatch: 9.0.4 + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.0 path-scurry: 1.11.1 @@ -3268,7 +3265,7 @@ packages: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.0.1 + minimatch: 5.1.6 once: 1.4.0 dev: true @@ -3291,7 +3288,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -3350,7 +3347,7 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.18.0 + uglify-js: 3.19.2 dev: true /has-flag@3.0.0: @@ -3379,13 +3376,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - /hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -3402,7 +3392,7 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} dependencies: - lru-cache: 10.2.2 + lru-cache: 10.4.3 dev: true /html-encoding-sniffer@3.0.0: @@ -3426,7 +3416,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -3436,7 +3426,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -3454,17 +3444,17 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + /https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -3497,8 +3487,8 @@ packages: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} dev: true @@ -3514,8 +3504,8 @@ packages: resolve-from: 4.0.0 dev: true - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + /import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} hasBin: true dependencies: @@ -3589,14 +3579,8 @@ packages: binary-extensions: 2.3.0 dev: true - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.1 - dev: true - - /is-core-module@2.14.0: - resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + /is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} dependencies: hasown: 2.0.2 @@ -3708,8 +3692,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.7 - '@babel/parser': 7.24.7 + '@babel/core': 7.25.2 + '@babel/parser': 7.25.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -3717,15 +3701,15 @@ packages: - supports-color dev: true - /istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + /istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.7 - '@babel/parser': 7.24.7 + '@babel/core': 7.25.2 + '@babel/parser': 7.25.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color dev: true @@ -3743,7 +3727,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -3758,21 +3742,20 @@ packages: istanbul-lib-report: 3.0.1 dev: true - /jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 dev: true - /jake@10.9.1: - resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} + /jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} hasBin: true dependencies: - async: 3.2.5 + async: 3.2.6 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 @@ -3795,7 +3778,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.7 + '@types/node': 20.16.2 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -3816,7 +3799,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.14.7): + /jest-cli@29.7.0(@types/node@20.16.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3830,10 +3813,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.14.7) + create-jest: 29.7.0(@types/node@20.16.2) exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.14.7) + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.16.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -3844,7 +3827,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.14.7): + /jest-config@29.7.0(@types/node@20.16.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3856,11 +3839,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.7 - babel-jest: 29.7.0(@babel/core@7.24.7) + '@types/node': 20.16.2 + babel-jest: 29.7.0(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -3874,7 +3857,7 @@ packages: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.7 + micromatch: 4.0.8 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 @@ -3925,7 +3908,7 @@ packages: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.14.7 + '@types/node': 20.16.2 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -3942,7 +3925,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.7 + '@types/node': 20.16.2 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -3962,14 +3945,14 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.14.7 + '@types/node': 20.16.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.7 + micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -4002,7 +3985,7 @@ packages: '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.7 + micromatch: 4.0.8 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -4013,7 +3996,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.7 + '@types/node': 20.16.2 jest-util: 29.7.0 dev: true @@ -4068,7 +4051,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.7 + '@types/node': 20.16.2 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -4099,9 +4082,9 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.7 + '@types/node': 20.16.2 chalk: 4.1.2 - cjs-module-lexer: 1.3.1 + cjs-module-lexer: 1.4.0 collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -4122,15 +4105,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) - '@babel/types': 7.24.7 + '@babel/core': 7.25.2 + '@babel/generator': 7.25.6 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) + '@babel/types': 7.25.6 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -4141,7 +4124,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color dev: true @@ -4151,7 +4134,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.7 + '@types/node': 20.16.2 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -4176,7 +4159,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.7 + '@types/node': 20.16.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -4188,13 +4171,13 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.14.7 + '@types/node': 20.16.2 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@20.14.7): + /jest@29.7.0(@types/node@20.16.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -4206,8 +4189,8 @@ packages: dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.14.7) + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.16.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4248,7 +4231,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.12.0 + acorn: 8.12.1 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -4261,7 +4244,7 @@ packages: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.10 + nwsapi: 2.2.12 parse5: 7.1.2 saxes: 6.0.0 symbol-tree: 3.2.4 @@ -4271,7 +4254,7 @@ packages: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.17.1 + ws: 8.18.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -4380,10 +4363,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /locate-app@2.4.18: - resolution: {integrity: sha512-eWvEDmEti5FfLrZt9QnNsZ7iD+xgS/VmSfw0kBRjixek1iQA+UH5ymuLZgQl/MgdYSm5JfVojc+8nQdBF18+PA==} + /locate-app@2.4.32: + resolution: {integrity: sha512-2Dqy98qk0Rm1h9mSExxT/4NBSgVOLw0C6Nr41Go2+UWDkZ6MmjHPa6+5MCE7EJIAQV0JVRNA0iu5K9eJSlozlA==} dependencies: - '@promptbook/utils': 0.57.0 + '@promptbook/utils': 0.67.5 type-fest: 2.13.0 userhome: 1.0.0 dev: true @@ -4419,7 +4402,6 @@ packages: /lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - requiresBuild: true dev: true /lodash.memoize@4.1.2: @@ -4474,9 +4456,8 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true - /lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} dev: true /lru-cache@5.1.1: @@ -4485,22 +4466,29 @@ packages: yallist: 3.1.1 dev: true + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + /lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} dev: true - /magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + /magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 dev: true /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.6.2 + semver: 7.6.3 dev: true /make-error@1.3.6: @@ -4522,8 +4510,8 @@ packages: engines: {node: '>= 8'} dev: true - /micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} dependencies: braces: 3.0.3 @@ -4574,13 +4562,6 @@ packages: brace-expansion: 1.1.11 dev: true - /minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} @@ -4595,8 +4576,8 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 @@ -4611,38 +4592,38 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dev: true - /mitt@3.0.0: - resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} dev: true /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: true - /mocha@10.4.0: - resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} + /mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} engines: {node: '>= 14.0.0'} hasBin: true dependencies: - ansi-colors: 4.1.1 + ansi-colors: 4.1.3 browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 + chokidar: 3.6.0 + debug: 4.3.6(supports-color@8.1.1) + diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 glob: 8.1.0 he: 1.2.0 js-yaml: 4.1.0 log-symbols: 4.1.0 - minimatch: 5.0.1 + minimatch: 5.1.6 ms: 2.1.3 - serialize-javascript: 6.0.0 + serialize-javascript: 6.0.2 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 6.2.1 + workerpool: 6.5.1 yargs: 16.2.0 - yargs-parser: 20.2.4 + yargs-parser: 20.2.9 yargs-unparser: 2.0.0 dev: true @@ -4710,17 +4691,16 @@ packages: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + /node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} dev: true - /normalize-package-data@6.0.1: - resolution: {integrity: sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==} + /normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} dependencies: hosted-git-info: 7.0.2 - is-core-module: 2.14.0 - semver: 7.6.2 + semver: 7.6.3 validate-npm-package-license: 3.0.4 dev: true @@ -4748,22 +4728,23 @@ packages: path-key: 4.0.0 dev: true - /nwsapi@2.2.10: - resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} + /nwsapi@2.2.12: + resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} dev: true - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + /object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} dev: true - /obsidian@1.5.7(@codemirror/state@6.4.1)(@codemirror/view@6.28.2): - resolution: {integrity: sha512-DNcvQJ6TvMflHZqWfO9cLGbOUbKTy2KBi6B6vjo5RG8XsftKZZq1zS/OQFhII2BnXK/DWan/lUcb2JYxfM3p5A==} + /obsidian@1.6.6(@codemirror/state@6.4.1)(@codemirror/view@6.33.0): + resolution: {integrity: sha512-GZHzeOiwmw/wBjB5JwrsxAZBLqxGQmqtEKSvJJvT0LtTcqeOFnV8jv0ZK5kO7hBb44WxJc+LdS7mZgLXbb+qXQ==} peerDependencies: '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@codemirror/view': 6.33.0 '@types/codemirror': 5.60.8 moment: 2.29.4 dev: true @@ -4843,7 +4824,7 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 dev: true /p-locate@4.1.0: @@ -4872,18 +4853,18 @@ packages: engines: {node: '>=6'} dev: true - /pac-proxy-agent@7.0.1: - resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} + /pac-proxy-agent@7.0.2: + resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} engines: {node: '>= 14'} dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 get-uri: 6.0.3 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.5 pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.3 + socks-proxy-agent: 8.0.4 transitivePeerDependencies: - supports-color dev: true @@ -4915,9 +4896,9 @@ packages: callsites: 3.1.0 dev: true - /parse-github-url@1.0.2: - resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} - engines: {node: '>=0.10.0'} + /parse-github-url@1.0.3: + resolution: {integrity: sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==} + engines: {node: '>= 0.10'} hasBin: true dev: true @@ -4986,7 +4967,7 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} dependencies: - lru-cache: 10.2.2 + lru-cache: 10.4.3 minipass: 7.1.2 dev: true @@ -5003,6 +4984,16 @@ packages: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true + /peggy@4.0.3: + resolution: {integrity: sha512-v7/Pt6kGYsfXsCrfb52q7/yg5jaAwiVaUMAPLPvy4DJJU6Wwr72t6nDIqIDkGfzd1B4zeVuTnQT0RGeOhe/uSA==} + engines: {node: '>=18'} + hasBin: true + dependencies: + '@peggyjs/from-mem': 1.3.0 + commander: 12.1.0 + source-map-generator: 0.8.0 + dev: false + /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true @@ -5033,8 +5024,8 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier@3.3.2: - resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + /prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true dev: true @@ -5052,10 +5043,7 @@ packages: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} dependencies: - is-core-module: 2.13.1 parse-ms: 2.1.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 dev: true /process-nextick-args@2.0.1: @@ -5080,34 +5068,18 @@ packages: sisteransi: 1.0.5 dev: true - /proxy-agent@6.3.0: - resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.3 - transitivePeerDependencies: - - supports-color - dev: true - /proxy-agent@6.3.1: resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.5 lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 + pac-proxy-agent: 7.0.2 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.3 + socks-proxy-agent: 8.0.4 transitivePeerDependencies: - supports-color dev: true @@ -5132,22 +5104,16 @@ packages: engines: {node: '>=6'} dev: true - /puppeteer-core@20.9.0(typescript@5.1.6): - resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==} - engines: {node: '>=16.3.0'} - peerDependencies: - typescript: '>= 4.7.4' - peerDependenciesMeta: - typescript: - optional: true + /puppeteer-core@21.11.0: + resolution: {integrity: sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==} + engines: {node: '>=16.13.2'} dependencies: - '@puppeteer/browsers': 1.4.6(typescript@5.1.6) - chromium-bidi: 0.4.16(devtools-protocol@0.0.1147663) + '@puppeteer/browsers': 1.9.1 + chromium-bidi: 0.5.8(devtools-protocol@0.0.1232444) cross-fetch: 4.0.0 - debug: 4.3.4(supports-color@8.1.1) - devtools-protocol: 0.0.1147663 - typescript: 5.1.6 - ws: 8.13.0 + debug: 4.3.4 + devtools-protocol: 0.0.1232444 + ws: 8.16.0 transitivePeerDependencies: - bufferutil - encoding @@ -5204,9 +5170,9 @@ packages: engines: {node: '>=16'} dependencies: '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.1 + normalize-package-data: 6.0.2 parse-json: 7.1.1 - type-fest: 4.20.1 + type-fest: 4.26.0 dev: true /readable-stream@2.3.8: @@ -5300,7 +5266,7 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.14.0 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -5383,17 +5349,21 @@ packages: xmlchars: 2.2.0 dev: true - /seedrandom@3.0.5: - resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} - dev: true - /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true - /semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true dev: true @@ -5405,8 +5375,8 @@ packages: type-fest: 2.19.0 dev: true - /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 dev: true @@ -5462,12 +5432,12 @@ packages: engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} dev: true - /socks-proxy-agent@8.0.3: - resolution: {integrity: sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==} + /socks-proxy-agent@8.0.4: + resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -5481,6 +5451,11 @@ packages: smart-buffer: 4.2.0 dev: true + /source-map-generator@0.8.0: + resolution: {integrity: sha512-psgxdGMwl5MZM9S3FWee4EgsEaIjahYV5AzGnwUvPhWeITz/j6rKpysQHlQ4USdxvINlb8lKfWGIXwfkrgtqkA==} + engines: {node: '>= 10'} + dev: false + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: @@ -5493,15 +5468,15 @@ packages: engines: {node: '>=0.10.0'} dev: true - /spacetrim@0.11.27: - resolution: {integrity: sha512-dwH0FuVEdapG4Qb2kNlZXM5kCyOgqsC0LkZbF+ESICLMTWH3RQsisSlnNy9raB38qxvUlUvpFrbEirB0RFKv5A==} + /spacetrim@0.11.39: + resolution: {integrity: sha512-S/baW29azJ7py5ausQRE2S6uEDQnlxgMHOEEq4V770ooBDD1/9kZnxRcco/tjZYuDuqYXblCk/r3N13ZmvHZ2g==} dev: true /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.18 + spdx-license-ids: 3.0.20 dev: true /spdx-exceptions@2.5.0: @@ -5512,11 +5487,11 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 + spdx-license-ids: 3.0.20 dev: true - /spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + /spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} dev: true /split2@4.2.0: @@ -5544,12 +5519,12 @@ packages: engines: {node: '>= 0.10.0'} dev: true - /streamx@2.18.0: - resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} + /streamx@2.19.0: + resolution: {integrity: sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg==} dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 - text-decoder: 1.1.0 + text-decoder: 1.1.1 optionalDependencies: bare-events: 2.4.2 dev: true @@ -5626,6 +5601,10 @@ packages: engines: {node: '>=8'} dev: true + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: true + /style-mod@4.1.2: resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} dev: true @@ -5674,7 +5653,7 @@ packages: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.3.1 + bare-fs: 2.3.2 bare-path: 2.1.3 dev: true @@ -5683,7 +5662,7 @@ packages: dependencies: b4a: 1.6.6 fast-fifo: 1.3.2 - streamx: 2.18.0 + streamx: 2.19.0 dev: true /tcp-port-used@1.0.2: @@ -5704,8 +5683,8 @@ packages: minimatch: 3.1.2 dev: true - /text-decoder@1.1.0: - resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} + /text-decoder@1.1.1: + resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} dependencies: b4a: 1.6.6 dev: true @@ -5718,6 +5697,11 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true + /tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + dev: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -5771,15 +5755,13 @@ packages: typescript: 5.1.6 dev: true - /ts-fsrs@3.5.7: - resolution: {integrity: sha512-xA18Igi1adkuCNgNjKkorjYgZq842+HdgRjatQPDERcrAWMlzM+3BwIbrF/Q0ijYEyw3NcTp3yJIMSO7agBLKQ==} - engines: {node: '>=16.0.0'} - dependencies: - seedrandom: 3.0.5 + /ts-fsrs@4.1.2: + resolution: {integrity: sha512-sHmx2m+RWG48zMbkwAfZ3NHJwuTNd2HvgtsrERJzGuQVeSTguN1V+rBeSCP47r0JusWK1Etu/+BJT63OIwMauw==} + engines: {node: '>=18.0.0'} dev: true - /ts-jest@29.1.5(@babel/core@7.24.7)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6): - resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} + /ts-jest@29.2.5(@babel/core@7.25.2)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6): + resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5802,16 +5784,17 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 bs-logger: 0.2.6 + ejs: 3.1.10 esbuild: 0.19.12 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.7) + jest: 29.7.0(@types/node@20.16.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.6.2 + semver: 7.6.3 typescript: 5.1.6 yargs-parser: 21.1.1 dev: true @@ -5832,6 +5815,11 @@ packages: engines: {node: '>=4'} dev: true + /type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + dev: true + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -5857,8 +5845,8 @@ packages: engines: {node: '>=14.16'} dev: true - /type-fest@4.20.1: - resolution: {integrity: sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==} + /type-fest@4.26.0: + resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} engines: {node: '>=16'} dev: true @@ -5868,8 +5856,8 @@ packages: hasBin: true dev: true - /uglify-js@3.18.0: - resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==} + /uglify-js@3.19.2: + resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true @@ -5883,8 +5871,8 @@ packages: through: 2.3.8 dev: true - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} dev: true /universalify@0.2.0: @@ -5897,13 +5885,13 @@ packages: engines: {node: '>= 10.0.0'} dev: true - /update-browserslist-db@1.0.16(browserslist@4.23.1): - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + /update-browserslist-db@1.1.0(browserslist@4.23.3): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.23.1 + browserslist: 4.23.3 escalade: 3.1.2 picocolors: 1.0.1 dev: true @@ -5921,6 +5909,10 @@ packages: requires-port: 1.0.0 dev: true + /urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + dev: true + /userhome@1.0.0: resolution: {integrity: sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==} engines: {node: '>= 0.8.0'} @@ -5930,8 +5922,8 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + /v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -5968,7 +5960,7 @@ packages: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.3.5 + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -5985,7 +5977,7 @@ packages: defaults: 1.0.4 dev: true - /wdio-chromedriver-service@8.1.1(webdriverio@8.39.0): + /wdio-chromedriver-service@8.1.1(webdriverio@8.40.5): resolution: {integrity: sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==} engines: {node: ^16.13 || >=18} peerDependencies: @@ -6002,7 +5994,7 @@ packages: fs-extra: 11.2.0 split2: 4.2.0 tcp-port-used: 1.0.2 - webdriverio: 8.39.0(typescript@5.1.6) + webdriverio: 8.40.5 transitivePeerDependencies: - supports-color dev: true @@ -6012,29 +6004,29 @@ packages: engines: {node: '>= 8'} dev: true - /webdriver@8.39.0: - resolution: {integrity: sha512-Kc3+SfiH4ufyrIht683VT2vnJocx0pfH8rYdyPvEh1b2OYewtFTHK36k9rBDHZiBmk6jcSXs4M2xeFgOuon9Lg==} + /webdriver@8.40.3: + resolution: {integrity: sha512-mc/pxLpgAQphnIaWvix/QXzp9CJpEvIA3YeF9t5plPaTbvbEaCAYYWkTP6e3vYPYWvx57krjGaYkNUnDCBNolA==} engines: {node: ^16.13 || >=18} dependencies: - '@types/node': 20.14.7 - '@types/ws': 8.5.10 - '@wdio/config': 8.39.0 + '@types/node': 22.5.1 + '@types/ws': 8.5.12 + '@wdio/config': 8.40.3 '@wdio/logger': 8.38.0 - '@wdio/protocols': 8.38.0 - '@wdio/types': 8.39.0 - '@wdio/utils': 8.39.0 + '@wdio/protocols': 8.40.3 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 deepmerge-ts: 5.1.0 got: 12.6.1 ky: 0.33.3 - ws: 8.17.1 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate dev: true - /webdriverio@8.39.0(typescript@5.1.6): - resolution: {integrity: sha512-pDpGu0V+TL1LkXPode67m3s+IPto4TcmcOzMpzFgu2oeLMBornoLN3yQSFR1fjZd1gK4UfnG3lJ4poTGOfbWfw==} + /webdriverio@8.40.5: + resolution: {integrity: sha512-fKzaAF8lbgVFWIP8i0eGk22MpjactVVTWP8qtUXDob5Kdo8ffrg1lCKP8mcyrz6fiZM1OY1m6dvkbFelf23Nxw==} engines: {node: ^16.13 || >=18} peerDependencies: devtools: ^8.14.0 @@ -6042,36 +6034,35 @@ packages: devtools: optional: true dependencies: - '@types/node': 20.14.7 - '@wdio/config': 8.39.0 + '@types/node': 22.5.1 + '@wdio/config': 8.40.3 '@wdio/logger': 8.38.0 - '@wdio/protocols': 8.38.0 - '@wdio/repl': 8.24.12 - '@wdio/types': 8.39.0 - '@wdio/utils': 8.39.0 + '@wdio/protocols': 8.40.3 + '@wdio/repl': 8.40.3 + '@wdio/types': 8.40.3 + '@wdio/utils': 8.40.3 archiver: 7.0.1 aria-query: 5.3.0 css-shorthand-properties: 1.1.1 css-value: 0.0.1 - devtools-protocol: 0.0.1302984 + devtools-protocol: 0.0.1342118 grapheme-splitter: 1.0.4 import-meta-resolve: 4.1.0 is-plain-obj: 4.1.0 jszip: 3.10.1 lodash.clonedeep: 4.5.0 lodash.zip: 4.2.0 - minimatch: 9.0.4 - puppeteer-core: 20.9.0(typescript@5.1.6) + minimatch: 9.0.5 + puppeteer-core: 21.11.0 query-selector-shadow-dom: 1.0.1 resq: 1.11.0 rgb2hex: 0.2.5 serialize-error: 11.0.3 - webdriver: 8.39.0 + webdriver: 8.40.3 transitivePeerDependencies: - bufferutil - encoding - supports-color - - typescript - utf-8-validate dev: true @@ -6136,8 +6127,8 @@ packages: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true - /workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + /workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} dev: true /wrap-ansi@6.2.0: @@ -6179,8 +6170,8 @@ packages: signal-exit: 3.0.7 dev: true - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -6192,8 +6183,8 @@ packages: optional: true dev: true - /ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + /ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -6223,8 +6214,12 @@ packages: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true @@ -6253,20 +6248,7 @@ packages: require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 20.2.4 - dev: true - - /yargs@17.7.1: - resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 + yargs-parser: 20.2.9 dev: true /yargs@17.7.2: @@ -6294,8 +6276,8 @@ packages: engines: {node: '>=10'} dev: true - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + /yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} dev: true diff --git a/requirements.txt b/requirements.txt index 473cab57..87e32081 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ -mkdocs-material==9.5.3 -mkdocs-static-i18n==0.56 +mkdocs-material==9.5.31 +mkdocs-static-i18n==1.2.3 diff --git a/src/NoteFileLoader.ts b/src/NoteFileLoader.ts index 252e863b..f63e0670 100644 --- a/src/NoteFileLoader.ts +++ b/src/NoteFileLoader.ts @@ -4,6 +4,7 @@ import { Question } from "./Question"; import { TopicPath } from "./TopicPath"; import { NoteQuestionParser } from "./NoteQuestionParser"; import { SRSettings } from "./settings"; +import { TextDirection } from "./util/TextDirection"; export class NoteFileLoader { fileText: string; @@ -16,7 +17,11 @@ export class NoteFileLoader { this.settings = settings; } - async load(noteFile: ISRFile, folderTopicPath: TopicPath): Promise { + async load( + noteFile: ISRFile, + defaultTextDirection: TextDirection, + folderTopicPath: TopicPath, + ): Promise { this.noteFile = noteFile; const questionParser: NoteQuestionParser = new NoteQuestionParser(this.settings); @@ -24,6 +29,7 @@ export class NoteFileLoader { const onlyKeepQuestionsWithTopicPath: boolean = true; const questionList: Question[] = await questionParser.createQuestionList( noteFile, + defaultTextDirection, folderTopicPath, onlyKeepQuestionsWithTopicPath, ); diff --git a/src/NoteParser.ts b/src/NoteParser.ts index 15b7fdbe..f6368954 100644 --- a/src/NoteParser.ts +++ b/src/NoteParser.ts @@ -3,6 +3,7 @@ import { ISRFile } from "./SRFile"; import { Note } from "./Note"; import { SRSettings } from "./settings"; import { TopicPath } from "./TopicPath"; +import { TextDirection } from "./util/TextDirection"; export class NoteParser { settings: SRSettings; @@ -12,9 +13,18 @@ export class NoteParser { this.settings = settings; } - async parse(noteFile: ISRFile, folderTopicPath: TopicPath): Promise { + async parse( + noteFile: ISRFile, + defaultTextDirection: TextDirection, + folderTopicPath: TopicPath, + ): Promise { const questionParser: NoteQuestionParser = new NoteQuestionParser(this.settings); - const questions = await questionParser.createQuestionList(noteFile, folderTopicPath, true); + const questions = await questionParser.createQuestionList( + noteFile, + defaultTextDirection, + folderTopicPath, + true, + ); const result: Note = new Note(noteFile, questions); return result; diff --git a/src/NoteQuestionParser.ts b/src/NoteQuestionParser.ts index 6ae18165..5e49730a 100644 --- a/src/NoteQuestionParser.ts +++ b/src/NoteQuestionParser.ts @@ -1,12 +1,13 @@ import { TagCache } from "obsidian"; import { Card } from "./Card"; import { CardScheduleInfo, NoteCardScheduleParser } from "./CardSchedule"; -import { parseEx, ParsedQuestionInfo } from "./parser"; +import { parseEx, ParsedQuestionInfo, ParserOptions } from "./parser"; import { Question, QuestionText } from "./Question"; import { CardFrontBack, CardFrontBackUtil } from "./QuestionType"; import { SRSettings, SettingsUtil } from "./settings"; import { ISRFile, frontmatterTagPseudoLineNum } from "./SRFile"; import { TopicPath, TopicPathList } from "./TopicPath"; +import { TextDirection } from "./util/TextDirection"; import { extractFrontmatter, splitTextIntoLineArray } from "./util/utils"; export class NoteQuestionParser { @@ -40,6 +41,7 @@ export class NoteQuestionParser { async createQuestionList( noteFile: ISRFile, + defaultTextDirection: TextDirection, folderTopicPath: TopicPath, onlyKeepQuestionsWithTopicPath: boolean, ): Promise { @@ -64,8 +66,11 @@ export class NoteQuestionParser { [this.frontmatterText, this.contentText] = extractFrontmatter(noteText); // Create the question list + let textDirection: TextDirection = noteFile.getTextDirection(); + if (textDirection == TextDirection.Unspecified) textDirection = defaultTextDirection; this.questionList = this.doCreateQuestionList( noteText, + textDirection, folderTopicPath, this.tagCacheList, ); @@ -89,6 +94,7 @@ export class NoteQuestionParser { private doCreateQuestionList( noteText: string, + textDirection: TextDirection, folderTopicPath: TopicPath, tagCacheList: TagCache[], ): Question[] { @@ -100,7 +106,7 @@ export class NoteQuestionParser { const result: Question[] = []; const parsedQuestionInfoList: ParsedQuestionInfo[] = this.parseQuestions(); for (const parsedQuestionInfo of parsedQuestionInfoList) { - const question: Question = this.createQuestionObject(parsedQuestionInfo); + const question: Question = this.createQuestionObject(parsedQuestionInfo, textDirection); // Each rawCardText can turn into multiple CardFrontBack's (e.g. CardType.Cloze, CardType.SingleLineReversed) const cardFrontBackList: CardFrontBack[] = CardFrontBackUtil.expand( @@ -130,21 +136,25 @@ export class NoteQuestionParser { private parseQuestions(): ParsedQuestionInfo[] { // We pass contentText which has the frontmatter blanked out; see extractFrontmatter for reasoning - const settings: SRSettings = this.settings; - const result: ParsedQuestionInfo[] = parseEx( - this.contentText, - settings.singleLineCardSeparator, - settings.singleLineReversedCardSeparator, - settings.multilineCardSeparator, - settings.multilineReversedCardSeparator, - settings.convertHighlightsToClozes, - settings.convertBoldTextToClozes, - settings.convertCurlyBracketsToClozes, - ); + const parserOptions: ParserOptions = { + singleLineCardSeparator: this.settings.singleLineCardSeparator, + singleLineReversedCardSeparator: this.settings.singleLineReversedCardSeparator, + multilineCardSeparator: this.settings.multilineCardSeparator, + multilineReversedCardSeparator: this.settings.multilineReversedCardSeparator, + multilineCardEndMarker: this.settings.multilineCardEndMarker, + convertHighlightsToClozes: this.settings.convertHighlightsToClozes, + convertBoldTextToClozes: this.settings.convertBoldTextToClozes, + convertCurlyBracketsToClozes: this.settings.convertCurlyBracketsToClozes, + }; + + const result: ParsedQuestionInfo[] = parseEx(this.contentText, parserOptions); return result; } - private createQuestionObject(parsedQuestionInfo: ParsedQuestionInfo): Question { + private createQuestionObject( + parsedQuestionInfo: ParsedQuestionInfo, + textDirection: TextDirection, + ): Question { const questionContext: string[] = this.noteFile.getQuestionContext( parsedQuestionInfo.firstLineNum, ); @@ -152,6 +162,7 @@ export class NoteQuestionParser { this.settings, parsedQuestionInfo, null, // We haven't worked out the TopicPathList yet + textDirection, questionContext, ); return result; diff --git a/src/Question.ts b/src/Question.ts index b02b039b..4b491625 100644 --- a/src/Question.ts +++ b/src/Question.ts @@ -11,6 +11,7 @@ import { ParsedQuestionInfo } from "./parser"; import { SRSettings } from "./settings"; import { TopicPath, TopicPathList, TopicPathWithWs } from "./TopicPath"; import { MultiLineTextFinder } from "./util/MultiLineTextFinder"; +import { TextDirection } from "./util/TextDirection"; import { cyrb53, stringTrimStart } from "./util/utils"; import { DataLocation } from "src/dataStore/dataLocation"; @@ -88,6 +89,9 @@ export class QuestionText { // The question text, e.g. "Q1::A1" with leading/trailing whitespace as described above actualQuestion: string; + // Either LTR or RTL + textDirection: TextDirection; + // The block identifier (optional), e.g. "^quote-of-the-day" // Format of block identifiers: // https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note @@ -104,11 +108,13 @@ export class QuestionText { original: string, topicPathWithWs: TopicPathWithWs, actualQuestion: string, + textDirection: TextDirection, blockId: string, ) { this.original = original; this.topicPathWithWs = topicPathWithWs; this.actualQuestion = actualQuestion; + this.textDirection = textDirection; this.obsidianBlockId = blockId; // The hash is generated based on the topic and question, explicitly not the schedule or obsidian block ID @@ -119,10 +125,14 @@ export class QuestionText { return this.actualQuestion.endsWith("```"); } - static create(original: string, settings: SRSettings): QuestionText { + static create( + original: string, + textDirection: TextDirection, + settings: SRSettings, + ): QuestionText { const [topicPathWithWs, actualQuestion, blockId] = this.splitText(original, settings); - return new QuestionText(original, topicPathWithWs, actualQuestion, blockId); + return new QuestionText(original, topicPathWithWs, actualQuestion, textDirection, blockId); } static splitText(original: string, settings: SRSettings): [TopicPathWithWs, string, string] { @@ -277,7 +287,12 @@ export class Question { let newText = MultiLineTextFinder.findAndReplace(noteText, originalText, replacementText); if (newText) { - this.questionText = QuestionText.create(replacementText, settings); + // Don't support changing the textDirection setting + this.questionText = QuestionText.create( + replacementText, + this.questionText.textDirection, + settings, + ); } else { console.error( `updateQuestionText: Text not found: ${originalText.substring( @@ -306,10 +321,15 @@ export class Question { settings: SRSettings, parsedQuestionInfo: ParsedQuestionInfo, noteTopicPathList: TopicPathList, + textDirection: TextDirection, context: string[], ): Question { const hasEditLaterTag = parsedQuestionInfo.text.includes(settings.editLaterTag); - const questionText: QuestionText = QuestionText.create(parsedQuestionInfo.text, settings); + const questionText: QuestionText = QuestionText.create( + parsedQuestionInfo.text, + textDirection, + settings, + ); let topicPathList: TopicPathList = noteTopicPathList; if (questionText.topicPathWithWs) { diff --git a/src/SRFile.ts b/src/SRFile.ts index eb71ca12..bee9b325 100644 --- a/src/SRFile.ts +++ b/src/SRFile.ts @@ -2,11 +2,12 @@ import { MetadataCache, TFile, Vault, - HeadingCache, getAllTags as ObsidianGetAllTags, + HeadingCache, TagCache, FrontMatterCache, } from "obsidian"; +import { TextDirection } from "./util/TextDirection"; import { parseObsidianFrontmatterTag } from "./util/utils"; // NOTE: Line numbers are zero based @@ -16,6 +17,7 @@ export interface ISRFile { getAllTagsFromCache(): string[]; getAllTagsFromText(): TagCache[]; getQuestionContext(cardLine: number): string[]; + getTextDirection(): TextDirection; read(): Promise; write(content: string): Promise; } @@ -111,6 +113,22 @@ export class SrTFile implements ISRFile { return result; } + getTextDirection(): TextDirection { + let result: TextDirection = TextDirection.Unspecified; + const fileCache = this.metadataCache.getFileCache(this.file); + const frontMatter = fileCache?.frontmatter; + if (frontMatter && frontMatter?.direction) { + // Don't know why the try/catch is needed; but copied from Obsidian RTL plug-in getFrontMatterDirection() + try { + const str: string = (frontMatter.direction + "").toLowerCase(); + result = str == "rtl" ? TextDirection.Rtl : TextDirection.Ltr; + } catch (error) { + // continue regardless of error + } + } + return result; + } + async read(): Promise { return await this.vault.read(this.file); } diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index 43fea3fb..a3cbd2bf 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -9,6 +9,7 @@ import deepcopy from "deepcopy"; import { AnkiData } from "./anki"; import { Rating, ReviewLog } from "ts-fsrs"; import { RepetitionItem, ReviewResult } from "src/dataStore/repetitionItem"; +import { Iadapter } from "src/dataStore/adapter"; // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/Settings.ts let applyDebounceTimer = 0; @@ -208,7 +209,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { } } - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; const duration = this.review_duration > 0 ? new Date().getTime() - this.review_duration : 0; this.review_duration = 0; const rlog = new RevLog(item, reviewLog, duration); @@ -230,7 +231,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { * @param rating */ reWriteRevlog(data: string, withTitle = false) { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; if (withTitle) { data = this.REVLOG_TITLE + data; @@ -239,7 +240,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { } async readRevlog() { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; let data = ""; if (await adapter.exists(this.logfilepath)) { data = await adapter.read(this.logfilepath); @@ -434,7 +435,7 @@ export class FsrsAlgorithm extends SrsAlgorithm { }); }) .settingEl.querySelector(".setting-item-description").innerHTML = - '查阅 FSRS V4 WIKI 和\ + '查阅 FSRS V5 WIKI 和\ FSRS w参数可视化 \ 以对各参数进行设置.'; diff --git a/src/algorithms/priorities/linkPageranks.ts b/src/algorithms/priorities/linkPageranks.ts index 7804f3f5..f8b068fe 100644 --- a/src/algorithms/priorities/linkPageranks.ts +++ b/src/algorithms/priorities/linkPageranks.ts @@ -2,6 +2,7 @@ import { MetadataCache, TFile } from "obsidian"; import { NoteEaseList } from "src/NoteEaseList"; import * as graph from "pagerank.js"; import { SRSettings } from "src/settings"; +import { Iadapter } from "src/dataStore/adapter"; export interface LinkStat { sourcePath: string; @@ -103,7 +104,7 @@ export class LinkRank { this.incomingLinks[noteFile.path] = []; } - const links = app.metadataCache.resolvedLinks[noteFile.path] || {}; + const links = Iadapter.instance.metadataCache.resolvedLinks[noteFile.path] || {}; for (const targetPath in links) { if (this.incomingLinks[targetPath] === undefined) this.incomingLinks[targetPath] = []; diff --git a/src/constants.ts b/src/constants.ts index 9b633b28..f50ead86 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -37,7 +37,7 @@ export const AUDIO_FORMATS = ["mp3", "webm", "m4a", "wav", "ogg"]; export const VIDEO_FORMATS = ["mp4", "mkv", "avi", "mov"]; export const COLLAPSE_ICON = - ''; + ''; export const TICKS_PER_DAY = 24 * 3600 * 1000; diff --git a/src/dataStore/adapter.ts b/src/dataStore/adapter.ts new file mode 100644 index 00000000..bf9fdcc2 --- /dev/null +++ b/src/dataStore/adapter.ts @@ -0,0 +1,36 @@ +import { App, DataAdapter, Keymap, MetadataCache, Vault } from "obsidian"; + +export abstract class Iadapter { + metadataCache: MetadataCache; + adapter: DataAdapter; + vault: Vault; + app: App; + + private static _instance: Iadapter; + + constructor(app: App) { + this.app = app; + Iadapter._instance = this; + } + + static get instance() { + if (Iadapter._instance) { + return Iadapter._instance; + } else { + throw Error("there is not Iadapter instance."); + } + } + + static create(app: App) { + return new ObAdapter(app); + } +} + +class ObAdapter extends Iadapter { + constructor(app: App) { + super(app); + this.metadataCache = app.metadataCache; + this.adapter = app.vault.adapter; + this.vault = app.vault; + } +} diff --git a/src/dataStore/data.ts b/src/dataStore/data.ts index 92ecec61..dbdcd3d4 100644 --- a/src/dataStore/data.ts +++ b/src/dataStore/data.ts @@ -12,6 +12,7 @@ import { SrsAlgorithm, algorithmNames } from "src/algorithms/algorithms"; import { CardInfo, TrackedFile } from "./trackedFile"; import { RPITEMTYPE, RepetitionItem, ReviewResult } from "./repetitionItem"; import { DEFAULT_QUEUE_DATA, Queue } from "./queue"; +import { Iadapter } from "./adapter"; /** * SrsData. @@ -109,7 +110,7 @@ export class DataStore { */ async load(path = this.dataPath) { try { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; if (await adapter.exists(path)) { const data = await adapter.read(path); @@ -156,7 +157,7 @@ export class DataStore { */ async save(path = this.dataPath) { try { - await app.vault.adapter.write(path, JSON.stringify(this.data)); + await Iadapter.instance.adapter.write(path, JSON.stringify(this.data)); this.data.mtime = await this.getmtime(); } catch (error) { MiscUtils.notice("Unable to save data file!"); @@ -171,7 +172,7 @@ export class DataStore { * @returns */ async getmtime(path = this.dataPath) { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; const stat = await adapter.stat(path.normalize()); if (stat != null) { return stat.mtime; @@ -356,7 +357,7 @@ export class DataStore { * @param {boolean} recursive */ untrackFilesInFolderPath(path: string, recursive?: boolean) { - const folder: TFolder = app.vault.getAbstractFileByPath(path) as TFolder; + const folder: TFolder = Iadapter.instance.vault.getAbstractFileByPath(path) as TFolder; if (folder != null) { this.untrackFilesInFolder(folder, recursive); @@ -404,7 +405,7 @@ export class DataStore { * @param {boolean} recursive */ trackFilesInFolderPath(path: string, recursive?: boolean) { - const folder: TFolder = app.vault.getAbstractFileByPath(path) as TFolder; + const folder: TFolder = Iadapter.instance.vault.getAbstractFileByPath(path) as TFolder; if (folder != null) { this.trackFilesInFolder(folder, recursive); @@ -489,11 +490,11 @@ export class DataStore { } const trackedFile = this.getTrackedFile(path); - const note = app.vault.getAbstractFileByPath(path) as TFile; + const note = Iadapter.instance.vault.getAbstractFileByPath(path) as TFile; let cardName: string = null; if (note != null && trackedFile.tags.length > 0) { - const fileCachedData = app.metadataCache.getFileCache(note) || {}; + const fileCachedData = Iadapter.instance.metadataCache.getFileCache(note) || {}; const tags = getAllTags(fileCachedData) || []; const deckname = Tags.getNoteDeckName(note, this.settings); cardName = Tags.getTagFromSettingTags(tags, this.settings.flashcardTags); @@ -762,7 +763,7 @@ export class DataStore { findMovedFile(path: string): string { const pathArr = path.split("/"); const name = pathArr.last().replace(".md", ""); - const notes: TFile[] = app.vault.getMarkdownFiles(); + const notes: TFile[] = Iadapter.instance.vault.getMarkdownFiles(); const result: string[] = []; notes.some((note: TFile) => { if (note.basename.includes(name) || name.includes(note.basename)) { @@ -791,7 +792,7 @@ export class DataStore { * @param {string}path */ async verify(path: string): Promise { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; if (path != null) { return await adapter.exists(path).catch((_reason) => { console.error("Unable to verify file: ", path); diff --git a/src/dataStore/location_switch.ts b/src/dataStore/location_switch.ts index 5ad694f2..52191699 100644 --- a/src/dataStore/location_switch.ts +++ b/src/dataStore/location_switch.ts @@ -23,6 +23,7 @@ import deepcopy from "deepcopy"; import { NoteCardScheduleParser } from "src/CardSchedule"; import { DataLocation, getStorePath } from "./dataLocation"; import { globalDateProvider } from "src/util/DateProvider"; +import { Iadapter } from "./adapter"; export class LocationSwitch { public plugin: SRPlugin; @@ -54,7 +55,7 @@ export class LocationSwitch { * @returns {boolean} */ async moveStoreLocation(): Promise { - const adapter = app.vault.adapter; + const adapter = Iadapter.instance.adapter; const store = DataStore.getInstance(); const newPath = this.getStorePath(); @@ -123,7 +124,7 @@ export class LocationSwitch { // await plugin.sync_Algo(); - let notes: TFile[] = app.vault.getMarkdownFiles(); + let notes: TFile[] = Iadapter.instance.vault.getMarkdownFiles(); notes = notes.filter( (noteFile) => !isIgnoredPath(settings.noteFoldersToIgnore, noteFile.path) && @@ -163,7 +164,7 @@ export class LocationSwitch { } if (deckname !== null) { - const fileCachedData = app.metadataCache.getFileCache(noteFile) || {}; + const fileCachedData = Iadapter.instance.metadataCache.getFileCache(noteFile) || {}; fileText = await _convertFrontMatter(noteFile, fileCachedData, deckname, fileText); if (fileText == null) { console.warn("_convertFrontMatter: fileText null: "); @@ -271,7 +272,7 @@ export class LocationSwitch { fileText: string, ) { // console.debug("_convertFrontMatter"); - // const fileCachedData = app.metadataCache.getFileCache(note) || {}; + // const fileCachedData = Iadapter.instance.metadataCache.getFileCache(note) || {}; const frontmatter: FrontMatterCache | Record = fileCachedData.frontmatter || {}; const sched = getReviewNoteHeaderData(frontmatter); @@ -312,7 +313,9 @@ export class LocationSwitch { .filter((tkfile) => !isIgnoredPath(this.settings.noteFoldersToIgnore, tkfile.path)) .map(async (tkfile) => { const item = store.getItembyID(tkfile.noteID); - const note = app.vault.getAbstractFileByPath(tkfile.path) as TFile; + const note = Iadapter.instance.vault.getAbstractFileByPath( + tkfile.path, + ) as TFile; if (!(note instanceof TFile)) { return; } diff --git a/src/dataStore/trackedFile.ts b/src/dataStore/trackedFile.ts index 012ad7af..5fb58188 100644 --- a/src/dataStore/trackedFile.ts +++ b/src/dataStore/trackedFile.ts @@ -182,16 +182,18 @@ export class TrackedFile implements ITrackedFile { const lines: number[] = []; const cardHashList: Record = {}; - const parsedCards: ParsedQuestionInfo[] = parseEx( - fileText, - settings.singleLineCardSeparator, - settings.singleLineReversedCardSeparator, - settings.multilineCardSeparator, - settings.multilineReversedCardSeparator, - settings.convertHighlightsToClozes, - settings.convertBoldTextToClozes, - settings.convertCurlyBracketsToClozes, - ); + const parserOptions = { + singleLineCardSeparator: settings.singleLineCardSeparator, + singleLineReversedCardSeparator: settings.singleLineReversedCardSeparator, + multilineCardSeparator: settings.multilineCardSeparator, + multilineReversedCardSeparator: settings.multilineReversedCardSeparator, + multilineCardEndMarker: settings.multilineCardEndMarker, + convertHighlightsToClozes: settings.convertHighlightsToClozes, + convertBoldTextToClozes: settings.convertBoldTextToClozes, + convertCurlyBracketsToClozes: settings.convertCurlyBracketsToClozes, + }; + + const parsedCards: ParsedQuestionInfo[] = parseEx(fileText, parserOptions); if (!this.hasCards && parsedCards.length === 0) { return false; } diff --git a/src/generateParser.ts b/src/generateParser.ts new file mode 100644 index 00000000..9ce11d75 --- /dev/null +++ b/src/generateParser.ts @@ -0,0 +1,271 @@ +// generateParser.ts + +import { generate, Parser } from "peggy"; +import { areParserOptionsEqual, copyParserOptions, debugParser, ParserOptions } from "./parser"; + +let parser: Parser | null = null; +let oldOptions: ParserOptions; + +export function generateParser(options: ParserOptions): Parser { + let grammar: string | null = null; + + // If the parser did not already exist or if the parser options changed since last the last + // parser was generated, we generate a new parser. Otherwise, we skip the block to save + // some execution time. + if (parser === null || !areParserOptionsEqual(options, oldOptions)) { + /* GENERATE A NEW PARSER */ + + oldOptions = copyParserOptions(options); + + grammar = generateGrammar(options); + + if (debugParser) { + const t0 = Date.now(); + parser = generate(grammar); + const t1 = Date.now(); + console.log("New parser generated in " + (t1 - t0) + " milliseconds."); + } else { + parser = generate(grammar); + } + } else { + if (debugParser) console.log("Parser already existed. No need to generate a new parser."); + } + + if (debugParser) { + if (grammar === null) { + grammar = generateGrammar(options); + } + console.log( + "The parsers grammar is provided below. You can test it with https://peggyjs.org/online.html.", + ); + console.log({ + info: "Copy the grammar by right-clicking on the property grammar and copying it as a string. Then, paste it in https://peggyjs.org/online.html.", + grammar: grammar, + }); + } + + return parser; +} + +function generateGrammar(options: ParserOptions): string { + const close_rules_list: string[] = []; + + if (options.convertHighlightsToClozes) close_rules_list.push("close_equal"); + if (options.convertBoldTextToClozes) close_rules_list.push("close_star"); + if (options.convertCurlyBracketsToClozes) close_rules_list.push("close_bracket"); + + const close_rules = close_rules_list.join(" / "); + + return `{ + // The fallback case is important if we want to test the rules with https://peggyjs.org/online.html + const CardTypeFallBack = { + SingleLineBasic: 0, + SingleLineReversed: 1, + MultiLineBasic: 2, + MultiLineReversed: 3, + Cloze: 4, + }; + + // The fallback case is important if we want to test the rules with https://peggyjs.org/online.html + const createParsedQuestionInfoFallBack = (cardType, text, firstLineNum, lastLineNum) => { + return {cardType, text, firstLineNum, lastLineNum}; + }; + + const CardType = options.CardType ? options.CardType : CardTypeFallBack; + CardType.Ignore=null; + const createParsedQuestionInfo = options.createParsedQuestionInfo ? options.createParsedQuestionInfo : createParsedQuestionInfoFallBack; + + function filterBlocks(b) { + return b.filter( (d) => d.cardType === CardType.Ignore ? false : true ) + } +} + +main + = blocks:block* { return filterBlocks(blocks); } + +/* The input text to the parser contains arbitrary text, not just card definitions. + Hence we fallback to matching on loose_line. The result from loose_line is filtered out by filterBlocks() */ +block + = html_comment / inline_rev_card / inline_card / multiline_rev_card / multiline_card / close_card / loose_line + +html_comment + = $("" (html_comment / .))* "-->" newline?) { + return createParsedQuestionInfo(CardType.Ignore,"",0,0); + } + +/* Obsidian tag definition: https://help.obsidian.md/Editing+and+formatting/Tags#Tag+format */ +tag + = $("#" + name:([a-zA-Z/\\-_] { return 1; } / [0-9]{ return 0;})+ &{ + // check if it is a valid Obsidian tag - (Tags must contain at least one non-numerical character) + return name.includes(1); + }) + +inline_card + = e:inline newline? { return e; } + +inline + = left:(!inline_mark non_newline)+ inline_mark right:text_till_newline (newline annotation)? { + return createParsedQuestionInfo(CardType.SingleLineBasic,text(),location().start.line-1,location().end.line-1); + } + +inline_rev_card + = e:inline_rev newline? { return e; } + +inline_rev + = left:(!inline_rev_mark non_newline)+ inline_rev_mark right:text_till_newline (newline annotation)? { + return createParsedQuestionInfo(CardType.SingleLineReversed,text(),location().start.line-1,location().end.line-1); + } + +multiline_card + = c:multiline separator_line { + return c; + } + +multiline + = arg1:multiline_before multiline_mark arg2:multiline_after { + return createParsedQuestionInfo(CardType.MultiLineBasic,(arg1+"${options.multilineCardSeparator}\\n"+arg2.trimEnd()),location().start.line-1,location().end.line-2); + } + +multiline_before + = $(!multiline_mark nonempty_text_line)+ + +multiline_after + = $(!separator_line (tilde_code / backprime_code / text_line))+ + +tilde_code + = $( + left:$tilde_marker text_line + t:$(!(middle:$tilde_marker &{ return left.length===middle.length;}) (tilde_code / text_line))* + (right:$tilde_marker &{ return left.length===right.length; }) + newline + ) + +tilde_marker + = "~~~" "~"* + +backprime_code + = $( + left:$backprime_marker text_line + t:$(!(middle:$backprime_marker &{ return left.length===middle.length;}) (backprime_code / text_line))* + (right:$backprime_marker &{ return left.length===right.length; }) + newline + ) + +backprime_marker + = "\`\`\`" "\`"* + +multiline_rev_card + = @multiline_rev separator_line + +multiline_rev + = arg1:multiline_rev_before multiline_rev_mark arg2:multiline_rev_after { + return createParsedQuestionInfo(CardType.MultiLineReversed,(arg1+"${options.multilineReversedCardSeparator}\\n"+arg2.trimEnd()),location().start.line-1,location().end.line-2); + } + +multiline_rev_before + = $(!multiline_rev_mark nonempty_text_line)+ + +multiline_rev_after + = $(!separator_line text_line)+ + +close_card + = $(multiline_before_close? close_line (multiline_after_close)? (newline annotation)?) { + return createParsedQuestionInfo(CardType.Cloze,text().trimEnd(),location().start.line-1,location().end.line-1); + } + +close_line + = ((!close_text non_newline)* close_text) text_line_nonterminated? + +multiline_before_close + = (!close_line nonempty_text_line)+ + +multiline_after_close + = e:(!(newline separator_line) text_line1)+ + +close_text + = ${close_rules} + +close_equal + = close_mark_equal (!close_mark_equal non_newline)+ close_mark_equal + +close_mark_equal + = "==" + +close_star + = close_mark_star (!close_mark_star non_newline)+ close_mark_star + +close_mark_star + = "**" + +close_bracket + = close_mark_bracket_open (!close_mark_bracket_close non_newline)+ close_mark_bracket_close + +close_mark_bracket_open + = "{{" + +close_mark_bracket_close + = "}}" + +inline_mark + = "${options.singleLineCardSeparator}" + +inline_rev_mark + = "${options.singleLineReversedCardSeparator}" + +multiline_mark + = optional_whitespaces "${options.multilineCardSeparator}" optional_whitespaces newline + +multiline_rev_mark + = optional_whitespaces "${options.multilineReversedCardSeparator}" optional_whitespaces newline + +end_card_mark + = "${options.multilineCardEndMarker}" + +separator_line + = end_card_mark optional_whitespaces newline + +text_line_nonterminated + = $nonempty_text_till_newline + +nonempty_text_line + = nonempty_text_till_newline newline + +text_line + = @$text_till_newline newline + +// very likely, it is possible to homogeneize/modify the rules to use only either 'text_line1' or 'text_line' +text_line1 + = newline @$text_till_newline + +loose_line + = $((text_till_newline newline) / nonempty_text_till_newline) { + return createParsedQuestionInfo(CardType.Ignore,"",0,0); + } + +annotation + = $("" .)+ "-->") + +nonempty_text_till_newline + = $non_newline+ + +text_till_newline + = $non_newline* + +non_newline + = [^\\n] + +newline + = $[\\n] + +empty_line + = $(whitespace_char* [\\n]) + +nonemptyspace + = [^ \\f\\t\\v\\u0020\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff] + +optional_whitespaces + = whitespace_char* + +whitespace_char = ([ \\f\\t\\v\\u0020\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]) +`; +} diff --git a/src/gui/EditModal.tsx b/src/gui/EditModal.tsx index 1feb19d5..35c9a7cd 100644 --- a/src/gui/EditModal.tsx +++ b/src/gui/EditModal.tsx @@ -1,5 +1,6 @@ import { App, Modal } from "obsidian"; import { t } from "src/lang/helpers"; +import { TextDirection } from "src/util/TextDirection"; // from https://github.com/chhoumann/quickadd/blob/bce0b4cdac44b867854d6233796e3406dfd163c6/src/gui/GenericInputPrompt/GenericInputPrompt.ts#L5 export class FlashcardEditModal extends Modal { @@ -17,17 +18,23 @@ export class FlashcardEditModal extends Modal { private rejectPromise: (reason?: any) => void; private didSaveChanges = false; private readonly modalText: string; - - public static Prompt(app: App, placeholder: string): Promise { - const newPromptModal = new FlashcardEditModal(app, placeholder); + private textDirection: TextDirection; + + public static Prompt( + app: App, + placeholder: string, + textDirection: TextDirection, + ): Promise { + const newPromptModal = new FlashcardEditModal(app, placeholder, textDirection); return newPromptModal.waitForClose; } - constructor(app: App, existingText: string) { + constructor(app: App, existingText: string, textDirection: TextDirection) { super(app); this.modalText = existingText; this.changedText = existingText; + this.textDirection = textDirection; this.waitForClose = new Promise((resolve, reject) => { this.resolvePromise = resolve; @@ -56,6 +63,9 @@ export class FlashcardEditModal extends Modal { this.textArea.addClass("sr-input"); this.textArea.setText(this.modalText ?? ""); this.textArea.addEventListener("keydown", this.saveOnEnterCallback); + if (this.textDirection == TextDirection.Rtl) { + this.textArea.setAttribute("dir", "rtl"); + } this._createResponse(this.contentEl); } diff --git a/src/gui/FlashcardModal.tsx b/src/gui/FlashcardModal.tsx index 9ff4b372..ddadb7d3 100644 --- a/src/gui/FlashcardModal.tsx +++ b/src/gui/FlashcardModal.tsx @@ -48,7 +48,9 @@ export class FlashcardModal extends Modal { // Setup base containers this.modalEl.style.height = this.settings.flashcardHeightPercentage + "%"; + this.modalEl.style.maxHeight = this.settings.flashcardHeightPercentage + "%"; this.modalEl.style.width = this.settings.flashcardWidthPercentage + "%"; + this.modalEl.style.maxWidth = this.settings.flashcardWidthPercentage + "%"; this.modalEl.setAttribute("id", "sr-modal"); this.contentEl.addClass("sr-modal-content"); @@ -118,7 +120,11 @@ export class FlashcardModal extends Modal { // Just the question/answer text; without any preceding topic tag const textPrompt = currentQ.questionText.actualQuestion; - const editModal = FlashcardEditModal.Prompt(this.app, textPrompt); + const editModal = FlashcardEditModal.Prompt( + this.app, + textPrompt, + currentQ.questionText.textDirection, + ); editModal .then(async (modifiedCardText) => { this.reviewSequencer.updateCurrentQuestionText(modifiedCardText); diff --git a/src/gui/FlashcardReviewView.tsx b/src/gui/FlashcardReviewView.tsx index 29a6bdc8..1a73a042 100644 --- a/src/gui/FlashcardReviewView.tsx +++ b/src/gui/FlashcardReviewView.tsx @@ -149,7 +149,11 @@ export class FlashcardReviewView { this.plugin, this._currentNote.filePath, ); - await wrapper.renderMarkdownWrapper(this._currentCard.front, this.content); + await wrapper.renderMarkdownWrapper( + this._currentCard.front, + this.content, + this._currentQuestion.questionText.textDirection, + ); // Set scroll position back to top this.content.scrollTop = 0; @@ -307,7 +311,11 @@ export class FlashcardReviewView { this.plugin, this._currentNote.filePath, ); - wrapper.renderMarkdownWrapper(this._currentCard.back, this.content); + wrapper.renderMarkdownWrapper( + this._currentCard.back, + this.content, + this._currentQuestion.questionText.textDirection, + ); // Show response buttons this.answerButton.addClass("sr-is-hidden"); diff --git a/src/gui/ReleaseNotes.ts b/src/gui/ReleaseNotes.ts index 7b72268e..a6761919 100644 --- a/src/gui/ReleaseNotes.ts +++ b/src/gui/ReleaseNotes.ts @@ -11,7 +11,7 @@ import README from "README.md"; import README_ZH from "docs/README_ZH.md"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -import RELEASE_changelog from "docs/changelog.md"; +import RELEASE_changelog from "docs/docs/changelog.md"; import { buildDonation } from "src/settings/donation"; // const fmd = fs.readFileSync("CHANGELOG.md", "utf8"); diff --git a/src/gui/Sidebar.tsx b/src/gui/Sidebar.tsx index 2986df44..43b21d88 100644 --- a/src/gui/Sidebar.tsx +++ b/src/gui/Sidebar.tsx @@ -46,8 +46,8 @@ export class ReviewQueueListView extends ItemView { public redraw(): void { const activeFile: TFile | null = this.app.workspace.getActiveFile(); - const rootEl: HTMLElement = createDiv(); - const childrenEl: HTMLElement = rootEl; + const rootEl: HTMLElement = createDiv("tree-item nav-folder mod-root"); + const childrenEl: HTMLElement = rootEl.createDiv("tree-item-children nav-folder-children"); for (const deckKey in this.plugin.reviewDecks) { const deck: ReviewDeck = this.plugin.reviewDecks[deckKey]; @@ -60,7 +60,7 @@ export class ReviewQueueListView extends ItemView { deckCollapsed, false, deck, - ).getElementsByClassName("tree-item-children")[0] as HTMLElement; + ).getElementsByClassName("tree-item-children nav-folder-children")[0] as HTMLElement; if (deck.newNotes.length > 0) { const newNotesFolderEl: HTMLElement = this.createRightPaneFolder( @@ -76,8 +76,8 @@ export class ReviewQueueListView extends ItemView { if (fileIsOpen) { deck.activeFolders.add(deck.deckName); deck.activeFolders.add(t("NEW")); - this.changeFolderIconToExpanded(newNotesFolderEl); - this.changeFolderIconToExpanded(deckFolderEl); + this.changeFolderFolding(newNotesFolderEl); + this.changeFolderFolding(deckFolderEl); } this.createRightPaneFile( newNotesFolderEl, @@ -141,8 +141,8 @@ export class ReviewQueueListView extends ItemView { if (fileIsOpen) { deck.activeFolders.add(deck.deckName); deck.activeFolders.add(folderTitle); - this.changeFolderIconToExpanded(schedFolderEl); - this.changeFolderIconToExpanded(deckFolderEl); + this.changeFolderFolding(schedFolderEl); + this.changeFolderFolding(deckFolderEl); } this.createRightPaneFile( @@ -169,36 +169,32 @@ export class ReviewQueueListView extends ItemView { hidden: boolean, deck: ReviewDeck, ): HTMLElement { - const folderEl: HTMLDivElement = parentEl.createDiv("tree-item"); - const folderTitleEl: HTMLDivElement = folderEl.createDiv("tree-item-self"); - const childrenEl: HTMLDivElement = folderEl.createDiv("tree-item-children"); + const folderEl: HTMLDivElement = parentEl.createDiv("tree-item nav-folder"); + const folderTitleEl: HTMLDivElement = folderEl.createDiv("tree-item-self nav-folder-title"); + const childrenEl: HTMLDivElement = folderEl.createDiv( + "tree-item-children nav-folder-children", + ); const collapseIconEl: HTMLDivElement = folderTitleEl.createDiv( - "tree-item-collapse-indicator collapse-icon", + "tree-item-icon collapse-icon nav-folder-collapse-indicator", ); collapseIconEl.innerHTML = COLLAPSE_ICON; - if (collapsed) { - (collapseIconEl.childNodes[0] as HTMLElement).style.transform = "rotate(-90deg)"; - } + this.changeFolderFolding(folderEl, collapsed); - folderTitleEl.createDiv("tree-item-content").setText(folderTitle); + folderTitleEl.createDiv("tree-item-inner nav-folder-title-content").setText(folderTitle); if (hidden) { folderEl.style.display = "none"; } folderTitleEl.onClickEvent(() => { - for (const child of childrenEl.childNodes as NodeListOf) { - if (child.style.display === "block" || child.style.display === "") { - child.style.display = "none"; - (collapseIconEl.childNodes[0] as HTMLElement).style.transform = - "rotate(-90deg)"; - deck.activeFolders.delete(folderTitle); - } else { - child.style.display = "block"; - (collapseIconEl.childNodes[0] as HTMLElement).style.transform = ""; - deck.activeFolders.add(folderTitle); - } + this.changeFolderFolding(folderEl, !folderEl.hasClass("is-collapsed")); + childrenEl.style.display = !folderEl.hasClass("is-collapsed") ? "block" : "none"; + + if (!folderEl.hasClass("is-collapsed")) { + deck.activeFolders.delete(folderTitle); + } else { + deck.activeFolders.add(folderTitle); } }); @@ -214,18 +210,20 @@ export class ReviewQueueListView extends ItemView { plugin: SRPlugin, ): void { const navFileEl: HTMLElement = folderEl - .getElementsByClassName("tree-item-children")[0] - .createDiv("tree-item"); + .getElementsByClassName("tree-item-children nav-folder-children")[0] + .createDiv("nav-file"); if (hidden) { navFileEl.style.display = "none"; } - const navFileTitle: HTMLElement = navFileEl.createDiv("tree-item-self"); + const navFileTitle: HTMLElement = navFileEl.createDiv("tree-item-self nav-file-title"); if (fileElActive) { navFileTitle.addClass("is-active"); } - navFileTitle.createDiv("tree-item-content").setText(file.note.basename); + navFileTitle + .createDiv("tree-item-inner nav-file-title-content") + .setText(file.note.basename); navFileTitle.addEventListener( "click", async (event: MouseEvent) => { @@ -256,8 +254,15 @@ export class ReviewQueueListView extends ItemView { ); } - private changeFolderIconToExpanded(folderEl: HTMLElement): void { - const collapseIconEl = folderEl.find("div.tree-item-collapse-indicator"); - (collapseIconEl.childNodes[0] as HTMLElement).style.transform = ""; + private changeFolderFolding(folderEl: HTMLElement, collapsed = false): void { + if (collapsed) { + folderEl.addClass("is-collapsed"); + const collapseIconEl = folderEl.find("div.nav-folder-collapse-indicator"); + collapseIconEl.addClass("is-collapsed"); + } else { + folderEl.removeClass("is-collapsed"); + const collapseIconEl = folderEl.find("div.nav-folder-collapse-indicator"); + collapseIconEl.removeClass("is-collapsed"); + } } } diff --git a/src/gui/Tabs.ts b/src/gui/Tabs.ts new file mode 100644 index 00000000..06fab85b --- /dev/null +++ b/src/gui/Tabs.ts @@ -0,0 +1,184 @@ +/* + * 'Shell commands' plugin for Obsidian. + * Copyright (C) 2021 - 2023 Jarkko Linnanvirta + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3.0 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Contact the author (Jarkko Linnanvirta): https://github.com/Taitava/ + */ + +import { setIcon } from "obsidian"; + +export interface Tab { + title: string; + icon: string; + content_generator: (container_element: HTMLElement) => Promise; +} + +export interface TabStructure { + header: HTMLElement; + active_tab_id: string; + buttons: { + [key: string]: HTMLElement; + }; + contentContainers: { + [key: string]: HTMLElement; + }; + contentGeneratorPromises: { + [key: string]: Promise; + }; +} + +export interface Tabs { + [key: string]: Tab; +} + +interface TabContentContainers { + [key: string]: HTMLElement; +} + +interface TabButtons { + [key: string]: HTMLElement; +} + +export function createTabs( + container_element: HTMLElement, + tabs: Tabs, + activateTabId: string, +): TabStructure { + const tab_header = container_element.createEl("div", { attr: { class: "sr-tab-header" } }); + const tab_content_containers: TabContentContainers = {}; + const tab_buttons: TabButtons = {}; + const tab_structure: TabStructure = { + header: tab_header, + active_tab_id: Object.keys(tabs)[0] as string, // Indicate that the first tab is active. This does not affect what tab is active in practise, it just reports the active tab. + buttons: tab_buttons, + contentContainers: tab_content_containers, + contentGeneratorPromises: {}, + }; + let first_button: HTMLElement | undefined; + for (const tab_id in tabs) { + const tab = tabs[tab_id]; + + // Create button + const button = tab_header.createEl("button", { + attr: { + class: "sr-tab-header-button", + activateTab: "sr-tab-" + tab_id, + }, + }); + button.onclick = function (event: MouseEvent) { + const tab_button = this as HTMLElement; // Use 'this' instead of event.target because this way we'll always get a button element, not an element inside the button (i.e. an icon). + + // Hide all tab contents and get the max dimensions + let max_width = 0; + let max_height = 0; + const tab_header = tab_button.parentElement; + if (null === tab_header) { + throw new Error("Tab header is missing. Did not get a parent from tab button."); + } + const container_element = tab_header.parentElement; + if (null === container_element) { + throw new Error( + "Container element is missing. Did not get a parent from tab header.", + ); + } + const tab_contents = container_element.findAll("div.sr-tab-content"); // Do not get all tab contents that exist, because there might be multiple tab systems open at the same time. + const is_main_settings_modal = container_element.hasClass("vertical-tab-content"); + for (const index in tab_contents) { + const tab_content = tab_contents[index]; + + // Get the maximum tab dimensions so that all tabs can have the same dimensions. + // But don't do it if this is the main settings modal + if (!is_main_settings_modal) { + tab_content.addClass("sr-tab-active"); // Need to make the tab visible temporarily in order to get the dimensions. + if (tab_content.offsetHeight > max_height) { + max_height = tab_content.offsetHeight; + } + if (tab_content.offsetWidth > max_width) { + max_width = tab_content.offsetWidth; + } + } + + // Finally hide the tab + tab_content.removeClass("sr-tab-active"); + } + + // Remove active status from all buttons + const adjacent_tab_buttons = tab_header.findAll(".sr-tab-header-button"); // Do not get all tab buttons that exist, because there might be multiple tab systems open at the same time. + for (const index in adjacent_tab_buttons) { + const tab_button = adjacent_tab_buttons[index]; + tab_button.removeClass("sr-tab-active"); + } + + // Activate the clicked tab + tab_button.addClass("sr-tab-active"); + const activateTabAttribute: Attr | null = + tab_button.attributes.getNamedItem("activateTab"); + if (null === activateTabAttribute) { + throw new Error("Tab button has no 'activateTab' HTML attribute! Murr!"); + } + const activate_tab_id = activateTabAttribute.value; + const tab_content: HTMLElement | null = document.getElementById(activate_tab_id); + if (null === tab_content) { + throw new Error( + "No tab content was found with activate_tab_id '" + + activate_tab_id + + "'! Hmph!", + ); + } + tab_content.addClass("sr-tab-active"); + + // Mark the clicked tab as active in TabStructure (just to report which tab is currently active) + tab_structure.active_tab_id = activate_tab_id.replace(/^sr-tab-/, ""); // Remove "sr-tab" prefix. + + // Focus an element (if a focusable element is present) + tab_content.find(".sr-focus-element-on-tab-opening")?.focus(); // ? = If not found, do nothing. + + // Apply the max dimensions to this tab + // But don't do it if this is the main settings modal + if (!is_main_settings_modal) { + tab_content.style.width = max_width + "px"; + tab_content.style.height = max_height + "px"; + } + + // Do nothing else (I don't know if this is needed or not) + event.preventDefault(); + }; + if (tab.icon) setIcon(button, tab.icon); + + button.insertAdjacentText("beforeend", " " + tab.title); + tab_buttons[tab_id] = button; + + // Create content container + tab_content_containers[tab_id] = container_element.createEl("div", { + attr: { class: "sr-tab-content", id: "sr-tab-" + tab_id }, + }); + + // Generate content + tab_structure.contentGeneratorPromises[tab_id] = tab.content_generator( + tab_content_containers[tab_id], + ); + + // Memorize the first tab's button + if (undefined === first_button) { + first_button = button; + } + } + + // Open a tab. + tab_buttons[activateTabId].click(); + + // Return the TabStructure + return tab_structure; +} diff --git a/src/lang/locale/ar.ts b/src/lang/locale/ar.ts index ebbb44bd..064485b3 100644 --- a/src/lang/locale/ar.ts +++ b/src/lang/locale/ar.ts @@ -38,6 +38,7 @@ export default { STATUS_BAR: "البطاقات المستحقة ${dueFlashcardsCount},ملاحظات ${dueNotesCount}:مراجعة", SYNC_TIME_TAKEN: "${t}ms استغراق المزامنة", NOTE_IN_IGNORED_FOLDER: ".الملاحظة يتم حفظها ضمن المجلد الذي تم تجاهله (تحقق من الإعدادات)", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: ".يرجى وضع وسم على الملاحظة بشكل مناسب للمراجعة (في الإعدادات)", RESPONSE_RECEIVED: ".استُلمت الاستجابة", NO_DECK_EXISTS: "${deckName} لا يوجد رُزمَة", @@ -57,10 +58,31 @@ export default { // settings.ts SETTINGS_HEADER: "Spaced Repetition Plugin - Settings", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: '.wiki لمزيد من المعلومات ، تحقق من', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "مجلدات لتجاهلها", - FOLDERS_TO_IGNORE_DESC: - "Templates Meta/Scripts : أدخل مسارات المجلد مفصولة بواسطة سطور جديدة,مثال", + FOLDERS_TO_IGNORE_DESC: `Templates Meta/Scripts. +Note that this setting is common to both Flashcards and Notes. : أدخل مسارات المجلد مفصولة بواسطة سطور جديدة,مثال`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "البطاقات", FLASHCARD_EASY_LABEL: "نص الزر سهل", FLASHCARD_GOOD_LABEL: "نص الزر جيد", @@ -109,6 +131,7 @@ export default { INLINE_REVERSED_CARDS_SEPARATOR: "فاصل من أجل البطاقات العكسية المضمنة", MULTILINE_CARDS_SEPARATOR: "فاصل من أجل البطاقات المتعددة", MULTILINE_REVERSED_CARDS_SEPARATOR: "فاصل من أجل البطاقات العكسية المتعددة", + MULTILINE_CARDS_END_MARKER: "الأحرف التي تدل على نهاية الكلوزات وبطاقات التعلم المتعددة الأسطر", NOTES: "ملاحظات", REVIEW_PANE_ON_STARTUP: "تمكين جزء مراجعة الملاحظات عند بدء التشغيل", TAGS_TO_REVIEW: "وسوم للمراجعة", @@ -146,7 +169,9 @@ export default { MAX_LINK_CONTRIB: "أقصى مساهمة ارتباط", MAX_LINK_CONTRIB_DESC: "أقصى مساهمة للسهولة المرجحة للملاحظات المرتبطة بالسهولة الأولية.", LOGGING: "تسجيل", - DISPLAY_DEBUG_INFO: "عرض معلومات التصحيح على وحدة تحكم المطور؟", + DISPLAY_DEBUG_INFO: "عرض معلومات التصحيح على وحدة تحكم المطور", + DISPLAY_PARSER_DEBUG_INFO: + "Display debugging information for the parser on the developer console", DATA_LOC: "Data Location", DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", diff --git a/src/lang/locale/cz.ts b/src/lang/locale/cz.ts index 8c07589f..0b4af057 100644 --- a/src/lang/locale/cz.ts +++ b/src/lang/locale/cz.ts @@ -38,6 +38,7 @@ export default { STATUS_BAR: "Revize: ${dueNotesCount} poznámek, ${dueFlashcardsCount} kartiček po termínu", SYNC_TIME_TAKEN: "Synchronizace trvala ${t}ms", NOTE_IN_IGNORED_FOLDER: "Poznámka je uložena v ignorované složce (zkontrolujte nastavení).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Prosím označne poznámku odpovídajícím tagem pro revizi (v nastavení).", RESPONSE_RECEIVED: "Odpověď přijata.", NO_DECK_EXISTS: "Neexistuje žádný balíček pro ${deckName}", @@ -56,11 +57,32 @@ export default { MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts - SETTINGS_HEADER: "Spaced Repetition Plugin - Nastavení", + SETTINGS_HEADER: "Spaced Repetition - Nastavení", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: 'Pro více informací jděte na wiki.', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Ignorované složky", - FOLDERS_TO_IGNORE_DESC: - "Zadejte cesty ke složkám oddělené odřádkováním napříkad. Šablony Meta/Scripts", + FOLDERS_TO_IGNORE_DESC: `Zadejte cesty ke složkám oddělené odřádkováním napříkad. Šablony Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Kartičky", FLASHCARD_EASY_LABEL: "Easy Button Text", FLASHCARD_GOOD_LABEL: "Good Button Text", @@ -112,6 +134,7 @@ export default { INLINE_REVERSED_CARDS_SEPARATOR: "Oddělovač pro otočené inline kartičky", MULTILINE_CARDS_SEPARATOR: "Oddělovač pro víceřádkové kartičky", MULTILINE_REVERSED_CARDS_SEPARATOR: "Oddělovač pro víceřádkove otočené kartičky", + MULTILINE_CARDS_END_MARKER: "Znaky označující konec clozes a víceřádkových flash karet", NOTES: "Poznámky", REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", TAGS_TO_REVIEW: "Tag pro revizi", @@ -150,7 +173,9 @@ export default { MAX_LINK_CONTRIB_DESC: "Maximální příspěvek vážené složitosti prolinkovaných poznámek použitý pro určení počáteční složitosti.", LOGGING: "Zaznamenávám", - DISPLAY_DEBUG_INFO: "Zobrazit informace pro ladění na vývojářské konzoli?", + DISPLAY_DEBUG_INFO: "Zobrazit informace pro ladění na vývojářské konzoli", + DISPLAY_PARSER_DEBUG_INFO: + "Display debugging information for the parser on the developer console", DATA_LOC: "Data Location", DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", diff --git a/src/lang/locale/de.ts b/src/lang/locale/de.ts index d624b85b..ab91377b 100644 --- a/src/lang/locale/de.ts +++ b/src/lang/locale/de.ts @@ -43,6 +43,7 @@ export default { SYNC_TIME_TAKEN: "Synchronisierung dauerte ${t}ms", NOTE_IN_IGNORED_FOLDER: "Notiz befindet sich in einem ausgeschlossenen Ordner (siehe Einstellungen).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Bitte die Notiz für Wiederholungen entsprechend taggen (siehe Einstellungen).", RESPONSE_RECEIVED: "Antwort erhalten.", @@ -62,11 +63,32 @@ export default { MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts - SETTINGS_HEADER: "Spaced Repetition Plugin - Einstellungen", + SETTINGS_HEADER: "Spaced Repetition - Einstellungen", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: 'Weitere Informationen gibt es im Wiki (english).', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Ausgeschlossene Ordner", - FOLDERS_TO_IGNORE_DESC: - "Mehrere Ordner mit Zeilenumbrüchen getrennt angeben. Bsp. OrdnerA[Zeilenumbruch]OrdnerB/Unterordner", + FOLDERS_TO_IGNORE_DESC: `Mehrere Ordner mit Zeilenumbrüchen getrennt angeben. Bsp. OrdnerA[Zeilenumbruch]OrdnerB/Unterordner. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Lernkarten", FLASHCARD_EASY_LABEL: "Einfach Knopf Text", FLASHCARD_GOOD_LABEL: "Gut Knopf Text", @@ -124,6 +146,8 @@ export default { INLINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen für einzeilige beidseitige Lernkarten", MULTILINE_CARDS_SEPARATOR: "Trennzeichen für mehrzeilige Lernkarten", MULTILINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen für mehrzeilige beidseitige Lernkarten", + MULTILINE_CARDS_END_MARKER: + "Zeichen, die das Ende von Lückentexten und mehrzeiligen Flashcards kennzeichnen", NOTES: "Notizen", REVIEW_PANE_ON_STARTUP: "Öffne Überprüfungswarteschlage beim start", TAGS_TO_REVIEW: "Zu wiederholende Tags", @@ -167,7 +191,9 @@ export default { MAX_LINK_CONTRIB_DESC: "Maximaler Einfluss der Einfachheiten verlinkter Notizen zur gewichteten initialen Einfachheit einer neuen Lernkarte.", LOGGING: "Protokollierung", - DISPLAY_DEBUG_INFO: "Informationen zum Debugging in der Entwicklerkonsole anzeigen?", + DISPLAY_DEBUG_INFO: "Informationen zum Debugging in der Entwicklerkonsole anzeigen", + DISPLAY_PARSER_DEBUG_INFO: + "Informationen zum parser Debugging in der Entwicklerkonsole anzeigen", DATA_LOC: "Data Location", DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 89632764..5184f70f 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -38,6 +38,7 @@ export default { STATUS_BAR: "Review: ${dueNotesCount} note(s), ${dueFlashcardsCount} card(s) due", SYNC_TIME_TAKEN: "Sync took ${t}ms", NOTE_IN_IGNORED_FOLDER: "Note is saved under ignored folder (check settings).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Please tag the note appropriately for reviewing (in settings).", RESPONSE_RECEIVED: "Response received.", NO_DECK_EXISTS: "No deck exists for ${deckName}", @@ -56,10 +57,32 @@ export default { MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts - SETTINGS_HEADER: "Spaced Repetition Plugin - Settings", + SETTINGS_HEADER: "Spaced Repetition - Settings", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: 'For more information, check the wiki.', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Folders to ignore", - FOLDERS_TO_IGNORE_DESC: "Enter folder paths separated by newlines i.e. Templates Meta/Scripts", + FOLDERS_TO_IGNORE_DESC: `Enter folder paths separated by newlines e.g. Templates Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Flashcards", FLASHCARD_EASY_LABEL: "Easy Button Text", FLASHCARD_GOOD_LABEL: "Good Button Text", @@ -111,6 +134,7 @@ export default { INLINE_REVERSED_CARDS_SEPARATOR: "Separator for inline reversed flashcards", MULTILINE_CARDS_SEPARATOR: "Separator for multiline flashcards", MULTILINE_REVERSED_CARDS_SEPARATOR: "Separator for multiline reversed flashcards", + MULTILINE_CARDS_END_MARKER: "Characters denoting the end of clozes and multiline flashcards", NOTES: "Notes", REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", TAGS_TO_REVIEW: "Tags to review", @@ -148,7 +172,9 @@ export default { MAX_LINK_CONTRIB_DESC: "Maximum contribution of the weighted ease of linked notes to the initial ease.", LOGGING: "Logging", - DISPLAY_DEBUG_INFO: "Display debugging information on the developer console?", + DISPLAY_DEBUG_INFO: "Display debugging information on the developer console", + DISPLAY_PARSER_DEBUG_INFO: + "Display debugging information for the parser on the developer console", DATA_LOC: "Data Location", DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", diff --git a/src/lang/locale/es.ts b/src/lang/locale/es.ts index 812d0c48..ee841c7f 100644 --- a/src/lang/locale/es.ts +++ b/src/lang/locale/es.ts @@ -38,6 +38,7 @@ export default { STATUS_BAR: "Revisar: ${dueNotesCount} nota(s), ${dueFlashcardsCount} tarjetas vencidas", SYNC_TIME_TAKEN: "La sincronización tomó ${t} milisegundos", NOTE_IN_IGNORED_FOLDER: "La nota está guardada en un directorio ignorado (revisa los ajustes).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Por favor etiquete apropiadamente la nota para revisión (en los ajustes).", RESPONSE_RECEIVED: "Respuesta Recibida", NO_DECK_EXISTS: "No existen mazos para: ${deckName}", @@ -57,10 +58,31 @@ export default { // settings.ts SETTINGS_HEADER: "Extensión de Repetición Espaciada - Ajustes", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: 'Para más información revisa la wiki.', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Directorios a ignorar", - FOLDERS_TO_IGNORE_DESC: - "Escriba las rutas de los directorios separadas por saltos de línea, por ejemplo, Plantillas Extra/Guiones", + FOLDERS_TO_IGNORE_DESC: `Escriba las rutas de los directorios separadas por saltos de línea, por ejemplo, Plantillas Extra/Guiones. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Tarjetas de Memorización", FLASHCARD_EASY_LABEL: "Texto del botón: Fácil", FLASHCARD_GOOD_LABEL: "Texto del botón: Bien", @@ -114,6 +136,8 @@ export default { MULTILINE_CARDS_SEPARATOR: "Separador para tarjetas de memorización multilínea", MULTILINE_REVERSED_CARDS_SEPARATOR: "Separador para tarjetas de memorización multilínea invertidas", + MULTILINE_CARDS_END_MARKER: + "Caracteres que denotan el fin de los clozes y tarjetas didácticas de varias líneas", NOTES: "Notes", REVIEW_PANE_ON_STARTUP: "Activar panel de revisión de notas al arrancar", TAGS_TO_REVIEW: "Etiquetas a revisar", @@ -155,7 +179,9 @@ export default { MAX_LINK_CONTRIB_DESC: "Contribución máxima de la facilidad ponderada de las notas vinculadas a la facilidad inicial.", LOGGING: "Registro", - DISPLAY_DEBUG_INFO: "¿Mostrar información de depuración en la consola de desarrollador?", + DISPLAY_DEBUG_INFO: "¿Mostrar información de depuración en la consola de desarrollador", + DISPLAY_PARSER_DEBUG_INFO: + "Display debugging information for the parser on the developer console", DATA_LOC: "Data Location", DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", diff --git a/src/lang/locale/it.ts b/src/lang/locale/it.ts index e0762f84..4d744a94 100644 --- a/src/lang/locale/it.ts +++ b/src/lang/locale/it.ts @@ -38,6 +38,7 @@ export default { STATUS_BAR: "Da rivedere: ${dueNotesCount} scheda/e, ${dueFlashcardsCount} schede in ritardo", SYNC_TIME_TAKEN: "Sincronizzato in ${t}ms", NOTE_IN_IGNORED_FOLDER: "La nota è salvata in una cartella ignorata (rivedi le impostazioni).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Per favore etichetta la nota appropriatamente per la revisione (nelle impostazioni).", RESPONSE_RECEIVED: "Risposta ricevuta.", @@ -58,10 +59,31 @@ export default { // settings.ts SETTINGS_HEADER: "Plugin per ripetizione spaziata - Impostazioni", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: 'Per maggiori informazioni, rivolgersi alla wiki.', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Cartelle da ignorare", - FOLDERS_TO_IGNORE_DESC: - "Inserisci i percorsi delle cartelle separati da a capo, per esempio, Templates Meta/Scripts", + FOLDERS_TO_IGNORE_DESC: `Inserisci i percorsi delle cartelle separati da a capo, per esempio, Templates Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Schede", FLASHCARD_EASY_LABEL: "Testo del bottone facile", FLASHCARD_GOOD_LABEL: "Testo del bottone buono", @@ -117,6 +139,8 @@ export default { INLINE_REVERSED_CARDS_SEPARATOR: "Separatore per schede all'incontrario sulla stessa riga", MULTILINE_CARDS_SEPARATOR: "Separatore per schede su più righe", MULTILINE_REVERSED_CARDS_SEPARATOR: "Separatore per schede all'incontrario su più righe", + MULTILINE_CARDS_END_MARKER: + "Caratteri che denotano la fine di carte con spazi da riempiere e carte multilinea", NOTES: "Note", REVIEW_PANE_ON_STARTUP: "Abilita il pannello di revisione note all'avvio", TAGS_TO_REVIEW: "Etichette da rivedere", @@ -158,7 +182,9 @@ export default { MAX_LINK_CONTRIB_DESC: "Contributo massimo della difficoltà pasata delle note collegate alla difficoltà iniziale.", LOGGING: "Registrando", - DISPLAY_DEBUG_INFO: "Visualizza informazione di debug sulla console per sviluppatori?", + DISPLAY_DEBUG_INFO: "Visualizza informazione di debug sulla console per sviluppatori", + DISPLAY_PARSER_DEBUG_INFO: + "Visualizza informazione di debug riguardanti il parser sulla console per sviluppatori", DATA_LOC: "Data Location", DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", diff --git a/src/lang/locale/ja.ts b/src/lang/locale/ja.ts index 2daf49db..e37dccc7 100644 --- a/src/lang/locale/ja.ts +++ b/src/lang/locale/ja.ts @@ -38,6 +38,7 @@ export default { STATUS_BAR: "レビュー: ${dueNotesCount}ノート, ${dueFlashcardsCount}カードが期日", SYNC_TIME_TAKEN: "同期に${t}msかかりました。", NOTE_IN_IGNORED_FOLDER: "ノートが無視するフォルダに保存されています(設定を確認してください)。", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "レビューを行うにはノートに対して正しくタグ付けしてください(設定を確認してください)。", RESPONSE_RECEIVED: "答えを受け取りました。", @@ -57,11 +58,32 @@ export default { MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts - SETTINGS_HEADER: "Spaced Repetition Plugin - 設定", + SETTINGS_HEADER: "Spaced Repetition - 設定", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: '詳細についてはwikiを確認してください。', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "無視するフォルダ", - FOLDERS_TO_IGNORE_DESC: - 'フォルダパスを改行で区切って入力してください。"Templates Meta/Scripts" のようなスペースによる区切りでの書き方は無効です。', + FOLDERS_TO_IGNORE_DESC: `フォルダパスを改行で区切って入力してください。"Templates Meta/Scripts" のようなスペースによる区切りでの書き方は無効です。. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "フラッシュカード", FLASHCARD_EASY_LABEL: "Easy Button Text", FLASHCARD_GOOD_LABEL: "Good Button Text", @@ -115,6 +137,7 @@ export default { INLINE_REVERSED_CARDS_SEPARATOR: "インラインの表裏反転フラッシュカードに使用するセパレーター", MULTILINE_CARDS_SEPARATOR: "複数行のフラッシュカードに使用するセパレーター", MULTILINE_REVERSED_CARDS_SEPARATOR: "複数行の表裏反転フラッシュカードに使用するセパレーター", + MULTILINE_CARDS_END_MARKER: "クローズと複数行フラッシュカードの終わりを示す文字", NOTES: "ノート", REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", TAGS_TO_REVIEW: "レビューに使用するタグ", @@ -154,7 +177,9 @@ export default { MAX_LINK_CONTRIB_DESC: "最初の易しさに対して、リンクされたノートの重み付けされた易しさが寄与する最大値を指定してください。", LOGGING: "ログ管理", - DISPLAY_DEBUG_INFO: "デベロッパーコンソールにてデバッグ情報を表示しますか?", + DISPLAY_DEBUG_INFO: "デベロッパーコンソールにてデバッグ情報を表示しますか", + DISPLAY_PARSER_DEBUG_INFO: + "Display debugging information for the parser on the developer console", DATA_LOC: "Data Location", DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", diff --git a/src/lang/locale/ko.ts b/src/lang/locale/ko.ts index fb0028a6..32a5407c 100644 --- a/src/lang/locale/ko.ts +++ b/src/lang/locale/ko.ts @@ -38,6 +38,7 @@ export default { STATUS_BAR: "--리뷰: ${dueNotesCount} 노트, ${dueFlashcardsCount} 카드 남았습니다.", SYNC_TIME_TAKEN: "동기화에 ${t}밀리초 걸렸습니다", NOTE_IN_IGNORED_FOLDER: "노트가 무시된 폴더 아래에 저장되어 있습니다. (설정을 확인해주세요)", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "리뷰를 하기위해 노트에 적절히 태그해주세요. (설정을 확인해주세요)", RESPONSE_RECEIVED: "요청이 완료되었습니다", NO_DECK_EXISTS: "${deckName}이라는 이름의 덱이 존재하지 않습니다.", @@ -56,11 +57,32 @@ export default { MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts - SETTINGS_HEADER: "Spaced Repetition Plugin - 설정", + SETTINGS_HEADER: "Spaced Repetition - 설정", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: '더 많은 정보를 원하시면, wiki를 확인해주세요.', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "무시할 폴더들", - FOLDERS_TO_IGNORE_DESC: - "폴더 경로를 빈 줄로 구분해서 입력해주세요. 'Templates Meta/Scripts' 와 같이 입력하는 것은 유효하지 않습니다.", + FOLDERS_TO_IGNORE_DESC: `폴더 경로를 빈 줄로 구분해서 입력해주세요. 'Templates Meta/Scripts' 와 같이 입력하는 것은 유효하지 않습니다. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "플래시카드", FLASHCARD_EASY_LABEL: "Easy Button Text", FLASHCARD_GOOD_LABEL: "Good Button Text", @@ -113,6 +135,7 @@ export default { INLINE_REVERSED_CARDS_SEPARATOR: "인라인 반전 플래시카드 구분자", MULTILINE_CARDS_SEPARATOR: "여러 줄 플래시카드 구분자", MULTILINE_REVERSED_CARDS_SEPARATOR: "여러 줄 반전 플래시카드 구분자", + MULTILINE_CARDS_END_MARKER: "클로즈와 다중 행 플래시카드의 끝을 나타내는 문자", NOTES: "노트", REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", TAGS_TO_REVIEW: "리뷰에 사용할 태그", @@ -151,7 +174,9 @@ export default { MAX_LINK_CONTRIB_DESC: "링크된 노트의 초기 ease에 대한 가중치가 적용된 ease의 최대 기여도입니다.", LOGGING: "로깅", - DISPLAY_DEBUG_INFO: "디버깅 정보를 개발자 콘솔에 표시하시겠습니까?", + DISPLAY_DEBUG_INFO: "디버깅 정보를 개발자 콘솔에 표시하시겠습니까", + DISPLAY_PARSER_DEBUG_INFO: + "Display debugging information for the parser on the developer console", DATA_LOC: "Data Location", DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", diff --git a/src/lang/locale/pl.ts b/src/lang/locale/pl.ts index cc7d19db..5d585935 100644 --- a/src/lang/locale/pl.ts +++ b/src/lang/locale/pl.ts @@ -38,6 +38,7 @@ export default { STATUS_BAR: "Przeglądaj: ${dueNotesCount} notatek, ${dueFlashcardsCount} fiszek z terminem", SYNC_TIME_TAKEN: "Synchronizacja zajęła ${t}ms", NOTE_IN_IGNORED_FOLDER: "Notatka jest zapisana w folderze zignorowanym (sprawdź ustawienia).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Proszę odpowiednio otagować notatkę do przeglądu (w ustawieniach).", RESPONSE_RECEIVED: "Otrzymano odpowiedź.", NO_DECK_EXISTS: "Nie istnieje talia o nazwie ${deckName}", @@ -57,10 +58,31 @@ export default { // settings.ts SETTINGS_HEADER: "Spaced Repetition - Ustawienia", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: 'Aby uzyskać więcej informacji, sprawdź wiki.', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Foldery do zignorowania", - FOLDERS_TO_IGNORE_DESC: - "Wprowadź ścieżki folderów oddzielone nowymi liniami, np. Szablony Meta/Scripts", + FOLDERS_TO_IGNORE_DESC: `Wprowadź ścieżki folderów oddzielone nowymi liniami, np. Szablony Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Fiszki", FLASHCARD_EASY_LABEL: "Tekst przycisku Łatwe", FLASHCARD_GOOD_LABEL: "Tekst przycisku Średnio trudne", @@ -116,6 +138,7 @@ export default { MULTILINE_CARDS_SEPARATOR: "Separator dla kart zamaskowanych wieloliniowych", MULTILINE_REVERSED_CARDS_SEPARATOR: "Separator dla kart zamaskowanych odwróconych wieloliniowych", + MULTILINE_CARDS_END_MARKER: "Caracteres que denotam o fim de clozes e flashcards multilineares", NOTES: "Notatki", REVIEW_PANE_ON_STARTUP: "Włączyć panel przeglądu notatek przy starcie", TAGS_TO_REVIEW: "Tagi do przeglądu", @@ -155,7 +178,9 @@ export default { MAX_LINK_CONTRIB_DESC: "Maksymalny wkład ważonej łatwości połączonych notatek do początkowej łatwości.", LOGGING: "Logowanie", - DISPLAY_DEBUG_INFO: "Wyświetl informacje debugowania w konsoli deweloperskiej?", // sidebar.ts + DISPLAY_DEBUG_INFO: "Wyświetl informacje debugowania w konsoli deweloperskiej", // sidebar.ts + DISPLAY_PARSER_DEBUG_INFO: + "Display debugging information for the parser on the developer console", DATA_LOC: "Data Location", DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", diff --git a/src/lang/locale/pt-br.ts b/src/lang/locale/pt-br.ts index b7c33083..3d468f7e 100644 --- a/src/lang/locale/pt-br.ts +++ b/src/lang/locale/pt-br.ts @@ -40,6 +40,7 @@ export default { "Revisão: ${dueNotesCount} nota(s), ${dueFlashcardsCount} Carta(s) para colocar em dia", SYNC_TIME_TAKEN: "Sincronização levou ${t}ms", NOTE_IN_IGNORED_FOLDER: "Nota é salva na pasta ignorada (cheque as configurações).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Por favor etiquete a nota apropriadamente para revisar (nas configurações).", RESPONSE_RECEIVED: "Resposta recebida.", NO_DECK_EXISTS: "Nenhum baralho existe para ${deckName}", @@ -58,11 +59,32 @@ export default { MINUTES_STR_IVL_MOBILE: "${interval}min", // settings.ts - SETTINGS_HEADER: "Plugin Spaced Repetition - Configuração", + SETTINGS_HEADER: "Spaced Repetition - Configuração", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: 'Para mais informações, cheque a wiki.', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Pastas para ignorar", - FOLDERS_TO_IGNORE_DESC: - "Insira o caminho das pastas separado por quebras de linha ex: Templates Meta/Scripts", + FOLDERS_TO_IGNORE_DESC: `Insira o caminho das pastas separado por quebras de linha ex: Templates Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Flashcards", FLASHCARD_EASY_LABEL: "Texto do Botão de Fácil", FLASHCARD_GOOD_LABEL: "Texto do Botão de OK", @@ -115,6 +137,7 @@ export default { INLINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards inline reversos", MULTILINE_CARDS_SEPARATOR: "Separador para flashcards de múltiplas linhas", MULTILINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards de múltiplas linhas reversos", + MULTILINE_CARDS_END_MARKER: "Caracteres que denotam o fim de clozes e flashcards multilinha", NOTES: "Notas", REVIEW_PANE_ON_STARTUP: "Habilitar painel de revisão de notas na inicialização", TAGS_TO_REVIEW: "Etiquetas para revisar", @@ -157,7 +180,9 @@ export default { MAX_LINK_CONTRIB_DESC: "Contribuição máxima da facilidade ponderada das notas linkadas à facilidade inicial.", LOGGING: "Logging", - DISPLAY_DEBUG_INFO: "Mostrar informação de debugging no console de desenvolvimento?", + DISPLAY_DEBUG_INFO: "Mostrar informação de debugging no console de desenvolvimento", + DISPLAY_PARSER_DEBUG_INFO: + "Display debugging information for the parser on the developer console", DATA_LOC: "Data Location", DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", diff --git a/src/lang/locale/ru.ts b/src/lang/locale/ru.ts index 980e64cc..8575a01b 100644 --- a/src/lang/locale/ru.ts +++ b/src/lang/locale/ru.ts @@ -47,6 +47,7 @@ export default { STATUS_BAR: "Повторить: ${dueNotesCount} заметок, ${dueFlashcardsCount} карточек", SYNC_TIME_TAKEN: "Синхронизация заняла ${t}мс", NOTE_IN_IGNORED_FOLDER: "Заметка сохранена в игнорируемую папку (см. настройки).", + NOTE_IN_IGNORED_TAGS: "Note is saved with ignored tag (check settings).", PLEASE_TAG_NOTE: "Для изучения, пожалуйста, правильно пометьте заметку тегом (см. настройки).", RESPONSE_RECEIVED: "Ответ получен.", NO_DECK_EXISTS: "Не существует уровня ${deckName}", @@ -66,10 +67,31 @@ export default { // settings.ts SETTINGS_HEADER: "Плагин Spaced Repetition - Настройки", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: 'Для дополнительной информации посетите: wiki.', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "Игнорируемые папки", - FOLDERS_TO_IGNORE_DESC: - "Укажите пути папок, каждый на своей строке, например: Templates Meta/Scripts", + FOLDERS_TO_IGNORE_DESC: `Укажите пути папок, каждый на своей строке, например: Templates Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "Tags to ignore", + TAGS_TO_IGNORE_DESC: `Enter tags separated by newlines i.e. #excalidraw. +Note that this setting is common to both Flashcards and Notes.`, FLASHCARDS: "Карточки", FLASHCARD_EASY_LABEL: 'Текст кнопки "Легко"', FLASHCARD_GOOD_LABEL: 'Текст кнопки "Нормально"', @@ -123,6 +145,7 @@ export default { INLINE_REVERSED_CARDS_SEPARATOR: "Разделитель для обратных внутристрочных карточек", MULTILINE_CARDS_SEPARATOR: "Разделитель для многострочных карточек", MULTILINE_REVERSED_CARDS_SEPARATOR: "Разделитель для обратных многострочных карточек", + MULTILINE_CARDS_END_MARKER: "Символы, обозначающие конец клозов и многострочных карточек", NOTES: "Заметки", REVIEW_PANE_ON_STARTUP: "Включить панель изучения карточек при запуске программы", TAGS_TO_REVIEW: "Теги для изучения", @@ -164,7 +187,9 @@ export default { MAX_LINK_CONTRIB_DESC: 'Максимальный вклад среднего значения "Лёгкости" связанных заметок в начальную "Лёгкость".', LOGGING: "Журналирование", - DISPLAY_DEBUG_INFO: "Отображать отладочную информацию в консоли разработчика?", + DISPLAY_DEBUG_INFO: "Отображать отладочную информацию в консоли разработчика", + DISPLAY_PARSER_DEBUG_INFO: + "Display debugging information for the parser on the developer console", DATA_LOC: "Data Location", DATA_LOC_DESC: "Where to store the data file for spaced repetition items.", diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 25e033a7..334cb74f 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -34,10 +34,11 @@ export default { REVIEW_CARDS_IN_NOTE: "复习此笔记中的卡片", CRAM_CARDS_IN_NOTE: "集中复习此笔记中的卡片", VIEW_STATS: "查看数据", - OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + OPEN_REVIEW_QUEUE_VIEW: "打开侧边栏的笔记复习队列", STATUS_BAR: "复习: ${dueNotesCount} 笔记, ${dueFlashcardsCount} 卡片已到期", SYNC_TIME_TAKEN: "同步时间 ${t}ms", NOTE_IN_IGNORED_FOLDER: "笔记保存在已被忽略的路径中(检查设置选项)。", + NOTE_IN_IGNORED_TAGS: "保存的笔记带有已被忽略的标签(检查设置选项)。", PLEASE_TAG_NOTE: "请将需要复习的笔记中加入正确的标签(检查设置选项)。", RESPONSE_RECEIVED: "反馈已收到", NO_DECK_EXISTS: "没有 ${deckName} 卡组", @@ -57,9 +58,31 @@ export default { // settings.ts SETTINGS_HEADER: "间隔重复插件 - 设置", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: '了解更多, 请点击wiki.', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "忽略此文件夹", - FOLDERS_TO_IGNORE_DESC: "输入文件夹路径,用新建行分隔,例如:Templates Meta/Scripts", + FOLDERS_TO_IGNORE_DESC: `输入文件夹路径,用新建行分隔,例如:Templates Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "忽略此标签", + TAGS_TO_IGNORE_DESC: `输入标签,用新建行分隔,例如: #excalidraw. + 注意卡片与笔记共用该项设置。`, FLASHCARDS: "卡片", FLASHCARD_EASY_LABEL: "“简单”按钮文本", FLASHCARD_GOOD_LABEL: "“记得”按钮文本", @@ -103,6 +126,7 @@ export default { INLINE_REVERSED_CARDS_SEPARATOR: "单行翻转卡片的分隔符", MULTILINE_CARDS_SEPARATOR: "多行卡片的分隔符", MULTILINE_REVERSED_CARDS_SEPARATOR: "多行翻转卡片的分隔符", + MULTILINE_CARDS_END_MARKER: "表示填空和多行闪卡结束的字符", NOTES: "笔记", REVIEW_PANE_ON_STARTUP: "启动时开启笔记复习窗格", TAGS_TO_REVIEW: "复习标签", @@ -136,7 +160,9 @@ export default { MAX_LINK_CONTRIB: "最大链接收益", MAX_LINK_CONTRIB_DESC: "链接笔记的加权掌握程度对原始掌握程度的最大贡献。", LOGGING: "记录中", - DISPLAY_DEBUG_INFO: "在开发者控制台中显示调试信息?", + DISPLAY_DEBUG_INFO: "在开发者控制台中显示调试信息", + DISPLAY_PARSER_DEBUG_INFO: + "Display debugging information for the parser on the developer console", DATA_LOC: "数据位置", DATA_LOC_DESC: "间隔重复数据项的文件的保存位置.", diff --git a/src/lang/locale/zh-tw.ts b/src/lang/locale/zh-tw.ts index ea73d44b..56b2806a 100644 --- a/src/lang/locale/zh-tw.ts +++ b/src/lang/locale/zh-tw.ts @@ -34,10 +34,11 @@ export default { REVIEW_ALL_CARDS: "復習所有筆記中的卡片", CRAM_CARDS_IN_NOTE: "不計難易度復習此筆記中的卡片", VIEW_STATS: "檢視數據", - OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar", + OPEN_REVIEW_QUEUE_VIEW: "打開側邊欄的筆記復習序列", STATUS_BAR: "復習: ${dueNotesCount} 筆記, ${dueFlashcardsCount} 卡片已到期", SYNC_TIME_TAKEN: "同步時間 ${t}ms", NOTE_IN_IGNORED_FOLDER: "筆記儲存在已被忽略的路徑中(檢查設定選項)。", + NOTE_IN_IGNORED_TAGS: "儲存的筆記带有已被忽略的標籤(檢查設定選項)。", PLEASE_TAG_NOTE: "請將需要復習的筆記中加入正確的標籤(檢查設定選項)。", RESPONSE_RECEIVED: "回饋已收到", NO_DECK_EXISTS: "沒有 ${deckName} 牌組", @@ -57,9 +58,31 @@ export default { // settings.ts SETTINGS_HEADER: "間隔重複外掛 - 設定", + GROUP_TAGS_FOLDERS: "Tags & Folders", + GROUP_FLASHCARD_REVIEW: "Flashcard Review", + GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators", + GROUP_DATA_STORAGE: "Storage of Scheduling Data", + GROUP_FLASHCARDS_NOTES: "Flashcards & Notes", + GROUP_CONTRIBUTING: "Contributing", CHECK_WIKI: '瞭解更多, 請點選wiki.', + GITHUB_DISCUSSIONS: + 'Visit the discussions section for Q&A help, feedback, and general discussion.', + GITHUB_ISSUES: + 'Raise an issue here if you have a feature request or a bug-report.', + GITHUB_SOURCE_CODE: + 'Project source code available on GitHub', + CODE_CONTRIBUTION_INFO: + 'Information on code contributions', + TRANSLATION_CONTRIBUTION_INFO: + 'Information on translating the plugin to your language', + PROJECT_CONTRIBUTIONS: + 'Raise an issue here if you have a feature request or a bug-report', FOLDERS_TO_IGNORE: "忽略此資料夾", - FOLDERS_TO_IGNORE_DESC: "輸入資料夾路徑(用換行字元分隔),例如:Templates Meta/Scripts", + FOLDERS_TO_IGNORE_DESC: `輸入資料夾路徑(用換行字元分隔),例如:Templates Meta/Scripts. +Note that this setting is common to both Flashcards and Notes.`, + TAGS_TO_IGNORE: "忽略此標籤", + TAGS_TO_IGNORE_DESC: `輸入標籤,用換行字元分隔,例如: #excalidraw . +注意闪卡與筆記共用該項設置。`, FLASHCARDS: "卡片", FLASHCARD_EASY_LABEL: "簡單按鈕文字", FLASHCARD_GOOD_LABEL: "記得按鈕文字", @@ -103,6 +126,7 @@ export default { INLINE_REVERSED_CARDS_SEPARATOR: "單行反轉卡片的分隔字元", MULTILINE_CARDS_SEPARATOR: "多行卡片的分隔字元", MULTILINE_REVERSED_CARDS_SEPARATOR: "多行翻轉卡片的分隔字元", + MULTILINE_CARDS_END_MARKER: "表示填空和多行闪卡结束的字符", NOTES: "筆記", REVIEW_PANE_ON_STARTUP: "啟動時開啟筆記復習窗格", TAGS_TO_REVIEW: "復習標籤", @@ -135,7 +159,9 @@ export default { MAX_LINK_CONTRIB: "最大鏈接貢獻", MAX_LINK_CONTRIB_DESC: "鏈接筆記的加權掌握程度對原始掌握程度的最大貢獻。", LOGGING: "記錄中", - DISPLAY_DEBUG_INFO: "在開發者控制台中顯示除錯資訊?", + DISPLAY_DEBUG_INFO: "在開發者控制台中顯示除錯資訊", + DISPLAY_PARSER_DEBUG_INFO: + "Display debugging information for the parser on the developer console", DATA_LOC: "數據位置", DATA_LOC_DESC: "間隔重複資料項目的檔的保存位置.", diff --git a/src/main.ts b/src/main.ts index 12dcb8ab..0f47b12c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -41,6 +41,11 @@ import { NoteEaseCalculator } from "./NoteEaseCalculator"; import { DeckTreeStatsCalculator } from "./DeckTreeStatsCalculator"; import { NoteEaseList } from "./NoteEaseList"; import { QuestionPostponementList } from "./QuestionPostponementList"; +import { TextDirection } from "./util/TextDirection"; +import { convertToStringOrEmpty } from "./util/utils"; +import { isEqualOrSubPath } from "./util/utils"; +import { generateParser } from "./generateParser"; +import { setDebugParser } from "./parser"; // https://github.com/martin-jw/obsidian-recall import { DataStore } from "./dataStore/data"; @@ -68,7 +73,8 @@ import { RepetitionItem } from "./dataStore/repetitionItem"; import { IReviewNote } from "./reviewNote/review-note"; import { ReviewView } from "./gui/reviewView"; import { MixQueSet } from "./dataStore/mixQueSet"; -import { isEqualOrSubPath } from "./util/utils"; +import { Tags } from "./tags"; +import { Iadapter } from "./dataStore/adapter"; interface PluginData { settings: SRSettings; @@ -132,6 +138,8 @@ export default class SRPlugin extends Plugin { return SRPlugin._instance; } + private debouncedGenerateParserTimeout: number | null = null; + async onload(): Promise { SRPlugin._instance = this; await this.loadPluginData(); @@ -149,6 +157,7 @@ export default class SRPlugin extends Plugin { if (isVersionNewerThanOther(PLUGIN_VERSION, this.data.settings.previousRelease)) { new ReleaseNotes(this.app, this, obsidianJustInstalled ? null : PLUGIN_VERSION).open(); } + Iadapter.create(this.app); const settings = this.data.settings; this.algorithm = algorithms[settings.algorithm]; @@ -428,9 +437,17 @@ export default class SRPlugin extends Plugin { } let notes: TFile[] = this.app.vault.getMarkdownFiles(); - notes = notes.filter( - (noteFile) => !isIgnoredPath(this.data.settings.noteFoldersToIgnore, noteFile.path), - ); + notes = notes.filter((noteFile) => { + const fileCachedData = this.app.metadataCache.getFileCache(noteFile) || {}; + const tags = getAllTags(fileCachedData) || []; + const isIgnoredTags = this.data.settings.tagsToIgnore.some((igntag) => + tags.some((notetag) => notetag.startsWith(igntag)), + ); + return ( + !isIgnoredPath(this.data.settings.noteFoldersToIgnore, noteFile.path) && + !isIgnoredTags + ); + }); this.linkRank.readLinks(notes); await Promise.all( notes.map(async (noteFile) => { @@ -578,7 +595,11 @@ export default class SRPlugin extends Plugin { this.data.settings, ); - const note: Note = await loader.load(srFile, folderTopicPath); + const note: Note = await loader.load( + this.createSrTFile(noteFile), + this.getObsidianRtlSetting(), + folderTopicPath, + ); ItemTrans.updateCardsSchedbyItems(note, folderTopicPath); note.createMultiCloze(this.data.settings); if (note.hasChanged) { @@ -587,6 +608,13 @@ export default class SRPlugin extends Plugin { return note; } + private getObsidianRtlSetting(): TextDirection { + // Get the direction with Obsidian's own setting + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const v: any = (this.app.vault as any).getConfig("rightToLeft"); + return convertToStringOrEmpty(v) == "true" ? TextDirection.Rtl : TextDirection.Ltr; + } + async saveReviewResponse(note: TFile, response: ReviewResponse): Promise { const settings = this.data.settings; if (isIgnoredPath(settings.noteFoldersToIgnore, note.path)) { @@ -612,11 +640,29 @@ export default class SRPlugin extends Plugin { this.postponeResponse(note, result.sNote); } + // return false if is ignored tagCheck(note: TFile) { const fileCachedData = this.app.metadataCache.getFileCache(note) || {}; const tags = getAllTags(fileCachedData) || []; let shouldIgnore = true; + if ( + this.data.settings.noteFoldersToIgnore.some((folder) => + isEqualOrSubPath(note.path, folder), + ) + ) { + new Notice(t("NOTE_IN_IGNORED_FOLDER")); + return false; + } + if ( + this.data.settings.tagsToIgnore.some((igntag) => + tags.some((notetag) => notetag.startsWith(igntag)), + ) + ) { + new Notice(t("NOTE_IN_IGNORED_TAGS")); + return false; + } + for (const tag of tags) { if ( this.data.settings.tagsToReview.some( @@ -654,13 +700,7 @@ export default class SRPlugin extends Plugin { let interval: number, delayBeforeReview: number; const now: number = Date.now(); // new note - if ( - !( - Object.prototype.hasOwnProperty.call(frontmatter, "sr-due") && - Object.prototype.hasOwnProperty.call(frontmatter, "sr-interval") && - Object.prototype.hasOwnProperty.call(frontmatter, "sr-ease") - ) - ) { + if (this.noteIsNew(note)) { ease = this.linkRank.getContribution(note, this.easeByPath).ease; ease = Math.round(ease); interval = 1.0; @@ -901,12 +941,34 @@ export default class SRPlugin extends Plugin { this.data.settings = Object.assign({}, DEFAULT_SETTINGS, this.data.settings); this.store = new DataStore(this.data.settings, this.manifest.dir); await this.store.load(); + setDebugParser(this.data.settings.showPaserDebugMessages); } async savePluginData(): Promise { await this.saveData(this.data); } + async debouncedGenerateParser(timeout_ms = 250) { + if (this.debouncedGenerateParserTimeout) { + clearTimeout(this.debouncedGenerateParserTimeout); + } + + this.debouncedGenerateParserTimeout = window.setTimeout(async () => { + const parserOptions = { + singleLineCardSeparator: this.data.settings.singleLineCardSeparator, + singleLineReversedCardSeparator: this.data.settings.singleLineReversedCardSeparator, + multilineCardSeparator: this.data.settings.multilineCardSeparator, + multilineReversedCardSeparator: this.data.settings.multilineReversedCardSeparator, + multilineCardEndMarker: this.data.settings.multilineCardEndMarker, + convertHighlightsToClozes: this.data.settings.convertHighlightsToClozes, + convertBoldTextToClozes: this.data.settings.convertBoldTextToClozes, + convertCurlyBracketsToClozes: this.data.settings.convertCurlyBracketsToClozes, + }; + generateParser(parserOptions); + this.debouncedGenerateParserTimeout = null; + }, timeout_ms); + } + private getActiveLeaf(type: string): WorkspaceLeaf | null { const leaves = this.app.workspace.getLeavesOfType(type); if (leaves.length == 0) { diff --git a/src/parser.ts b/src/parser.ts index c604c0fe..a40187d7 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -1,5 +1,51 @@ import { CardType } from "./Question"; +import { Parser } from "peggy"; +import { generateParser } from "./generateParser"; + +export let debugParser = false; + +export interface ParserOptions { + singleLineCardSeparator: string; + singleLineReversedCardSeparator: string; + multilineCardSeparator: string; + multilineReversedCardSeparator: string; + multilineCardEndMarker: string; + convertHighlightsToClozes: boolean; + convertBoldTextToClozes: boolean; + convertCurlyBracketsToClozes: boolean; +} + +export function areParserOptionsEqual(options1: ParserOptions, options2: ParserOptions): boolean { + return ( + options1.singleLineCardSeparator === options2.singleLineCardSeparator && + options1.singleLineReversedCardSeparator === options2.singleLineReversedCardSeparator && + options1.multilineCardSeparator === options2.multilineCardSeparator && + options1.multilineReversedCardSeparator === options2.multilineReversedCardSeparator && + options1.multilineCardEndMarker === options2.multilineCardEndMarker && + options1.convertHighlightsToClozes === options2.convertHighlightsToClozes && + options1.convertBoldTextToClozes === options2.convertBoldTextToClozes && + options1.convertCurlyBracketsToClozes === options2.convertCurlyBracketsToClozes + ); +} + +export function copyParserOptions(src: ParserOptions): ParserOptions { + return { + singleLineCardSeparator: src.singleLineCardSeparator, + singleLineReversedCardSeparator: src.singleLineReversedCardSeparator, + multilineCardSeparator: src.multilineCardSeparator, + multilineReversedCardSeparator: src.multilineReversedCardSeparator, + multilineCardEndMarker: src.multilineCardEndMarker, + convertHighlightsToClozes: src.convertHighlightsToClozes, + convertBoldTextToClozes: src.convertBoldTextToClozes, + convertCurlyBracketsToClozes: src.convertCurlyBracketsToClozes, + }; +} + +export function setDebugParser(value: boolean) { + debugParser = value; +} + export class ParsedQuestionInfo { cardType: CardType; text: string; @@ -10,7 +56,7 @@ export class ParsedQuestionInfo { constructor(cardType: CardType, text: string, firstLineNum: number, lastLineNum: number) { this.cardType = cardType; - this.text = text; + this.text = text; // text.replace(/\s*$/gm, ""); // reproduce the same old behavior as when adding new lines with trimEnd. It is not clear why we need it in real life. However, it is needed to pass the tests. this.firstLineNum = firstLineNum; this.lastLineNum = lastLineNum; } @@ -25,112 +71,51 @@ export class ParsedQuestionInfo { * * It is best that the text does not contain frontmatter, see extractFrontmatter for reasoning * - * Multi-line question with blank lines user workaround: - * As of 3/04/2024 there is no support for including blank lines within multi-line questions - * As a workaround, one user uses a zero width Unicode character - U+200B - * https://github.com/st3v3nmw/obsidian-spaced-repetition/issues/915#issuecomment-2031003092 + * EXCEPTIONS: The underlying peggy parser can throw an exception if the input it receives does + * not conform to the grammar it was built with. However, the grammar used in generating this + * parser, see generateParser(), intentionally matches all input text and therefore + * this function should not throw an exception. * * @param text - The text to extract flashcards from - * @param singlelineCardSeparator - Separator for inline basic cards - * @param singlelineReversedCardSeparator - Separator for inline reversed cards - * @param multilineCardSeparator - Separator for multiline basic cards - * @param multilineReversedCardSeparator - Separator for multiline basic card + * @param options - Plugin's settings * @returns An array of [CardType, card text, line number] tuples */ -export function parseEx( - text: string, - singlelineCardSeparator: string, - singlelineReversedCardSeparator: string, - multilineCardSeparator: string, - multilineReversedCardSeparator: string, - convertHighlightsToClozes: boolean, - convertBoldTextToClozes: boolean, - convertCurlyBracketsToClozes: boolean, -): ParsedQuestionInfo[] { - let cardText = ""; - const cards: ParsedQuestionInfo[] = []; - let cardType: CardType | null = null; - let firstLineNo = 0; - let lastLineNo = 0; - - const lines: string[] = text.replaceAll("\r\n", "\n").split("\n"); - for (let i = 0; i < lines.length; i++) { - const currentLine = lines[i]; - if (currentLine.length === 0) { - if (cardType) { - lastLineNo = i - 1; - cards.push(new ParsedQuestionInfo(cardType, cardText, firstLineNo, lastLineNo)); - cardType = null; - } - - cardText = ""; - continue; - } else if (currentLine.startsWith("")) i++; - i++; - continue; - } - - if (cardText.length > 0) { - cardText += "\n"; - } else if (cardText.length === 0) { - // This could be the first line of a multi line question - firstLineNo = i; - } - if (i + 1 < lines.length && lines[i + 1].length === 0) { - // keep last block line as it is for adding block id - cardText += currentLine; - } else { - cardText += currentLine.trimEnd(); - } - - if ( - currentLine.includes(singlelineReversedCardSeparator) || - currentLine.includes(singlelineCardSeparator) - ) { - cardType = lines[i].includes(singlelineReversedCardSeparator) - ? CardType.SingleLineReversed - : CardType.SingleLineBasic; - cardText = lines[i]; - firstLineNo = i; - if (i + 1 < lines.length && lines[i + 1].startsWith(" `; let settings2 = DEFAULT_SETTINGS; @@ -65,31 +65,31 @@ Q1::A1 var noteFileLoader: NoteFileLoader = new NoteFileLoader(settings2); let file: UnitTestSRFile = new UnitTestSRFile(originalText); - let note: Note = await noteFileLoader.load(file, TopicPath.emptyPath); + let note: Note = await noteFileLoader.load(file, TextDirection.Ltr, TopicPath.emptyPath); note.createMultiCloze(settings2); let deck: Deck = Deck.emptyDeck; note.appendCardsToDeck(deck); - let subdeck: Deck = deck.getDeck(new TopicPath(["flashcards"])); + let subdeck: Deck = deck.getDeck(new TopicPath(["flashcards", "test"])); expect(subdeck.newFlashcards[0].front).toEqual( - `"This is a really very {{interesting}} and ==fascinating== and [......] test"\n`, + "This is a really very {{interesting}} and ==fascinating== and [......] test", ); expect(subdeck.newFlashcards[0].back).toEqual( - `"This is a really very interesting and fascinating and great test"\n`, + "This is a really very interesting and fascinating and great test", ); expect(subdeck.dueFlashcards[0].front).toEqual( - `"This is a really very [.........] and [.........] and [......] test"\n`, + "This is a really very [.........] and [.........] and [......] test", ); expect(subdeck.dueFlashcards[0].back).toEqual( - `"This is a really very interesting and [.........] and [......] test"\n`, + "This is a really very interesting and [.........] and [......] test", ); expect(subdeck.dueFlashcards[1].front).toEqual( - `"This is a really very {{interesting}} and [.........] and [......] test"\n`, + "This is a really very {{interesting}} and [.........] and [......] test", ); expect(subdeck.dueFlashcards[1].back).toEqual( - `"This is a really very interesting and fascinating and [......] test"\n`, + "This is a really very interesting and fascinating and [......] test", ); }); }); @@ -104,7 +104,7 @@ Q3:::A3 `; let file: UnitTestSRFile = new UnitTestSRFile(originalText); - let note: Note = await noteFileLoader.load(file, TopicPath.emptyPath); + let note: Note = await noteFileLoader.load(file, TextDirection.Ltr, TopicPath.emptyPath); await note.writeNoteFile(DEFAULT_SETTINGS); let updatedText: string = file.content; diff --git a/tests/unit/NoteFileLoader.test.ts b/tests/unit/NoteFileLoader.test.ts index ce2c2fbc..c60db472 100644 --- a/tests/unit/NoteFileLoader.test.ts +++ b/tests/unit/NoteFileLoader.test.ts @@ -2,6 +2,7 @@ import { Note } from "src/Note"; import { NoteFileLoader } from "src/NoteFileLoader"; import { TopicPath } from "src/TopicPath"; import { DEFAULT_SETTINGS } from "src/settings"; +import { TextDirection } from "src/util/TextDirection"; import { UnitTestSRFile } from "./helpers/UnitTestSRFile"; var noteFileLoader: NoteFileLoader = new NoteFileLoader(DEFAULT_SETTINGS); @@ -16,7 +17,7 @@ Q3:::A3 `; let file: UnitTestSRFile = new UnitTestSRFile(noteText); - let note: Note = await noteFileLoader.load(file, TopicPath.emptyPath); + let note: Note = await noteFileLoader.load(file, TextDirection.Ltr, TopicPath.emptyPath); expect(note.hasChanged).toEqual(false); }); @@ -29,7 +30,7 @@ Q3:::A3 `; let file: UnitTestSRFile = new UnitTestSRFile(noteText); - let note: Note = await noteFileLoader.load(file, TopicPath.emptyPath); + let note: Note = await noteFileLoader.load(file, TextDirection.Ltr, TopicPath.emptyPath); expect(note.hasChanged).toEqual(true); }); }); diff --git a/tests/unit/NoteParser.test.ts b/tests/unit/NoteParser.test.ts index a7768492..3f62bbc4 100644 --- a/tests/unit/NoteParser.test.ts +++ b/tests/unit/NoteParser.test.ts @@ -4,6 +4,7 @@ import { Note } from "src/Note"; import { Question } from "src/Question"; import { DEFAULT_SETTINGS } from "src/settings"; import { setupStaticDateProvider_20230906 } from "src/util/DateProvider"; +import { TextDirection } from "src/util/TextDirection"; import { UnitTestSRFile } from "./helpers/UnitTestSRFile"; let parser: NoteParser = new NoteParser(DEFAULT_SETTINGS); @@ -21,7 +22,7 @@ Q3::A3 `; let file: UnitTestSRFile = new UnitTestSRFile(noteText); let folderTopicPath = TopicPath.emptyPath; - let note: Note = await parser.parse(file, folderTopicPath); + let note: Note = await parser.parse(file, TextDirection.Ltr, folderTopicPath); let questionList = note.questionList; expect(questionList.length).toEqual(3); }); diff --git a/tests/unit/NoteQuestionParser.test.ts b/tests/unit/NoteQuestionParser.test.ts index a8131d3e..62627a6d 100644 --- a/tests/unit/NoteQuestionParser.test.ts +++ b/tests/unit/NoteQuestionParser.test.ts @@ -7,6 +7,7 @@ import { TopicPath, TopicPathList } from "src/TopicPath"; import { createTest_NoteQuestionParser } from "./SampleItems"; import { ISRFile, frontmatterTagPseudoLineNum } from "src/SRFile"; import { setupStaticDateProvider_20230906 } from "src/util/DateProvider"; +import { TextDirection } from "src/util/TextDirection"; import { UnitTestSRFile } from "./helpers/UnitTestSRFile"; import { Card } from "src/Card"; @@ -28,7 +29,12 @@ describe("No flashcard questions", () => { let noteFile: ISRFile = new UnitTestSRFile(noteText); expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toEqual([]); }); @@ -38,7 +44,12 @@ describe("No flashcard questions", () => { let noteFile: ISRFile = new UnitTestSRFile(noteText); expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toEqual([]); }); }); @@ -70,7 +81,12 @@ A::B }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); @@ -109,7 +125,12 @@ A::B }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); @@ -131,7 +152,12 @@ A::B }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); @@ -160,7 +186,12 @@ In computer-science, a *heap* is a tree-based data-structure, that satisfies the }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); }); @@ -199,7 +230,12 @@ A::B ^d7cee0 }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); @@ -244,7 +280,12 @@ A::B ^d7cee0 }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); @@ -287,7 +328,12 @@ A::B ^d7cee0 }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); @@ -329,7 +375,12 @@ A::B ^d7cee0 }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); }); @@ -344,6 +395,7 @@ Q2::A2 let folderTopicPath: TopicPath = TopicPath.emptyPath; let questionList: Question[] = await parser_ConvertFoldersToDecks.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -361,6 +413,7 @@ Q3::A3 let folderTopicPath: TopicPath = new TopicPath(["flashcards", "science"]); let questionList: Question[] = await parser_ConvertFoldersToDecks.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -386,6 +439,7 @@ Q3::A3 ); let questionList: Question[] = await parser_trackedNoteToDecks.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -412,6 +466,7 @@ Q3::A3 let folderTopicPath: TopicPath = TopicPath.emptyPath; let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -438,9 +493,9 @@ Multiline answer2 `; let noteFile: ISRFile = new UnitTestSRFile(noteText); - let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( noteFile, + TextDirection.Ltr, TopicPath.emptyPath, true, ); @@ -487,6 +542,7 @@ describe("Handling tags within note", () => { let folderTopicPath: TopicPath = new TopicPath(["folder", "subfolder"]); let questionList: Question[] = await parser2.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -504,6 +560,7 @@ Q1::A1 let folderTopicPath: TopicPath = new TopicPath(["folder", "subfolder"]); let questionList: Question[] = await parser2.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -523,6 +580,7 @@ Q1::A1 let folderTopicPath: TopicPath = new TopicPath(["folder", "subfolder"]); let questionList: Question[] = await parser2.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -546,6 +604,7 @@ Q1::A1 let folderTopicPath: TopicPath = TopicPath.emptyPath; let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -583,7 +642,12 @@ Stop trying ==to milk the crowd== for sympathy. // доить толпу }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); @@ -598,6 +662,7 @@ Stop trying ==to milk the crowd== for sympathy. // доить толпу let folderTopicPath: TopicPath = TopicPath.emptyPath; let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -620,6 +685,7 @@ Stop trying ==to milk the crowd== for sympathy. // доить толпу let folderTopicPath: TopicPath = TopicPath.emptyPath; let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -641,6 +707,7 @@ Stop trying ==to milk the crowd== for sympathy. // доить толпу let folderTopicPath: TopicPath = TopicPath.emptyPath; let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -664,6 +731,7 @@ Stop trying ==to milk the crowd== for sympathy. // доить толпу let folderTopicPath: TopicPath = TopicPath.emptyPath; let questionList: Question[] = await parserWithDefaultSettings.createQuestionList( noteFile, + TextDirection.Ltr, folderTopicPath, true, ); @@ -705,7 +773,12 @@ What year was the Taliban Emirate founded?::1996 #flashcards }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); }); @@ -742,11 +815,16 @@ In computer-science, a *heap* is a tree-based data-structure, that satisfies the }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); - test("Multi-line without question (i.e. question is blank)", async () => { + test("Multi-line without question is ignored", async () => { let noteText: string = `--- created: 2024-03-11 10:41 tags: @@ -754,7 +832,11 @@ tags: - data-structure --- ? -In computer-science, a *heap* is a tree-based data-structure, that satisfies the *heap property*. A heap is a complete *binary-tree*! +A1 + +Q2 +? +A2 `; let noteFile: ISRFile = new UnitTestSRFile(noteText); @@ -764,16 +846,23 @@ In computer-science, a *heap* is a tree-based data-structure, that satisfies the questionType: CardType.MultiLineBasic, // Explicitly checking that #data-structure is not included topicPathList: TopicPathList.fromPsv("#flashcards", frontmatterTagPseudoLineNum), + + // No card A1; only card Q2/A2 cards: [ new Card({ - front: "", - back: "In computer-science, a *heap* is a tree-based data-structure, that satisfies the *heap property*. A heap is a complete *binary-tree*!", + front: "Q2", + back: "A2", }), ], }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); @@ -813,7 +902,12 @@ A::B }, ]; expect( - await parserWithDefaultSettings.createQuestionList(noteFile, folderTopicPath, true), + await parserWithDefaultSettings.createQuestionList( + noteFile, + TextDirection.Ltr, + folderTopicPath, + true, + ), ).toMatchObject(expected); }); }); diff --git a/tests/unit/Question.test.ts b/tests/unit/Question.test.ts index 8ba2928f..e6c65c9b 100644 --- a/tests/unit/Question.test.ts +++ b/tests/unit/Question.test.ts @@ -1,6 +1,7 @@ import { TopicPath } from "src/TopicPath"; import { DEFAULT_SETTINGS, SRSettings } from "src/settings"; import { Question, QuestionText } from "src/Question"; +import { TextDirection } from "src/util/TextDirection"; let settings_cardCommentOnSameLine: SRSettings = { ...DEFAULT_SETTINGS }; settings_cardCommentOnSameLine.cardCommentOnSameLine = true; @@ -13,7 +14,7 @@ describe("Question", () => { "```\nprint('Hello World!')\nprint('Howdy?')\nlambda x: x[0]\n```"; let question: Question = new Question({ - questionText: new QuestionText(text, null, text, null), + questionText: new QuestionText(text, null, text, TextDirection.Ltr, null), }); expect(question.getHtmlCommentSeparator(DEFAULT_SETTINGS)).toEqual("\n"); @@ -24,7 +25,7 @@ describe("Question", () => { let text: string = "Q1::A1"; let question: Question = new Question({ - questionText: new QuestionText(text, null, text, null), + questionText: new QuestionText(text, null, text, TextDirection.Ltr, null), }); expect(question.getHtmlCommentSeparator(DEFAULT_SETTINGS)).toEqual("\n"); diff --git a/tests/unit/SampleItems.ts b/tests/unit/SampleItems.ts index da071b5b..b928032c 100644 --- a/tests/unit/SampleItems.ts +++ b/tests/unit/SampleItems.ts @@ -7,6 +7,7 @@ import { CardType, Question } from "src/Question"; import { CardFrontBack, CardFrontBackUtil } from "src/QuestionType"; import { DEFAULT_SETTINGS, SRSettings } from "src/settings"; import { TopicPath } from "src/TopicPath"; +import { TextDirection } from "src/util/TextDirection"; import { UnitTestSRFile } from "./helpers/UnitTestSRFile"; import { CardOrder, DeckOrder, DeckTreeIterator } from "src/DeckTreeIterator"; @@ -70,7 +71,7 @@ Q3::A3`; ): Promise { let deck: Deck = new Deck("Root", null); let noteParser: NoteParser = createTest_NoteParser(); - let note: Note = await noteParser.parse(file, folderTopicPath); + let note: Note = await noteParser.parse(file, TextDirection.Ltr, folderTopicPath); note.appendCardsToDeck(deck); return deck; } diff --git a/tests/unit/helpers/UnitTestSRFile.ts b/tests/unit/helpers/UnitTestSRFile.ts index 4878ca82..4c498496 100644 --- a/tests/unit/helpers/UnitTestSRFile.ts +++ b/tests/unit/helpers/UnitTestSRFile.ts @@ -1,6 +1,7 @@ import { TagCache } from "obsidian"; import { ISRFile } from "src/SRFile"; import { unitTest_GetAllTagsFromTextEx } from "./UnitTestHelper"; +import { TextDirection } from "src/util/TextDirection"; export class UnitTestSRFile implements ISRFile { content: string; @@ -32,6 +33,10 @@ export class UnitTestSRFile implements ISRFile { return []; } + getTextDirection(): TextDirection { + return TextDirection.Unspecified; + } + async read(): Promise { return this.content; } diff --git a/tests/unit/parser.test.ts b/tests/unit/parser.test.ts index 9d2c7b6f..3f32bca7 100644 --- a/tests/unit/parser.test.ts +++ b/tests/unit/parser.test.ts @@ -1,41 +1,27 @@ -import { parseEx, ParsedQuestionInfo } from "src/parser"; +import { parseEx, ParsedQuestionInfo, setDebugParser } from "src/parser"; import { CardType } from "src/Question"; +import { ParserOptions } from "src/parser"; -const defaultArgs: [string, string, string, string, boolean, boolean, boolean] = [ - "::", - ":::", - "?", - "??", - true, - true, - true, -]; +const parserOptions: ParserOptions = { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "", + convertHighlightsToClozes: true, + convertBoldTextToClozes: true, + convertCurlyBracketsToClozes: true, +}; /** * This function is a small wrapper around parseEx used for testing only. * Created when the actual parser changed from returning [CardType, string, number, number] to ParsedQuestionInfo. * It's purpose is to minimise changes to all the test cases here during the parser()->parserEx() change. */ -function parse( - text: string, - singlelineCardSeparator: string, - singlelineReversedCardSeparator: string, - multilineCardSeparator: string, - multilineReversedCardSeparator: string, - convertHighlightsToClozes: boolean, - convertBoldTextToClozes: boolean, - convertCurlyBracketsToClozes: boolean, -): [CardType, string, number, number][] { - const list: ParsedQuestionInfo[] = parseEx( - text, - singlelineCardSeparator, - singlelineReversedCardSeparator, - multilineCardSeparator, - multilineReversedCardSeparator, - convertHighlightsToClozes, - convertBoldTextToClozes, - convertCurlyBracketsToClozes, - ); +function parse(text: string, options: ParserOptions): [CardType, string, number, number][] { + // for testing purposes, generate parser each time, overwriting the default one + + const list: ParsedQuestionInfo[] = parseEx(text, options); const result: [CardType, string, number, number][] = []; for (const item of list) { result.push([item.cardType, item.text, item.firstLineNum, item.lastLineNum]); @@ -44,60 +30,60 @@ function parse( } test("Test parsing of single line basic cards", () => { - expect(parse("Question::Answer", ...defaultArgs)).toEqual([ + expect(parse("Question::Answer", parserOptions)).toEqual([ [CardType.SingleLineBasic, "Question::Answer", 0, 0], ]); - expect(parse("Question::Answer\n", ...defaultArgs)).toEqual([ + expect(parse("Question::Answer\n", parserOptions)).toEqual([ [CardType.SingleLineBasic, "Question::Answer\n", 0, 1], ]); - expect(parse("Question::Answer ", ...defaultArgs)).toEqual([ + expect(parse("Question::Answer ", parserOptions)).toEqual([ [CardType.SingleLineBasic, "Question::Answer ", 0, 0], ]); - expect(parse("Some text before\nQuestion ::Answer", ...defaultArgs)).toEqual([ + expect(parse("Some text before\nQuestion ::Answer", parserOptions)).toEqual([ [CardType.SingleLineBasic, "Question ::Answer", 1, 1], ]); - expect(parse("#Title\n\nQ1::A1\nQ2:: A2", ...defaultArgs)).toEqual([ + expect(parse("#Title\n\nQ1::A1\nQ2:: A2", parserOptions)).toEqual([ [CardType.SingleLineBasic, "Q1::A1", 2, 2], [CardType.SingleLineBasic, "Q2:: A2", 3, 3], ]); - expect(parse("#flashcards/science Question ::Answer", ...defaultArgs)).toEqual([ + expect(parse("#flashcards/science Question ::Answer", parserOptions)).toEqual([ [CardType.SingleLineBasic, "#flashcards/science Question ::Answer", 0, 0], ]); }); test("Test parsing of single line reversed cards", () => { - expect(parse("Question:::Answer", ...defaultArgs)).toEqual([ + expect(parse("Question:::Answer", parserOptions)).toEqual([ [CardType.SingleLineReversed, "Question:::Answer", 0, 0], ]); - expect(parse("Some text before\nQuestion :::Answer", ...defaultArgs)).toEqual([ + expect(parse("Some text before\nQuestion :::Answer", parserOptions)).toEqual([ [CardType.SingleLineReversed, "Question :::Answer", 1, 1], ]); - expect(parse("#Title\n\nQ1:::A1\nQ2::: A2", ...defaultArgs)).toEqual([ + expect(parse("#Title\n\nQ1:::A1\nQ2::: A2", parserOptions)).toEqual([ [CardType.SingleLineReversed, "Q1:::A1", 2, 2], [CardType.SingleLineReversed, "Q2::: A2", 3, 3], ]); }); test("Test parsing of multi line basic cards", () => { - expect(parse("Question\n?\nAnswer", ...defaultArgs)).toEqual([ + expect(parse("Question\n?\nAnswer", parserOptions)).toEqual([ [CardType.MultiLineBasic, "Question\n?\nAnswer", 0, 2], ]); - expect(parse("Question\n? \nAnswer", ...defaultArgs)).toEqual([ + expect(parse("Question\n? \nAnswer", parserOptions)).toEqual([ [CardType.MultiLineBasic, "Question\n?\nAnswer", 0, 2], ]); - expect(parse("Question\n?\nAnswer ", ...defaultArgs)).toEqual([ + expect(parse("Question\n?\nAnswer ", parserOptions)).toEqual([ [CardType.MultiLineBasic, "Question\n?\nAnswer ", 0, 2], ]); - expect(parse("Question\n?\nAnswer\n", ...defaultArgs)).toEqual([ + expect(parse("Question\n?\nAnswer\n", parserOptions)).toEqual([ [CardType.MultiLineBasic, "Question\n?\nAnswer\n", 0, 3], ]); - expect(parse("Question line 1\nQuestion line 2\n?\nAnswer", ...defaultArgs)).toEqual([ + expect(parse("Question line 1\nQuestion line 2\n?\nAnswer", parserOptions)).toEqual([ [CardType.MultiLineBasic, "Question line 1\nQuestion line 2\n?\nAnswer", 0, 3], ]); - expect(parse("Question\n?\nAnswer line 1\nAnswer line 2", ...defaultArgs)).toEqual([ + expect(parse("Question\n?\nAnswer line 1\nAnswer line 2", parserOptions)).toEqual([ [CardType.MultiLineBasic, "Question\n?\nAnswer line 1\nAnswer line 2", 0, 3], ]); - expect(parse("#Title\n\nLine0\nQ1\n?\nA1\nAnswerExtra\n\nQ2\n?\nA2", ...defaultArgs)).toEqual([ + expect(parse("#Title\n\nLine0\nQ1\n?\nA1\nAnswerExtra\n\nQ2\n?\nA2", parserOptions)).toEqual([ [ CardType.MultiLineBasic, "Line0\nQ1\n?\nA1\nAnswerExtra", @@ -106,101 +92,229 @@ test("Test parsing of multi line basic cards", () => { ], [CardType.MultiLineBasic, "Q2\n?\nA2", 8, 10], ]); - expect(parse("#flashcards/tag-on-previous-line\nQuestion\n?\nAnswer", ...defaultArgs)).toEqual([ + expect(parse("#flashcards/tag-on-previous-line\nQuestion\n?\nAnswer", parserOptions)).toEqual([ [CardType.MultiLineBasic, "#flashcards/tag-on-previous-line\nQuestion\n?\nAnswer", 0, 3], ]); + expect( + parse("Question\n?\nAnswer line 1\nAnswer line 2\n\n---", { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "---", + convertHighlightsToClozes: false, + convertBoldTextToClozes: true, + convertCurlyBracketsToClozes: false, + }), + ).toEqual([[CardType.MultiLineBasic, "Question\n?\nAnswer line 1\nAnswer line 2", 0, 4]]); + expect( + parse( + "Question 1\n?\nAnswer line 1\nAnswer line 2\n\n---\nQuestion 2\n?\nAnswer line 1\nAnswer line 2\n---\n", + { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "---", + convertHighlightsToClozes: false, + convertBoldTextToClozes: true, + convertCurlyBracketsToClozes: false, + }, + ), + ).toEqual([ + [CardType.MultiLineBasic, "Question 1\n?\nAnswer line 1\nAnswer line 2", 0, 4], + [CardType.MultiLineBasic, "Question 2\n?\nAnswer line 1\nAnswer line 2", 6, 9], + ]); + expect( + parse( + "Question 1\n?\nAnswer line 1\nAnswer line 2\n\n---\nQuestion with empty line after question mark\n?\n\nAnswer line 1\nAnswer line 2\n---\n", + { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "---", + convertHighlightsToClozes: false, + convertBoldTextToClozes: true, + convertCurlyBracketsToClozes: false, + }, + ), + ).toEqual([ + [CardType.MultiLineBasic, "Question 1\n?\nAnswer line 1\nAnswer line 2", 0, 4], + [ + CardType.MultiLineBasic, + "Question with empty line after question mark\n?\n\nAnswer line 1\nAnswer line 2", + 6, + 10, + ], + ]); }); test("Test parsing of multi line reversed cards", () => { - expect(parse("Question\n??\nAnswer", ...defaultArgs)).toEqual([ + expect(parse("Question\n??\nAnswer", parserOptions)).toEqual([ [CardType.MultiLineReversed, "Question\n??\nAnswer", 0, 2], ]); - expect(parse("Question line 1\nQuestion line 2\n??\nAnswer", ...defaultArgs)).toEqual([ + expect(parse("Question line 1\nQuestion line 2\n??\nAnswer", parserOptions)).toEqual([ [CardType.MultiLineReversed, "Question line 1\nQuestion line 2\n??\nAnswer", 0, 3], ]); - expect(parse("Question\n??\nAnswer line 1\nAnswer line 2", ...defaultArgs)).toEqual([ + expect(parse("Question\n??\nAnswer line 1\nAnswer line 2", parserOptions)).toEqual([ [CardType.MultiLineReversed, "Question\n??\nAnswer line 1\nAnswer line 2", 0, 3], ]); - expect(parse("#Title\n\nLine0\nQ1\n??\nA1\nAnswerExtra\n\nQ2\n??\nA2", ...defaultArgs)).toEqual( + expect(parse("#Title\n\nLine0\nQ1\n??\nA1\nAnswerExtra\n\nQ2\n??\nA2", parserOptions)).toEqual([ [ - [ - CardType.MultiLineReversed, - "Line0\nQ1\n??\nA1\nAnswerExtra", - /* Line0 */ 2, - /* AnswerExtra */ 6, - ], - [CardType.MultiLineReversed, "Q2\n??\nA2", 8, 10], + CardType.MultiLineReversed, + "Line0\nQ1\n??\nA1\nAnswerExtra", + /* Line0 */ 2, + /* AnswerExtra */ 6, ], - ); + [CardType.MultiLineReversed, "Q2\n??\nA2", 8, 10], + ]); + expect( + parse("Question\n??\nAnswer line 1\nAnswer line 2\n\n---", { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "---", + convertHighlightsToClozes: true, + convertBoldTextToClozes: true, + convertCurlyBracketsToClozes: true, + }), + ).toEqual([[CardType.MultiLineReversed, "Question\n??\nAnswer line 1\nAnswer line 2", 0, 4]]); + expect( + parse( + "Question 1\n?\nAnswer line 1\nAnswer line 2\n\n---\nQuestion 2\n??\nAnswer line 1\nAnswer line 2\n---\n", + { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "---", + convertHighlightsToClozes: true, + convertBoldTextToClozes: true, + convertCurlyBracketsToClozes: true, + }, + ), + ).toEqual([ + [CardType.MultiLineBasic, "Question 1\n?\nAnswer line 1\nAnswer line 2", 0, 4], + [CardType.MultiLineReversed, "Question 2\n??\nAnswer line 1\nAnswer line 2", 6, 9], + ]); }); test("Test parsing of cloze cards", () => { // ==highlights== - expect(parse("cloze ==deletion== test", ...defaultArgs)).toEqual([ + expect(parse("cloze ==deletion== test", parserOptions)).toEqual([ [CardType.Cloze, "cloze ==deletion== test", 0, 0], ]); - expect(parse("cloze ==deletion== test\n", ...defaultArgs)).toEqual([ + expect(parse("cloze ==deletion== test\n", parserOptions)).toEqual([ [CardType.Cloze, "cloze ==deletion== test\n", 0, 1], ]); - expect(parse("cloze ==deletion== test ", ...defaultArgs)).toEqual([ + expect(parse("cloze ==deletion== test ", parserOptions)).toEqual([ [CardType.Cloze, "cloze ==deletion== test ", 0, 0], ]); - expect(parse("==this== is a ==deletion==\n", ...defaultArgs)).toEqual([ + expect(parse("==this== is a ==deletion==\n", parserOptions)).toEqual([ [CardType.Cloze, "==this== is a ==deletion==", 0, 0], ]); expect( parse( "some text before\n\na deletion on\nsuch ==wow==\n\n" + "many text\nsuch surprise ==wow== more ==text==\nsome text after\n\nHmm", - ...defaultArgs, + parserOptions, ), ).toEqual([ [CardType.Cloze, "a deletion on\nsuch ==wow==", 2, 3], [CardType.Cloze, "many text\nsuch surprise ==wow== more ==text==\nsome text after", 5, 7], ]); - expect(parse("srdf ==", ...defaultArgs)).toEqual([]); - expect(parse("lorem ipsum ==p\ndolor won==", ...defaultArgs)).toEqual([]); - expect(parse("lorem ipsum ==dolor won=", ...defaultArgs)).toEqual([]); + expect(parse("srdf ==", parserOptions)).toEqual([]); + expect(parse("lorem ipsum ==p\ndolor won==", parserOptions)).toEqual([]); + expect(parse("lorem ipsum ==dolor won=", parserOptions)).toEqual([]); // ==highlights== turned off - expect(parse("cloze ==deletion== test", "::", ":::", "?", "??", false, true, false)).toEqual( - [], - ); + expect( + parse("cloze ==deletion== test", { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "", + convertHighlightsToClozes: false, + convertBoldTextToClozes: true, + convertCurlyBracketsToClozes: false, + }), + ).toEqual([]); // **bolded** - expect(parse("cloze **deletion** test", ...defaultArgs)).toEqual([ + expect(parse("cloze **deletion** test", parserOptions)).toEqual([ [CardType.Cloze, "cloze **deletion** test", 0, 0], ]); - expect(parse("cloze **deletion** test\n", ...defaultArgs)).toEqual([ + expect(parse("cloze **deletion** test\n", parserOptions)).toEqual([ [CardType.Cloze, "cloze **deletion** test\n", 0, 1], ]); - expect(parse("cloze **deletion** test ", ...defaultArgs)).toEqual([ + expect(parse("cloze **deletion** test ", parserOptions)).toEqual([ [CardType.Cloze, "cloze **deletion** test ", 0, 0], ]); - expect(parse("**this** is a **deletion**\n", ...defaultArgs)).toEqual([ + expect(parse("**this** is a **deletion**\n", parserOptions)).toEqual([ [CardType.Cloze, "**this** is a **deletion**", 0, 0], ]); expect( parse( "some text before\n\na deletion on\nsuch **wow**\n\n" + "many text\nsuch surprise **wow** more **text**\nsome text after\n\nHmm", - ...defaultArgs, + parserOptions, ), ).toEqual([ [CardType.Cloze, "a deletion on\nsuch **wow**", 2, 3], [CardType.Cloze, "many text\nsuch surprise **wow** more **text**\nsome text after", 5, 7], ]); - expect(parse("srdf **", ...defaultArgs)).toEqual([]); - expect(parse("lorem ipsum **p\ndolor won**", ...defaultArgs)).toEqual([]); - expect(parse("lorem ipsum **dolor won*", ...defaultArgs)).toEqual([]); + expect(parse("srdf **", parserOptions)).toEqual([]); + expect(parse("lorem ipsum **p\ndolor won**", parserOptions)).toEqual([]); + expect(parse("lorem ipsum **dolor won*", parserOptions)).toEqual([]); // **bolded** turned off - expect(parse("cloze **deletion** test", "::", ":::", "?", "??", true, false, false)).toEqual( - [], - ); + expect( + parse("cloze **deletion** test", { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "", + convertHighlightsToClozes: true, + convertBoldTextToClozes: false, + convertCurlyBracketsToClozes: false, + }), + ).toEqual([]); // both - expect(parse("cloze **deletion** test ==another deletion==!", ...defaultArgs)).toEqual([ + expect(parse("cloze **deletion** test ==another deletion==!", parserOptions)).toEqual([ [CardType.Cloze, "cloze **deletion** test ==another deletion==!", 0, 0], ]); + + expect( + parse( + "Test 1\nTest 2\nThis is a close with ===secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.\n\n---\n\nTest 3\nTest 4\nThis is a close with ===super secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.\n\n---\n\nHere is some more text.", + { + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + multilineCardEndMarker: "---", + convertHighlightsToClozes: true, + convertBoldTextToClozes: false, + convertCurlyBracketsToClozes: false, + }, + ), + ).toEqual([ + [ + CardType.Cloze, + "Test 1\nTest 2\nThis is a close with ===secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.", + 0, + 7, + ], + [ + CardType.Cloze, + "Test 3\nTest 4\nThis is a close with ===super secret=== text.\nWith this extra lines\n\nAnd more here.\nAnd even more.", + 10, + 17, + ], + ]); }); test("Test parsing of a mix of card types", () => { @@ -210,7 +324,7 @@ test("Test parsing of a mix of card types", () => { "Duis magna arcu, eleifend rhoncus ==euismod non,==\nlaoreet vitae enim.\n\n" + "Fusce placerat::velit in pharetra gravida\n\n" + "Donec dapibus ullamcorper aliquam.\n??\nDonec dapibus ullamcorper aliquam.\n", - ...defaultArgs, + parserOptions, ), ).toEqual([ [ @@ -237,7 +351,7 @@ test("Test codeblocks", () => { parse( "How do you ... Python?\n?\n" + "```\nprint('Hello World!')\nprint('Howdy?')\nlambda x: x[0]\n```", - ...defaultArgs, + parserOptions, ), ).toEqual([ [ @@ -254,7 +368,7 @@ test("Test codeblocks", () => { parse( "How do you ... Python?\n?\n" + "```\nprint('Hello World!')\n\n\nprint('Howdy?')\n\nlambda x: x[0]\n```", - ...defaultArgs, + parserOptions, ), ).toEqual([ [ @@ -279,7 +393,7 @@ test("Test codeblocks", () => { "print('hello world')\n" + "~~~\n" + "````", - ...defaultArgs, + parserOptions, ), ).toEqual([ [ @@ -302,14 +416,59 @@ test("Test codeblocks", () => { test("Test not parsing cards in HTML comments", () => { expect( - parse("\n-->", ...defaultArgs), + parse("\n-->", parserOptions), ).toEqual([]); expect( parse( "\n\n-->", - ...defaultArgs, + parserOptions, ), ).toEqual([]); - expect(parse("", ...defaultArgs)).toEqual([]); - expect(parse("", ...defaultArgs)).toEqual([]); + expect(parse("", parserOptions)).toEqual([]); + expect(parse("", parserOptions)).toEqual([]); +}); + +test("Unexpected Error case", () => { + // replace console error log with an empty mock function + const errorSpy = jest.spyOn(global.console, "error").mockImplementation(() => {}); + + expect(parseEx("", null)).toStrictEqual([]); + + expect(errorSpy).toHaveBeenCalled(); + expect(errorSpy.mock.calls[0][0]).toMatch(/^Unexpected error:.*/); + + // clear the mock + errorSpy.mockClear(); + + expect(parseEx("", parserOptions)).toStrictEqual([]); + expect(errorSpy).toHaveBeenCalledTimes(0); + + // restore original console error log + errorSpy.mockRestore(); +}); + +describe("Parser debug messages", () => { + test("Messages disabled", () => { + // replace console error log with an empty mock function + const logSpy = jest.spyOn(global.console, "log").mockImplementation(() => {}); + setDebugParser(false); + + parseEx("", parserOptions); + expect(logSpy).toHaveBeenCalledTimes(0); + + // restore original console error log + logSpy.mockRestore(); + }); + + test("Messages enabled", () => { + // replace console error log with an empty mock function + const logSpy = jest.spyOn(global.console, "log").mockImplementation(() => {}); + setDebugParser(true); + + parseEx("", parserOptions); + expect(logSpy).toHaveBeenCalled(); + + // restore original console error log + logSpy.mockRestore(); + }); }); diff --git a/tests/unit/util/utils.test.ts b/tests/unit/util/utils.test.ts index 89dd3c3c..c2c3de25 100644 --- a/tests/unit/util/utils.test.ts +++ b/tests/unit/util/utils.test.ts @@ -1,5 +1,6 @@ import { YAML_FRONT_MATTER_REGEX } from "src/constants"; import { + convertToStringOrEmpty, extractFrontmatter, findLineIndexOfSearchStringIgnoringWs, isEqualOrSubPath, @@ -79,6 +80,28 @@ $$\\huge F_g=\\frac {G m_1 m_2}{d^2}$$ }); }); +describe("convertToStringOrEmpty", () => { + test("undefined returns empty string", () => { + expect(convertToStringOrEmpty(undefined)).toEqual(""); + }); + + test("null returns empty string", () => { + expect(convertToStringOrEmpty(null)).toEqual(""); + }); + + test("empty string returns empty string", () => { + expect(convertToStringOrEmpty("")).toEqual(""); + }); + + test("string returned unchanged", () => { + expect(convertToStringOrEmpty("Hello")).toEqual("Hello"); + }); + + test("number is converted to string", () => { + expect(convertToStringOrEmpty(5)).toEqual("5"); + }); +}); + function createTestStr1(sep: string): string { return `---${sep}sr-due: 2024-08-10${sep}sr-interval: 273${sep}sr-ease: 309${sep}---`; } @@ -178,6 +201,176 @@ ${content}`; ${content}`; expect(c).toEqual(expectedContent); }); + + test("With frontmatter and content (Horizontal line)", () => { + const frontmatter: string = `--- +sr-due: 2024-01-17 +sr-interval: 16 +sr-ease: 278 +tags: + - flashcards/aws + - flashcards/datascience +---`; + const frontmatterBlankedOut: string = ` + + + + + + +`; + const content: string = `#flashcards/science/chemistry + + +--- +# Questions +--- + + +Chemistry Question from file underelephant 4A::goodby + + + +Chemistry Question from file underdog 4B::goodby + + + +--- + +Chemistry Question from file underdog 4C::goodby + + + +This single {{question}} turns into {{3 separate}} {{cards}} + + + +---`; + + const text: string = `${frontmatter} +${content}`; + const expectedContent: string = `${frontmatterBlankedOut} +${content}`; + + const [f, c] = extractFrontmatter(text); + expect(f).toEqual(frontmatter); + expect(c).toEqual(expectedContent); + }); + + test("With frontmatter and content (Horizontal line newLine)", () => { + const frontmatter: string = `--- +sr-due: 2024-01-17 +sr-interval: 16 +sr-ease: 278 +tags: + - flashcards/aws + - flashcards/datascience +---`; + const frontmatterBlankedOut: string = ` + + + + + + +`; + const content: string = `#flashcards/science/chemistry + + +--- +# Questions +--- + + +Chemistry Question from file underelephant 4A::goodby + + + +Chemistry Question from file underdog 4B::goodby + + + +--- + +Chemistry Question from file underdog 4C::goodby + + + +This single {{question}} turns into {{3 separate}} {{cards}} + + + +--- +`; + + const text: string = `${frontmatter} +${content}`; + const expectedContent: string = `${frontmatterBlankedOut} +${content}`; + + const [f, c] = extractFrontmatter(text); + expect(f).toEqual(frontmatter); + expect(c).toEqual(expectedContent); + }); + + test("With frontmatter and content (Horizontal line codeblock)", () => { + const frontmatter: string = `--- +sr-due: 2024-01-17 +sr-interval: 16 +sr-ease: 278 +tags: + - flashcards/aws + - flashcards/datascience +---`; + const frontmatterBlankedOut: string = ` + + + + + + +`; + const content: string = [ + "```", + "---", + "```", + "#flashcards/science/chemistry", + "# Questions", + " ", + "", + "Chemistry Question from file underelephant 4A::goodby", + "", + "", + "", + "Chemistry Question from file underdog 4B::goodby", + "", + "", + "```", + "---", + "```", + "", + "Chemistry Question from file underdog 4C::goodby", + "", + "", + "", + "This single {{question}} turns into {{3 separate}} {{cards}}", + "", + "", + "", + "```", + "---", + "```", + ].join("\n"); + + const text: string = `${frontmatter} +${content}`; + const expectedContent: string = `${frontmatterBlankedOut} +${content}`; + + const [f, c] = extractFrontmatter(text); + expect(f).toEqual(frontmatter); + expect(c).toEqual(expectedContent); + }); }); describe("findLineIndexOfSearchStringIgnoringWs", () => { @@ -303,6 +496,14 @@ describe("isEqualOrSubPath", () => { true, ); }); + + test("Multiple separators", () => { + expect(isEqualOrSubPath(root + sep + sep, root)).toBe(true); + expect(isEqualOrSubPath(root, root + sep + sep)).toBe(true); + expect(isEqualOrSubPath(root, root + sep + sep + sub_1)).toBe(false); + expect(isEqualOrSubPath(root + sep + sep + sub_1, root)).toBe(true); + expect(isEqualOrSubPath(root + winSep + linSep + sub_1, root)).toBe(true); + }); }); describe("Linux", () => { const sep = linSep; @@ -352,5 +553,20 @@ describe("isEqualOrSubPath", () => { true, ); }); + + test("Multiple separators", () => { + expect(isEqualOrSubPath(root + sep + sep, root)).toBe(true); + expect(isEqualOrSubPath(root, root + sep + sep)).toBe(true); + expect(isEqualOrSubPath(root, root + sep + sep + sub_1)).toBe(false); + expect(isEqualOrSubPath(root + sep + sep + sub_1, root)).toBe(true); + expect(isEqualOrSubPath(root + winSep + linSep + sub_1, root)).toBe(true); + }); + }); + test("Examples", () => { + expect(isEqualOrSubPath("/user/docs/letter.txt", "/user/docs")).toBe(true); + expect(isEqualOrSubPath("/user/docs", "/user/docs")).toBe(true); + expect(isEqualOrSubPath("/user/docs/letter.txt", "/user/projects")).toBe(false); + expect(isEqualOrSubPath("/User/Docs", "/user/docs")).toBe(true); + expect(isEqualOrSubPath("C:\\user\\docs", "C:/user/docs")).toBe(true); }); }); From daf7a120b47ae12cf17cda014448b8ffafaf758d Mon Sep 17 00:00:00 2001 From: ishiko Date: Tue, 3 Sep 2024 00:33:25 +1000 Subject: [PATCH 153/155] Feat/Add two feature toggles (#78) fsrs v5 setting support `enable_short_term` and `enable_fuzz`. --- package.json | 2 +- pnpm-lock.yaml | 12 ++++----- src/algorithms/fsrs.ts | 53 ++++++++++++++++++++++++++++++++++++++++ src/lang/locale/ar.ts | 6 +++++ src/lang/locale/cz.ts | 6 +++++ src/lang/locale/de.ts | 6 +++++ src/lang/locale/en.ts | 6 +++++ src/lang/locale/es.ts | 6 +++++ src/lang/locale/it.ts | 6 +++++ src/lang/locale/ja.ts | 6 +++++ src/lang/locale/ko.ts | 6 +++++ src/lang/locale/pl.ts | 6 +++++ src/lang/locale/pt-br.ts | 6 +++++ src/lang/locale/ru.ts | 6 +++++ src/lang/locale/zh-cn.ts | 5 ++++ src/lang/locale/zh-tw.ts | 5 ++++ 16 files changed, 136 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 3871ceaf..55af6b09 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "moment": "^2.30.1", "obsidian": "^1.6.6", "prettier": "^3.3.3", - "ts-fsrs": "^4.1.2", + "ts-fsrs": "^4.1.3", "ts-jest": "^29.2.5", "tslib": "2.6.1", "typescript": "5.1.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e59ffa4f..0595340e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ dependencies: peggy: specifier: ^4.0.3 version: 4.0.3 + ts-fsrs: + specifier: 4.1.3 + version: 4.1.3 devDependencies: '@popperjs/core': @@ -82,9 +85,6 @@ devDependencies: prettier: specifier: ^3.3.3 version: 3.3.3 - ts-fsrs: - specifier: ^4.1.2 - version: 4.1.2 ts-jest: specifier: ^29.2.5 version: 29.2.5(@babel/core@7.25.2)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6) @@ -5755,10 +5755,10 @@ packages: typescript: 5.1.6 dev: true - /ts-fsrs@4.1.2: - resolution: {integrity: sha512-sHmx2m+RWG48zMbkwAfZ3NHJwuTNd2HvgtsrERJzGuQVeSTguN1V+rBeSCP47r0JusWK1Etu/+BJT63OIwMauw==} + /ts-fsrs@4.1.3: + resolution: {integrity: sha512-UKZnDtATocNnZy/BaEE328Tn7DpEEl2Z/ocKqrGsvw1RgGw3B5i9OM/i5Gs87sXNP2eKOBqVMgw2vmiGY+4TVA==} engines: {node: '>=18.0.0'} - dev: true + dev: false /ts-jest@29.2.5(@babel/core@7.25.2)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6): resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} diff --git a/src/algorithms/fsrs.ts b/src/algorithms/fsrs.ts index a3cbd2bf..091ad7ad 100644 --- a/src/algorithms/fsrs.ts +++ b/src/algorithms/fsrs.ts @@ -55,6 +55,7 @@ interface FsrsSettings { maximum_interval: number; w: number[]; enable_fuzz: boolean; + enable_short_term: boolean; } const FsrsOptions: string[] = ["Again", "Hard", "Good", "Easy"]; // Manual =0 @@ -439,6 +440,58 @@ export class FsrsAlgorithm extends SrsAlgorithm { FSRS w参数可视化 \ 以对各参数进行设置.'; + new Setting(containerEl) + .setName(t("FUZZING")) + .setDesc(t("FUZZING_DESC")) + .addToggle((toggle) => + toggle.setValue(this.settings.enable_fuzz).onChange(async (value) => { + applySettingsUpdate(async () => { + this.settings.enable_fuzz = value ?? this.defaultSettings().enable_fuzz; + update(this.settings, true); + this.updateFsrsParams(); + }); + }), + ) + .addExtraButton((button) => { + button + .setIcon("reset") + .setTooltip(t("RESET_DEFAULT")) + .onClick(async () => { + applySettingsUpdate(async () => { + this.settings.enable_fuzz = this.defaultSettings().enable_fuzz; + update(this.settings, true); + this.updateFsrsParams(); + }); + }); + }); + + new Setting(containerEl) + .setName(t("SWITCH_SHORT_TERM")) + .setDesc(t("SWITCH_SHORT_TERM_DESC")) + .addToggle((toggle) => + toggle.setValue(this.settings.enable_short_term).onChange(async (value) => { + applySettingsUpdate(async () => { + this.settings.enable_short_term = + value ?? this.defaultSettings().enable_short_term; + update(this.settings, true); + this.updateFsrsParams(); + }); + }), + ) + .addExtraButton((button) => { + button + .setIcon("reset") + .setTooltip(t("RESET_DEFAULT")) + .onClick(async () => { + applySettingsUpdate(async () => { + this.settings.enable_short_term = + this.defaultSettings().enable_short_term; + update(this.settings, true); + this.updateFsrsParams(); + }); + }); + }); + return; } } diff --git a/src/lang/locale/ar.ts b/src/lang/locale/ar.ts index 064485b3..ee4fafa9 100644 --- a/src/lang/locale/ar.ts +++ b/src/lang/locale/ar.ts @@ -168,6 +168,12 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_INTERVAL_MIN_WARNING: "يجب أن يكون الحد الأقصى للفاصل الزمني لمدة يوم واحد على الأقل.", MAX_LINK_CONTRIB: "أقصى مساهمة ارتباط", MAX_LINK_CONTRIB_DESC: "أقصى مساهمة للسهولة المرجحة للملاحظات المرتبطة بالسهولة الأولية.", + FUZZING: "Fuzzing", + FUZZING_DESC: + "When enabled, this adds a small random delay to the new interval time to prevent cards from sticking together and always being reviewed on the same day.", + SWITCH_SHORT_TERM: "Switch to Short-term Scheduler", + SWITCH_SHORT_TERM_DESC: + "When disabled, this allow user to skip the short-term scheduler and directly switch to the long-term scheduler.", LOGGING: "تسجيل", DISPLAY_DEBUG_INFO: "عرض معلومات التصحيح على وحدة تحكم المطور", DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/cz.ts b/src/lang/locale/cz.ts index 0b4af057..17e656b8 100644 --- a/src/lang/locale/cz.ts +++ b/src/lang/locale/cz.ts @@ -172,6 +172,12 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_LINK_CONTRIB: "Maximální příspěvěk prolinkování", MAX_LINK_CONTRIB_DESC: "Maximální příspěvek vážené složitosti prolinkovaných poznámek použitý pro určení počáteční složitosti.", + FUZZING: "Fuzzing", + FUZZING_DESC: + "When enabled, this adds a small random delay to the new interval time to prevent cards from sticking together and always being reviewed on the same day.", + SWITCH_SHORT_TERM: "Switch to Short-term Scheduler", + SWITCH_SHORT_TERM_DESC: + "When disabled, this allow user to skip the short-term scheduler and directly switch to the long-term scheduler.", LOGGING: "Zaznamenávám", DISPLAY_DEBUG_INFO: "Zobrazit informace pro ladění na vývojářské konzoli", DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/de.ts b/src/lang/locale/de.ts index ab91377b..eaa5c509 100644 --- a/src/lang/locale/de.ts +++ b/src/lang/locale/de.ts @@ -190,6 +190,12 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_LINK_CONTRIB: "Maximaler Einfluss von Links", MAX_LINK_CONTRIB_DESC: "Maximaler Einfluss der Einfachheiten verlinkter Notizen zur gewichteten initialen Einfachheit einer neuen Lernkarte.", + FUZZING: "Fuzzing", + FUZZING_DESC: + "When enabled, this adds a small random delay to the new interval time to prevent cards from sticking together and always being reviewed on the same day.", + SWITCH_SHORT_TERM: "Switch to Short-term Scheduler", + SWITCH_SHORT_TERM_DESC: + "When disabled, this allow user to skip the short-term scheduler and directly switch to the long-term scheduler.", LOGGING: "Protokollierung", DISPLAY_DEBUG_INFO: "Informationen zum Debugging in der Entwicklerkonsole anzeigen", DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 5184f70f..b06f778d 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -171,6 +171,12 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_LINK_CONTRIB: "Maximum link contribution", MAX_LINK_CONTRIB_DESC: "Maximum contribution of the weighted ease of linked notes to the initial ease.", + FUZZING: "Fuzzing", + FUZZING_DESC: + "When enabled, this adds a small random delay to the new interval time to prevent cards from sticking together and always being reviewed on the same day.", + SWITCH_SHORT_TERM: "Switch to Short-term Scheduler", + SWITCH_SHORT_TERM_DESC: + "When disabled, this allow user to skip the short-term scheduler and directly switch to the long-term scheduler.", LOGGING: "Logging", DISPLAY_DEBUG_INFO: "Display debugging information on the developer console", DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/es.ts b/src/lang/locale/es.ts index ee841c7f..6c24df5e 100644 --- a/src/lang/locale/es.ts +++ b/src/lang/locale/es.ts @@ -178,6 +178,12 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_LINK_CONTRIB: "Contribución máxima de las notas vinculadas.", MAX_LINK_CONTRIB_DESC: "Contribución máxima de la facilidad ponderada de las notas vinculadas a la facilidad inicial.", + FUZZING: "Fuzzing", + FUZZING_DESC: + "When enabled, this adds a small random delay to the new interval time to prevent cards from sticking together and always being reviewed on the same day.", + SWITCH_SHORT_TERM: "Switch to Short-term Scheduler", + SWITCH_SHORT_TERM_DESC: + "When disabled, this allow user to skip the short-term scheduler and directly switch to the long-term scheduler.", LOGGING: "Registro", DISPLAY_DEBUG_INFO: "¿Mostrar información de depuración en la consola de desarrollador", DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/it.ts b/src/lang/locale/it.ts index 4d744a94..eb50194f 100644 --- a/src/lang/locale/it.ts +++ b/src/lang/locale/it.ts @@ -181,6 +181,12 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_LINK_CONTRIB: "Contributo massimo delle note collegate", MAX_LINK_CONTRIB_DESC: "Contributo massimo della difficoltà pasata delle note collegate alla difficoltà iniziale.", + FUZZING: "Fuzzing", + FUZZING_DESC: + "When enabled, this adds a small random delay to the new interval time to prevent cards from sticking together and always being reviewed on the same day.", + SWITCH_SHORT_TERM: "Switch to Short-term Scheduler", + SWITCH_SHORT_TERM_DESC: + "When disabled, this allow user to skip the short-term scheduler and directly switch to the long-term scheduler.", LOGGING: "Registrando", DISPLAY_DEBUG_INFO: "Visualizza informazione di debug sulla console per sviluppatori", DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/ja.ts b/src/lang/locale/ja.ts index e37dccc7..9e7bd86b 100644 --- a/src/lang/locale/ja.ts +++ b/src/lang/locale/ja.ts @@ -176,6 +176,12 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_LINK_CONTRIB: "リンクコントリビューションの最大値", MAX_LINK_CONTRIB_DESC: "最初の易しさに対して、リンクされたノートの重み付けされた易しさが寄与する最大値を指定してください。", + FUZZING: "Fuzzing", + FUZZING_DESC: + "When enabled, this adds a small random delay to the new interval time to prevent cards from sticking together and always being reviewed on the same day.", + SWITCH_SHORT_TERM: "Switch to Short-term Scheduler", + SWITCH_SHORT_TERM_DESC: + "When disabled, this allow user to skip the short-term scheduler and directly switch to the long-term scheduler.", LOGGING: "ログ管理", DISPLAY_DEBUG_INFO: "デベロッパーコンソールにてデバッグ情報を表示しますか", DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/ko.ts b/src/lang/locale/ko.ts index 32a5407c..f0db232c 100644 --- a/src/lang/locale/ko.ts +++ b/src/lang/locale/ko.ts @@ -173,6 +173,12 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_LINK_CONTRIB: "최대 연결 기여도", MAX_LINK_CONTRIB_DESC: "링크된 노트의 초기 ease에 대한 가중치가 적용된 ease의 최대 기여도입니다.", + FUZZING: "Fuzzing", + FUZZING_DESC: + "When enabled, this adds a small random delay to the new interval time to prevent cards from sticking together and always being reviewed on the same day.", + SWITCH_SHORT_TERM: "Switch to Short-term Scheduler", + SWITCH_SHORT_TERM_DESC: + "When disabled, this allow user to skip the short-term scheduler and directly switch to the long-term scheduler.", LOGGING: "로깅", DISPLAY_DEBUG_INFO: "디버깅 정보를 개발자 콘솔에 표시하시겠습니까", DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/pl.ts b/src/lang/locale/pl.ts index 5d585935..8eb867b5 100644 --- a/src/lang/locale/pl.ts +++ b/src/lang/locale/pl.ts @@ -177,6 +177,12 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_LINK_CONTRIB: "Maksymalny wkład łącza", MAX_LINK_CONTRIB_DESC: "Maksymalny wkład ważonej łatwości połączonych notatek do początkowej łatwości.", + FUZZING: "Fuzzing", + FUZZING_DESC: + "When enabled, this adds a small random delay to the new interval time to prevent cards from sticking together and always being reviewed on the same day.", + SWITCH_SHORT_TERM: "Switch to Short-term Scheduler", + SWITCH_SHORT_TERM_DESC: + "When disabled, this allow user to skip the short-term scheduler and directly switch to the long-term scheduler.", LOGGING: "Logowanie", DISPLAY_DEBUG_INFO: "Wyświetl informacje debugowania w konsoli deweloperskiej", // sidebar.ts DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/pt-br.ts b/src/lang/locale/pt-br.ts index 3d468f7e..19a465a7 100644 --- a/src/lang/locale/pt-br.ts +++ b/src/lang/locale/pt-br.ts @@ -179,6 +179,12 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_LINK_CONTRIB: "Contribuição Máxima de Links", MAX_LINK_CONTRIB_DESC: "Contribuição máxima da facilidade ponderada das notas linkadas à facilidade inicial.", + FUZZING: "Fuzzing", + FUZZING_DESC: + "When enabled, this adds a small random delay to the new interval time to prevent cards from sticking together and always being reviewed on the same day.", + SWITCH_SHORT_TERM: "Switch to Short-term Scheduler", + SWITCH_SHORT_TERM_DESC: + "When disabled, this allow user to skip the short-term scheduler and directly switch to the long-term scheduler.", LOGGING: "Logging", DISPLAY_DEBUG_INFO: "Mostrar informação de debugging no console de desenvolvimento", DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/ru.ts b/src/lang/locale/ru.ts index 8575a01b..b63c7ca5 100644 --- a/src/lang/locale/ru.ts +++ b/src/lang/locale/ru.ts @@ -186,6 +186,12 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_LINK_CONTRIB: "Максимальный вклад связи (ссылки)", MAX_LINK_CONTRIB_DESC: 'Максимальный вклад среднего значения "Лёгкости" связанных заметок в начальную "Лёгкость".', + FUZZING: "Fuzzing", + FUZZING_DESC: + "When enabled, this adds a small random delay to the new interval time to prevent cards from sticking together and always being reviewed on the same day.", + SWITCH_SHORT_TERM: "Switch to Short-term Scheduler", + SWITCH_SHORT_TERM_DESC: + "When disabled, this allow user to skip the short-term scheduler and directly switch to the long-term scheduler.", LOGGING: "Журналирование", DISPLAY_DEBUG_INFO: "Отображать отладочную информацию в консоли разработчика", DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 334cb74f..ba0f0617 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -159,6 +159,11 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_INTERVAL_MIN_WARNING: "最大间隔至少为1天", MAX_LINK_CONTRIB: "最大链接收益", MAX_LINK_CONTRIB_DESC: "链接笔记的加权掌握程度对原始掌握程度的最大贡献。", + FUZZING: "均衡", + FUZZING_DESC: "启用时, 会给新间隔添加个较小的随机延迟,以免卡片总被堆积在同一天复习。", + SWITCH_SHORT_TERM: "短期排程", + SWITCH_SHORT_TERM_DESC: + "禁用时,可让用户跳过短期排程(如5分钟、10分钟),直接切换到长期排程(如3天、5天)。", LOGGING: "记录中", DISPLAY_DEBUG_INFO: "在开发者控制台中显示调试信息", DISPLAY_PARSER_DEBUG_INFO: diff --git a/src/lang/locale/zh-tw.ts b/src/lang/locale/zh-tw.ts index 56b2806a..f737c1a1 100644 --- a/src/lang/locale/zh-tw.ts +++ b/src/lang/locale/zh-tw.ts @@ -158,6 +158,11 @@ Note that this setting is common to both Flashcards and Notes.`, MAX_INTERVAL_MIN_WARNING: "最大間隔至少為1天", MAX_LINK_CONTRIB: "最大鏈接貢獻", MAX_LINK_CONTRIB_DESC: "鏈接筆記的加權掌握程度對原始掌握程度的最大貢獻。", + FUZZING: "均衡", + FUZZING_DESC: "啟用時, 會給新間隔添加個較小的隨機延遲,以免卡片總被堆積在同一天復習。", + SWITCH_SHORT_TERM: "短期排程", + SWITCH_SHORT_TERM_DESC: + "禁用時,可讓用戶跳過短期排程(如5分鐘、10分鐘),直接切換到長期排程(如3天、5天)。", LOGGING: "記錄中", DISPLAY_DEBUG_INFO: "在開發者控制台中顯示除錯資訊", DISPLAY_PARSER_DEBUG_INFO: From 99a54d182a9d9e5af686dde2920c111caa0fba61 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Wed, 4 Sep 2024 22:38:23 +0800 Subject: [PATCH 154/155] 1.12.5.11 (#80) ## [1.12.5.11] - feat #78 fsrs v5 setting support enable_short_term and enable_fuzz (by @ishiko732). - fix #77 codeblock render error; - fix #76 sidebar note didn't show; - fix note random review; --- docs/docs/changelog.md | 7 +++++++ manifest.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 8 ++++---- src/generateParser.ts | 11 ++++++++--- src/gui/Sidebar.tsx | 9 +++++---- src/main.ts | 29 +++++++++++++++++++---------- src/reviewNote/review-note.ts | 9 +++------ 8 files changed, 48 insertions(+), 29 deletions(-) diff --git a/docs/docs/changelog.md b/docs/docs/changelog.md index 01e7083a..05f6d1d9 100644 --- a/docs/docs/changelog.md +++ b/docs/docs/changelog.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.12.5.11] + +- feat #78 fsrs v5 setting support enable_short_term and enable_fuzz (by @ishiko732). +- fix #77 codeblock render error; +- fix #76 sidebar note didn't show; +- fix note random review; + ## [1.12.5.10] - 同步原插件最新分支sync upsteam branch; diff --git a/manifest.json b/manifest.json index a00b02e3..6101c63a 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.12.5.10", + "version": "1.12.5.11", "minAppVersion": "1.2.8", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index 55af6b09..387a7903 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.12.5.10", + "version": "1.12.5.11", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0595340e..31027032 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,6 @@ dependencies: peggy: specifier: ^4.0.3 version: 4.0.3 - ts-fsrs: - specifier: 4.1.3 - version: 4.1.3 devDependencies: '@popperjs/core': @@ -85,6 +82,9 @@ devDependencies: prettier: specifier: ^3.3.3 version: 3.3.3 + ts-fsrs: + specifier: ^4.1.3 + version: 4.1.3 ts-jest: specifier: ^29.2.5 version: 29.2.5(@babel/core@7.25.2)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6) @@ -5758,7 +5758,7 @@ packages: /ts-fsrs@4.1.3: resolution: {integrity: sha512-UKZnDtATocNnZy/BaEE328Tn7DpEEl2Z/ocKqrGsvw1RgGw3B5i9OM/i5Gs87sXNP2eKOBqVMgw2vmiGY+4TVA==} engines: {node: '>=18.0.0'} - dev: false + dev: true /ts-jest@29.2.5(@babel/core@7.25.2)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.1.6): resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} diff --git a/src/generateParser.ts b/src/generateParser.ts index 9ce11d75..a4dde177 100644 --- a/src/generateParser.ts +++ b/src/generateParser.ts @@ -86,7 +86,7 @@ main /* The input text to the parser contains arbitrary text, not just card definitions. Hence we fallback to matching on loose_line. The result from loose_line is filtered out by filterBlocks() */ block - = html_comment / inline_rev_card / inline_card / multiline_rev_card / multiline_card / close_card / loose_line + = html_comment / inline_rev_card / inline_card / multiline_rev_card / multiline_card / close_card / backprime_code_line / loose_line html_comment = $("" (html_comment / .))* "-->" newline?) { @@ -127,7 +127,7 @@ multiline } multiline_before - = $(!multiline_mark nonempty_text_line)+ + = $(!multiline_mark (tilde_code / backprime_code / nonempty_text_line ))+ multiline_after = $(!separator_line (tilde_code / backprime_code / text_line))+ @@ -143,6 +143,11 @@ tilde_code tilde_marker = "~~~" "~"* +backprime_code_line + = $(backprime_code) { + return createParsedQuestionInfo(CardType.Ignore,"",location().start.line-1,location().end.line-2); + } + backprime_code = $( left:$backprime_marker text_line @@ -177,7 +182,7 @@ close_line = ((!close_text non_newline)* close_text) text_line_nonterminated? multiline_before_close - = (!close_line nonempty_text_line)+ + = (!close_line !backprime_marker nonempty_text_line)+ multiline_after_close = e:(!(newline separator_line) text_line1)+ diff --git a/src/gui/Sidebar.tsx b/src/gui/Sidebar.tsx index 43b21d88..65efa99a 100644 --- a/src/gui/Sidebar.tsx +++ b/src/gui/Sidebar.tsx @@ -209,11 +209,12 @@ export class ReviewQueueListView extends ItemView { deck: ReviewDeck, plugin: SRPlugin, ): void { - const navFileEl: HTMLElement = folderEl - .getElementsByClassName("tree-item-children nav-folder-children")[0] - .createDiv("nav-file"); + const childrenEl: HTMLElement = folderEl.getElementsByClassName( + "tree-item-children nav-folder-children", + )[0] as HTMLElement; + const navFileEl: HTMLElement = childrenEl.createDiv("nav-file"); if (hidden) { - navFileEl.style.display = "none"; + childrenEl.style.display = "none"; } const navFileTitle: HTMLElement = navFileEl.createDiv("tree-item-self nav-file-title"); diff --git a/src/main.ts b/src/main.ts index 0f47b12c..afd25447 100644 --- a/src/main.ts +++ b/src/main.ts @@ -142,6 +142,7 @@ export default class SRPlugin extends Plugin { async onload(): Promise { SRPlugin._instance = this; + Iadapter.create(this.app); await this.loadPluginData(); this.easeByPath = new NoteEaseList(this.data.settings); this.questionPostponementList = new QuestionPostponementList( @@ -157,7 +158,6 @@ export default class SRPlugin extends Plugin { if (isVersionNewerThanOther(PLUGIN_VERSION, this.data.settings.previousRelease)) { new ReleaseNotes(this.app, this, obsidianJustInstalled ? null : PLUGIN_VERSION).open(); } - Iadapter.create(this.app); const settings = this.data.settings; this.algorithm = algorithms[settings.algorithm]; @@ -188,7 +188,15 @@ export default class SRPlugin extends Plugin { registerTrackFileEvents(this); if (this.data.settings.dataLocation !== DataLocation.SaveOnNoteFile) { - this.registerInterval(window.setInterval(() => this.store.save(), 5 * 60 * 1000)); + this.registerInterval( + window.setInterval( + async () => { + await this.sync(); + this.store.save(); + }, + 5 * 60 * 1000, + ), + ); } this.statusBar = this.addStatusBarItem(); @@ -867,11 +875,11 @@ export default class SRPlugin extends Plugin { } }; - index = IReviewNote.getNextDueNoteIndex( - deck.dueNotesCount, - this.data.settings.openRandomNote, - ); - if (mqs.isDue && index >= 0) { + if (mqs.isDue && deck.dueNotesCount > 0) { + index = IReviewNote.getNextNoteIndex( + deck.dueNotesCount, + this.data.settings.openRandomNote, + ); await this.app.workspace.getLeaf().openFile(deck.scheduledNotes[index].note); item = deck.scheduledNotes[index].item; fShowItemInfo(item, "scheduledNoes index: " + index); @@ -891,9 +899,10 @@ export default class SRPlugin extends Plugin { } } if (!mqs.isDue && deck.newNotes.length > 0) { - const index = this.data.settings.openRandomNote - ? Math.floor(Math.random() * deck.newNotes.length) - : 0; + const index = IReviewNote.getNextNoteIndex( + deck.newNotes.length, + this.data.settings.openRandomNote, + ); await this.app.workspace.getLeaf().openFile(deck.newNotes[index].note); item = deck.newNotes[index].item; fShowItemInfo(item, "newNotes index:" + index); diff --git a/src/reviewNote/review-note.ts b/src/reviewNote/review-note.ts index afd38318..9bf6b8c3 100644 --- a/src/reviewNote/review-note.ts +++ b/src/reviewNote/review-note.ts @@ -135,16 +135,13 @@ export abstract class IReviewNote { } } - static getNextDueNoteIndex(NotesCount: number, openRandomNote: boolean = false) { - let index = -1; + static getNextNoteIndex(NotesCount: number, openRandomNote: boolean = false) { + let index = 0; - if (NotesCount < 1) { - return -1; - } if (!openRandomNote) { return 0; } else { - index = Math.floor(Math.random() * NotesCount); + index = Math.floor(Math.random() * (NotesCount - 0.1)); // avoid conner case: index == notesCount; } return index; } From 6d8d92b1ca2dbb323ab5fdc60bb3efa033134c26 Mon Sep 17 00:00:00 2001 From: Newdea <9208450+Newdea@users.noreply.github.com> Date: Thu, 10 Oct 2024 22:13:22 +0800 Subject: [PATCH 155/155] blockid #81 #83 - feat #83 just add blockid when review new card. - fix #81 add multi blockids; --- docs/docs/changelog.md | 6 ++++++ manifest.json | 2 +- package.json | 2 +- src/Question.ts | 4 ++-- src/dataStore/itemTrans.ts | 12 ++++++++---- src/generateParser.ts | 5 ++++- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/docs/docs/changelog.md b/docs/docs/changelog.md index 05f6d1d9..c2fbec29 100644 --- a/docs/docs/changelog.md +++ b/docs/docs/changelog.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). + +## [1.12.5.12] + +- feat #83 just add blockid when review new card. +- fix #81 add multi blockids; + ## [1.12.5.11] - feat #78 fsrs v5 setting support enable_short_term and enable_fuzz (by @ishiko732). diff --git a/manifest.json b/manifest.json index 6101c63a..b37d703e 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-spaced-repetition-recall", "name": "Spaced Repetition Recall", - "version": "1.12.5.11", + "version": "1.12.5.12", "minAppVersion": "1.2.8", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "author": "Newdea", diff --git a/package.json b/package.json index 387a7903..d31060cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-spaced-repetition", - "version": "1.12.5.11", + "version": "1.12.5.12", "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", "main": "main.js", "scripts": { diff --git a/src/Question.ts b/src/Question.ts index 4b491625..32376e84 100644 --- a/src/Question.ts +++ b/src/Question.ts @@ -252,9 +252,9 @@ export class Question { blockId = this.questionText.obsidianBlockId = this.questionText.genBlockId; } if (blockId) { - this.questionText.original += "\n"; - if (this.isCardCommentsOnSameLine(settings)) result += ` ${blockId}\n`; + if (!this.questionText.original.endsWith("```")) result += ` ${blockId}\n`; else result += `\n${blockId}\n`; + this.questionText.original += "\n"; } return result; diff --git a/src/dataStore/itemTrans.ts b/src/dataStore/itemTrans.ts index 8d605273..2a955c19 100644 --- a/src/dataStore/itemTrans.ts +++ b/src/dataStore/itemTrans.ts @@ -166,10 +166,10 @@ export class ItemTrans { let deckname = dtppath?.hasPath ? dtppath.path[0] : topicPath.path[0]; deckname = Tags.isDefaultDackName(deckname) ? deckname : "#" + deckname; store.updateCardItems(trackedFile, cardinfo, count, deckname, false); - updateCardObjs(question.cards, cardinfo, scheduling); + const update = updateCardObjs(question.cards, cardinfo, scheduling); // update question - if (question.questionText.genBlockId) { + if (question.questionText.genBlockId && update) { question.hasChanged = true; } else { question.hasChanged = false; @@ -182,14 +182,18 @@ function updateCardObjs(cards: Card[], cardinfo: CardInfo, scheduling: RegExpMat const schedInfoList: CardScheduleInfo[] = NoteCardScheduleParser.createInfoList_algo(scheduling); const carditemIds = cardinfo.itemIds; + let update = false; for (let i = 0; i < cards.length; i++) { const cardObj = cards[i]; const hasScheduleInfo: boolean = i < schedInfoList.length; const schedule: CardScheduleInfo = schedInfoList[i]; - cardObj.scheduleInfo = - hasScheduleInfo && !schedule.isDummyScheduleForNewCard() ? schedule : null; + const hassched = !schedule.isDummyScheduleForNewCard(); + cardObj.scheduleInfo = hasScheduleInfo && hassched ? schedule : null; cardObj.Id = carditemIds[i]; + + if (hassched) update = true; } + return update; } export function itemToShedNote(item: RepetitionItem, note: TFile): SchedNote { diff --git a/src/generateParser.ts b/src/generateParser.ts index a4dde177..3b5e2014 100644 --- a/src/generateParser.ts +++ b/src/generateParser.ts @@ -248,7 +248,7 @@ loose_line } annotation - = $("" .)+ "-->") + = $($("" .)+ "-->") / blockid) nonempty_text_till_newline = $non_newline+ @@ -271,6 +271,9 @@ nonemptyspace optional_whitespaces = whitespace_char* +blockid +=$([\\^][a-zA-Z0-9-]+) + whitespace_char = ([ \\f\\t\\v\\u0020\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]) `; }

p8=5ykp7L&W6QyPhq}@y6gai6R>< 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±@#&E>NUsXK$47k0|<= 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≶}3Ah^( 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%0A`+p4*w)*W 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