├── .codecov.yml ├── .editorconfig ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .nvmrc ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── biome.json ├── eslint.config.mjs ├── package.json ├── pnpm-lock.yaml ├── src ├── bencode │ ├── decode.ts │ ├── encode.ts │ ├── index.ts │ └── utils.ts ├── index.ts └── torrentFile.ts ├── test ├── bencode │ ├── announce-compacted-peers.bin │ ├── bep-0023.spec.ts │ ├── decode.buffer.spec.ts │ ├── decode.spec.ts │ └── encode.spec.ts ├── torrentFile.spec.ts └── ubuntu-18.04.2-live-server-amd64.iso.torrent ├── tsconfig.json └── vitest.config.ts /.codecov.yml: -------------------------------------------------------------------------------- 1 | coverage: 2 | range: "50..100" 3 | status: 4 | project: false 5 | patch: false 6 | comment: 7 | require_changes: true 8 | behavior: once 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | indent_size = 2 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | steps: 13 | # https://github.com/actions/checkout 14 | - uses: actions/checkout@v4 15 | 16 | # https://github.com/wyvox/action-setup-pnpm 17 | - uses: wyvox/action-setup-pnpm@v3 18 | with: { node-version: 22, pnpm-version: 9 } 19 | 20 | - name: lint 21 | run: pnpm run lint 22 | 23 | - name: test 24 | run: pnpm run test:ci 25 | 26 | - name: coverage 27 | uses: codecov/codecov-action@v4 28 | with: 29 | token: ${{ secrets.CODECOV_TOKEN }} 30 | 31 | publish: 32 | needs: build 33 | runs-on: ubuntu-latest 34 | if: github.ref_name == 'master' 35 | permissions: 36 | contents: write # to be able to publish a GitHub release 37 | issues: write # to be able to comment on released issues 38 | pull-requests: write # to be able to comment on released pull requests 39 | id-token: write # to enable use of OIDC for npm provenance 40 | steps: 41 | # https://github.com/actions/checkout 42 | - uses: actions/checkout@v4 43 | 44 | # https://github.com/wyvox/action-setup-pnpm 45 | - uses: wyvox/action-setup-pnpm@v3 46 | with: { node-version: 22, pnpm-version: 9 } 47 | 48 | - name: release 49 | run: npx semantic-release 50 | env: 51 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 52 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 53 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Coverage directory 12 | coverage 13 | junit.xml 14 | .DS_Store 15 | 16 | # node-waf configuration 17 | .lock-wscript 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directories 23 | node_modules 24 | jspm_packages 25 | 26 | # Optional npm cache directory 27 | .npm 28 | 29 | # Optional REPL history 30 | .node_repl_history 31 | .vscode/* 32 | !.vscode/launch.json 33 | !.vscode/settings.json 34 | 35 | # build 36 | build 37 | docs 38 | dist 39 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 22 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "biomejs.biome", 3 | "[javascript][typescript][javascriptreact][typescriptreact]": { 4 | "editor.formatOnSave": true, 5 | "editor.defaultFormatter": "biomejs.biome", 6 | "editor.codeActionsOnSave": { 7 | "quickfix.biome": "explicit", 8 | "source.fixAll.eslint": "explicit" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Scott Cooper 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # torrent-file [![npm](https://badgen.net/npm/v/@ctrl/torrent-file)](https://www.npmjs.com/package/@ctrl/torrent-file) [![coverage](https://badgen.net/codecov/c/github/scttcper/torrent-file)](https://codecov.io/gh/scttcper/torrent-file) [![bundlesize](https://badgen.net/bundlephobia/min/@ctrl/torrent-file)](https://bundlephobia.com/result?p=@ctrl/torrent-file) 2 | 3 | > Parse a torrent file and read encoded data. 4 | 5 | This project is based on [parse-torrent](https://www.npmjs.com/package/parse-torrent) and [node-bencode](https://github.com/themasch/node-bencode) to parse the data of a torrent file. This library implements its own [bencode](http://www.bittorrent.org/beps/bep_0003.html) encoder and decoder that does not use `Buffer`. 6 | 7 | ### Install 8 | ```console 9 | npm install @ctrl/torrent-file 10 | ``` 11 | 12 | ### API 13 | 14 | ##### info 15 | The content of the metainfo file. 16 | ```ts 17 | import fs from 'fs'; 18 | import { info } from '@ctrl/torrent-file'; 19 | 20 | const torrentInfo = info(fs.readFileSync('myfile')); 21 | console.log({ torrentInfo }); 22 | ``` 23 | 24 | ##### files 25 | data about the files described in the torrent file, includes hashes of the pieces 26 | ```ts 27 | import fs from 'fs'; 28 | import { files } from '@ctrl/torrent-file'; 29 | 30 | const torrentFiles = files(fs.readFileSync('myfile')); 31 | console.log({ torrentFiles }); 32 | ``` 33 | 34 | ##### hash 35 | sha1 of torrent file info. This hash is commenly used by torrent clients as the ID of the torrent. It is async and sha1 encoding is handled by [crypto-hash](https://github.com/sindresorhus/crypto-hash) 36 | ```ts 37 | import fs from 'fs'; 38 | import { hash } from '@ctrl/torrent-file'; 39 | 40 | (async () => { 41 | const torrentHash = await hash(fs.readFileSync('myfile')); 42 | console.log({ torrentHash }); 43 | })() 44 | ``` 45 | 46 | 47 | ### See Also 48 | [parse-torrent](https://www.npmjs.com/package/parse-torrent) - "@ctrl/torrent-file" torrent parsing based very heavily off this project 49 | [node-bencode](https://github.com/themasch/node-bencode) - bencoder built into this project heavily based off this project 50 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", 3 | "files": { 4 | "ignoreUnknown": true, 5 | "ignore": ["dist/*", "package.json"] 6 | }, 7 | "extends": ["./node_modules/@ctrl/eslint-config-biome/biome.json"] 8 | } 9 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import config from '@ctrl/eslint-config-biome'; 2 | 3 | export default [ 4 | { 5 | ignores: ['coverage', 'dist'], 6 | }, 7 | ...config, 8 | ]; 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ctrl/torrent-file", 3 | "version": "0.0.0-placeholder", 4 | "description": "Parse a torrent file (name, hash, files, pieces)", 5 | "author": "Scott Cooper ", 6 | "license": "MIT", 7 | "repository": "scttcper/torrent-file", 8 | "type": "module", 9 | "exports": "./dist/src/index.js", 10 | "types": "./dist/src/index.d.ts", 11 | "files": [ 12 | "dist/src" 13 | ], 14 | "sideEffects": false, 15 | "keywords": [], 16 | "scripts": { 17 | "lint": "pnpm run '/^(lint:biome|lint:eslint)$/'", 18 | "lint:biome": "biome check .", 19 | "lint:eslint": "eslint .", 20 | "lint:fix": "pnpm run '/^(lint:biome|lint:eslint):fix$/'", 21 | "lint:eslint:fix": "eslint . --fix", 22 | "lint:biome:fix": "biome check . --apply", 23 | "prepare": "npm run build", 24 | "build": "tsc", 25 | "test": "vitest run", 26 | "test:watch": "vitest", 27 | "test:ci": "vitest run --coverage --reporter=default --reporter=junit --outputFile=./junit.xml" 28 | }, 29 | "dependencies": { 30 | "uint8array-extras": "^1.4.0" 31 | }, 32 | "devDependencies": { 33 | "@biomejs/biome": "1.9.4", 34 | "@ctrl/eslint-config-biome": "4.3.1", 35 | "@sindresorhus/tsconfig": "7.0.0", 36 | "@types/node": "22.10.7", 37 | "@vitest/coverage-v8": "3.0.2", 38 | "parse-torrent": "11.0.18", 39 | "typescript": "5.7.3", 40 | "vitest": "3.0.2" 41 | }, 42 | "publishConfig": { 43 | "access": "public", 44 | "provenance": true 45 | }, 46 | "release": { 47 | "branches": [ 48 | "master" 49 | ] 50 | }, 51 | "engines": { 52 | "node": ">=18" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | uint8array-extras: 12 | specifier: ^1.4.0 13 | version: 1.4.0 14 | devDependencies: 15 | '@biomejs/biome': 16 | specifier: 1.9.4 17 | version: 1.9.4 18 | '@ctrl/eslint-config-biome': 19 | specifier: 4.3.1 20 | version: 4.3.1(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) 21 | '@sindresorhus/tsconfig': 22 | specifier: 7.0.0 23 | version: 7.0.0 24 | '@types/node': 25 | specifier: 22.10.7 26 | version: 22.10.7 27 | '@vitest/coverage-v8': 28 | specifier: 3.0.2 29 | version: 3.0.2(vitest@3.0.2(@types/node@22.10.7)) 30 | parse-torrent: 31 | specifier: 11.0.18 32 | version: 11.0.18 33 | typescript: 34 | specifier: 5.7.3 35 | version: 5.7.3 36 | vitest: 37 | specifier: 3.0.2 38 | version: 3.0.2(@types/node@22.10.7) 39 | 40 | packages: 41 | 42 | '@ampproject/remapping@2.3.0': 43 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 44 | engines: {node: '>=6.0.0'} 45 | 46 | '@babel/helper-string-parser@7.25.9': 47 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 48 | engines: {node: '>=6.9.0'} 49 | 50 | '@babel/helper-validator-identifier@7.25.9': 51 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 52 | engines: {node: '>=6.9.0'} 53 | 54 | '@babel/parser@7.26.5': 55 | resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} 56 | engines: {node: '>=6.0.0'} 57 | hasBin: true 58 | 59 | '@babel/types@7.26.5': 60 | resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} 61 | engines: {node: '>=6.9.0'} 62 | 63 | '@bcoe/v8-coverage@1.0.2': 64 | resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} 65 | engines: {node: '>=18'} 66 | 67 | '@biomejs/biome@1.9.4': 68 | resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} 69 | engines: {node: '>=14.21.3'} 70 | hasBin: true 71 | 72 | '@biomejs/cli-darwin-arm64@1.9.4': 73 | resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} 74 | engines: {node: '>=14.21.3'} 75 | cpu: [arm64] 76 | os: [darwin] 77 | 78 | '@biomejs/cli-darwin-x64@1.9.4': 79 | resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} 80 | engines: {node: '>=14.21.3'} 81 | cpu: [x64] 82 | os: [darwin] 83 | 84 | '@biomejs/cli-linux-arm64-musl@1.9.4': 85 | resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} 86 | engines: {node: '>=14.21.3'} 87 | cpu: [arm64] 88 | os: [linux] 89 | 90 | '@biomejs/cli-linux-arm64@1.9.4': 91 | resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} 92 | engines: {node: '>=14.21.3'} 93 | cpu: [arm64] 94 | os: [linux] 95 | 96 | '@biomejs/cli-linux-x64-musl@1.9.4': 97 | resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} 98 | engines: {node: '>=14.21.3'} 99 | cpu: [x64] 100 | os: [linux] 101 | 102 | '@biomejs/cli-linux-x64@1.9.4': 103 | resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} 104 | engines: {node: '>=14.21.3'} 105 | cpu: [x64] 106 | os: [linux] 107 | 108 | '@biomejs/cli-win32-arm64@1.9.4': 109 | resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} 110 | engines: {node: '>=14.21.3'} 111 | cpu: [arm64] 112 | os: [win32] 113 | 114 | '@biomejs/cli-win32-x64@1.9.4': 115 | resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} 116 | engines: {node: '>=14.21.3'} 117 | cpu: [x64] 118 | os: [win32] 119 | 120 | '@ctrl/eslint-config-biome@4.3.1': 121 | resolution: {integrity: sha512-e2sl26HwZvllGSllB0NKxmC3HQZvy7sYFXXFSzSctvX5A0ZO3LiLIha6L9+W4hYIU3TjVRmNKRJAMdH4xeEkNA==} 122 | 123 | '@esbuild/aix-ppc64@0.24.2': 124 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 125 | engines: {node: '>=18'} 126 | cpu: [ppc64] 127 | os: [aix] 128 | 129 | '@esbuild/android-arm64@0.24.2': 130 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 131 | engines: {node: '>=18'} 132 | cpu: [arm64] 133 | os: [android] 134 | 135 | '@esbuild/android-arm@0.24.2': 136 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 137 | engines: {node: '>=18'} 138 | cpu: [arm] 139 | os: [android] 140 | 141 | '@esbuild/android-x64@0.24.2': 142 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 143 | engines: {node: '>=18'} 144 | cpu: [x64] 145 | os: [android] 146 | 147 | '@esbuild/darwin-arm64@0.24.2': 148 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 149 | engines: {node: '>=18'} 150 | cpu: [arm64] 151 | os: [darwin] 152 | 153 | '@esbuild/darwin-x64@0.24.2': 154 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 155 | engines: {node: '>=18'} 156 | cpu: [x64] 157 | os: [darwin] 158 | 159 | '@esbuild/freebsd-arm64@0.24.2': 160 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 161 | engines: {node: '>=18'} 162 | cpu: [arm64] 163 | os: [freebsd] 164 | 165 | '@esbuild/freebsd-x64@0.24.2': 166 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 167 | engines: {node: '>=18'} 168 | cpu: [x64] 169 | os: [freebsd] 170 | 171 | '@esbuild/linux-arm64@0.24.2': 172 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 173 | engines: {node: '>=18'} 174 | cpu: [arm64] 175 | os: [linux] 176 | 177 | '@esbuild/linux-arm@0.24.2': 178 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 179 | engines: {node: '>=18'} 180 | cpu: [arm] 181 | os: [linux] 182 | 183 | '@esbuild/linux-ia32@0.24.2': 184 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 185 | engines: {node: '>=18'} 186 | cpu: [ia32] 187 | os: [linux] 188 | 189 | '@esbuild/linux-loong64@0.24.2': 190 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 191 | engines: {node: '>=18'} 192 | cpu: [loong64] 193 | os: [linux] 194 | 195 | '@esbuild/linux-mips64el@0.24.2': 196 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 197 | engines: {node: '>=18'} 198 | cpu: [mips64el] 199 | os: [linux] 200 | 201 | '@esbuild/linux-ppc64@0.24.2': 202 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 203 | engines: {node: '>=18'} 204 | cpu: [ppc64] 205 | os: [linux] 206 | 207 | '@esbuild/linux-riscv64@0.24.2': 208 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 209 | engines: {node: '>=18'} 210 | cpu: [riscv64] 211 | os: [linux] 212 | 213 | '@esbuild/linux-s390x@0.24.2': 214 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 215 | engines: {node: '>=18'} 216 | cpu: [s390x] 217 | os: [linux] 218 | 219 | '@esbuild/linux-x64@0.24.2': 220 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 221 | engines: {node: '>=18'} 222 | cpu: [x64] 223 | os: [linux] 224 | 225 | '@esbuild/netbsd-arm64@0.24.2': 226 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 227 | engines: {node: '>=18'} 228 | cpu: [arm64] 229 | os: [netbsd] 230 | 231 | '@esbuild/netbsd-x64@0.24.2': 232 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 233 | engines: {node: '>=18'} 234 | cpu: [x64] 235 | os: [netbsd] 236 | 237 | '@esbuild/openbsd-arm64@0.24.2': 238 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 239 | engines: {node: '>=18'} 240 | cpu: [arm64] 241 | os: [openbsd] 242 | 243 | '@esbuild/openbsd-x64@0.24.2': 244 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 245 | engines: {node: '>=18'} 246 | cpu: [x64] 247 | os: [openbsd] 248 | 249 | '@esbuild/sunos-x64@0.24.2': 250 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 251 | engines: {node: '>=18'} 252 | cpu: [x64] 253 | os: [sunos] 254 | 255 | '@esbuild/win32-arm64@0.24.2': 256 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 257 | engines: {node: '>=18'} 258 | cpu: [arm64] 259 | os: [win32] 260 | 261 | '@esbuild/win32-ia32@0.24.2': 262 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 263 | engines: {node: '>=18'} 264 | cpu: [ia32] 265 | os: [win32] 266 | 267 | '@esbuild/win32-x64@0.24.2': 268 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 269 | engines: {node: '>=18'} 270 | cpu: [x64] 271 | os: [win32] 272 | 273 | '@eslint-community/eslint-utils@4.4.1': 274 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 275 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 276 | peerDependencies: 277 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 278 | 279 | '@eslint-community/regexpp@4.12.1': 280 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 281 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 282 | 283 | '@eslint/config-array@0.19.1': 284 | resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} 285 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 286 | 287 | '@eslint/core@0.10.0': 288 | resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} 289 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 290 | 291 | '@eslint/eslintrc@3.2.0': 292 | resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} 293 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 294 | 295 | '@eslint/js@9.18.0': 296 | resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} 297 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 298 | 299 | '@eslint/object-schema@2.1.5': 300 | resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} 301 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 302 | 303 | '@eslint/plugin-kit@0.2.5': 304 | resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} 305 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 306 | 307 | '@humanfs/core@0.19.1': 308 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 309 | engines: {node: '>=18.18.0'} 310 | 311 | '@humanfs/node@0.16.6': 312 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 313 | engines: {node: '>=18.18.0'} 314 | 315 | '@humanwhocodes/module-importer@1.0.1': 316 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 317 | engines: {node: '>=12.22'} 318 | 319 | '@humanwhocodes/retry@0.3.1': 320 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 321 | engines: {node: '>=18.18'} 322 | 323 | '@humanwhocodes/retry@0.4.1': 324 | resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} 325 | engines: {node: '>=18.18'} 326 | 327 | '@isaacs/cliui@8.0.2': 328 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 329 | engines: {node: '>=12'} 330 | 331 | '@istanbuljs/schema@0.1.3': 332 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 333 | engines: {node: '>=8'} 334 | 335 | '@jridgewell/gen-mapping@0.3.8': 336 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 337 | engines: {node: '>=6.0.0'} 338 | 339 | '@jridgewell/resolve-uri@3.1.2': 340 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 341 | engines: {node: '>=6.0.0'} 342 | 343 | '@jridgewell/set-array@1.2.1': 344 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 345 | engines: {node: '>=6.0.0'} 346 | 347 | '@jridgewell/sourcemap-codec@1.5.0': 348 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 349 | 350 | '@jridgewell/trace-mapping@0.3.25': 351 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 352 | 353 | '@nodelib/fs.scandir@2.1.5': 354 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 355 | engines: {node: '>= 8'} 356 | 357 | '@nodelib/fs.stat@2.0.5': 358 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 359 | engines: {node: '>= 8'} 360 | 361 | '@nodelib/fs.walk@1.2.8': 362 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 363 | engines: {node: '>= 8'} 364 | 365 | '@pkgjs/parseargs@0.11.0': 366 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 367 | engines: {node: '>=14'} 368 | 369 | '@rollup/rollup-android-arm-eabi@4.31.0': 370 | resolution: {integrity: sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==} 371 | cpu: [arm] 372 | os: [android] 373 | 374 | '@rollup/rollup-android-arm64@4.31.0': 375 | resolution: {integrity: sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==} 376 | cpu: [arm64] 377 | os: [android] 378 | 379 | '@rollup/rollup-darwin-arm64@4.31.0': 380 | resolution: {integrity: sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==} 381 | cpu: [arm64] 382 | os: [darwin] 383 | 384 | '@rollup/rollup-darwin-x64@4.31.0': 385 | resolution: {integrity: sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==} 386 | cpu: [x64] 387 | os: [darwin] 388 | 389 | '@rollup/rollup-freebsd-arm64@4.31.0': 390 | resolution: {integrity: sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==} 391 | cpu: [arm64] 392 | os: [freebsd] 393 | 394 | '@rollup/rollup-freebsd-x64@4.31.0': 395 | resolution: {integrity: sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==} 396 | cpu: [x64] 397 | os: [freebsd] 398 | 399 | '@rollup/rollup-linux-arm-gnueabihf@4.31.0': 400 | resolution: {integrity: sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==} 401 | cpu: [arm] 402 | os: [linux] 403 | 404 | '@rollup/rollup-linux-arm-musleabihf@4.31.0': 405 | resolution: {integrity: sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==} 406 | cpu: [arm] 407 | os: [linux] 408 | 409 | '@rollup/rollup-linux-arm64-gnu@4.31.0': 410 | resolution: {integrity: sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==} 411 | cpu: [arm64] 412 | os: [linux] 413 | 414 | '@rollup/rollup-linux-arm64-musl@4.31.0': 415 | resolution: {integrity: sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==} 416 | cpu: [arm64] 417 | os: [linux] 418 | 419 | '@rollup/rollup-linux-loongarch64-gnu@4.31.0': 420 | resolution: {integrity: sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==} 421 | cpu: [loong64] 422 | os: [linux] 423 | 424 | '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': 425 | resolution: {integrity: sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==} 426 | cpu: [ppc64] 427 | os: [linux] 428 | 429 | '@rollup/rollup-linux-riscv64-gnu@4.31.0': 430 | resolution: {integrity: sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==} 431 | cpu: [riscv64] 432 | os: [linux] 433 | 434 | '@rollup/rollup-linux-s390x-gnu@4.31.0': 435 | resolution: {integrity: sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==} 436 | cpu: [s390x] 437 | os: [linux] 438 | 439 | '@rollup/rollup-linux-x64-gnu@4.31.0': 440 | resolution: {integrity: sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==} 441 | cpu: [x64] 442 | os: [linux] 443 | 444 | '@rollup/rollup-linux-x64-musl@4.31.0': 445 | resolution: {integrity: sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==} 446 | cpu: [x64] 447 | os: [linux] 448 | 449 | '@rollup/rollup-win32-arm64-msvc@4.31.0': 450 | resolution: {integrity: sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==} 451 | cpu: [arm64] 452 | os: [win32] 453 | 454 | '@rollup/rollup-win32-ia32-msvc@4.31.0': 455 | resolution: {integrity: sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==} 456 | cpu: [ia32] 457 | os: [win32] 458 | 459 | '@rollup/rollup-win32-x64-msvc@4.31.0': 460 | resolution: {integrity: sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==} 461 | cpu: [x64] 462 | os: [win32] 463 | 464 | '@rtsao/scc@1.1.0': 465 | resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} 466 | 467 | '@sindresorhus/tsconfig@7.0.0': 468 | resolution: {integrity: sha512-i5K04hLAP44Af16zmDjG07E1NHuDgCM07SJAT4gY0LZSRrWYzwt4qkLem6TIbIVh0k51RkN2bF+lP+lM5eC9fw==} 469 | engines: {node: '>=18'} 470 | 471 | '@thaunknown/thirty-two@1.0.5': 472 | resolution: {integrity: sha512-Q53KyCXweV1CS62EfqtPDqfpksn5keQ59PGqzzkK+g8Vif1jB4inoBCcs/BUSdsqddhE3G+2Fn+4RX3S6RqT0A==} 473 | engines: {node: '>=0.2.6'} 474 | 475 | '@types/estree@1.0.6': 476 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 477 | 478 | '@types/json-schema@7.0.15': 479 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 480 | 481 | '@types/json5@0.0.29': 482 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 483 | 484 | '@types/node@22.10.7': 485 | resolution: {integrity: sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==} 486 | 487 | '@typescript-eslint/eslint-plugin@8.21.0': 488 | resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} 489 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 490 | peerDependencies: 491 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 492 | eslint: ^8.57.0 || ^9.0.0 493 | typescript: '>=4.8.4 <5.8.0' 494 | 495 | '@typescript-eslint/parser@8.21.0': 496 | resolution: {integrity: sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==} 497 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 498 | peerDependencies: 499 | eslint: ^8.57.0 || ^9.0.0 500 | typescript: '>=4.8.4 <5.8.0' 501 | 502 | '@typescript-eslint/scope-manager@8.21.0': 503 | resolution: {integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==} 504 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 505 | 506 | '@typescript-eslint/type-utils@8.21.0': 507 | resolution: {integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==} 508 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 509 | peerDependencies: 510 | eslint: ^8.57.0 || ^9.0.0 511 | typescript: '>=4.8.4 <5.8.0' 512 | 513 | '@typescript-eslint/types@8.21.0': 514 | resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} 515 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 516 | 517 | '@typescript-eslint/typescript-estree@8.21.0': 518 | resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} 519 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 520 | peerDependencies: 521 | typescript: '>=4.8.4 <5.8.0' 522 | 523 | '@typescript-eslint/utils@8.21.0': 524 | resolution: {integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==} 525 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 526 | peerDependencies: 527 | eslint: ^8.57.0 || ^9.0.0 528 | typescript: '>=4.8.4 <5.8.0' 529 | 530 | '@typescript-eslint/visitor-keys@8.21.0': 531 | resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} 532 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 533 | 534 | '@vitest/coverage-v8@3.0.2': 535 | resolution: {integrity: sha512-U+hZYb0FtgNDb6B3E9piAHzXXIuxuBw2cd6Lvepc9sYYY4KjgiwCBmo3Sird9ZRu3ggLpLBTfw1ZRr77ipiSfw==} 536 | peerDependencies: 537 | '@vitest/browser': 3.0.2 538 | vitest: 3.0.2 539 | peerDependenciesMeta: 540 | '@vitest/browser': 541 | optional: true 542 | 543 | '@vitest/expect@3.0.2': 544 | resolution: {integrity: sha512-dKSHLBcoZI+3pmP5hiZ7I5grNru2HRtEW8Z5Zp4IXog8QYcxhlox7JUPyIIFWfN53+3HW3KPLIl6nSzUGgKSuQ==} 545 | 546 | '@vitest/mocker@3.0.2': 547 | resolution: {integrity: sha512-Hr09FoBf0jlwwSyzIF4Xw31OntpO3XtZjkccpcBf8FeVW3tpiyKlkeUzxS/txzHqpUCNIX157NaTySxedyZLvA==} 548 | peerDependencies: 549 | msw: ^2.4.9 550 | vite: ^5.0.0 || ^6.0.0 551 | peerDependenciesMeta: 552 | msw: 553 | optional: true 554 | vite: 555 | optional: true 556 | 557 | '@vitest/pretty-format@3.0.2': 558 | resolution: {integrity: sha512-yBohcBw/T/p0/JRgYD+IYcjCmuHzjC3WLAKsVE4/LwiubzZkE8N49/xIQ/KGQwDRA8PaviF8IRO8JMWMngdVVQ==} 559 | 560 | '@vitest/runner@3.0.2': 561 | resolution: {integrity: sha512-GHEsWoncrGxWuW8s405fVoDfSLk6RF2LCXp6XhevbtDjdDme1WV/eNmUueDfpY1IX3MJaCRelVCEXsT9cArfEg==} 562 | 563 | '@vitest/snapshot@3.0.2': 564 | resolution: {integrity: sha512-h9s67yD4+g+JoYG0zPCo/cLTabpDqzqNdzMawmNPzDStTiwxwkyYM1v5lWE8gmGv3SVJ2DcxA2NpQJZJv9ym3g==} 565 | 566 | '@vitest/spy@3.0.2': 567 | resolution: {integrity: sha512-8mI2iUn+PJFMT44e3ISA1R+K6ALVs47W6eriDTfXe6lFqlflID05MB4+rIFhmDSLBj8iBsZkzBYlgSkinxLzSQ==} 568 | 569 | '@vitest/utils@3.0.2': 570 | resolution: {integrity: sha512-Qu01ZYZlgHvDP02JnMBRpX43nRaZtNpIzw3C1clDXmn8eakgX6iQVGzTQ/NjkIr64WD8ioqOjkaYRVvHQI5qiw==} 571 | 572 | abort-controller@3.0.0: 573 | resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 574 | engines: {node: '>=6.5'} 575 | 576 | acorn-jsx@5.3.2: 577 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 578 | peerDependencies: 579 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 580 | 581 | acorn@8.14.0: 582 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 583 | engines: {node: '>=0.4.0'} 584 | hasBin: true 585 | 586 | ajv@6.12.6: 587 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 588 | 589 | ansi-regex@5.0.1: 590 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 591 | engines: {node: '>=8'} 592 | 593 | ansi-regex@6.1.0: 594 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 595 | engines: {node: '>=12'} 596 | 597 | ansi-styles@4.3.0: 598 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 599 | engines: {node: '>=8'} 600 | 601 | ansi-styles@6.2.1: 602 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 603 | engines: {node: '>=12'} 604 | 605 | argparse@2.0.1: 606 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 607 | 608 | array-buffer-byte-length@1.0.2: 609 | resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} 610 | engines: {node: '>= 0.4'} 611 | 612 | array-includes@3.1.8: 613 | resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} 614 | engines: {node: '>= 0.4'} 615 | 616 | array.prototype.findlastindex@1.2.5: 617 | resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} 618 | engines: {node: '>= 0.4'} 619 | 620 | array.prototype.flat@1.3.3: 621 | resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} 622 | engines: {node: '>= 0.4'} 623 | 624 | array.prototype.flatmap@1.3.3: 625 | resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} 626 | engines: {node: '>= 0.4'} 627 | 628 | arraybuffer.prototype.slice@1.0.4: 629 | resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 630 | engines: {node: '>= 0.4'} 631 | 632 | assertion-error@2.0.1: 633 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 634 | engines: {node: '>=12'} 635 | 636 | available-typed-arrays@1.0.7: 637 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 638 | engines: {node: '>= 0.4'} 639 | 640 | balanced-match@1.0.2: 641 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 642 | 643 | base64-arraybuffer@1.0.2: 644 | resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} 645 | engines: {node: '>= 0.6.0'} 646 | 647 | bencode@4.0.0: 648 | resolution: {integrity: sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==} 649 | engines: {node: '>=12.20.0'} 650 | 651 | bep53-range@2.0.0: 652 | resolution: {integrity: sha512-sMm2sV5PRs0YOVk0LTKtjuIprVzxgTQUsrGX/7Yph2Rm4FO2Fqqtq7hNjsOB5xezM4v4+5rljCgK++UeQJZguA==} 653 | engines: {node: '>=12.20.0'} 654 | 655 | brace-expansion@1.1.11: 656 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 657 | 658 | brace-expansion@2.0.1: 659 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 660 | 661 | braces@3.0.3: 662 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 663 | engines: {node: '>=8'} 664 | 665 | cac@6.7.14: 666 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 667 | engines: {node: '>=8'} 668 | 669 | call-bind-apply-helpers@1.0.1: 670 | resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} 671 | engines: {node: '>= 0.4'} 672 | 673 | call-bind@1.0.8: 674 | resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} 675 | engines: {node: '>= 0.4'} 676 | 677 | call-bound@1.0.3: 678 | resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} 679 | engines: {node: '>= 0.4'} 680 | 681 | callsites@3.1.0: 682 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 683 | engines: {node: '>=6'} 684 | 685 | chai@5.1.2: 686 | resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} 687 | engines: {node: '>=12'} 688 | 689 | chalk@4.1.2: 690 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 691 | engines: {node: '>=10'} 692 | 693 | check-error@2.1.1: 694 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 695 | engines: {node: '>= 16'} 696 | 697 | color-convert@2.0.1: 698 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 699 | engines: {node: '>=7.0.0'} 700 | 701 | color-name@1.1.4: 702 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 703 | 704 | concat-map@0.0.1: 705 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 706 | 707 | cross-fetch-ponyfill@1.0.3: 708 | resolution: {integrity: sha512-uOBkDhUAGAbx/FEzNKkOfx3w57H8xReBBXoZvUnOKTI0FW0Xvrj3GrYv2iZXUqlffC1LMGfQzhmBM/ke+6eTDA==} 709 | 710 | cross-spawn@7.0.6: 711 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 712 | engines: {node: '>= 8'} 713 | 714 | data-uri-to-buffer@4.0.1: 715 | resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 716 | engines: {node: '>= 12'} 717 | 718 | data-view-buffer@1.0.2: 719 | resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} 720 | engines: {node: '>= 0.4'} 721 | 722 | data-view-byte-length@1.0.2: 723 | resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} 724 | engines: {node: '>= 0.4'} 725 | 726 | data-view-byte-offset@1.0.1: 727 | resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} 728 | engines: {node: '>= 0.4'} 729 | 730 | debug@3.2.7: 731 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 732 | peerDependencies: 733 | supports-color: '*' 734 | peerDependenciesMeta: 735 | supports-color: 736 | optional: true 737 | 738 | debug@4.4.0: 739 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 740 | engines: {node: '>=6.0'} 741 | peerDependencies: 742 | supports-color: '*' 743 | peerDependenciesMeta: 744 | supports-color: 745 | optional: true 746 | 747 | deep-eql@5.0.2: 748 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 749 | engines: {node: '>=6'} 750 | 751 | deep-is@0.1.4: 752 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 753 | 754 | define-data-property@1.1.4: 755 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 756 | engines: {node: '>= 0.4'} 757 | 758 | define-properties@1.2.1: 759 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 760 | engines: {node: '>= 0.4'} 761 | 762 | doctrine@2.1.0: 763 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 764 | engines: {node: '>=0.10.0'} 765 | 766 | dunder-proto@1.0.1: 767 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 768 | engines: {node: '>= 0.4'} 769 | 770 | eastasianwidth@0.2.0: 771 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 772 | 773 | emoji-regex@8.0.0: 774 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 775 | 776 | emoji-regex@9.2.2: 777 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 778 | 779 | es-abstract@1.23.9: 780 | resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} 781 | engines: {node: '>= 0.4'} 782 | 783 | es-define-property@1.0.1: 784 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 785 | engines: {node: '>= 0.4'} 786 | 787 | es-errors@1.3.0: 788 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 789 | engines: {node: '>= 0.4'} 790 | 791 | es-module-lexer@1.6.0: 792 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 793 | 794 | es-object-atoms@1.1.1: 795 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 796 | engines: {node: '>= 0.4'} 797 | 798 | es-set-tostringtag@2.1.0: 799 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 800 | engines: {node: '>= 0.4'} 801 | 802 | es-shim-unscopables@1.0.2: 803 | resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} 804 | 805 | es-to-primitive@1.3.0: 806 | resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 807 | engines: {node: '>= 0.4'} 808 | 809 | esbuild@0.24.2: 810 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 811 | engines: {node: '>=18'} 812 | hasBin: true 813 | 814 | escape-string-regexp@4.0.0: 815 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 816 | engines: {node: '>=10'} 817 | 818 | eslint-import-resolver-node@0.3.9: 819 | resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 820 | 821 | eslint-module-utils@2.12.0: 822 | resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} 823 | engines: {node: '>=4'} 824 | peerDependencies: 825 | '@typescript-eslint/parser': '*' 826 | eslint: '*' 827 | eslint-import-resolver-node: '*' 828 | eslint-import-resolver-typescript: '*' 829 | eslint-import-resolver-webpack: '*' 830 | peerDependenciesMeta: 831 | '@typescript-eslint/parser': 832 | optional: true 833 | eslint: 834 | optional: true 835 | eslint-import-resolver-node: 836 | optional: true 837 | eslint-import-resolver-typescript: 838 | optional: true 839 | eslint-import-resolver-webpack: 840 | optional: true 841 | 842 | eslint-plugin-import@2.31.0: 843 | resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} 844 | engines: {node: '>=4'} 845 | peerDependencies: 846 | '@typescript-eslint/parser': '*' 847 | eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 848 | peerDependenciesMeta: 849 | '@typescript-eslint/parser': 850 | optional: true 851 | 852 | eslint-plugin-simple-import-sort@12.1.1: 853 | resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} 854 | peerDependencies: 855 | eslint: '>=5.0.0' 856 | 857 | eslint-scope@8.2.0: 858 | resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} 859 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 860 | 861 | eslint-visitor-keys@3.4.3: 862 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 863 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 864 | 865 | eslint-visitor-keys@4.2.0: 866 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 867 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 868 | 869 | eslint@9.18.0: 870 | resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} 871 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 872 | hasBin: true 873 | peerDependencies: 874 | jiti: '*' 875 | peerDependenciesMeta: 876 | jiti: 877 | optional: true 878 | 879 | espree@10.3.0: 880 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 881 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 882 | 883 | esquery@1.6.0: 884 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 885 | engines: {node: '>=0.10'} 886 | 887 | esrecurse@4.3.0: 888 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 889 | engines: {node: '>=4.0'} 890 | 891 | estraverse@5.3.0: 892 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 893 | engines: {node: '>=4.0'} 894 | 895 | estree-walker@3.0.3: 896 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 897 | 898 | esutils@2.0.3: 899 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 900 | engines: {node: '>=0.10.0'} 901 | 902 | event-target-shim@5.0.1: 903 | resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 904 | engines: {node: '>=6'} 905 | 906 | expect-type@1.1.0: 907 | resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} 908 | engines: {node: '>=12.0.0'} 909 | 910 | fast-deep-equal@3.1.3: 911 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 912 | 913 | fast-glob@3.3.3: 914 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 915 | engines: {node: '>=8.6.0'} 916 | 917 | fast-json-stable-stringify@2.1.0: 918 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 919 | 920 | fast-levenshtein@2.0.6: 921 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 922 | 923 | fastq@1.18.0: 924 | resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} 925 | 926 | fetch-blob@3.2.0: 927 | resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 928 | engines: {node: ^12.20 || >= 14.13} 929 | 930 | file-entry-cache@8.0.0: 931 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 932 | engines: {node: '>=16.0.0'} 933 | 934 | fill-range@7.1.1: 935 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 936 | engines: {node: '>=8'} 937 | 938 | find-up@5.0.0: 939 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 940 | engines: {node: '>=10'} 941 | 942 | flat-cache@4.0.1: 943 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 944 | engines: {node: '>=16'} 945 | 946 | flatted@3.3.2: 947 | resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} 948 | 949 | for-each@0.3.3: 950 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 951 | 952 | foreground-child@3.3.0: 953 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 954 | engines: {node: '>=14'} 955 | 956 | formdata-polyfill@4.0.10: 957 | resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 958 | engines: {node: '>=12.20.0'} 959 | 960 | fsevents@2.3.3: 961 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 962 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 963 | os: [darwin] 964 | 965 | function-bind@1.1.2: 966 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 967 | 968 | function.prototype.name@1.1.8: 969 | resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} 970 | engines: {node: '>= 0.4'} 971 | 972 | functions-have-names@1.2.3: 973 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 974 | 975 | get-intrinsic@1.2.7: 976 | resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} 977 | engines: {node: '>= 0.4'} 978 | 979 | get-proto@1.0.1: 980 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 981 | engines: {node: '>= 0.4'} 982 | 983 | get-stdin@9.0.0: 984 | resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} 985 | engines: {node: '>=12'} 986 | 987 | get-symbol-description@1.1.0: 988 | resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 989 | engines: {node: '>= 0.4'} 990 | 991 | glob-parent@5.1.2: 992 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 993 | engines: {node: '>= 6'} 994 | 995 | glob-parent@6.0.2: 996 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 997 | engines: {node: '>=10.13.0'} 998 | 999 | glob@10.4.5: 1000 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 1001 | hasBin: true 1002 | 1003 | globals@14.0.0: 1004 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 1005 | engines: {node: '>=18'} 1006 | 1007 | globalthis@1.0.4: 1008 | resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 1009 | engines: {node: '>= 0.4'} 1010 | 1011 | gopd@1.2.0: 1012 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 1013 | engines: {node: '>= 0.4'} 1014 | 1015 | graphemer@1.4.0: 1016 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1017 | 1018 | has-bigints@1.1.0: 1019 | resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} 1020 | engines: {node: '>= 0.4'} 1021 | 1022 | has-flag@4.0.0: 1023 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1024 | engines: {node: '>=8'} 1025 | 1026 | has-property-descriptors@1.0.2: 1027 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 1028 | 1029 | has-proto@1.2.0: 1030 | resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} 1031 | engines: {node: '>= 0.4'} 1032 | 1033 | has-symbols@1.1.0: 1034 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 1035 | engines: {node: '>= 0.4'} 1036 | 1037 | has-tostringtag@1.0.2: 1038 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 1039 | engines: {node: '>= 0.4'} 1040 | 1041 | hasown@2.0.2: 1042 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1043 | engines: {node: '>= 0.4'} 1044 | 1045 | html-escaper@2.0.2: 1046 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1047 | 1048 | ignore@5.3.2: 1049 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1050 | engines: {node: '>= 4'} 1051 | 1052 | import-fresh@3.3.0: 1053 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1054 | engines: {node: '>=6'} 1055 | 1056 | imurmurhash@0.1.4: 1057 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1058 | engines: {node: '>=0.8.19'} 1059 | 1060 | internal-slot@1.1.0: 1061 | resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 1062 | engines: {node: '>= 0.4'} 1063 | 1064 | is-array-buffer@3.0.5: 1065 | resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} 1066 | engines: {node: '>= 0.4'} 1067 | 1068 | is-async-function@2.1.0: 1069 | resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==} 1070 | engines: {node: '>= 0.4'} 1071 | 1072 | is-bigint@1.1.0: 1073 | resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} 1074 | engines: {node: '>= 0.4'} 1075 | 1076 | is-boolean-object@1.2.1: 1077 | resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} 1078 | engines: {node: '>= 0.4'} 1079 | 1080 | is-callable@1.2.7: 1081 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1082 | engines: {node: '>= 0.4'} 1083 | 1084 | is-core-module@2.16.1: 1085 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1086 | engines: {node: '>= 0.4'} 1087 | 1088 | is-data-view@1.0.2: 1089 | resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} 1090 | engines: {node: '>= 0.4'} 1091 | 1092 | is-date-object@1.1.0: 1093 | resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} 1094 | engines: {node: '>= 0.4'} 1095 | 1096 | is-extglob@2.1.1: 1097 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1098 | engines: {node: '>=0.10.0'} 1099 | 1100 | is-finalizationregistry@1.1.1: 1101 | resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} 1102 | engines: {node: '>= 0.4'} 1103 | 1104 | is-fullwidth-code-point@3.0.0: 1105 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1106 | engines: {node: '>=8'} 1107 | 1108 | is-generator-function@1.1.0: 1109 | resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} 1110 | engines: {node: '>= 0.4'} 1111 | 1112 | is-glob@4.0.3: 1113 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1114 | engines: {node: '>=0.10.0'} 1115 | 1116 | is-map@2.0.3: 1117 | resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 1118 | engines: {node: '>= 0.4'} 1119 | 1120 | is-number-object@1.1.1: 1121 | resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} 1122 | engines: {node: '>= 0.4'} 1123 | 1124 | is-number@7.0.0: 1125 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1126 | engines: {node: '>=0.12.0'} 1127 | 1128 | is-regex@1.2.1: 1129 | resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 1130 | engines: {node: '>= 0.4'} 1131 | 1132 | is-set@2.0.3: 1133 | resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 1134 | engines: {node: '>= 0.4'} 1135 | 1136 | is-shared-array-buffer@1.0.4: 1137 | resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} 1138 | engines: {node: '>= 0.4'} 1139 | 1140 | is-string@1.1.1: 1141 | resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} 1142 | engines: {node: '>= 0.4'} 1143 | 1144 | is-symbol@1.1.1: 1145 | resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} 1146 | engines: {node: '>= 0.4'} 1147 | 1148 | is-typed-array@1.1.15: 1149 | resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} 1150 | engines: {node: '>= 0.4'} 1151 | 1152 | is-weakmap@2.0.2: 1153 | resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 1154 | engines: {node: '>= 0.4'} 1155 | 1156 | is-weakref@1.1.0: 1157 | resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} 1158 | engines: {node: '>= 0.4'} 1159 | 1160 | is-weakset@2.0.4: 1161 | resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} 1162 | engines: {node: '>= 0.4'} 1163 | 1164 | isarray@2.0.5: 1165 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1166 | 1167 | isexe@2.0.0: 1168 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1169 | 1170 | istanbul-lib-coverage@3.2.2: 1171 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 1172 | engines: {node: '>=8'} 1173 | 1174 | istanbul-lib-report@3.0.1: 1175 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1176 | engines: {node: '>=10'} 1177 | 1178 | istanbul-lib-source-maps@5.0.6: 1179 | resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} 1180 | engines: {node: '>=10'} 1181 | 1182 | istanbul-reports@3.1.7: 1183 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 1184 | engines: {node: '>=8'} 1185 | 1186 | jackspeak@3.4.3: 1187 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 1188 | 1189 | js-yaml@4.1.0: 1190 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1191 | hasBin: true 1192 | 1193 | json-buffer@3.0.1: 1194 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1195 | 1196 | json-schema-traverse@0.4.1: 1197 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1198 | 1199 | json-stable-stringify-without-jsonify@1.0.1: 1200 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1201 | 1202 | json5@1.0.2: 1203 | resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 1204 | hasBin: true 1205 | 1206 | keyv@4.5.4: 1207 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1208 | 1209 | levn@0.4.1: 1210 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1211 | engines: {node: '>= 0.8.0'} 1212 | 1213 | locate-path@6.0.0: 1214 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1215 | engines: {node: '>=10'} 1216 | 1217 | lodash.merge@4.6.2: 1218 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1219 | 1220 | loupe@3.1.2: 1221 | resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} 1222 | 1223 | lru-cache@10.4.3: 1224 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1225 | 1226 | magic-string@0.30.17: 1227 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1228 | 1229 | magicast@0.3.5: 1230 | resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} 1231 | 1232 | magnet-uri@7.0.7: 1233 | resolution: {integrity: sha512-z/+dB2NQsXaDuxVBjoPLpZT8ePaacUmoontoFheRBl++nALHYs4qV9MmhTur9e4SaMbkCR/uPX43UMzEOoeyaw==} 1234 | engines: {node: '>=12.20.0'} 1235 | 1236 | make-dir@4.0.0: 1237 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1238 | engines: {node: '>=10'} 1239 | 1240 | math-intrinsics@1.1.0: 1241 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1242 | engines: {node: '>= 0.4'} 1243 | 1244 | merge2@1.4.1: 1245 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1246 | engines: {node: '>= 8'} 1247 | 1248 | micromatch@4.0.8: 1249 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1250 | engines: {node: '>=8.6'} 1251 | 1252 | minimatch@3.1.2: 1253 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1254 | 1255 | minimatch@9.0.5: 1256 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1257 | engines: {node: '>=16 || 14 >=14.17'} 1258 | 1259 | minimist@1.2.8: 1260 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1261 | 1262 | minipass@7.1.2: 1263 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1264 | engines: {node: '>=16 || 14 >=14.17'} 1265 | 1266 | ms@2.1.3: 1267 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1268 | 1269 | nanoid@3.3.8: 1270 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 1271 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1272 | hasBin: true 1273 | 1274 | natural-compare@1.4.0: 1275 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1276 | 1277 | node-domexception@1.0.0: 1278 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 1279 | engines: {node: '>=10.5.0'} 1280 | 1281 | node-fetch@3.3.2: 1282 | resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} 1283 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1284 | 1285 | object-inspect@1.13.3: 1286 | resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} 1287 | engines: {node: '>= 0.4'} 1288 | 1289 | object-keys@1.1.1: 1290 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1291 | engines: {node: '>= 0.4'} 1292 | 1293 | object.assign@4.1.7: 1294 | resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} 1295 | engines: {node: '>= 0.4'} 1296 | 1297 | object.fromentries@2.0.8: 1298 | resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} 1299 | engines: {node: '>= 0.4'} 1300 | 1301 | object.groupby@1.0.3: 1302 | resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} 1303 | engines: {node: '>= 0.4'} 1304 | 1305 | object.values@1.2.1: 1306 | resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} 1307 | engines: {node: '>= 0.4'} 1308 | 1309 | optionator@0.9.4: 1310 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1311 | engines: {node: '>= 0.8.0'} 1312 | 1313 | own-keys@1.0.1: 1314 | resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} 1315 | engines: {node: '>= 0.4'} 1316 | 1317 | p-limit@3.1.0: 1318 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1319 | engines: {node: '>=10'} 1320 | 1321 | p-locate@5.0.0: 1322 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1323 | engines: {node: '>=10'} 1324 | 1325 | package-json-from-dist@1.0.1: 1326 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1327 | 1328 | parent-module@1.0.1: 1329 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1330 | engines: {node: '>=6'} 1331 | 1332 | parse-torrent@11.0.18: 1333 | resolution: {integrity: sha512-C1igbmTrQQuKlspAfP1wcLaOPlvtu5qi4pMdPoCCfepHmxDOk8iArJ2J1yblLx11UefZJUaKEPSxIwMdG11SuA==} 1334 | engines: {node: '>=12.20.0'} 1335 | hasBin: true 1336 | 1337 | path-exists@4.0.0: 1338 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1339 | engines: {node: '>=8'} 1340 | 1341 | path-key@3.1.1: 1342 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1343 | engines: {node: '>=8'} 1344 | 1345 | path-parse@1.0.7: 1346 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1347 | 1348 | path-scurry@1.11.1: 1349 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1350 | engines: {node: '>=16 || 14 >=14.18'} 1351 | 1352 | pathe@2.0.2: 1353 | resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} 1354 | 1355 | pathval@2.0.0: 1356 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 1357 | engines: {node: '>= 14.16'} 1358 | 1359 | picocolors@1.1.1: 1360 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1361 | 1362 | picomatch@2.3.1: 1363 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1364 | engines: {node: '>=8.6'} 1365 | 1366 | possible-typed-array-names@1.0.0: 1367 | resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 1368 | engines: {node: '>= 0.4'} 1369 | 1370 | postcss@8.5.1: 1371 | resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} 1372 | engines: {node: ^10 || ^12 || >=14} 1373 | 1374 | prelude-ls@1.2.1: 1375 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1376 | engines: {node: '>= 0.8.0'} 1377 | 1378 | punycode@2.3.1: 1379 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1380 | engines: {node: '>=6'} 1381 | 1382 | queue-microtask@1.2.3: 1383 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1384 | 1385 | reflect.getprototypeof@1.0.10: 1386 | resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} 1387 | engines: {node: '>= 0.4'} 1388 | 1389 | regexp.prototype.flags@1.5.4: 1390 | resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 1391 | engines: {node: '>= 0.4'} 1392 | 1393 | resolve-from@4.0.0: 1394 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1395 | engines: {node: '>=4'} 1396 | 1397 | resolve@1.22.10: 1398 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1399 | engines: {node: '>= 0.4'} 1400 | hasBin: true 1401 | 1402 | reusify@1.0.4: 1403 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1404 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1405 | 1406 | rollup@4.31.0: 1407 | resolution: {integrity: sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==} 1408 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1409 | hasBin: true 1410 | 1411 | run-parallel@1.2.0: 1412 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1413 | 1414 | safe-array-concat@1.1.3: 1415 | resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} 1416 | engines: {node: '>=0.4'} 1417 | 1418 | safe-push-apply@1.0.0: 1419 | resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} 1420 | engines: {node: '>= 0.4'} 1421 | 1422 | safe-regex-test@1.1.0: 1423 | resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} 1424 | engines: {node: '>= 0.4'} 1425 | 1426 | semver@6.3.1: 1427 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1428 | hasBin: true 1429 | 1430 | semver@7.6.3: 1431 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1432 | engines: {node: '>=10'} 1433 | hasBin: true 1434 | 1435 | set-function-length@1.2.2: 1436 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1437 | engines: {node: '>= 0.4'} 1438 | 1439 | set-function-name@2.0.2: 1440 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1441 | engines: {node: '>= 0.4'} 1442 | 1443 | set-proto@1.0.0: 1444 | resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} 1445 | engines: {node: '>= 0.4'} 1446 | 1447 | shebang-command@2.0.0: 1448 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1449 | engines: {node: '>=8'} 1450 | 1451 | shebang-regex@3.0.0: 1452 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1453 | engines: {node: '>=8'} 1454 | 1455 | side-channel-list@1.0.0: 1456 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1457 | engines: {node: '>= 0.4'} 1458 | 1459 | side-channel-map@1.0.1: 1460 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1461 | engines: {node: '>= 0.4'} 1462 | 1463 | side-channel-weakmap@1.0.2: 1464 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1465 | engines: {node: '>= 0.4'} 1466 | 1467 | side-channel@1.1.0: 1468 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1469 | engines: {node: '>= 0.4'} 1470 | 1471 | siginfo@2.0.0: 1472 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1473 | 1474 | signal-exit@4.1.0: 1475 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1476 | engines: {node: '>=14'} 1477 | 1478 | source-map-js@1.2.1: 1479 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1480 | engines: {node: '>=0.10.0'} 1481 | 1482 | stackback@0.0.2: 1483 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1484 | 1485 | std-env@3.8.0: 1486 | resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} 1487 | 1488 | string-width@4.2.3: 1489 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1490 | engines: {node: '>=8'} 1491 | 1492 | string-width@5.1.2: 1493 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1494 | engines: {node: '>=12'} 1495 | 1496 | string.prototype.trim@1.2.10: 1497 | resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} 1498 | engines: {node: '>= 0.4'} 1499 | 1500 | string.prototype.trimend@1.0.9: 1501 | resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} 1502 | engines: {node: '>= 0.4'} 1503 | 1504 | string.prototype.trimstart@1.0.8: 1505 | resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 1506 | engines: {node: '>= 0.4'} 1507 | 1508 | strip-ansi@6.0.1: 1509 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1510 | engines: {node: '>=8'} 1511 | 1512 | strip-ansi@7.1.0: 1513 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1514 | engines: {node: '>=12'} 1515 | 1516 | strip-bom@3.0.0: 1517 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1518 | engines: {node: '>=4'} 1519 | 1520 | strip-json-comments@3.1.1: 1521 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1522 | engines: {node: '>=8'} 1523 | 1524 | supports-color@7.2.0: 1525 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1526 | engines: {node: '>=8'} 1527 | 1528 | supports-preserve-symlinks-flag@1.0.0: 1529 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1530 | engines: {node: '>= 0.4'} 1531 | 1532 | test-exclude@7.0.1: 1533 | resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} 1534 | engines: {node: '>=18'} 1535 | 1536 | tinybench@2.9.0: 1537 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1538 | 1539 | tinyexec@0.3.2: 1540 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1541 | 1542 | tinypool@1.0.2: 1543 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 1544 | engines: {node: ^18.0.0 || >=20.0.0} 1545 | 1546 | tinyrainbow@2.0.0: 1547 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 1548 | engines: {node: '>=14.0.0'} 1549 | 1550 | tinyspy@3.0.2: 1551 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 1552 | engines: {node: '>=14.0.0'} 1553 | 1554 | to-regex-range@5.0.1: 1555 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1556 | engines: {node: '>=8.0'} 1557 | 1558 | ts-api-utils@2.0.0: 1559 | resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} 1560 | engines: {node: '>=18.12'} 1561 | peerDependencies: 1562 | typescript: '>=4.8.4' 1563 | 1564 | tsconfig-paths@3.15.0: 1565 | resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} 1566 | 1567 | type-check@0.4.0: 1568 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1569 | engines: {node: '>= 0.8.0'} 1570 | 1571 | typed-array-buffer@1.0.3: 1572 | resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} 1573 | engines: {node: '>= 0.4'} 1574 | 1575 | typed-array-byte-length@1.0.3: 1576 | resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} 1577 | engines: {node: '>= 0.4'} 1578 | 1579 | typed-array-byte-offset@1.0.4: 1580 | resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} 1581 | engines: {node: '>= 0.4'} 1582 | 1583 | typed-array-length@1.0.7: 1584 | resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1585 | engines: {node: '>= 0.4'} 1586 | 1587 | typescript-eslint@8.21.0: 1588 | resolution: {integrity: sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==} 1589 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1590 | peerDependencies: 1591 | eslint: ^8.57.0 || ^9.0.0 1592 | typescript: '>=4.8.4 <5.8.0' 1593 | 1594 | typescript@5.7.3: 1595 | resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 1596 | engines: {node: '>=14.17'} 1597 | hasBin: true 1598 | 1599 | uint8-util@2.2.5: 1600 | resolution: {integrity: sha512-/QxVQD7CttWpVUKVPz9znO+3Dd4BdTSnFQ7pv/4drVhC9m4BaL2LFHTkJn6EsYoxT79VDq/2Gg8L0H22PrzyMw==} 1601 | 1602 | uint8array-extras@1.4.0: 1603 | resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} 1604 | engines: {node: '>=18'} 1605 | 1606 | unbox-primitive@1.1.0: 1607 | resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1608 | engines: {node: '>= 0.4'} 1609 | 1610 | undici-types@6.20.0: 1611 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1612 | 1613 | uri-js@4.4.1: 1614 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1615 | 1616 | vite-node@3.0.2: 1617 | resolution: {integrity: sha512-hsEQerBAHvVAbv40m3TFQe/lTEbOp7yDpyqMJqr2Tnd+W58+DEYOt+fluQgekOePcsNBmR77lpVAnIU2Xu4SvQ==} 1618 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1619 | hasBin: true 1620 | 1621 | vite@6.0.10: 1622 | resolution: {integrity: sha512-MEszunEcMo6pFsfXN1GhCFQqnE25tWRH0MA4f0Q7uanACi4y1Us+ZGpTMnITwCTnYzB2b9cpmnelTlxgTBmaBA==} 1623 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1624 | hasBin: true 1625 | peerDependencies: 1626 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1627 | jiti: '>=1.21.0' 1628 | less: '*' 1629 | lightningcss: ^1.21.0 1630 | sass: '*' 1631 | sass-embedded: '*' 1632 | stylus: '*' 1633 | sugarss: '*' 1634 | terser: ^5.16.0 1635 | tsx: ^4.8.1 1636 | yaml: ^2.4.2 1637 | peerDependenciesMeta: 1638 | '@types/node': 1639 | optional: true 1640 | jiti: 1641 | optional: true 1642 | less: 1643 | optional: true 1644 | lightningcss: 1645 | optional: true 1646 | sass: 1647 | optional: true 1648 | sass-embedded: 1649 | optional: true 1650 | stylus: 1651 | optional: true 1652 | sugarss: 1653 | optional: true 1654 | terser: 1655 | optional: true 1656 | tsx: 1657 | optional: true 1658 | yaml: 1659 | optional: true 1660 | 1661 | vitest@3.0.2: 1662 | resolution: {integrity: sha512-5bzaHakQ0hmVVKLhfh/jXf6oETDBtgPo8tQCHYB+wftNgFJ+Hah67IsWc8ivx4vFL025Ow8UiuTf4W57z4izvQ==} 1663 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1664 | hasBin: true 1665 | peerDependencies: 1666 | '@edge-runtime/vm': '*' 1667 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1668 | '@vitest/browser': 3.0.2 1669 | '@vitest/ui': 3.0.2 1670 | happy-dom: '*' 1671 | jsdom: '*' 1672 | peerDependenciesMeta: 1673 | '@edge-runtime/vm': 1674 | optional: true 1675 | '@types/node': 1676 | optional: true 1677 | '@vitest/browser': 1678 | optional: true 1679 | '@vitest/ui': 1680 | optional: true 1681 | happy-dom: 1682 | optional: true 1683 | jsdom: 1684 | optional: true 1685 | 1686 | web-streams-polyfill@3.3.3: 1687 | resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 1688 | engines: {node: '>= 8'} 1689 | 1690 | which-boxed-primitive@1.1.1: 1691 | resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} 1692 | engines: {node: '>= 0.4'} 1693 | 1694 | which-builtin-type@1.2.1: 1695 | resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} 1696 | engines: {node: '>= 0.4'} 1697 | 1698 | which-collection@1.0.2: 1699 | resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 1700 | engines: {node: '>= 0.4'} 1701 | 1702 | which-typed-array@1.1.18: 1703 | resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} 1704 | engines: {node: '>= 0.4'} 1705 | 1706 | which@2.0.2: 1707 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1708 | engines: {node: '>= 8'} 1709 | hasBin: true 1710 | 1711 | why-is-node-running@2.3.0: 1712 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1713 | engines: {node: '>=8'} 1714 | hasBin: true 1715 | 1716 | word-wrap@1.2.5: 1717 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1718 | engines: {node: '>=0.10.0'} 1719 | 1720 | wrap-ansi@7.0.0: 1721 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1722 | engines: {node: '>=10'} 1723 | 1724 | wrap-ansi@8.1.0: 1725 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1726 | engines: {node: '>=12'} 1727 | 1728 | yocto-queue@0.1.0: 1729 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1730 | engines: {node: '>=10'} 1731 | 1732 | snapshots: 1733 | 1734 | '@ampproject/remapping@2.3.0': 1735 | dependencies: 1736 | '@jridgewell/gen-mapping': 0.3.8 1737 | '@jridgewell/trace-mapping': 0.3.25 1738 | 1739 | '@babel/helper-string-parser@7.25.9': {} 1740 | 1741 | '@babel/helper-validator-identifier@7.25.9': {} 1742 | 1743 | '@babel/parser@7.26.5': 1744 | dependencies: 1745 | '@babel/types': 7.26.5 1746 | 1747 | '@babel/types@7.26.5': 1748 | dependencies: 1749 | '@babel/helper-string-parser': 7.25.9 1750 | '@babel/helper-validator-identifier': 7.25.9 1751 | 1752 | '@bcoe/v8-coverage@1.0.2': {} 1753 | 1754 | '@biomejs/biome@1.9.4': 1755 | optionalDependencies: 1756 | '@biomejs/cli-darwin-arm64': 1.9.4 1757 | '@biomejs/cli-darwin-x64': 1.9.4 1758 | '@biomejs/cli-linux-arm64': 1.9.4 1759 | '@biomejs/cli-linux-arm64-musl': 1.9.4 1760 | '@biomejs/cli-linux-x64': 1.9.4 1761 | '@biomejs/cli-linux-x64-musl': 1.9.4 1762 | '@biomejs/cli-win32-arm64': 1.9.4 1763 | '@biomejs/cli-win32-x64': 1.9.4 1764 | 1765 | '@biomejs/cli-darwin-arm64@1.9.4': 1766 | optional: true 1767 | 1768 | '@biomejs/cli-darwin-x64@1.9.4': 1769 | optional: true 1770 | 1771 | '@biomejs/cli-linux-arm64-musl@1.9.4': 1772 | optional: true 1773 | 1774 | '@biomejs/cli-linux-arm64@1.9.4': 1775 | optional: true 1776 | 1777 | '@biomejs/cli-linux-x64-musl@1.9.4': 1778 | optional: true 1779 | 1780 | '@biomejs/cli-linux-x64@1.9.4': 1781 | optional: true 1782 | 1783 | '@biomejs/cli-win32-arm64@1.9.4': 1784 | optional: true 1785 | 1786 | '@biomejs/cli-win32-x64@1.9.4': 1787 | optional: true 1788 | 1789 | '@ctrl/eslint-config-biome@4.3.1(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3)': 1790 | dependencies: 1791 | '@eslint/js': 9.18.0 1792 | eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0) 1793 | eslint-plugin-simple-import-sort: 12.1.1(eslint@9.18.0) 1794 | typescript-eslint: 8.21.0(eslint@9.18.0)(typescript@5.7.3) 1795 | transitivePeerDependencies: 1796 | - '@typescript-eslint/parser' 1797 | - eslint 1798 | - eslint-import-resolver-typescript 1799 | - eslint-import-resolver-webpack 1800 | - supports-color 1801 | - typescript 1802 | 1803 | '@esbuild/aix-ppc64@0.24.2': 1804 | optional: true 1805 | 1806 | '@esbuild/android-arm64@0.24.2': 1807 | optional: true 1808 | 1809 | '@esbuild/android-arm@0.24.2': 1810 | optional: true 1811 | 1812 | '@esbuild/android-x64@0.24.2': 1813 | optional: true 1814 | 1815 | '@esbuild/darwin-arm64@0.24.2': 1816 | optional: true 1817 | 1818 | '@esbuild/darwin-x64@0.24.2': 1819 | optional: true 1820 | 1821 | '@esbuild/freebsd-arm64@0.24.2': 1822 | optional: true 1823 | 1824 | '@esbuild/freebsd-x64@0.24.2': 1825 | optional: true 1826 | 1827 | '@esbuild/linux-arm64@0.24.2': 1828 | optional: true 1829 | 1830 | '@esbuild/linux-arm@0.24.2': 1831 | optional: true 1832 | 1833 | '@esbuild/linux-ia32@0.24.2': 1834 | optional: true 1835 | 1836 | '@esbuild/linux-loong64@0.24.2': 1837 | optional: true 1838 | 1839 | '@esbuild/linux-mips64el@0.24.2': 1840 | optional: true 1841 | 1842 | '@esbuild/linux-ppc64@0.24.2': 1843 | optional: true 1844 | 1845 | '@esbuild/linux-riscv64@0.24.2': 1846 | optional: true 1847 | 1848 | '@esbuild/linux-s390x@0.24.2': 1849 | optional: true 1850 | 1851 | '@esbuild/linux-x64@0.24.2': 1852 | optional: true 1853 | 1854 | '@esbuild/netbsd-arm64@0.24.2': 1855 | optional: true 1856 | 1857 | '@esbuild/netbsd-x64@0.24.2': 1858 | optional: true 1859 | 1860 | '@esbuild/openbsd-arm64@0.24.2': 1861 | optional: true 1862 | 1863 | '@esbuild/openbsd-x64@0.24.2': 1864 | optional: true 1865 | 1866 | '@esbuild/sunos-x64@0.24.2': 1867 | optional: true 1868 | 1869 | '@esbuild/win32-arm64@0.24.2': 1870 | optional: true 1871 | 1872 | '@esbuild/win32-ia32@0.24.2': 1873 | optional: true 1874 | 1875 | '@esbuild/win32-x64@0.24.2': 1876 | optional: true 1877 | 1878 | '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0)': 1879 | dependencies: 1880 | eslint: 9.18.0 1881 | eslint-visitor-keys: 3.4.3 1882 | 1883 | '@eslint-community/regexpp@4.12.1': {} 1884 | 1885 | '@eslint/config-array@0.19.1': 1886 | dependencies: 1887 | '@eslint/object-schema': 2.1.5 1888 | debug: 4.4.0 1889 | minimatch: 3.1.2 1890 | transitivePeerDependencies: 1891 | - supports-color 1892 | 1893 | '@eslint/core@0.10.0': 1894 | dependencies: 1895 | '@types/json-schema': 7.0.15 1896 | 1897 | '@eslint/eslintrc@3.2.0': 1898 | dependencies: 1899 | ajv: 6.12.6 1900 | debug: 4.4.0 1901 | espree: 10.3.0 1902 | globals: 14.0.0 1903 | ignore: 5.3.2 1904 | import-fresh: 3.3.0 1905 | js-yaml: 4.1.0 1906 | minimatch: 3.1.2 1907 | strip-json-comments: 3.1.1 1908 | transitivePeerDependencies: 1909 | - supports-color 1910 | 1911 | '@eslint/js@9.18.0': {} 1912 | 1913 | '@eslint/object-schema@2.1.5': {} 1914 | 1915 | '@eslint/plugin-kit@0.2.5': 1916 | dependencies: 1917 | '@eslint/core': 0.10.0 1918 | levn: 0.4.1 1919 | 1920 | '@humanfs/core@0.19.1': {} 1921 | 1922 | '@humanfs/node@0.16.6': 1923 | dependencies: 1924 | '@humanfs/core': 0.19.1 1925 | '@humanwhocodes/retry': 0.3.1 1926 | 1927 | '@humanwhocodes/module-importer@1.0.1': {} 1928 | 1929 | '@humanwhocodes/retry@0.3.1': {} 1930 | 1931 | '@humanwhocodes/retry@0.4.1': {} 1932 | 1933 | '@isaacs/cliui@8.0.2': 1934 | dependencies: 1935 | string-width: 5.1.2 1936 | string-width-cjs: string-width@4.2.3 1937 | strip-ansi: 7.1.0 1938 | strip-ansi-cjs: strip-ansi@6.0.1 1939 | wrap-ansi: 8.1.0 1940 | wrap-ansi-cjs: wrap-ansi@7.0.0 1941 | 1942 | '@istanbuljs/schema@0.1.3': {} 1943 | 1944 | '@jridgewell/gen-mapping@0.3.8': 1945 | dependencies: 1946 | '@jridgewell/set-array': 1.2.1 1947 | '@jridgewell/sourcemap-codec': 1.5.0 1948 | '@jridgewell/trace-mapping': 0.3.25 1949 | 1950 | '@jridgewell/resolve-uri@3.1.2': {} 1951 | 1952 | '@jridgewell/set-array@1.2.1': {} 1953 | 1954 | '@jridgewell/sourcemap-codec@1.5.0': {} 1955 | 1956 | '@jridgewell/trace-mapping@0.3.25': 1957 | dependencies: 1958 | '@jridgewell/resolve-uri': 3.1.2 1959 | '@jridgewell/sourcemap-codec': 1.5.0 1960 | 1961 | '@nodelib/fs.scandir@2.1.5': 1962 | dependencies: 1963 | '@nodelib/fs.stat': 2.0.5 1964 | run-parallel: 1.2.0 1965 | 1966 | '@nodelib/fs.stat@2.0.5': {} 1967 | 1968 | '@nodelib/fs.walk@1.2.8': 1969 | dependencies: 1970 | '@nodelib/fs.scandir': 2.1.5 1971 | fastq: 1.18.0 1972 | 1973 | '@pkgjs/parseargs@0.11.0': 1974 | optional: true 1975 | 1976 | '@rollup/rollup-android-arm-eabi@4.31.0': 1977 | optional: true 1978 | 1979 | '@rollup/rollup-android-arm64@4.31.0': 1980 | optional: true 1981 | 1982 | '@rollup/rollup-darwin-arm64@4.31.0': 1983 | optional: true 1984 | 1985 | '@rollup/rollup-darwin-x64@4.31.0': 1986 | optional: true 1987 | 1988 | '@rollup/rollup-freebsd-arm64@4.31.0': 1989 | optional: true 1990 | 1991 | '@rollup/rollup-freebsd-x64@4.31.0': 1992 | optional: true 1993 | 1994 | '@rollup/rollup-linux-arm-gnueabihf@4.31.0': 1995 | optional: true 1996 | 1997 | '@rollup/rollup-linux-arm-musleabihf@4.31.0': 1998 | optional: true 1999 | 2000 | '@rollup/rollup-linux-arm64-gnu@4.31.0': 2001 | optional: true 2002 | 2003 | '@rollup/rollup-linux-arm64-musl@4.31.0': 2004 | optional: true 2005 | 2006 | '@rollup/rollup-linux-loongarch64-gnu@4.31.0': 2007 | optional: true 2008 | 2009 | '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': 2010 | optional: true 2011 | 2012 | '@rollup/rollup-linux-riscv64-gnu@4.31.0': 2013 | optional: true 2014 | 2015 | '@rollup/rollup-linux-s390x-gnu@4.31.0': 2016 | optional: true 2017 | 2018 | '@rollup/rollup-linux-x64-gnu@4.31.0': 2019 | optional: true 2020 | 2021 | '@rollup/rollup-linux-x64-musl@4.31.0': 2022 | optional: true 2023 | 2024 | '@rollup/rollup-win32-arm64-msvc@4.31.0': 2025 | optional: true 2026 | 2027 | '@rollup/rollup-win32-ia32-msvc@4.31.0': 2028 | optional: true 2029 | 2030 | '@rollup/rollup-win32-x64-msvc@4.31.0': 2031 | optional: true 2032 | 2033 | '@rtsao/scc@1.1.0': {} 2034 | 2035 | '@sindresorhus/tsconfig@7.0.0': {} 2036 | 2037 | '@thaunknown/thirty-two@1.0.5': 2038 | dependencies: 2039 | uint8-util: 2.2.5 2040 | 2041 | '@types/estree@1.0.6': {} 2042 | 2043 | '@types/json-schema@7.0.15': {} 2044 | 2045 | '@types/json5@0.0.29': {} 2046 | 2047 | '@types/node@22.10.7': 2048 | dependencies: 2049 | undici-types: 6.20.0 2050 | 2051 | '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3)': 2052 | dependencies: 2053 | '@eslint-community/regexpp': 4.12.1 2054 | '@typescript-eslint/parser': 8.21.0(eslint@9.18.0)(typescript@5.7.3) 2055 | '@typescript-eslint/scope-manager': 8.21.0 2056 | '@typescript-eslint/type-utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) 2057 | '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) 2058 | '@typescript-eslint/visitor-keys': 8.21.0 2059 | eslint: 9.18.0 2060 | graphemer: 1.4.0 2061 | ignore: 5.3.2 2062 | natural-compare: 1.4.0 2063 | ts-api-utils: 2.0.0(typescript@5.7.3) 2064 | typescript: 5.7.3 2065 | transitivePeerDependencies: 2066 | - supports-color 2067 | 2068 | '@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3)': 2069 | dependencies: 2070 | '@typescript-eslint/scope-manager': 8.21.0 2071 | '@typescript-eslint/types': 8.21.0 2072 | '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) 2073 | '@typescript-eslint/visitor-keys': 8.21.0 2074 | debug: 4.4.0 2075 | eslint: 9.18.0 2076 | typescript: 5.7.3 2077 | transitivePeerDependencies: 2078 | - supports-color 2079 | 2080 | '@typescript-eslint/scope-manager@8.21.0': 2081 | dependencies: 2082 | '@typescript-eslint/types': 8.21.0 2083 | '@typescript-eslint/visitor-keys': 8.21.0 2084 | 2085 | '@typescript-eslint/type-utils@8.21.0(eslint@9.18.0)(typescript@5.7.3)': 2086 | dependencies: 2087 | '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) 2088 | '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) 2089 | debug: 4.4.0 2090 | eslint: 9.18.0 2091 | ts-api-utils: 2.0.0(typescript@5.7.3) 2092 | typescript: 5.7.3 2093 | transitivePeerDependencies: 2094 | - supports-color 2095 | 2096 | '@typescript-eslint/types@8.21.0': {} 2097 | 2098 | '@typescript-eslint/typescript-estree@8.21.0(typescript@5.7.3)': 2099 | dependencies: 2100 | '@typescript-eslint/types': 8.21.0 2101 | '@typescript-eslint/visitor-keys': 8.21.0 2102 | debug: 4.4.0 2103 | fast-glob: 3.3.3 2104 | is-glob: 4.0.3 2105 | minimatch: 9.0.5 2106 | semver: 7.6.3 2107 | ts-api-utils: 2.0.0(typescript@5.7.3) 2108 | typescript: 5.7.3 2109 | transitivePeerDependencies: 2110 | - supports-color 2111 | 2112 | '@typescript-eslint/utils@8.21.0(eslint@9.18.0)(typescript@5.7.3)': 2113 | dependencies: 2114 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) 2115 | '@typescript-eslint/scope-manager': 8.21.0 2116 | '@typescript-eslint/types': 8.21.0 2117 | '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) 2118 | eslint: 9.18.0 2119 | typescript: 5.7.3 2120 | transitivePeerDependencies: 2121 | - supports-color 2122 | 2123 | '@typescript-eslint/visitor-keys@8.21.0': 2124 | dependencies: 2125 | '@typescript-eslint/types': 8.21.0 2126 | eslint-visitor-keys: 4.2.0 2127 | 2128 | '@vitest/coverage-v8@3.0.2(vitest@3.0.2(@types/node@22.10.7))': 2129 | dependencies: 2130 | '@ampproject/remapping': 2.3.0 2131 | '@bcoe/v8-coverage': 1.0.2 2132 | debug: 4.4.0 2133 | istanbul-lib-coverage: 3.2.2 2134 | istanbul-lib-report: 3.0.1 2135 | istanbul-lib-source-maps: 5.0.6 2136 | istanbul-reports: 3.1.7 2137 | magic-string: 0.30.17 2138 | magicast: 0.3.5 2139 | std-env: 3.8.0 2140 | test-exclude: 7.0.1 2141 | tinyrainbow: 2.0.0 2142 | vitest: 3.0.2(@types/node@22.10.7) 2143 | transitivePeerDependencies: 2144 | - supports-color 2145 | 2146 | '@vitest/expect@3.0.2': 2147 | dependencies: 2148 | '@vitest/spy': 3.0.2 2149 | '@vitest/utils': 3.0.2 2150 | chai: 5.1.2 2151 | tinyrainbow: 2.0.0 2152 | 2153 | '@vitest/mocker@3.0.2(vite@6.0.10(@types/node@22.10.7))': 2154 | dependencies: 2155 | '@vitest/spy': 3.0.2 2156 | estree-walker: 3.0.3 2157 | magic-string: 0.30.17 2158 | optionalDependencies: 2159 | vite: 6.0.10(@types/node@22.10.7) 2160 | 2161 | '@vitest/pretty-format@3.0.2': 2162 | dependencies: 2163 | tinyrainbow: 2.0.0 2164 | 2165 | '@vitest/runner@3.0.2': 2166 | dependencies: 2167 | '@vitest/utils': 3.0.2 2168 | pathe: 2.0.2 2169 | 2170 | '@vitest/snapshot@3.0.2': 2171 | dependencies: 2172 | '@vitest/pretty-format': 3.0.2 2173 | magic-string: 0.30.17 2174 | pathe: 2.0.2 2175 | 2176 | '@vitest/spy@3.0.2': 2177 | dependencies: 2178 | tinyspy: 3.0.2 2179 | 2180 | '@vitest/utils@3.0.2': 2181 | dependencies: 2182 | '@vitest/pretty-format': 3.0.2 2183 | loupe: 3.1.2 2184 | tinyrainbow: 2.0.0 2185 | 2186 | abort-controller@3.0.0: 2187 | dependencies: 2188 | event-target-shim: 5.0.1 2189 | 2190 | acorn-jsx@5.3.2(acorn@8.14.0): 2191 | dependencies: 2192 | acorn: 8.14.0 2193 | 2194 | acorn@8.14.0: {} 2195 | 2196 | ajv@6.12.6: 2197 | dependencies: 2198 | fast-deep-equal: 3.1.3 2199 | fast-json-stable-stringify: 2.1.0 2200 | json-schema-traverse: 0.4.1 2201 | uri-js: 4.4.1 2202 | 2203 | ansi-regex@5.0.1: {} 2204 | 2205 | ansi-regex@6.1.0: {} 2206 | 2207 | ansi-styles@4.3.0: 2208 | dependencies: 2209 | color-convert: 2.0.1 2210 | 2211 | ansi-styles@6.2.1: {} 2212 | 2213 | argparse@2.0.1: {} 2214 | 2215 | array-buffer-byte-length@1.0.2: 2216 | dependencies: 2217 | call-bound: 1.0.3 2218 | is-array-buffer: 3.0.5 2219 | 2220 | array-includes@3.1.8: 2221 | dependencies: 2222 | call-bind: 1.0.8 2223 | define-properties: 1.2.1 2224 | es-abstract: 1.23.9 2225 | es-object-atoms: 1.1.1 2226 | get-intrinsic: 1.2.7 2227 | is-string: 1.1.1 2228 | 2229 | array.prototype.findlastindex@1.2.5: 2230 | dependencies: 2231 | call-bind: 1.0.8 2232 | define-properties: 1.2.1 2233 | es-abstract: 1.23.9 2234 | es-errors: 1.3.0 2235 | es-object-atoms: 1.1.1 2236 | es-shim-unscopables: 1.0.2 2237 | 2238 | array.prototype.flat@1.3.3: 2239 | dependencies: 2240 | call-bind: 1.0.8 2241 | define-properties: 1.2.1 2242 | es-abstract: 1.23.9 2243 | es-shim-unscopables: 1.0.2 2244 | 2245 | array.prototype.flatmap@1.3.3: 2246 | dependencies: 2247 | call-bind: 1.0.8 2248 | define-properties: 1.2.1 2249 | es-abstract: 1.23.9 2250 | es-shim-unscopables: 1.0.2 2251 | 2252 | arraybuffer.prototype.slice@1.0.4: 2253 | dependencies: 2254 | array-buffer-byte-length: 1.0.2 2255 | call-bind: 1.0.8 2256 | define-properties: 1.2.1 2257 | es-abstract: 1.23.9 2258 | es-errors: 1.3.0 2259 | get-intrinsic: 1.2.7 2260 | is-array-buffer: 3.0.5 2261 | 2262 | assertion-error@2.0.1: {} 2263 | 2264 | available-typed-arrays@1.0.7: 2265 | dependencies: 2266 | possible-typed-array-names: 1.0.0 2267 | 2268 | balanced-match@1.0.2: {} 2269 | 2270 | base64-arraybuffer@1.0.2: {} 2271 | 2272 | bencode@4.0.0: 2273 | dependencies: 2274 | uint8-util: 2.2.5 2275 | 2276 | bep53-range@2.0.0: {} 2277 | 2278 | brace-expansion@1.1.11: 2279 | dependencies: 2280 | balanced-match: 1.0.2 2281 | concat-map: 0.0.1 2282 | 2283 | brace-expansion@2.0.1: 2284 | dependencies: 2285 | balanced-match: 1.0.2 2286 | 2287 | braces@3.0.3: 2288 | dependencies: 2289 | fill-range: 7.1.1 2290 | 2291 | cac@6.7.14: {} 2292 | 2293 | call-bind-apply-helpers@1.0.1: 2294 | dependencies: 2295 | es-errors: 1.3.0 2296 | function-bind: 1.1.2 2297 | 2298 | call-bind@1.0.8: 2299 | dependencies: 2300 | call-bind-apply-helpers: 1.0.1 2301 | es-define-property: 1.0.1 2302 | get-intrinsic: 1.2.7 2303 | set-function-length: 1.2.2 2304 | 2305 | call-bound@1.0.3: 2306 | dependencies: 2307 | call-bind-apply-helpers: 1.0.1 2308 | get-intrinsic: 1.2.7 2309 | 2310 | callsites@3.1.0: {} 2311 | 2312 | chai@5.1.2: 2313 | dependencies: 2314 | assertion-error: 2.0.1 2315 | check-error: 2.1.1 2316 | deep-eql: 5.0.2 2317 | loupe: 3.1.2 2318 | pathval: 2.0.0 2319 | 2320 | chalk@4.1.2: 2321 | dependencies: 2322 | ansi-styles: 4.3.0 2323 | supports-color: 7.2.0 2324 | 2325 | check-error@2.1.1: {} 2326 | 2327 | color-convert@2.0.1: 2328 | dependencies: 2329 | color-name: 1.1.4 2330 | 2331 | color-name@1.1.4: {} 2332 | 2333 | concat-map@0.0.1: {} 2334 | 2335 | cross-fetch-ponyfill@1.0.3: 2336 | dependencies: 2337 | abort-controller: 3.0.0 2338 | node-fetch: 3.3.2 2339 | 2340 | cross-spawn@7.0.6: 2341 | dependencies: 2342 | path-key: 3.1.1 2343 | shebang-command: 2.0.0 2344 | which: 2.0.2 2345 | 2346 | data-uri-to-buffer@4.0.1: {} 2347 | 2348 | data-view-buffer@1.0.2: 2349 | dependencies: 2350 | call-bound: 1.0.3 2351 | es-errors: 1.3.0 2352 | is-data-view: 1.0.2 2353 | 2354 | data-view-byte-length@1.0.2: 2355 | dependencies: 2356 | call-bound: 1.0.3 2357 | es-errors: 1.3.0 2358 | is-data-view: 1.0.2 2359 | 2360 | data-view-byte-offset@1.0.1: 2361 | dependencies: 2362 | call-bound: 1.0.3 2363 | es-errors: 1.3.0 2364 | is-data-view: 1.0.2 2365 | 2366 | debug@3.2.7: 2367 | dependencies: 2368 | ms: 2.1.3 2369 | 2370 | debug@4.4.0: 2371 | dependencies: 2372 | ms: 2.1.3 2373 | 2374 | deep-eql@5.0.2: {} 2375 | 2376 | deep-is@0.1.4: {} 2377 | 2378 | define-data-property@1.1.4: 2379 | dependencies: 2380 | es-define-property: 1.0.1 2381 | es-errors: 1.3.0 2382 | gopd: 1.2.0 2383 | 2384 | define-properties@1.2.1: 2385 | dependencies: 2386 | define-data-property: 1.1.4 2387 | has-property-descriptors: 1.0.2 2388 | object-keys: 1.1.1 2389 | 2390 | doctrine@2.1.0: 2391 | dependencies: 2392 | esutils: 2.0.3 2393 | 2394 | dunder-proto@1.0.1: 2395 | dependencies: 2396 | call-bind-apply-helpers: 1.0.1 2397 | es-errors: 1.3.0 2398 | gopd: 1.2.0 2399 | 2400 | eastasianwidth@0.2.0: {} 2401 | 2402 | emoji-regex@8.0.0: {} 2403 | 2404 | emoji-regex@9.2.2: {} 2405 | 2406 | es-abstract@1.23.9: 2407 | dependencies: 2408 | array-buffer-byte-length: 1.0.2 2409 | arraybuffer.prototype.slice: 1.0.4 2410 | available-typed-arrays: 1.0.7 2411 | call-bind: 1.0.8 2412 | call-bound: 1.0.3 2413 | data-view-buffer: 1.0.2 2414 | data-view-byte-length: 1.0.2 2415 | data-view-byte-offset: 1.0.1 2416 | es-define-property: 1.0.1 2417 | es-errors: 1.3.0 2418 | es-object-atoms: 1.1.1 2419 | es-set-tostringtag: 2.1.0 2420 | es-to-primitive: 1.3.0 2421 | function.prototype.name: 1.1.8 2422 | get-intrinsic: 1.2.7 2423 | get-proto: 1.0.1 2424 | get-symbol-description: 1.1.0 2425 | globalthis: 1.0.4 2426 | gopd: 1.2.0 2427 | has-property-descriptors: 1.0.2 2428 | has-proto: 1.2.0 2429 | has-symbols: 1.1.0 2430 | hasown: 2.0.2 2431 | internal-slot: 1.1.0 2432 | is-array-buffer: 3.0.5 2433 | is-callable: 1.2.7 2434 | is-data-view: 1.0.2 2435 | is-regex: 1.2.1 2436 | is-shared-array-buffer: 1.0.4 2437 | is-string: 1.1.1 2438 | is-typed-array: 1.1.15 2439 | is-weakref: 1.1.0 2440 | math-intrinsics: 1.1.0 2441 | object-inspect: 1.13.3 2442 | object-keys: 1.1.1 2443 | object.assign: 4.1.7 2444 | own-keys: 1.0.1 2445 | regexp.prototype.flags: 1.5.4 2446 | safe-array-concat: 1.1.3 2447 | safe-push-apply: 1.0.0 2448 | safe-regex-test: 1.1.0 2449 | set-proto: 1.0.0 2450 | string.prototype.trim: 1.2.10 2451 | string.prototype.trimend: 1.0.9 2452 | string.prototype.trimstart: 1.0.8 2453 | typed-array-buffer: 1.0.3 2454 | typed-array-byte-length: 1.0.3 2455 | typed-array-byte-offset: 1.0.4 2456 | typed-array-length: 1.0.7 2457 | unbox-primitive: 1.1.0 2458 | which-typed-array: 1.1.18 2459 | 2460 | es-define-property@1.0.1: {} 2461 | 2462 | es-errors@1.3.0: {} 2463 | 2464 | es-module-lexer@1.6.0: {} 2465 | 2466 | es-object-atoms@1.1.1: 2467 | dependencies: 2468 | es-errors: 1.3.0 2469 | 2470 | es-set-tostringtag@2.1.0: 2471 | dependencies: 2472 | es-errors: 1.3.0 2473 | get-intrinsic: 1.2.7 2474 | has-tostringtag: 1.0.2 2475 | hasown: 2.0.2 2476 | 2477 | es-shim-unscopables@1.0.2: 2478 | dependencies: 2479 | hasown: 2.0.2 2480 | 2481 | es-to-primitive@1.3.0: 2482 | dependencies: 2483 | is-callable: 1.2.7 2484 | is-date-object: 1.1.0 2485 | is-symbol: 1.1.1 2486 | 2487 | esbuild@0.24.2: 2488 | optionalDependencies: 2489 | '@esbuild/aix-ppc64': 0.24.2 2490 | '@esbuild/android-arm': 0.24.2 2491 | '@esbuild/android-arm64': 0.24.2 2492 | '@esbuild/android-x64': 0.24.2 2493 | '@esbuild/darwin-arm64': 0.24.2 2494 | '@esbuild/darwin-x64': 0.24.2 2495 | '@esbuild/freebsd-arm64': 0.24.2 2496 | '@esbuild/freebsd-x64': 0.24.2 2497 | '@esbuild/linux-arm': 0.24.2 2498 | '@esbuild/linux-arm64': 0.24.2 2499 | '@esbuild/linux-ia32': 0.24.2 2500 | '@esbuild/linux-loong64': 0.24.2 2501 | '@esbuild/linux-mips64el': 0.24.2 2502 | '@esbuild/linux-ppc64': 0.24.2 2503 | '@esbuild/linux-riscv64': 0.24.2 2504 | '@esbuild/linux-s390x': 0.24.2 2505 | '@esbuild/linux-x64': 0.24.2 2506 | '@esbuild/netbsd-arm64': 0.24.2 2507 | '@esbuild/netbsd-x64': 0.24.2 2508 | '@esbuild/openbsd-arm64': 0.24.2 2509 | '@esbuild/openbsd-x64': 0.24.2 2510 | '@esbuild/sunos-x64': 0.24.2 2511 | '@esbuild/win32-arm64': 0.24.2 2512 | '@esbuild/win32-ia32': 0.24.2 2513 | '@esbuild/win32-x64': 0.24.2 2514 | 2515 | escape-string-regexp@4.0.0: {} 2516 | 2517 | eslint-import-resolver-node@0.3.9: 2518 | dependencies: 2519 | debug: 3.2.7 2520 | is-core-module: 2.16.1 2521 | resolve: 1.22.10 2522 | transitivePeerDependencies: 2523 | - supports-color 2524 | 2525 | eslint-module-utils@2.12.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.18.0): 2526 | dependencies: 2527 | debug: 3.2.7 2528 | optionalDependencies: 2529 | '@typescript-eslint/parser': 8.21.0(eslint@9.18.0)(typescript@5.7.3) 2530 | eslint: 9.18.0 2531 | eslint-import-resolver-node: 0.3.9 2532 | transitivePeerDependencies: 2533 | - supports-color 2534 | 2535 | eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0): 2536 | dependencies: 2537 | '@rtsao/scc': 1.1.0 2538 | array-includes: 3.1.8 2539 | array.prototype.findlastindex: 1.2.5 2540 | array.prototype.flat: 1.3.3 2541 | array.prototype.flatmap: 1.3.3 2542 | debug: 3.2.7 2543 | doctrine: 2.1.0 2544 | eslint: 9.18.0 2545 | eslint-import-resolver-node: 0.3.9 2546 | eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.18.0) 2547 | hasown: 2.0.2 2548 | is-core-module: 2.16.1 2549 | is-glob: 4.0.3 2550 | minimatch: 3.1.2 2551 | object.fromentries: 2.0.8 2552 | object.groupby: 1.0.3 2553 | object.values: 1.2.1 2554 | semver: 6.3.1 2555 | string.prototype.trimend: 1.0.9 2556 | tsconfig-paths: 3.15.0 2557 | optionalDependencies: 2558 | '@typescript-eslint/parser': 8.21.0(eslint@9.18.0)(typescript@5.7.3) 2559 | transitivePeerDependencies: 2560 | - eslint-import-resolver-typescript 2561 | - eslint-import-resolver-webpack 2562 | - supports-color 2563 | 2564 | eslint-plugin-simple-import-sort@12.1.1(eslint@9.18.0): 2565 | dependencies: 2566 | eslint: 9.18.0 2567 | 2568 | eslint-scope@8.2.0: 2569 | dependencies: 2570 | esrecurse: 4.3.0 2571 | estraverse: 5.3.0 2572 | 2573 | eslint-visitor-keys@3.4.3: {} 2574 | 2575 | eslint-visitor-keys@4.2.0: {} 2576 | 2577 | eslint@9.18.0: 2578 | dependencies: 2579 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) 2580 | '@eslint-community/regexpp': 4.12.1 2581 | '@eslint/config-array': 0.19.1 2582 | '@eslint/core': 0.10.0 2583 | '@eslint/eslintrc': 3.2.0 2584 | '@eslint/js': 9.18.0 2585 | '@eslint/plugin-kit': 0.2.5 2586 | '@humanfs/node': 0.16.6 2587 | '@humanwhocodes/module-importer': 1.0.1 2588 | '@humanwhocodes/retry': 0.4.1 2589 | '@types/estree': 1.0.6 2590 | '@types/json-schema': 7.0.15 2591 | ajv: 6.12.6 2592 | chalk: 4.1.2 2593 | cross-spawn: 7.0.6 2594 | debug: 4.4.0 2595 | escape-string-regexp: 4.0.0 2596 | eslint-scope: 8.2.0 2597 | eslint-visitor-keys: 4.2.0 2598 | espree: 10.3.0 2599 | esquery: 1.6.0 2600 | esutils: 2.0.3 2601 | fast-deep-equal: 3.1.3 2602 | file-entry-cache: 8.0.0 2603 | find-up: 5.0.0 2604 | glob-parent: 6.0.2 2605 | ignore: 5.3.2 2606 | imurmurhash: 0.1.4 2607 | is-glob: 4.0.3 2608 | json-stable-stringify-without-jsonify: 1.0.1 2609 | lodash.merge: 4.6.2 2610 | minimatch: 3.1.2 2611 | natural-compare: 1.4.0 2612 | optionator: 0.9.4 2613 | transitivePeerDependencies: 2614 | - supports-color 2615 | 2616 | espree@10.3.0: 2617 | dependencies: 2618 | acorn: 8.14.0 2619 | acorn-jsx: 5.3.2(acorn@8.14.0) 2620 | eslint-visitor-keys: 4.2.0 2621 | 2622 | esquery@1.6.0: 2623 | dependencies: 2624 | estraverse: 5.3.0 2625 | 2626 | esrecurse@4.3.0: 2627 | dependencies: 2628 | estraverse: 5.3.0 2629 | 2630 | estraverse@5.3.0: {} 2631 | 2632 | estree-walker@3.0.3: 2633 | dependencies: 2634 | '@types/estree': 1.0.6 2635 | 2636 | esutils@2.0.3: {} 2637 | 2638 | event-target-shim@5.0.1: {} 2639 | 2640 | expect-type@1.1.0: {} 2641 | 2642 | fast-deep-equal@3.1.3: {} 2643 | 2644 | fast-glob@3.3.3: 2645 | dependencies: 2646 | '@nodelib/fs.stat': 2.0.5 2647 | '@nodelib/fs.walk': 1.2.8 2648 | glob-parent: 5.1.2 2649 | merge2: 1.4.1 2650 | micromatch: 4.0.8 2651 | 2652 | fast-json-stable-stringify@2.1.0: {} 2653 | 2654 | fast-levenshtein@2.0.6: {} 2655 | 2656 | fastq@1.18.0: 2657 | dependencies: 2658 | reusify: 1.0.4 2659 | 2660 | fetch-blob@3.2.0: 2661 | dependencies: 2662 | node-domexception: 1.0.0 2663 | web-streams-polyfill: 3.3.3 2664 | 2665 | file-entry-cache@8.0.0: 2666 | dependencies: 2667 | flat-cache: 4.0.1 2668 | 2669 | fill-range@7.1.1: 2670 | dependencies: 2671 | to-regex-range: 5.0.1 2672 | 2673 | find-up@5.0.0: 2674 | dependencies: 2675 | locate-path: 6.0.0 2676 | path-exists: 4.0.0 2677 | 2678 | flat-cache@4.0.1: 2679 | dependencies: 2680 | flatted: 3.3.2 2681 | keyv: 4.5.4 2682 | 2683 | flatted@3.3.2: {} 2684 | 2685 | for-each@0.3.3: 2686 | dependencies: 2687 | is-callable: 1.2.7 2688 | 2689 | foreground-child@3.3.0: 2690 | dependencies: 2691 | cross-spawn: 7.0.6 2692 | signal-exit: 4.1.0 2693 | 2694 | formdata-polyfill@4.0.10: 2695 | dependencies: 2696 | fetch-blob: 3.2.0 2697 | 2698 | fsevents@2.3.3: 2699 | optional: true 2700 | 2701 | function-bind@1.1.2: {} 2702 | 2703 | function.prototype.name@1.1.8: 2704 | dependencies: 2705 | call-bind: 1.0.8 2706 | call-bound: 1.0.3 2707 | define-properties: 1.2.1 2708 | functions-have-names: 1.2.3 2709 | hasown: 2.0.2 2710 | is-callable: 1.2.7 2711 | 2712 | functions-have-names@1.2.3: {} 2713 | 2714 | get-intrinsic@1.2.7: 2715 | dependencies: 2716 | call-bind-apply-helpers: 1.0.1 2717 | es-define-property: 1.0.1 2718 | es-errors: 1.3.0 2719 | es-object-atoms: 1.1.1 2720 | function-bind: 1.1.2 2721 | get-proto: 1.0.1 2722 | gopd: 1.2.0 2723 | has-symbols: 1.1.0 2724 | hasown: 2.0.2 2725 | math-intrinsics: 1.1.0 2726 | 2727 | get-proto@1.0.1: 2728 | dependencies: 2729 | dunder-proto: 1.0.1 2730 | es-object-atoms: 1.1.1 2731 | 2732 | get-stdin@9.0.0: {} 2733 | 2734 | get-symbol-description@1.1.0: 2735 | dependencies: 2736 | call-bound: 1.0.3 2737 | es-errors: 1.3.0 2738 | get-intrinsic: 1.2.7 2739 | 2740 | glob-parent@5.1.2: 2741 | dependencies: 2742 | is-glob: 4.0.3 2743 | 2744 | glob-parent@6.0.2: 2745 | dependencies: 2746 | is-glob: 4.0.3 2747 | 2748 | glob@10.4.5: 2749 | dependencies: 2750 | foreground-child: 3.3.0 2751 | jackspeak: 3.4.3 2752 | minimatch: 9.0.5 2753 | minipass: 7.1.2 2754 | package-json-from-dist: 1.0.1 2755 | path-scurry: 1.11.1 2756 | 2757 | globals@14.0.0: {} 2758 | 2759 | globalthis@1.0.4: 2760 | dependencies: 2761 | define-properties: 1.2.1 2762 | gopd: 1.2.0 2763 | 2764 | gopd@1.2.0: {} 2765 | 2766 | graphemer@1.4.0: {} 2767 | 2768 | has-bigints@1.1.0: {} 2769 | 2770 | has-flag@4.0.0: {} 2771 | 2772 | has-property-descriptors@1.0.2: 2773 | dependencies: 2774 | es-define-property: 1.0.1 2775 | 2776 | has-proto@1.2.0: 2777 | dependencies: 2778 | dunder-proto: 1.0.1 2779 | 2780 | has-symbols@1.1.0: {} 2781 | 2782 | has-tostringtag@1.0.2: 2783 | dependencies: 2784 | has-symbols: 1.1.0 2785 | 2786 | hasown@2.0.2: 2787 | dependencies: 2788 | function-bind: 1.1.2 2789 | 2790 | html-escaper@2.0.2: {} 2791 | 2792 | ignore@5.3.2: {} 2793 | 2794 | import-fresh@3.3.0: 2795 | dependencies: 2796 | parent-module: 1.0.1 2797 | resolve-from: 4.0.0 2798 | 2799 | imurmurhash@0.1.4: {} 2800 | 2801 | internal-slot@1.1.0: 2802 | dependencies: 2803 | es-errors: 1.3.0 2804 | hasown: 2.0.2 2805 | side-channel: 1.1.0 2806 | 2807 | is-array-buffer@3.0.5: 2808 | dependencies: 2809 | call-bind: 1.0.8 2810 | call-bound: 1.0.3 2811 | get-intrinsic: 1.2.7 2812 | 2813 | is-async-function@2.1.0: 2814 | dependencies: 2815 | call-bound: 1.0.3 2816 | get-proto: 1.0.1 2817 | has-tostringtag: 1.0.2 2818 | safe-regex-test: 1.1.0 2819 | 2820 | is-bigint@1.1.0: 2821 | dependencies: 2822 | has-bigints: 1.1.0 2823 | 2824 | is-boolean-object@1.2.1: 2825 | dependencies: 2826 | call-bound: 1.0.3 2827 | has-tostringtag: 1.0.2 2828 | 2829 | is-callable@1.2.7: {} 2830 | 2831 | is-core-module@2.16.1: 2832 | dependencies: 2833 | hasown: 2.0.2 2834 | 2835 | is-data-view@1.0.2: 2836 | dependencies: 2837 | call-bound: 1.0.3 2838 | get-intrinsic: 1.2.7 2839 | is-typed-array: 1.1.15 2840 | 2841 | is-date-object@1.1.0: 2842 | dependencies: 2843 | call-bound: 1.0.3 2844 | has-tostringtag: 1.0.2 2845 | 2846 | is-extglob@2.1.1: {} 2847 | 2848 | is-finalizationregistry@1.1.1: 2849 | dependencies: 2850 | call-bound: 1.0.3 2851 | 2852 | is-fullwidth-code-point@3.0.0: {} 2853 | 2854 | is-generator-function@1.1.0: 2855 | dependencies: 2856 | call-bound: 1.0.3 2857 | get-proto: 1.0.1 2858 | has-tostringtag: 1.0.2 2859 | safe-regex-test: 1.1.0 2860 | 2861 | is-glob@4.0.3: 2862 | dependencies: 2863 | is-extglob: 2.1.1 2864 | 2865 | is-map@2.0.3: {} 2866 | 2867 | is-number-object@1.1.1: 2868 | dependencies: 2869 | call-bound: 1.0.3 2870 | has-tostringtag: 1.0.2 2871 | 2872 | is-number@7.0.0: {} 2873 | 2874 | is-regex@1.2.1: 2875 | dependencies: 2876 | call-bound: 1.0.3 2877 | gopd: 1.2.0 2878 | has-tostringtag: 1.0.2 2879 | hasown: 2.0.2 2880 | 2881 | is-set@2.0.3: {} 2882 | 2883 | is-shared-array-buffer@1.0.4: 2884 | dependencies: 2885 | call-bound: 1.0.3 2886 | 2887 | is-string@1.1.1: 2888 | dependencies: 2889 | call-bound: 1.0.3 2890 | has-tostringtag: 1.0.2 2891 | 2892 | is-symbol@1.1.1: 2893 | dependencies: 2894 | call-bound: 1.0.3 2895 | has-symbols: 1.1.0 2896 | safe-regex-test: 1.1.0 2897 | 2898 | is-typed-array@1.1.15: 2899 | dependencies: 2900 | which-typed-array: 1.1.18 2901 | 2902 | is-weakmap@2.0.2: {} 2903 | 2904 | is-weakref@1.1.0: 2905 | dependencies: 2906 | call-bound: 1.0.3 2907 | 2908 | is-weakset@2.0.4: 2909 | dependencies: 2910 | call-bound: 1.0.3 2911 | get-intrinsic: 1.2.7 2912 | 2913 | isarray@2.0.5: {} 2914 | 2915 | isexe@2.0.0: {} 2916 | 2917 | istanbul-lib-coverage@3.2.2: {} 2918 | 2919 | istanbul-lib-report@3.0.1: 2920 | dependencies: 2921 | istanbul-lib-coverage: 3.2.2 2922 | make-dir: 4.0.0 2923 | supports-color: 7.2.0 2924 | 2925 | istanbul-lib-source-maps@5.0.6: 2926 | dependencies: 2927 | '@jridgewell/trace-mapping': 0.3.25 2928 | debug: 4.4.0 2929 | istanbul-lib-coverage: 3.2.2 2930 | transitivePeerDependencies: 2931 | - supports-color 2932 | 2933 | istanbul-reports@3.1.7: 2934 | dependencies: 2935 | html-escaper: 2.0.2 2936 | istanbul-lib-report: 3.0.1 2937 | 2938 | jackspeak@3.4.3: 2939 | dependencies: 2940 | '@isaacs/cliui': 8.0.2 2941 | optionalDependencies: 2942 | '@pkgjs/parseargs': 0.11.0 2943 | 2944 | js-yaml@4.1.0: 2945 | dependencies: 2946 | argparse: 2.0.1 2947 | 2948 | json-buffer@3.0.1: {} 2949 | 2950 | json-schema-traverse@0.4.1: {} 2951 | 2952 | json-stable-stringify-without-jsonify@1.0.1: {} 2953 | 2954 | json5@1.0.2: 2955 | dependencies: 2956 | minimist: 1.2.8 2957 | 2958 | keyv@4.5.4: 2959 | dependencies: 2960 | json-buffer: 3.0.1 2961 | 2962 | levn@0.4.1: 2963 | dependencies: 2964 | prelude-ls: 1.2.1 2965 | type-check: 0.4.0 2966 | 2967 | locate-path@6.0.0: 2968 | dependencies: 2969 | p-locate: 5.0.0 2970 | 2971 | lodash.merge@4.6.2: {} 2972 | 2973 | loupe@3.1.2: {} 2974 | 2975 | lru-cache@10.4.3: {} 2976 | 2977 | magic-string@0.30.17: 2978 | dependencies: 2979 | '@jridgewell/sourcemap-codec': 1.5.0 2980 | 2981 | magicast@0.3.5: 2982 | dependencies: 2983 | '@babel/parser': 7.26.5 2984 | '@babel/types': 7.26.5 2985 | source-map-js: 1.2.1 2986 | 2987 | magnet-uri@7.0.7: 2988 | dependencies: 2989 | '@thaunknown/thirty-two': 1.0.5 2990 | bep53-range: 2.0.0 2991 | uint8-util: 2.2.5 2992 | 2993 | make-dir@4.0.0: 2994 | dependencies: 2995 | semver: 7.6.3 2996 | 2997 | math-intrinsics@1.1.0: {} 2998 | 2999 | merge2@1.4.1: {} 3000 | 3001 | micromatch@4.0.8: 3002 | dependencies: 3003 | braces: 3.0.3 3004 | picomatch: 2.3.1 3005 | 3006 | minimatch@3.1.2: 3007 | dependencies: 3008 | brace-expansion: 1.1.11 3009 | 3010 | minimatch@9.0.5: 3011 | dependencies: 3012 | brace-expansion: 2.0.1 3013 | 3014 | minimist@1.2.8: {} 3015 | 3016 | minipass@7.1.2: {} 3017 | 3018 | ms@2.1.3: {} 3019 | 3020 | nanoid@3.3.8: {} 3021 | 3022 | natural-compare@1.4.0: {} 3023 | 3024 | node-domexception@1.0.0: {} 3025 | 3026 | node-fetch@3.3.2: 3027 | dependencies: 3028 | data-uri-to-buffer: 4.0.1 3029 | fetch-blob: 3.2.0 3030 | formdata-polyfill: 4.0.10 3031 | 3032 | object-inspect@1.13.3: {} 3033 | 3034 | object-keys@1.1.1: {} 3035 | 3036 | object.assign@4.1.7: 3037 | dependencies: 3038 | call-bind: 1.0.8 3039 | call-bound: 1.0.3 3040 | define-properties: 1.2.1 3041 | es-object-atoms: 1.1.1 3042 | has-symbols: 1.1.0 3043 | object-keys: 1.1.1 3044 | 3045 | object.fromentries@2.0.8: 3046 | dependencies: 3047 | call-bind: 1.0.8 3048 | define-properties: 1.2.1 3049 | es-abstract: 1.23.9 3050 | es-object-atoms: 1.1.1 3051 | 3052 | object.groupby@1.0.3: 3053 | dependencies: 3054 | call-bind: 1.0.8 3055 | define-properties: 1.2.1 3056 | es-abstract: 1.23.9 3057 | 3058 | object.values@1.2.1: 3059 | dependencies: 3060 | call-bind: 1.0.8 3061 | call-bound: 1.0.3 3062 | define-properties: 1.2.1 3063 | es-object-atoms: 1.1.1 3064 | 3065 | optionator@0.9.4: 3066 | dependencies: 3067 | deep-is: 0.1.4 3068 | fast-levenshtein: 2.0.6 3069 | levn: 0.4.1 3070 | prelude-ls: 1.2.1 3071 | type-check: 0.4.0 3072 | word-wrap: 1.2.5 3073 | 3074 | own-keys@1.0.1: 3075 | dependencies: 3076 | get-intrinsic: 1.2.7 3077 | object-keys: 1.1.1 3078 | safe-push-apply: 1.0.0 3079 | 3080 | p-limit@3.1.0: 3081 | dependencies: 3082 | yocto-queue: 0.1.0 3083 | 3084 | p-locate@5.0.0: 3085 | dependencies: 3086 | p-limit: 3.1.0 3087 | 3088 | package-json-from-dist@1.0.1: {} 3089 | 3090 | parent-module@1.0.1: 3091 | dependencies: 3092 | callsites: 3.1.0 3093 | 3094 | parse-torrent@11.0.18: 3095 | dependencies: 3096 | bencode: 4.0.0 3097 | cross-fetch-ponyfill: 1.0.3 3098 | get-stdin: 9.0.0 3099 | magnet-uri: 7.0.7 3100 | queue-microtask: 1.2.3 3101 | uint8-util: 2.2.5 3102 | 3103 | path-exists@4.0.0: {} 3104 | 3105 | path-key@3.1.1: {} 3106 | 3107 | path-parse@1.0.7: {} 3108 | 3109 | path-scurry@1.11.1: 3110 | dependencies: 3111 | lru-cache: 10.4.3 3112 | minipass: 7.1.2 3113 | 3114 | pathe@2.0.2: {} 3115 | 3116 | pathval@2.0.0: {} 3117 | 3118 | picocolors@1.1.1: {} 3119 | 3120 | picomatch@2.3.1: {} 3121 | 3122 | possible-typed-array-names@1.0.0: {} 3123 | 3124 | postcss@8.5.1: 3125 | dependencies: 3126 | nanoid: 3.3.8 3127 | picocolors: 1.1.1 3128 | source-map-js: 1.2.1 3129 | 3130 | prelude-ls@1.2.1: {} 3131 | 3132 | punycode@2.3.1: {} 3133 | 3134 | queue-microtask@1.2.3: {} 3135 | 3136 | reflect.getprototypeof@1.0.10: 3137 | dependencies: 3138 | call-bind: 1.0.8 3139 | define-properties: 1.2.1 3140 | es-abstract: 1.23.9 3141 | es-errors: 1.3.0 3142 | es-object-atoms: 1.1.1 3143 | get-intrinsic: 1.2.7 3144 | get-proto: 1.0.1 3145 | which-builtin-type: 1.2.1 3146 | 3147 | regexp.prototype.flags@1.5.4: 3148 | dependencies: 3149 | call-bind: 1.0.8 3150 | define-properties: 1.2.1 3151 | es-errors: 1.3.0 3152 | get-proto: 1.0.1 3153 | gopd: 1.2.0 3154 | set-function-name: 2.0.2 3155 | 3156 | resolve-from@4.0.0: {} 3157 | 3158 | resolve@1.22.10: 3159 | dependencies: 3160 | is-core-module: 2.16.1 3161 | path-parse: 1.0.7 3162 | supports-preserve-symlinks-flag: 1.0.0 3163 | 3164 | reusify@1.0.4: {} 3165 | 3166 | rollup@4.31.0: 3167 | dependencies: 3168 | '@types/estree': 1.0.6 3169 | optionalDependencies: 3170 | '@rollup/rollup-android-arm-eabi': 4.31.0 3171 | '@rollup/rollup-android-arm64': 4.31.0 3172 | '@rollup/rollup-darwin-arm64': 4.31.0 3173 | '@rollup/rollup-darwin-x64': 4.31.0 3174 | '@rollup/rollup-freebsd-arm64': 4.31.0 3175 | '@rollup/rollup-freebsd-x64': 4.31.0 3176 | '@rollup/rollup-linux-arm-gnueabihf': 4.31.0 3177 | '@rollup/rollup-linux-arm-musleabihf': 4.31.0 3178 | '@rollup/rollup-linux-arm64-gnu': 4.31.0 3179 | '@rollup/rollup-linux-arm64-musl': 4.31.0 3180 | '@rollup/rollup-linux-loongarch64-gnu': 4.31.0 3181 | '@rollup/rollup-linux-powerpc64le-gnu': 4.31.0 3182 | '@rollup/rollup-linux-riscv64-gnu': 4.31.0 3183 | '@rollup/rollup-linux-s390x-gnu': 4.31.0 3184 | '@rollup/rollup-linux-x64-gnu': 4.31.0 3185 | '@rollup/rollup-linux-x64-musl': 4.31.0 3186 | '@rollup/rollup-win32-arm64-msvc': 4.31.0 3187 | '@rollup/rollup-win32-ia32-msvc': 4.31.0 3188 | '@rollup/rollup-win32-x64-msvc': 4.31.0 3189 | fsevents: 2.3.3 3190 | 3191 | run-parallel@1.2.0: 3192 | dependencies: 3193 | queue-microtask: 1.2.3 3194 | 3195 | safe-array-concat@1.1.3: 3196 | dependencies: 3197 | call-bind: 1.0.8 3198 | call-bound: 1.0.3 3199 | get-intrinsic: 1.2.7 3200 | has-symbols: 1.1.0 3201 | isarray: 2.0.5 3202 | 3203 | safe-push-apply@1.0.0: 3204 | dependencies: 3205 | es-errors: 1.3.0 3206 | isarray: 2.0.5 3207 | 3208 | safe-regex-test@1.1.0: 3209 | dependencies: 3210 | call-bound: 1.0.3 3211 | es-errors: 1.3.0 3212 | is-regex: 1.2.1 3213 | 3214 | semver@6.3.1: {} 3215 | 3216 | semver@7.6.3: {} 3217 | 3218 | set-function-length@1.2.2: 3219 | dependencies: 3220 | define-data-property: 1.1.4 3221 | es-errors: 1.3.0 3222 | function-bind: 1.1.2 3223 | get-intrinsic: 1.2.7 3224 | gopd: 1.2.0 3225 | has-property-descriptors: 1.0.2 3226 | 3227 | set-function-name@2.0.2: 3228 | dependencies: 3229 | define-data-property: 1.1.4 3230 | es-errors: 1.3.0 3231 | functions-have-names: 1.2.3 3232 | has-property-descriptors: 1.0.2 3233 | 3234 | set-proto@1.0.0: 3235 | dependencies: 3236 | dunder-proto: 1.0.1 3237 | es-errors: 1.3.0 3238 | es-object-atoms: 1.1.1 3239 | 3240 | shebang-command@2.0.0: 3241 | dependencies: 3242 | shebang-regex: 3.0.0 3243 | 3244 | shebang-regex@3.0.0: {} 3245 | 3246 | side-channel-list@1.0.0: 3247 | dependencies: 3248 | es-errors: 1.3.0 3249 | object-inspect: 1.13.3 3250 | 3251 | side-channel-map@1.0.1: 3252 | dependencies: 3253 | call-bound: 1.0.3 3254 | es-errors: 1.3.0 3255 | get-intrinsic: 1.2.7 3256 | object-inspect: 1.13.3 3257 | 3258 | side-channel-weakmap@1.0.2: 3259 | dependencies: 3260 | call-bound: 1.0.3 3261 | es-errors: 1.3.0 3262 | get-intrinsic: 1.2.7 3263 | object-inspect: 1.13.3 3264 | side-channel-map: 1.0.1 3265 | 3266 | side-channel@1.1.0: 3267 | dependencies: 3268 | es-errors: 1.3.0 3269 | object-inspect: 1.13.3 3270 | side-channel-list: 1.0.0 3271 | side-channel-map: 1.0.1 3272 | side-channel-weakmap: 1.0.2 3273 | 3274 | siginfo@2.0.0: {} 3275 | 3276 | signal-exit@4.1.0: {} 3277 | 3278 | source-map-js@1.2.1: {} 3279 | 3280 | stackback@0.0.2: {} 3281 | 3282 | std-env@3.8.0: {} 3283 | 3284 | string-width@4.2.3: 3285 | dependencies: 3286 | emoji-regex: 8.0.0 3287 | is-fullwidth-code-point: 3.0.0 3288 | strip-ansi: 6.0.1 3289 | 3290 | string-width@5.1.2: 3291 | dependencies: 3292 | eastasianwidth: 0.2.0 3293 | emoji-regex: 9.2.2 3294 | strip-ansi: 7.1.0 3295 | 3296 | string.prototype.trim@1.2.10: 3297 | dependencies: 3298 | call-bind: 1.0.8 3299 | call-bound: 1.0.3 3300 | define-data-property: 1.1.4 3301 | define-properties: 1.2.1 3302 | es-abstract: 1.23.9 3303 | es-object-atoms: 1.1.1 3304 | has-property-descriptors: 1.0.2 3305 | 3306 | string.prototype.trimend@1.0.9: 3307 | dependencies: 3308 | call-bind: 1.0.8 3309 | call-bound: 1.0.3 3310 | define-properties: 1.2.1 3311 | es-object-atoms: 1.1.1 3312 | 3313 | string.prototype.trimstart@1.0.8: 3314 | dependencies: 3315 | call-bind: 1.0.8 3316 | define-properties: 1.2.1 3317 | es-object-atoms: 1.1.1 3318 | 3319 | strip-ansi@6.0.1: 3320 | dependencies: 3321 | ansi-regex: 5.0.1 3322 | 3323 | strip-ansi@7.1.0: 3324 | dependencies: 3325 | ansi-regex: 6.1.0 3326 | 3327 | strip-bom@3.0.0: {} 3328 | 3329 | strip-json-comments@3.1.1: {} 3330 | 3331 | supports-color@7.2.0: 3332 | dependencies: 3333 | has-flag: 4.0.0 3334 | 3335 | supports-preserve-symlinks-flag@1.0.0: {} 3336 | 3337 | test-exclude@7.0.1: 3338 | dependencies: 3339 | '@istanbuljs/schema': 0.1.3 3340 | glob: 10.4.5 3341 | minimatch: 9.0.5 3342 | 3343 | tinybench@2.9.0: {} 3344 | 3345 | tinyexec@0.3.2: {} 3346 | 3347 | tinypool@1.0.2: {} 3348 | 3349 | tinyrainbow@2.0.0: {} 3350 | 3351 | tinyspy@3.0.2: {} 3352 | 3353 | to-regex-range@5.0.1: 3354 | dependencies: 3355 | is-number: 7.0.0 3356 | 3357 | ts-api-utils@2.0.0(typescript@5.7.3): 3358 | dependencies: 3359 | typescript: 5.7.3 3360 | 3361 | tsconfig-paths@3.15.0: 3362 | dependencies: 3363 | '@types/json5': 0.0.29 3364 | json5: 1.0.2 3365 | minimist: 1.2.8 3366 | strip-bom: 3.0.0 3367 | 3368 | type-check@0.4.0: 3369 | dependencies: 3370 | prelude-ls: 1.2.1 3371 | 3372 | typed-array-buffer@1.0.3: 3373 | dependencies: 3374 | call-bound: 1.0.3 3375 | es-errors: 1.3.0 3376 | is-typed-array: 1.1.15 3377 | 3378 | typed-array-byte-length@1.0.3: 3379 | dependencies: 3380 | call-bind: 1.0.8 3381 | for-each: 0.3.3 3382 | gopd: 1.2.0 3383 | has-proto: 1.2.0 3384 | is-typed-array: 1.1.15 3385 | 3386 | typed-array-byte-offset@1.0.4: 3387 | dependencies: 3388 | available-typed-arrays: 1.0.7 3389 | call-bind: 1.0.8 3390 | for-each: 0.3.3 3391 | gopd: 1.2.0 3392 | has-proto: 1.2.0 3393 | is-typed-array: 1.1.15 3394 | reflect.getprototypeof: 1.0.10 3395 | 3396 | typed-array-length@1.0.7: 3397 | dependencies: 3398 | call-bind: 1.0.8 3399 | for-each: 0.3.3 3400 | gopd: 1.2.0 3401 | is-typed-array: 1.1.15 3402 | possible-typed-array-names: 1.0.0 3403 | reflect.getprototypeof: 1.0.10 3404 | 3405 | typescript-eslint@8.21.0(eslint@9.18.0)(typescript@5.7.3): 3406 | dependencies: 3407 | '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) 3408 | '@typescript-eslint/parser': 8.21.0(eslint@9.18.0)(typescript@5.7.3) 3409 | '@typescript-eslint/utils': 8.21.0(eslint@9.18.0)(typescript@5.7.3) 3410 | eslint: 9.18.0 3411 | typescript: 5.7.3 3412 | transitivePeerDependencies: 3413 | - supports-color 3414 | 3415 | typescript@5.7.3: {} 3416 | 3417 | uint8-util@2.2.5: 3418 | dependencies: 3419 | base64-arraybuffer: 1.0.2 3420 | 3421 | uint8array-extras@1.4.0: {} 3422 | 3423 | unbox-primitive@1.1.0: 3424 | dependencies: 3425 | call-bound: 1.0.3 3426 | has-bigints: 1.1.0 3427 | has-symbols: 1.1.0 3428 | which-boxed-primitive: 1.1.1 3429 | 3430 | undici-types@6.20.0: {} 3431 | 3432 | uri-js@4.4.1: 3433 | dependencies: 3434 | punycode: 2.3.1 3435 | 3436 | vite-node@3.0.2(@types/node@22.10.7): 3437 | dependencies: 3438 | cac: 6.7.14 3439 | debug: 4.4.0 3440 | es-module-lexer: 1.6.0 3441 | pathe: 2.0.2 3442 | vite: 6.0.10(@types/node@22.10.7) 3443 | transitivePeerDependencies: 3444 | - '@types/node' 3445 | - jiti 3446 | - less 3447 | - lightningcss 3448 | - sass 3449 | - sass-embedded 3450 | - stylus 3451 | - sugarss 3452 | - supports-color 3453 | - terser 3454 | - tsx 3455 | - yaml 3456 | 3457 | vite@6.0.10(@types/node@22.10.7): 3458 | dependencies: 3459 | esbuild: 0.24.2 3460 | postcss: 8.5.1 3461 | rollup: 4.31.0 3462 | optionalDependencies: 3463 | '@types/node': 22.10.7 3464 | fsevents: 2.3.3 3465 | 3466 | vitest@3.0.2(@types/node@22.10.7): 3467 | dependencies: 3468 | '@vitest/expect': 3.0.2 3469 | '@vitest/mocker': 3.0.2(vite@6.0.10(@types/node@22.10.7)) 3470 | '@vitest/pretty-format': 3.0.2 3471 | '@vitest/runner': 3.0.2 3472 | '@vitest/snapshot': 3.0.2 3473 | '@vitest/spy': 3.0.2 3474 | '@vitest/utils': 3.0.2 3475 | chai: 5.1.2 3476 | debug: 4.4.0 3477 | expect-type: 1.1.0 3478 | magic-string: 0.30.17 3479 | pathe: 2.0.2 3480 | std-env: 3.8.0 3481 | tinybench: 2.9.0 3482 | tinyexec: 0.3.2 3483 | tinypool: 1.0.2 3484 | tinyrainbow: 2.0.0 3485 | vite: 6.0.10(@types/node@22.10.7) 3486 | vite-node: 3.0.2(@types/node@22.10.7) 3487 | why-is-node-running: 2.3.0 3488 | optionalDependencies: 3489 | '@types/node': 22.10.7 3490 | transitivePeerDependencies: 3491 | - jiti 3492 | - less 3493 | - lightningcss 3494 | - msw 3495 | - sass 3496 | - sass-embedded 3497 | - stylus 3498 | - sugarss 3499 | - supports-color 3500 | - terser 3501 | - tsx 3502 | - yaml 3503 | 3504 | web-streams-polyfill@3.3.3: {} 3505 | 3506 | which-boxed-primitive@1.1.1: 3507 | dependencies: 3508 | is-bigint: 1.1.0 3509 | is-boolean-object: 1.2.1 3510 | is-number-object: 1.1.1 3511 | is-string: 1.1.1 3512 | is-symbol: 1.1.1 3513 | 3514 | which-builtin-type@1.2.1: 3515 | dependencies: 3516 | call-bound: 1.0.3 3517 | function.prototype.name: 1.1.8 3518 | has-tostringtag: 1.0.2 3519 | is-async-function: 2.1.0 3520 | is-date-object: 1.1.0 3521 | is-finalizationregistry: 1.1.1 3522 | is-generator-function: 1.1.0 3523 | is-regex: 1.2.1 3524 | is-weakref: 1.1.0 3525 | isarray: 2.0.5 3526 | which-boxed-primitive: 1.1.1 3527 | which-collection: 1.0.2 3528 | which-typed-array: 1.1.18 3529 | 3530 | which-collection@1.0.2: 3531 | dependencies: 3532 | is-map: 2.0.3 3533 | is-set: 2.0.3 3534 | is-weakmap: 2.0.2 3535 | is-weakset: 2.0.4 3536 | 3537 | which-typed-array@1.1.18: 3538 | dependencies: 3539 | available-typed-arrays: 1.0.7 3540 | call-bind: 1.0.8 3541 | call-bound: 1.0.3 3542 | for-each: 0.3.3 3543 | gopd: 1.2.0 3544 | has-tostringtag: 1.0.2 3545 | 3546 | which@2.0.2: 3547 | dependencies: 3548 | isexe: 2.0.0 3549 | 3550 | why-is-node-running@2.3.0: 3551 | dependencies: 3552 | siginfo: 2.0.0 3553 | stackback: 0.0.2 3554 | 3555 | word-wrap@1.2.5: {} 3556 | 3557 | wrap-ansi@7.0.0: 3558 | dependencies: 3559 | ansi-styles: 4.3.0 3560 | string-width: 4.2.3 3561 | strip-ansi: 6.0.1 3562 | 3563 | wrap-ansi@8.1.0: 3564 | dependencies: 3565 | ansi-styles: 6.2.1 3566 | string-width: 5.1.2 3567 | strip-ansi: 7.1.0 3568 | 3569 | yocto-queue@0.1.0: {} 3570 | -------------------------------------------------------------------------------- /src/bencode/decode.ts: -------------------------------------------------------------------------------- 1 | import { stringToUint8Array, uint8ArrayToString } from 'uint8array-extras'; 2 | 3 | import type { bencodeValue } from './encode.js'; 4 | import { isValidUTF8 } from './utils.js'; 5 | 6 | const td = new TextDecoder(); 7 | 8 | class Decoder { 9 | idx = 0; 10 | 11 | constructor(public buf: Uint8Array) {} 12 | 13 | readByte(): string | null { 14 | if (this.idx >= this.buf.length) { 15 | return null; 16 | } 17 | 18 | return String.fromCharCode(this.buf[this.idx++]!); 19 | } 20 | 21 | readBytes(length: number): Uint8Array { 22 | if (this.idx + length > this.buf.length) { 23 | throw new Error(`could not read ${length} bytes, insufficient content`); 24 | } 25 | 26 | const result = this.buf.slice(this.idx, this.idx + length); 27 | this.idx += length; 28 | return result; 29 | } 30 | 31 | readUntil(char: string): Uint8Array { 32 | const targetIdx = this.buf.indexOf(char.charCodeAt(0), this.idx); 33 | if (targetIdx === -1) { 34 | throw new Error(`could not find terminated char: ${char}`); 35 | } 36 | 37 | const result = this.buf.slice(this.idx, targetIdx); 38 | this.idx = targetIdx; 39 | return result; 40 | } 41 | 42 | readNumber(): number { 43 | const buf = this.readUntil(':'); 44 | return parseInt(uint8ArrayToString(buf), 10); 45 | } 46 | 47 | peekByte(): string { 48 | if (this.idx >= this.buf.length) { 49 | return ''; 50 | } 51 | 52 | const result = this.readByte(); 53 | if (result === null) { 54 | return ''; 55 | } 56 | 57 | this.idx--; 58 | return result; 59 | } 60 | 61 | assertByte(expected: string) { 62 | const b = this.readByte(); 63 | if (b !== expected) { 64 | throw new Error(`expecte ${expected}, got ${b}`); 65 | } 66 | } 67 | 68 | next(): bencodeValue { 69 | switch (this.peekByte()) { 70 | case 'd': { 71 | return this.nextDictionary(); 72 | } 73 | 74 | case 'l': { 75 | return this.nextList(); 76 | } 77 | 78 | case 'i': { 79 | return this.nextNumber(); 80 | } 81 | 82 | default: { 83 | return this.nextBufOrString(); 84 | } 85 | } 86 | } 87 | 88 | nextBufOrString(): string | Uint8Array { 89 | const length = this.readNumber(); 90 | this.assertByte(':'); 91 | const buf = this.readBytes(length); 92 | return isValidUTF8(buf) ? td.decode(buf) : buf; 93 | } 94 | 95 | nextString(): string { 96 | const length = this.readNumber(); 97 | this.assertByte(':'); 98 | return td.decode(this.readBytes(length)); 99 | } 100 | 101 | nextNumber(): number { 102 | this.assertByte('i'); 103 | const content = td.decode(this.readUntil('e')); 104 | this.assertByte('e'); 105 | const result = Number(content); 106 | 107 | if (isNaN(result)) { 108 | throw new Error(`not a number: ${content}`); 109 | } 110 | 111 | return result; 112 | } 113 | 114 | nextList(): bencodeValue[] { 115 | this.assertByte('l'); 116 | const result = []; 117 | 118 | while (this.peekByte() !== 'e') { 119 | result.push(this.next()); 120 | } 121 | 122 | this.assertByte('e'); 123 | return result; 124 | } 125 | 126 | nextDictionary(): Record { 127 | this.assertByte('d'); 128 | const result: Record = {}; 129 | 130 | while (this.peekByte() !== 'e') { 131 | result[this.nextString()] = this.next(); 132 | } 133 | 134 | this.assertByte('e'); 135 | 136 | return result; 137 | } 138 | } 139 | 140 | export const decode = (payload: ArrayBufferView | ArrayBuffer | string): bencodeValue => { 141 | let buf; 142 | if (typeof payload === 'string') { 143 | buf = stringToUint8Array(payload); 144 | } else if (payload instanceof ArrayBuffer) { 145 | buf = new Uint8Array(payload); 146 | } else if ('buffer' in payload) { 147 | buf = new Uint8Array(payload.buffer); 148 | } else { 149 | throw new Error(`invalid payload type`); 150 | } 151 | 152 | const decoder = new Decoder(buf); 153 | return decoder.next(); 154 | }; 155 | -------------------------------------------------------------------------------- /src/bencode/encode.ts: -------------------------------------------------------------------------------- 1 | import { concatUint8Arrays, stringToUint8Array } from 'uint8array-extras'; 2 | 3 | import { cmpRawString } from './utils.js'; 4 | 5 | export type bencodeValue = 6 | | string 7 | | Uint8Array 8 | | number 9 | | { [key: string]: bencodeValue } 10 | | bencodeValue[]; 11 | 12 | const te = new TextEncoder(); 13 | 14 | const encodeString = (str: string): Uint8Array => { 15 | const lengthBytes = new TextEncoder().encode(str.length.toString()); 16 | const content = te.encode(str); 17 | 18 | const result = new Uint8Array(lengthBytes.byteLength + 1 + content.byteLength); 19 | result.set(lengthBytes); 20 | result.set(te.encode(':'), lengthBytes.byteLength); 21 | result.set(content, lengthBytes.byteLength + 1); 22 | 23 | return result; 24 | }; 25 | 26 | const encodeBuf = (buf: Uint8Array): Uint8Array => { 27 | const lengthBytes = new TextEncoder().encode(buf.byteLength.toString()); 28 | 29 | const result = new Uint8Array(lengthBytes.byteLength + 1 + buf.byteLength); 30 | result.set(lengthBytes); 31 | result.set(te.encode(':'), lengthBytes.byteLength); 32 | result.set(buf, lengthBytes.byteLength + 1); 33 | return result; 34 | }; 35 | 36 | const encodeNumber = (num: number): Uint8Array => { 37 | // NOTE: only support integers 38 | const int = Math.floor(num); 39 | if (int !== num) { 40 | throw new Error(`bencode only support integers, got ${num}`); 41 | } 42 | 43 | return concatUint8Arrays([ 44 | stringToUint8Array('i'), 45 | stringToUint8Array(int.toString()), 46 | stringToUint8Array('e'), 47 | ]); 48 | }; 49 | 50 | const encodeDictionary = (obj: Record): Uint8Array => { 51 | const results: Uint8Array[] = []; 52 | 53 | Object.keys(obj) 54 | .sort(cmpRawString) 55 | .forEach(key => { 56 | results.push(encodeString(key)); 57 | results.push(new Uint8Array(encode(obj[key]!))); 58 | }); 59 | 60 | const d = stringToUint8Array('d'); 61 | const e = stringToUint8Array('e'); 62 | return concatUint8Arrays([d, ...results, e]); 63 | }; 64 | 65 | const encodeArray = (arr: bencodeValue[]): Uint8Array => { 66 | const prefixSuffix = te.encode('le'); // Combined prefix and suffix 67 | const encodedElements = arr.map(encode); // Encode each element 68 | 69 | // Concatenate the encoded elements directly into a Uint8Array 70 | const result = concatUint8Arrays([prefixSuffix, ...encodedElements.flat()]); 71 | 72 | return result; 73 | }; 74 | 75 | export const encode = (data: bencodeValue | bencodeValue[]): Uint8Array => { 76 | if (Array.isArray(data)) { 77 | return encodeArray(data); 78 | } 79 | 80 | // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check 81 | switch (typeof data) { 82 | case 'string': { 83 | return encodeString(data); 84 | } 85 | 86 | case 'number': { 87 | return encodeNumber(data); 88 | } 89 | 90 | case 'object': { 91 | if (data instanceof Uint8Array) { 92 | return encodeBuf(data); 93 | } 94 | 95 | return encodeDictionary(data); 96 | } 97 | 98 | default: { 99 | throw new Error(`unsupport data type: ${typeof data}`); 100 | } 101 | } 102 | }; 103 | 104 | export default encode; 105 | -------------------------------------------------------------------------------- /src/bencode/index.ts: -------------------------------------------------------------------------------- 1 | export * from './decode.js'; 2 | export * from './encode.js'; 3 | -------------------------------------------------------------------------------- /src/bencode/utils.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-bitwise */ 2 | 3 | // str1 > str2: 1 4 | // str1 === str2: 0 5 | // str1 < str2: -1 6 | export const cmpRawString = (str1: string, str2: string): number => { 7 | const te = new TextEncoder(); 8 | const v1 = te.encode(str1); 9 | const v2 = te.encode(str2); 10 | 11 | for (let i = 0; i < Math.min(v1.length, v2.length); i++) { 12 | if (v1[i]! < v2[i]!) { 13 | return -1; 14 | } 15 | 16 | if (v1[i]! > v2[i]!) { 17 | return 1; 18 | } 19 | } 20 | 21 | if (v1.length === v2.length) { 22 | return 0; 23 | } 24 | 25 | return v1.length < v2.length ? -1 : 1; 26 | }; 27 | 28 | export const typedArraysAreEqual = (a: T, b: T): boolean => { 29 | if (a.byteLength !== b.byteLength) { 30 | return false; 31 | } 32 | 33 | return a.every((val, i) => val === b[i]); 34 | }; 35 | 36 | // Copied from https://github.com/hcodes/isutf8/blob/master/src/index.ts 37 | /* 38 | https://tools.ietf.org/html/rfc3629 39 | UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4 40 | UTF8-1 = %x00-7F 41 | UTF8-2 = %xC2-DF UTF8-tail 42 | UTF8-3 = %xE0 %xA0-BF UTF8-tail 43 | %xE1-EC 2( UTF8-tail ) 44 | %xED %x80-9F UTF8-tail 45 | %xEE-EF 2( UTF8-tail ) 46 | UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) 47 | %xF1-F3 3( UTF8-tail ) 48 | %xF4 %x80-8F 2( UTF8-tail ) 49 | UTF8-tail = %x80-BF 50 | */ 51 | export const isValidUTF8 = (buf: Uint8Array): boolean => { 52 | let i = 0; 53 | const len = buf.length; 54 | 55 | while (i < len) { 56 | // UTF8-1 = %x00-7F 57 | if (buf[i]! <= 0x7f) { 58 | i++; 59 | 60 | continue; 61 | } 62 | 63 | // UTF8-2 = %xC2-DF UTF8-tail 64 | if (buf[i]! >= 0xc2 && buf[i]! <= 0xdf) { 65 | // if(buf[i + 1] >= 0x80 && buf[i + 1] <= 0xBF) { 66 | if (buf[i + 1]! >> 6 === 2) { 67 | i += 2; 68 | 69 | continue; 70 | // biome-ignore lint/style/noUselessElse: false positive 71 | } else { 72 | return false; 73 | } 74 | } 75 | 76 | // UTF8-3 = %xE0 %xA0-BF UTF8-tail 77 | // UTF8-3 = %xED %x80-9F UTF8-tail 78 | if ( 79 | ((buf[i] === 0xe0 && buf[i + 1]! >= 0xa0 && buf[i + 1]! <= 0xbf) || 80 | (buf[i] === 0xed && buf[i + 1]! >= 0x80 && buf[i + 1]! <= 0x9f)) && 81 | buf[i + 2]! >> 6 === 2 82 | ) { 83 | i += 3; 84 | 85 | continue; 86 | } 87 | 88 | // UTF8-3 = %xE1-EC 2( UTF8-tail ) 89 | // UTF8-3 = %xEE-EF 2( UTF8-tail ) 90 | if ( 91 | ((buf[i]! >= 0xe1 && buf[i]! <= 0xec) || (buf[i]! >= 0xee && buf[i]! <= 0xef)) && 92 | buf[i + 1]! >> 6 === 2 && 93 | buf[i + 2]! >> 6 === 2 94 | ) { 95 | i += 3; 96 | 97 | continue; 98 | } 99 | 100 | // UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) 101 | // %xF1-F3 3( UTF8-tail ) 102 | // %xF4 %x80-8F 2( UTF8-tail ) 103 | if ( 104 | ((buf[i] === 0xf0 && buf[i + 1]! >= 0x90 && buf[i + 1]! <= 0xbf) || 105 | (buf[i]! >= 0xf1 && buf[i]! <= 0xf3 && buf[i + 1]! >> 6 === 2) || 106 | (buf[i] === 0xf4 && buf[i + 1]! >= 0x80 && buf[i + 1]! <= 0x8f)) && 107 | buf[i + 2]! >> 6 === 2 && 108 | buf[i + 3]! >> 6 === 2 109 | ) { 110 | i += 4; 111 | 112 | continue; 113 | } 114 | 115 | return false; 116 | } 117 | 118 | return true; 119 | }; 120 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './torrentFile.js'; 2 | -------------------------------------------------------------------------------- /src/torrentFile.ts: -------------------------------------------------------------------------------- 1 | import { createHash } from 'node:crypto'; 2 | import { join, sep } from 'node:path'; 3 | 4 | import { isUint8Array, uint8ArrayToHex, uint8ArrayToString } from 'uint8array-extras'; 5 | 6 | import { decode, encode } from './bencode/index.js'; 7 | 8 | export const sha1 = (input: Uint8Array): string => { 9 | const hash = createHash('sha1'); 10 | // Update the hash object with the data 11 | hash.update(input); 12 | return hash.digest('hex'); 13 | }; 14 | 15 | /** 16 | * sha1 of torrent file info. This hash is commenly used by torrent clients as the ID of the torrent. 17 | */ 18 | export function hash(file: Uint8Array): string { 19 | const torrent: any = decode(file); 20 | return sha1(encode(torrent.info)); 21 | } 22 | 23 | export interface TorrentFileData { 24 | length: number; 25 | files: Array<{ 26 | path: string; 27 | /** 28 | * filename 29 | */ 30 | name: string; 31 | /** 32 | * length of the file in bytes 33 | */ 34 | length: number; 35 | offset: number; 36 | }>; 37 | /** 38 | * number of bytes in each piece 39 | */ 40 | pieceLength: number; 41 | lastPieceLength: number; 42 | pieces: string[]; 43 | } 44 | 45 | /** 46 | * data about the files the torrent contains 47 | */ 48 | export function files(file: Uint8Array): TorrentFileData { 49 | const torrent: any = decode(file); 50 | const result: TorrentFileData = { 51 | files: [], 52 | length: 0, 53 | lastPieceLength: 0, 54 | pieceLength: torrent.info['piece length'], 55 | pieces: [], 56 | }; 57 | 58 | const files: string[] = torrent.info.files || [torrent.info]; 59 | const name: string = (torrent.info['name.utf-8'] || torrent.info.name).toString(); 60 | result.files = files.map((file: any, i) => { 61 | const parts: string[] = [name, ...(file['path.utf-8'] || file.path || [])].map(p => 62 | p.toString(), 63 | ); 64 | return { 65 | path: join(sep, ...parts).slice(1), 66 | name: parts[parts.length - 1]!, 67 | length: file.length, 68 | offset: files.slice(0, i).reduce(sumLength, 0), 69 | }; 70 | }); 71 | 72 | result.length = files.reduce(sumLength, 0); 73 | 74 | const lastFile = result.files[result.files.length - 1]; 75 | 76 | result.lastPieceLength = 77 | (lastFile && (lastFile.offset + lastFile.length) % result.pieceLength) || result.pieceLength; 78 | result.pieces = splitPieces(torrent.info.pieces); 79 | return result; 80 | } 81 | 82 | function sumLength(sum: number, file: string): number { 83 | return sum + file.length; 84 | } 85 | 86 | function splitPieces(buf: Uint8Array): string[] { 87 | const pieces: string[] = []; 88 | for (let i = 0; i < buf.length; i += 20) { 89 | pieces.push(uint8ArrayToHex(buf.slice(i, i + 20))); 90 | } 91 | 92 | return pieces; 93 | } 94 | 95 | export interface TorrentInfo { 96 | name: string; 97 | /** 98 | * The announce URL of the trackers 99 | */ 100 | announce: string[]; 101 | /** 102 | * free-form textual comments of the author 103 | */ 104 | comment?: string; 105 | /** 106 | * if false the client may obtain peer from other means, e.g. PEX peer exchange, dht. Here, "private" may be read as "no external peer source". 107 | */ 108 | private?: boolean; 109 | created?: Date; 110 | /** 111 | * name and version of the program used to create the .torrent (string) 112 | */ 113 | createdBy?: string; 114 | /** 115 | * weburls to download torrent files 116 | */ 117 | urlList: string[]; 118 | } 119 | 120 | /** 121 | * torrent file info 122 | */ 123 | export function info(file: Uint8Array): TorrentInfo { 124 | const torrent: any = decode(file); 125 | const result: TorrentInfo = { 126 | name: (torrent.info['name.utf-8'] || torrent.info.name).toString(), 127 | announce: [], 128 | urlList: [], 129 | }; 130 | 131 | if (torrent.info.private !== undefined) { 132 | result.private = Boolean(torrent.info.private); 133 | } 134 | 135 | if (torrent['creation date']) { 136 | result.created = new Date(torrent['creation date'] * 1000); 137 | } 138 | 139 | if (torrent['created by']) { 140 | result.createdBy = torrent['created by'].toString(); 141 | } 142 | 143 | if (isUint8Array(torrent.comment)) { 144 | result.comment = uint8ArrayToString(torrent.comment); 145 | } 146 | 147 | // announce and announce-list will be missing if metadata fetched via ut_metadata 148 | if ( 149 | Array.isArray(torrent['announce-list']) && 150 | torrent['announce-list'] && 151 | torrent['announce-list'].length > 0 152 | ) { 153 | torrent['announce-list'].forEach((urls: any) => { 154 | urls.forEach((url: any) => { 155 | result.announce.push(url.toString()); 156 | }); 157 | }); 158 | } else if (torrent.announce) { 159 | result.announce.push(torrent.announce.toString()); 160 | } 161 | 162 | if (result.announce.length) { 163 | result.announce = Array.from(new Set(result.announce)); 164 | } 165 | 166 | // web seeds 167 | if (isUint8Array(torrent['url-list'])) { 168 | // some clients set url-list to empty string 169 | torrent['url-list'] = torrent['url-list'].length > 0 ? [torrent['url-list']] : []; 170 | } 171 | 172 | result.urlList = (torrent['url-list'] || []).map((url: any) => url.toString()); 173 | if (result.urlList.length) { 174 | result.urlList = Array.from(new Set(result.urlList)); 175 | } 176 | 177 | return result; 178 | } 179 | -------------------------------------------------------------------------------- /test/bencode/announce-compacted-peers.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scttcper/torrent-file/b538a076a64ad35e2064be3f6fcfd16323da987c/test/bencode/announce-compacted-peers.bin -------------------------------------------------------------------------------- /test/bencode/bep-0023.spec.ts: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs/promises'; 2 | import { URL } from 'node:url'; 3 | 4 | import { hexToUint8Array } from 'uint8array-extras'; 5 | import { expect, it } from 'vitest'; 6 | 7 | import { decode } from '../../src/bencode/index.js'; 8 | 9 | // @see http://www.bittorrent.org/beps/bep_0023.html 10 | it('should be able to handle an compacted peer announce', async () => { 11 | const announce = await fs.readFile(new URL('./announce-compacted-peers.bin', import.meta.url)); 12 | const data = decode(announce); 13 | 14 | expect(data).toEqual({ 15 | complete: 4, 16 | incomplete: 3, 17 | interval: 1800, 18 | 'min interval': 1800, 19 | peers: hexToUint8Array( 20 | '2ebd1b641a1f51d54c0546cc342190401a1f626ee9c6c8d5cb0d92131a1fac4e689a3c6b180f3d5746db', 21 | ), 22 | }); 23 | }); 24 | 25 | it('should be able to handle an compacted peer announce when decoding strings', async () => { 26 | const announce = await fs.readFile(new URL('./announce-compacted-peers.bin', import.meta.url)); 27 | const data = decode(announce); 28 | 29 | expect(data).toEqual({ 30 | complete: 4, 31 | incomplete: 3, 32 | interval: 1800, 33 | 'min interval': 1800, 34 | peers: hexToUint8Array( 35 | '2ebd1b641a1f51d54c0546cc342190401a1f626ee9c6c8d5cb0d92131a1fac4e689a3c6b180f3d5746db', 36 | ), 37 | }); 38 | }); 39 | -------------------------------------------------------------------------------- /test/bencode/decode.buffer.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, it } from 'vitest'; 2 | 3 | import { decode } from '../../src/bencode/index.js'; 4 | 5 | it('should be able to decode an integer', () => { 6 | expect(decode('i123e')).toBe(123); 7 | expect(decode('i-123e')).toBe(-123); 8 | }); 9 | // it('should be throw an error when trying to decode a broken integer', () => { 10 | // expect(() => decode('i12+3e')).toThrow(/not a number/); 11 | // expect(() => decode('i-1+23e')).toThrow(/not a number/); 12 | // }); 13 | // it('should be able to decode a float (as int)', () => { 14 | // expect(decode('i12.3e')).toBe(12); 15 | // expect(decode('i-12.3e')).toBe(-12); 16 | // }); 17 | // it('should be throw an error when trying to decode a broken float', () => { 18 | // expect(() => decode('i1+2.3e')).toThrow(/not a number/); 19 | // expect(() => decode('i-1+2.3e')).toThrow(/not a number/); 20 | // }); 21 | 22 | it('should be able to decode a dictionary', () => { 23 | expect(decode('d3:cow3:moo4:spam4:eggse')).toEqual({ 24 | cow: 'moo', 25 | spam: 'eggs', 26 | }); 27 | expect(decode('d4:spaml1:a1:bee')).toEqual({ spam: ['a', 'b'] }); 28 | expect( 29 | decode('d9:publisher3:bob17:publisher-webpage15:www.example.com18:publisher.location4:homee'), 30 | ).toEqual({ 31 | publisher: 'bob', 32 | 'publisher-webpage': 'www.example.com', 33 | 'publisher.location': 'home', 34 | }); 35 | }); 36 | 37 | it('should be able to decode a list', () => { 38 | expect(decode('l4:spam4:eggse')).toEqual(['spam', 'eggs']); 39 | }); 40 | -------------------------------------------------------------------------------- /test/bencode/decode.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect, it } from 'vitest'; 2 | 3 | import { decode } from '../../src/bencode/index.js'; 4 | 5 | it('should be able to decode an integer', () => { 6 | expect(decode('i123e')).toBe(123); 7 | expect(decode('i-123e')).toBe(-123); 8 | }); 9 | // it('should be throw an error when trying to decode a broken integer', () => { 10 | // expect(() => decode('i12+3e')).toThrow(/not a number/); 11 | // expect(() => decode('i-1+23e')).toThrow(/not a number/); 12 | // }); 13 | // it('should be able to decode a float (as int)', () => { 14 | // expect(decode('i12.3e')).toBe(12); 15 | // expect(decode('i-12.3e')).toBe(-12); 16 | // }); 17 | // it('should be throw an error when trying to decode a broken float', () => { 18 | // expect(() => decode('i1+2.3e')).toThrow(/not a number/); 19 | // expect(() => decode('i-1+2.3e')).toThrow(/not a number/); 20 | // }); 21 | 22 | it('should be able to decode a dictionary', () => { 23 | expect(decode('d3:cow3:moo4:spam4:eggse')).toEqual({ 24 | cow: 'moo', 25 | spam: 'eggs', 26 | }); 27 | expect(decode('d4:spaml1:a1:bee')).toEqual({ spam: ['a', 'b'] }); 28 | expect( 29 | decode('d9:publisher3:bob17:publisher-webpage15:www.example.com18:publisher.location4:homee'), 30 | ).toEqual({ 31 | publisher: 'bob', 32 | 'publisher-webpage': 'www.example.com', 33 | 'publisher.location': 'home', 34 | }); 35 | }); 36 | 37 | it('should be able to decode a list', () => { 38 | expect(decode('l4:spam4:eggse')).toEqual(['spam', 'eggs']); 39 | }); 40 | it('should return the correct type', () => { 41 | expect(decode('4:öö')).toBeTruthy(); 42 | }); 43 | 44 | // it('should be able to decode stuff in dicts', () => { 45 | // const someData = { 46 | // string: 'Hello World', 47 | // integer: 12345, 48 | // dict: { 49 | // key: 'This is a string within a dictionary', 50 | // }, 51 | // list: [1, 2, 3, 4, 'string', 5, {}], 52 | // }; 53 | // const result = encode(someData); 54 | // const dat: any = decode(result); 55 | // expect(dat.integer).toBe(12345); 56 | // expect(dat.string).toEqual('Hello World'); 57 | // expect(dat.dict.key).toEqual('This is a string within a dictionary'); 58 | // expect(dat.list).toEqual([1, 2, 3, 4, 'string', 5, {}]); 59 | // }); 60 | -------------------------------------------------------------------------------- /test/bencode/encode.spec.ts: -------------------------------------------------------------------------------- 1 | import { isUint8Array, stringToUint8Array, uint8ArrayToString } from 'uint8array-extras'; 2 | import { expect, it } from 'vitest'; 3 | 4 | import { decode, encode } from '../../src/bencode/index.js'; 5 | 6 | it('should always return a Uint8Array', () => { 7 | expect(isUint8Array(encode({}))).toBeTruthy(); 8 | expect(isUint8Array(encode('test'))).toBeTruthy(); 9 | expect(isUint8Array(encode([3, 2]))).toBeTruthy(); 10 | expect(isUint8Array(encode({ a: 'b', 3: 6 }))).toBeTruthy(); 11 | expect(isUint8Array(encode(123))).toBeTruthy(); 12 | }); 13 | 14 | it('should sort dictionaries', () => { 15 | const data = { string: 'Hello World', integer: 12345 }; 16 | expect(uint8ArrayToString(encode(data))).toBe('d7:integeri12345e6:string11:Hello Worlde'); 17 | }); 18 | 19 | it('should force keys to be strings', () => { 20 | const data = { 21 | 12: 'Hello World', 22 | 34: 12345, 23 | }; 24 | expect(uint8ArrayToString(encode(data))).toBe('d2:1211:Hello World2:34i12345ee'); 25 | }); 26 | 27 | it('should be able to encode a positive integer', () => { 28 | expect(uint8ArrayToString(encode(123))).toBe('i123e'); 29 | }); 30 | it('should be able to encode a negative integer', () => { 31 | expect(uint8ArrayToString(encode(-123))).toBe('i-123e'); 32 | }); 33 | // it('should be able to encode a positive float (as int)', () => { 34 | // expect(encode(123.5, undefined, undefined, true).toString()).toBe('i123e'); 35 | // }); 36 | // it('should be able to encode a negative float (as int)', () => { 37 | // expect(encode(-123.5, undefined, undefined, true).toString()).toBe('i-123e'); 38 | // }); 39 | 40 | it('should be able to safely encode numbers between -/+ 2 ^ 53 (as ints)', () => { 41 | const JAVASCRIPT_INT_BITS = 53; 42 | 43 | expect(uint8ArrayToString(encode(0))).toBe(`i${0}e`); 44 | 45 | for (let exp = 1; exp < JAVASCRIPT_INT_BITS; ++exp) { 46 | const val = 2 ** exp; 47 | // try the positive and negative 48 | expect(uint8ArrayToString(encode(val))).toBe(`i${val}e`); 49 | expect(uint8ArrayToString(encode(-val))).toBe(`i-${val}e`); 50 | 51 | // try the value, one above and one below, both positive and negative 52 | const above = val + 1; 53 | const below = val - 1; 54 | 55 | expect(uint8ArrayToString(encode(above))).toBe(`i${above}e`); 56 | expect(uint8ArrayToString(encode(-above))).toBe(`i-${above}e`); 57 | 58 | expect(uint8ArrayToString(encode(below))).toBe(`i${below}e`); 59 | expect(uint8ArrayToString(encode(-below))).toBe(`i-${below}e`); 60 | } 61 | 62 | expect(uint8ArrayToString(encode(Number.MAX_SAFE_INTEGER))).toBe(`i${Number.MAX_SAFE_INTEGER}e`); 63 | expect(uint8ArrayToString(encode(-Number.MAX_SAFE_INTEGER))).toBe( 64 | `i-${Number.MAX_SAFE_INTEGER}e`, 65 | ); 66 | }); 67 | it('should be able to encode a previously problematice 64 bit int', () => { 68 | expect(uint8ArrayToString(encode(2433088826))).toBe(`i${2433088826}e`); 69 | }); 70 | it('should be able to encode a negative 64 bit int', () => { 71 | expect(uint8ArrayToString(encode(-0xffffffff))).toBe(`i-${0xffffffff}e`); 72 | }); 73 | // it('should be able to encode a positive 64 bit float (as int)', () => { 74 | // expect(encode(0xffffffff + 0.5, undefined, undefined, true).toString()).toBe(`i${0xffffffff}e`); 75 | // }); 76 | // it('should be able to encode a negative 64 bit float (as int)', () => { 77 | // expect(encode(-0xffffffff - 0.5, undefined, undefined, true).toString()).toBe(`i-${0xffffffff}e`); 78 | // }); 79 | it('should be able to encode a string', () => { 80 | expect(uint8ArrayToString(encode('asdf'))).toBe('4:asdf'); 81 | expect(uint8ArrayToString(encode(':asdf:'))).toBe('6::asdf:'); 82 | }); 83 | it('should be able to encode a uint8array', () => { 84 | expect(uint8ArrayToString(encode(stringToUint8Array('asdf')))).toBe('4:asdf'); 85 | expect(uint8ArrayToString(encode(stringToUint8Array(':asdf:')))).toBe('6::asdf:'); 86 | }); 87 | // it('should be able to encode an array', () => { 88 | // expect(uint8ArrayToString(encode([32, 12]))).toBe('li32ei12ee'); 89 | // expect(uint8ArrayToString(encode([':asdf:']))).toBe('l6::asdf:e'); 90 | // }); 91 | it('should be able to encode an object', () => { 92 | expect(uint8ArrayToString(encode({ a: 'bc' }))).toBe('d1:a2:bce'); 93 | expect(uint8ArrayToString(encode({ a: '45', b: 45 })).toString()).toBe('d1:a2:451:bi45ee'); 94 | expect(uint8ArrayToString(encode({ a: stringToUint8Array('bc') })).toString()).toBe('d1:a2:bce'); 95 | }); 96 | 97 | // it('should encode new Number(1) as number', () => { 98 | // const data = Number(1); 99 | // const result = decode(encode(data, undefined, undefined, true)); 100 | // expect(result).toEqual(1); 101 | // }); 102 | 103 | // it('should encode new Boolean(true) as number', () => { 104 | // const data = true; 105 | // const result = decode(encode(data, undefined, undefined, true)); 106 | // expect(result).toEqual(1); 107 | // }); 108 | 109 | it('should encode Uint8Array as Uint8Array', () => { 110 | const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9]); 111 | const result = decode(encode(data)); 112 | expect(result).toEqual(result); 113 | }); 114 | 115 | // it('should encode Uint32Array as buffer', () => { 116 | // const data = new Uint32Array([ 117 | // 0xf, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0xfffffff, 0xffffffff, 118 | // ]); 119 | // const result = decode(encode(data)); 120 | // const expected = Buffer.from(data.buffer); 121 | // expect(result).toEqual(expected); 122 | // }); 123 | 124 | // it('should encode Uint8Array subarray properly', () => { 125 | // const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9]); 126 | // const subData = data.subarray(5); 127 | // const result = decode(encode(subData)); 128 | // const expected = Buffer.from(subData.buffer, subData.byteOffset, subData.byteLength); 129 | // expect(result).toEqual(expected); 130 | // }); 131 | -------------------------------------------------------------------------------- /test/torrentFile.spec.ts: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs/promises'; 2 | import { URL } from 'node:url'; 3 | 4 | // @ts-expect-error types are outdated 5 | import parseTorrent from 'parse-torrent'; 6 | import { expect, it } from 'vitest'; 7 | 8 | import { files, hash, info } from '../src/index.js'; 9 | 10 | const filepath = new URL('./ubuntu-18.04.2-live-server-amd64.iso.torrent', import.meta.url); 11 | 12 | it('should have the same hash as parse-torrent', async () => { 13 | const file = await fs.readFile(filepath); 14 | expect(hash(file)).toBe((await parseTorrent(file)).infoHash); 15 | }); 16 | it('should have the same name as parse-torrent', async () => { 17 | const file = await fs.readFile(filepath); 18 | expect(info(file).name).toEqual((await parseTorrent(file)).name); 19 | }); 20 | it('should parse files', async () => { 21 | const file = await fs.readFile(filepath); 22 | expect(files(file).files[0]).toEqual({ 23 | length: 874512384, 24 | name: 'ubuntu-18.04.2-live-server-amd64.iso', 25 | offset: 0, 26 | path: 'ubuntu-18.04.2-live-server-amd64.iso', 27 | }); 28 | }); 29 | it('should parse file pieces', async () => { 30 | const file = await fs.readFile(filepath); 31 | expect(files(file).pieces).toHaveLength(1668); 32 | }); 33 | -------------------------------------------------------------------------------- /test/ubuntu-18.04.2-live-server-amd64.iso.torrent: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scttcper/torrent-file/b538a076a64ad35e2064be3f6fcfd16323da987c/test/ubuntu-18.04.2-live-server-amd64.iso.torrent -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@sindresorhus/tsconfig", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "target": "ES2022" // Node.js 18 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | coverage: { 6 | reporter: ['text', 'json', 'html'], 7 | }, 8 | }, 9 | }); 10 | --------------------------------------------------------------------------------