diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..67f5307 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,16 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint", + "prettier" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "prettier/prettier": "error" + } +} diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml new file mode 100644 index 0000000..e869b7a --- /dev/null +++ b/.github/workflows/nodejs.yml @@ -0,0 +1,41 @@ +name: Node CI + +on: [push] +env: + FORCE_COLOR: 2 +jobs: + test: + name: v${{ matrix.node }} @ ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + # @actions/setup-node does not support Node.js v14 for macOS + - node: 14 + os: ubuntu-latest + node: + - 16.0.0 + - 16 + - 18.0.0 + - 18 + - 20 + - 22 + os: + - ubuntu-latest + - macOS-latest + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 + with: + persist-credentials: false + - name: Use Node.js ${{ matrix.node }} + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 + with: + node-version: ${{ matrix.node }} + registry-url: "https://registry.npmjs.org" + - run: npm install -g npm@9.x + - run: npm ci + - run: npm run build --if-present + - run: npm test + - run: npm run browser-tests + - run: npm run lint --if-present diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml new file mode 100644 index 0000000..c59931f --- /dev/null +++ b/.github/workflows/publish-npm.yml @@ -0,0 +1,26 @@ +name: Publish package to npm +on: + release: + types: [created] +jobs: + build: + name: "Publish to NPM" + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@1e31de5234b9f8995739874a8ce0492dc87873e2 # v4 + with: + persist-credentials: false + - uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4 + with: + node-version: 20 + registry-url: 'https://registry.npmjs.org' + cache: npm + - run: npm install -g npm@9.x + - run: npm ci + - run: npm run build + - run: npm publish --provenance --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} diff --git a/.gitignore b/.gitignore index 8b9982b..55d0b5b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,16 +2,11 @@ /*.js.map /*.d.ts /*.d.ts.map -/pure -/shims +/bip39 /test-builds /node_modules -/scryptsy-without-crypto-build -/hdkey-without-crypto-build -/bip39-without-wordlists -/vendor -/bip39 -elliptic-secp256k1.js -scryptsy-without-crypto.js -hdkey-without-crypto.js -bip39-without-wordlists.js +.parcel-cache +/esm +/test/node_modules +/test/package-lock.json +/test/test-builds diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index cd031e4..0000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "bip39-lib"] - path = bip39-lib - url = https://github.com/bitcoinjs/bip39.git -[submodule "hdkey"] - path = hdkey - url = https://github.com/cryptocoinjs/hdkey.git diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 0000000..f10a5b3 --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,8 @@ +{ + "require" : [ + "ts-node/register" + ], + "spec": "./test/test-vectors/*.ts", + "package": "./package.json", + "ui": "bdd" +} diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 9cf9495..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index e019adf..0000000 --- a/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -language: node_js - -node_js: - - 10 - - 12 - - 13 - - 14 - -install: - - npm i - -script: - - npm run test - - npm run browser-tests - - npm run lint - - npm run build && node scripts/check-browser-field.js - -cache: - npm: true - directories: - - $HOME/.npm - - node_modules diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..195d249 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.exclude": { + "*.{js,d.ts,js.map,d.ts.map}": true, + "esm/*.{js,d.ts,js.map,d.ts.map}": true + } +} \ No newline at end of file diff --git a/LICENSE b/LICENSE index ae198a7..29f02ab 100644 --- a/LICENSE +++ b/LICENSE @@ -1,26 +1,21 @@ -bip39-without-wordlist.js is based on bip39, which is released under the -ISC license by the Wei Lu and Daniel Cousens. Its license complete license can be found here: https://github.com/bitcoinjs/bip39/blob/0a0e74eac9f4b753939dd6368984900fdba1975b/LICENSE +The MIT License (MIT) -hdkey-without-crypto.js is based on hdkey, which is released under the -MIT license by the cryptocoinjs. Its license complete license can be found here: https://github.com/cryptocoinjs/hdkey/blob/87d5495ac8e4dfe9917ddcebf6788ce69c0695ff/LICENSE +Copyright (c) 2021 Patricio Palladino, Paul Miller, ethereum-cryptography contributors -The rest of the project is released under this license: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Copyright 2019 The ethereum-cryptography contributors +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index f47ba0b..a695c63 100644 --- a/README.md +++ b/README.md @@ -1,259 +1,379 @@ # ethereum-cryptography -[![npm version][1]][2] -[![Travis CI][3]][4] -[![license][5]][6] -[![Types][7]][8] +[Audited](#security) pure JS library containing all Ethereum-related cryptographic primitives. Implemented with 6 [noble & scure](https://paulmillr.com/noble/) dependencies. -⚠️ **WARNING: This project is under active development. Don't use it until a stable version is released.** ⚠️ +Check out [Changelog / Upgrading](#upgrading) and an article about the library: +[A safer, smaller, and faster Ethereum cryptography stack](https://medium.com/nomic-labs-blog/a-safer-smaller-and-faster-ethereum-cryptography-stack-5eeb47f62d79). -This npm package contains all the cryptographic primitives normally used when -developing Javascript/TypeScript applications and tools for Ethereum. - -Pure Javascript implementations of all the primitives are included, so it can -be used out of the box for web applications and libraries. - -In Node, it takes advantage of the built-in and N-API based implementations -whenever possible. - -The cryptographic primitives included are: - -* [Pseudorandom number generation](#pseudorandom-number-generation-submodule) -* [Keccak](#keccak-submodule) -* [Scrypt](#scrypt-submodule) -* [PBKDF2](#pbkdf2-submodule) -* [SHA-256](#sha-256-submodule) -* [RIPEMD-160](#ripemd-160-submodule) -* [BLAKE2b](#blake2b-submodule) -* [AES](#aes-submodule) -* [Secp256k1](#secp256k1-submodule) -* [Hierarchical Deterministic keys derivation](#hierarchical-deterministic-keys-submodule) -* [Seed recovery phrases](#seed-recovery-phrases) - -## Installation - -Via `npm`: - -```bash -$ npm install ethereum-cryptography -``` - -Via `yarn`: +## Usage -```bash -$ yarn add ethereum-cryptography +```shell +npm install ethereum-cryptography ``` -## Usage +We explicitly support major browsers and Node.js on x86 and arm64. Other major runtimes and platforms are supported on a best-effort basis. +Refer to `engines` field of `package.json` for runtime support information for each version. +Tests are being ran with Webpack, Rollup, Parcel and Browserify. This package has no single entry-point, but submodule for each cryptographic -primitive. Read each primitive's section of this document to learn how to use -them. - -The reason for this is that importing everything from a single file will lead to -huge bundles when using this package for the web. This could be avoided through -tree-shaking, but the possibility of it not working properly on one of -[the supported bundlers](#browser-usage) is too high. - -## Pseudorandom number generation submodule - -The `random` submodule has functions to generate cryptographically strong -pseudo-random data in synchronous and asynchronous ways. - -In Node, this functions are backed by [`crypto.randomBytes`](https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callback). - -In the browser, [`crypto.getRandomValues`](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues) -is used. If not available, this module won't work, as that would be insecure. - -### Function types - -```ts -function getRandomBytes(bytes: number): Promise; - -function getRandomBytesSync(bytes: number): Buffer; -``` - -### Example usage +primitive. The reason for this is that importing everything from a single file will lead to huge bundles when using this package for the web. This could be +avoided through tree-shaking, but the possibility of it not working properly +on one of [the supported bundlers](#browser-usage) is too high. + +- [Usage](#usage) + - [Dependencies](#dependencies) + - [hashes: sha256, sha512, keccak, ripemd160, blake2b](#hashes-sha256-sha512-keccak-ripemd160-blake2b) + - [kdfs: pbkdf2, scrypt](#kdfs-pbkdf2-scrypt) + - [random: secure randomness](#random-secure-randomness) + - [secp256k1: curve operations](#secp256k1-curve-operations) + - [bn: pairing-friendly curve](#bn-pairing-friendly-curve) + - [bls: pairing-friendly curve](#bls-pairing-friendly-curve) + - [aes: encryption](#aes-encryption) + - [hdkey: bip32 HD wallets](#hdkey-bip32-hd-wallets) + - [bip39: mnemonic phrases](#bip39-mnemonic-phrases) + - [math: utilities](#math-utilities) + - [utils: generic utilities](#utils-generic-utilities) + - [secp256k1-compat: compatibility layer with other libraries](#secp256k1-compat-compatibility-layer-with-other-libraries) + - [All imports](#all-imports) +- [Caveats](#caveats) + - [Browser usage: Rollup setup](#browser-usage-rollup-setup) + - [AES](#aes) + - [Encrypting with passwords](#encrypting-with-passwords) + - [Operation modes](#operation-modes) + - [Padding plaintext messages](#padding-plaintext-messages) + - [How to use the IV parameter](#how-to-use-the-iv-parameter) + - [How to handle errors with this module](#how-to-handle-errors-with-this-module) +- [Upgrading](#upgrading) + - [Changelog](#changelog) + - [From v2 to v3](#from-v2-to-v3) + - [From v1 to v2](#from-v1-to-v2) + - [From v0.1 to v1](#from-v01-to-v1) +- [Security](#security) +- [License](#license) + +### Dependencies + +All functionality of the module is simple +re-export of 6 audited [noble & scure libraries](https://paulmillr.com/noble/): + +- noble-curves, noble-ciphers, noble-hashes +- scure-base, scure-bip32, scure-bip39 + +ethereum-cryptography pins versions of the libraries to ensure good +protection against supply chain attacks. Ideally, your app would also +pin version of ethereum-cryptography. That means, no `^3.1.0` - use `3.1.0` instead. + +### hashes: sha256, sha512, keccak, ripemd160, blake2b ```js -const { getRandomBytesSync } = require("ethereum-cryptography/random"); - -console.log(getRandomBytesSync(32).toString("hex")); +import { sha256 } from "ethereum-cryptography/sha256.js"; +import { sha512 } from "ethereum-cryptography/sha512.js"; +import { + keccak256, + keccak224, + keccak384, + keccak512, +} from "ethereum-cryptography/keccak.js"; +import { ripemd160 } from "ethereum-cryptography/ripemd160.js"; +import { blake2b } from "ethereum-cryptography/blake2b.js"; +sha256(Uint8Array.from([1, 2, 3])); // A: buffers + +import { utf8ToBytes } from "ethereum-cryptography/utils.js"; +sha256(utf8ToBytes("abc")); // B: strings + +import { bytesToHex as toHex } from "ethereum-cryptography/utils.js"; +toHex(sha256(utf8ToBytes("abc"))); // C: hex ``` -## Keccak submodule - -The `keccak` submodule has four functions that implement different variations of -the Keccak hashing algorithm. These are `keccak224`, `keccak256`, `keccak384`, -and `keccak512`. - -### Function types - -```ts -function keccak224(msg: Buffer): Buffer; - -function keccak256(msg: Buffer): Buffer; - -function keccak384(msg: Buffer): Buffer; - -function keccak512(msg: Buffer): Buffer; -``` - -### Example usage +### kdfs: pbkdf2, scrypt ```js -const { keccak256 } = require("ethereum-cryptography/keccak"); - -console.log(keccak256(Buffer.from("Hello, world!", "ascii")).toString("hex")); +import { pbkdf2, pbkdf2Sync } from "ethereum-cryptography/pbkdf2.js"; +import { scrypt, scryptSync } from "ethereum-cryptography/scrypt.js"; +import { utf8ToBytes } from "ethereum-cryptography/utils.js"; + +// Pass Uint8Array, or convert strings to Uint8Array +const pass = utf8ToBytes("password"); +const salt = utf8ToBytes("salt"); +const iters = 131072; +const outLength = 32; +console.log(await pbkdf2(pass, salt, iters, outLength, "sha256")); + +const N = 262144; +const r = 8; +const p = 1; +const outLengths = 32; +console.log(await scrypt(pass, salt, N, r, p, outLengths)); ``` -## Scrypt submodule +The `pbkdf2` submodule has two functions implementing the PBKDF2 key +derivation algorithm in synchronous and asynchronous ways. This algorithm is +very slow, and using the synchronous version in the browser is not recommended, +as it will block its main thread and hang your UI. The KDF supports `sha256` and `sha512` digests. The `scrypt` submodule has two functions implementing the Scrypt key derivation algorithm in synchronous and asynchronous ways. This algorithm is very slow, and using the synchronous version in the browser is not recommended, as it will block its main thread and hang your UI. -### Password encoding - Encoding passwords is a frequent source of errors. Please read -[these notes](https://github.com/ricmoo/scrypt-js/tree/0eb70873ddf3d24e34b53e0d9a99a0cef06a79c0#encoding-notes) -before using this submodule. - -### Function types +[notes](https://github.com/ricmoo/scrypt-js/tree/0eb70873ddf3d24e34b53e0d9a99a0cef06a79c0#encoding-notes) +before using these submodules. -```ts -function scrypt(password: Buffer, salt: Buffer, n: number, p: number, r: number, dklen: number): Promise; +### random: secure randomness -function scryptSync(password: Buffer, salt: Buffer, n: number, p: number, r: number, dklen: number): Buffer; +```js +import { getRandomBytesSync } from "ethereum-cryptography/random.js"; +console.log(getRandomBytesSync(32)); ``` -### Example usage +The `random` submodule has functions to generate cryptographically strong +pseudo-random data in synchronous and asynchronous ways. Backed by [`crypto.getRandomValues`](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues) in browser and by [`crypto.randomBytes`](https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callback) in node.js. If backends are somehow not available, the module would throw an error and won't work, as keeping them working would be insecure. -```js -const { scryptSync } = require("ethereum-cryptography/scrypt"); +### secp256k1: curve operations -console.log( - scryptSync( - Buffer.from("ascii password", "ascii"), - Buffer.from("salt", "hex"), - 16, - 1, - 1, - 64 - ).toString("hex") -); +```js +import { secp256k1 } from "ethereum-cryptography/secp256k1.js"; +// You pass either a hex string, or Uint8Array +const privateKey = + "6b911fd37cdf5c81d4c0adb1ab7fa822ed253ab0ad9aa18d77257c88b29b718e"; +const messageHash = + "a33321f98e4ff1c283c76998f14f57447545d339b3db534c6d886decb4209f28"; +const publicKey = secp256k1.getPublicKey(privateKey); +const signature = secp256k1.sign(messageHash, privateKey); +const isSigned = secp256k1.verify(signature, messageHash, publicKey); ``` -## PBKDF2 submodule - -The `pbkdf2` submodule has two functions implementing the PBKDF2 key -derivation algorithm in synchronous and asynchronous ways. This algorithm is -very slow, and using the synchronous version in the browser is not recommended, -as it will block its main thread and hang your UI. +Elliptic curve operations on the curve secp256k1. Check out [noble-curves docs](https://github.com/paulmillr/noble-curves) for more info. -### Password encoding +secp256k1 private keys need to be cryptographically secure random numbers with +certain characteristics. If this is not the case, the security of secp256k1 is +compromised. -Encoding passwords is a frequent source of errors. Please read -[these notes](https://github.com/ricmoo/scrypt-js/tree/0eb70873ddf3d24e34b53e0d9a99a0cef06a79c0#encoding-notes) -before using this submodule. +### bn: pairing-friendly curve -### Supported digests - -In Node this submodule uses the built-in implementation and supports any digest -returned by [`crypto.getHashes`](https://nodejs.org/api/crypto.html#crypto_crypto_gethashes). +```js +import { bn } from "ethereum-cryptography/bls.js"; -In the browser, it is tested to support at least `sha256`, the only digest -normally used with `pbkdf2` in Ethereum. It may support more. +console.log(bn254.G1, bn254.G2, bn254.pairing); +``` -### Function types +For example usage, check out [the implementation of bn254 EVM precompiles](https://github.com/paulmillr/noble-curves/blob/3ed792f8ad9932765b84d1064afea8663a255457/test/bn254.test.js#L697). -```ts -function pbkdf2(password: Buffer, salt: Buffer, iterations: number, keylen: number, digest: string): Promise; +### bls: pairing-friendly curve -function pbkdf2Sync(password: Buffer, salt: Buffer, iterations: number, keylen: number, digest: string): Buffer; +```js +import { bls12_381 as bls } from "ethereum-cryptography/bls.js"; + +// G1 keys, G2 signatures +const privateKey = + "67d53f170b908cabb9eb326c3c337762d59289a8fec79f7bc9254b584b73265c"; +const message = "64726e3da8"; +const publicKey = bls.getPublicKey(privateKey); +const signature = bls.sign(message, privateKey); +const isValid = bls.verify(signature, message, publicKey); +console.log({ publicKey, signature, isValid }); + +// G2 signatures, G1 keys +// getPublicKeyForShortSignatures(privateKey) +// signShortSignature(message, privateKey) +// verifyShortSignature(signature, message, publicKey) +// aggregateShortSignatures(signatures) + +// Custom DST +const htfEthereum = { DST: "BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_" }; +const signatureEth = bls.sign(message, privateKey, htfEthereum); +const isValidEth = bls.verify(signature, message, publicKey, htfEthereum); + +// Aggregation +const aggregatedKey = bls.aggregatePublicKeys([ + bls.getPublicKey(bls.utils.randomPrivateKey()), + bls.getPublicKey(bls.utils.randomPrivateKey()), +]); +// const aggregatedSig = bls.aggregateSignatures(sigs) + +// Pairings, with and without final exponentiation +// bls.pairing(PointG1, PointG2); +// bls.pairing(PointG1, PointG2, false); +// bls.fields.Fp12.finalExponentiate(bls.fields.Fp12.mul(PointG1, PointG2)); + +// Others +// bls.G1.ProjectivePoint.BASE, bls.G2.ProjectivePoint.BASE; +// bls.fields.Fp, bls.fields.Fp2, bls.fields.Fp12, bls.fields.Fr; ``` -### Example usage +For example usage, check out [the implementation of BLS EVM precompiles](https://github.com/ethereumjs/ethereumjs-monorepo/blob/361f4edbc239e795a411ac2da7e5567298b9e7e5/packages/evm/src/precompiles/bls12_381/noble.ts). + +### aes: encryption ```js -const { pbkdf2Sync } = require("ethereum-cryptography/pbkdf2"); +import * as aes from "ethereum-cryptography/aes.js"; +import { hexToBytes, utf8ToBytes } from "ethereum-cryptography/utils.js"; console.log( - pbkdf2Sync( - Buffer.from("ascii password", "ascii"), - Buffer.from("salt", "hex"), - 4096, - 32, - 'sha256' - ).toString("hex") + aes.encrypt( + utf8ToBytes("message"), + hexToBytes("2b7e151628aed2a6abf7158809cf4f3c"), + hexToBytes("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff") + ) ); +// const mode = "aes-128-ctr"; // "aes-128-cbc", "aes-256-ctr", "aes-256-cbc" +// function encrypt(msg: Uint8Array, key: Uint8Array, iv: Uint8Array, mode = "aes-128-ctr", pkcs7PaddingEnabled = true): Uint8Array; +// function decrypt(cipherText: Uint8Array, key: Uint8Array, iv: Uint8Array, mode = "aes-128-ctr", pkcs7PaddingEnabled = true): Uint8Array; ``` -## SHA-256 submodule - -The `sha256` submodule contains a single function implementing the SHA-256 -hashing algorithm. - -### Function types +### hdkey: bip32 HD wallets -```ts -function sha256(msg: Buffer): Buffer; +```js +import { HDKey } from "ethereum-cryptography/hdkey.js"; +const hdkey1 = HDKey.fromMasterSeed(seed); +const hdkey2 = HDKey.fromExtendedKey(base58key); +const hdkey3 = HDKey.fromJSON({ xpriv: string }); + +// props +[hdkey1.depth, hdkey1.index, hdkey1.chainCode]; +console.log(hdkey2.privateKey, hdkey2.publicKey); +console.log(hdkey3.derive("m/0/2147483647'/1")); +const sig = hdkey3.sign(hash); +hdkey3.verify(hash, sig); ``` -### Example usage +Hierarchical deterministic (HD) wallets that conform to +[BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki). -```js -const { sha256 } = require("ethereum-cryptography/sha256"); +### bip39: mnemonic phrases -console.log(sha256(Buffer.from("message", "ascii")).toString("hex")); +```js +import * as bip39 from "ethereum-cryptography/bip39/index.js"; +import { wordlist } from "ethereum-cryptography/bip39/wordlists/english.js"; + +// import { wordlist } from "ethereum-cryptography/bip39/wordlists/czech.js"; +// import { wordlist } from "ethereum-cryptography/bip39/wordlists/english.js"; +// import { wordlist } from "ethereum-cryptography/bip39/wordlists/french.js"; +// import { wordlist } from "ethereum-cryptography/bip39/wordlists/italian.js"; +// import { wordlist } from "ethereum-cryptography/bip39/wordlists/japanese.js"; +// import { wordlist } from "ethereum-cryptography/bip39/wordlists/korean.js"; +// import { wordlist } from "ethereum-cryptography/bip39/wordlists/portuguese.js"; +// import { wordlist } from "ethereum-cryptography/bip39/wordlists/simplified-chinese.js"; +// import { wordlist } from "ethereum-cryptography/bip39/wordlists/spanish.js"; +// import { wordlist } from "ethereum-cryptography/bip39/wordlists/traditional-chinese.js"; + +// Generate x random words. Uses Cryptographically-Secure Random Number Generator. +const mn = bip39.generateMnemonic(wordlist); +console.log(mn); + +// Reversible: Converts mnemonic string to raw entropy in form of byte array. +const ent = bip39.mnemonicToEntropy(mn, wordlist); + +// Reversible: Converts raw entropy in form of byte array to mnemonic string. +bip39.entropyToMnemonic(ent, wordlist); + +// Validates mnemonic for being 12-24 words contained in `wordlist`. +bip39.validateMnemonic(mn, wordlist); + +// Irreversible: Uses KDF to derive 64 bytes of key data from mnemonic + optional password. +await bip39.mnemonicToSeed(mn, "password"); +bip39.mnemonicToSeedSync(mn, "password"); ``` -## RIPEMD-160 submodule +The `bip39` submodule provides functions to generate, validate and use seed +recovery phrases according to [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki). -The `ripemd160` submodule contains a single function implementing the -RIPEMD-160 hashing algorithm. +Wordlists for different languages are not imported by default, +as that would increase bundle sizes too much. Instead, you should import and use them explicitly. -### Function types +### math: utilities -```ts -function ripemd160(msg: Buffer): Buffer; +```js +import { modPow, modInvert } from "ethereum-cryptography/math.js"; +modPow(123n, 456n, 789n); +modInvert(22n, 5n); ``` -### Example usage +### utils: generic utilities ```js -const { ripemd160 } = require("ethereum-cryptography/ripemd160"); +import { hexToBytes, toHex, utf8ToBytes } from "ethereum-cryptography/utils.js"; +``` -console.log(ripemd160(Buffer.from("message", "ascii")).toString("hex")); +### secp256k1-compat: compatibility layer with other libraries + +```js +import { + createPrivateKeySync, + ecdsaSign, +} from "ethereum-cryptography/secp256k1-compat"; +const msgHash = Uint8Array.from( + "82ff40c0a986c6a5cfad4ddf4c3aa6996f1a7837f9c398e17e5de5cbd5a12b28", + "hex" +); +const privateKey = createPrivateKeySync(); +console.log(Uint8Array.from(ecdsaSign(msgHash, privateKey).signature)); ``` -## BLAKE2b submodule +**Warning:** use `secp256k1` instead. This module is only for users who upgraded +from ethereum-cryptography v0.1. It could be removed in the future. -The `blake2b` submodule contains a single function implementing the -BLAKE2b non-keyed hashing algorithm. +The API of `secp256k1-compat` is the same as [secp256k1-node](https://github.com/cryptocoinjs/secp256k1-node): -### Function types +### All imports -```ts -function blake2b(input: Buffer, outputLength = 64): Buffer; +```js +import { sha256 } from "ethereum-cryptography/sha256.js"; +import { sha512 } from "ethereum-cryptography/sha512.js"; +import { + keccak256, + keccak224, + keccak384, + keccak512, +} from "ethereum-cryptography/keccak.js"; +import { ripemd160 } from "ethereum-cryptography/ripemd160.js"; +import { blake2b } from "ethereum-cryptography/blake2b.js"; + +import { pbkdf2Sync } from "ethereum-cryptography/pbkdf2.js"; +import { scryptSync } from "ethereum-cryptography/scrypt.js"; + +import { getRandomBytesSync } from "ethereum-cryptography/random.js"; + +import { encrypt } from "ethereum-cryptography/aes.js"; +import { modPow, modInvert } from "ethereum-cryptography/math.js"; + +import { secp256k1 } from "ethereum-cryptography/secp256k1.js"; +import { bls12_381 } from "ethereum-cryptography/bls.js"; +import { bn254 } from "ethereum-cryptography/bn.js"; + +import { HDKey } from "ethereum-cryptography/hdkey.js"; +import { generateMnemonic } from "ethereum-cryptography/bip39/index.js"; +import { wordlist } from "ethereum-cryptography/bip39/wordlists/english.js"; + +import { modPow, modInvert } from "ethereum-cryptography/math.js"; +import { hexToBytes, toHex, utf8ToBytes } from "ethereum-cryptography/utils.js"; ``` -### Example usage +## Caveats -```js -const { blake2b } = require("ethereum-cryptography/blake2b"); +### Browser usage: Rollup setup -console.log(blake2b(Buffer.from("message", "ascii")).toString("hex")); -``` +Using this library with Rollup requires the following plugins: -## AES submodule +- [`@rollup/plugin-commonjs`](https://www.npmjs.com/package/@rollup/plugin-commonjs) +- [`@rollup/plugin-node-resolve`](https://www.npmjs.com/package/@rollup/plugin-node-resolve) -The `aes` submodule contains encryption and decryption functions implementing -the [Advanced Encryption Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) -algorithm. +These can be used by setting your `plugins` array like this: -### Encrypting with passwords +```js +plugins: [ + commonjs(), + resolve({ + browser: true, + preferBuiltins: false, + }), +]; +``` + +### AES + +#### Encrypting with passwords AES is not supposed to be used directly with a password. Doing that will compromise your users' security. @@ -261,9 +381,9 @@ compromise your users' security. The `key` parameters in this submodule are meant to be strong cryptographic keys. If you want to obtain such a key from a password, please use a [key derivation function](https://en.wikipedia.org/wiki/Key_derivation_function) -like [pbkdf2](#pbkdf2-submodule) or [scrypt](#scrypt-submodule). +like [pbkdf2](#kdfs-pbkdf2-scrypt) or [scrypt](#kdfs-pbkdf2-scrypt). -### Operation modes +#### Operation modes This submodule works with different [block cipher modes of operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation). If you are using this module in a new application, we recommend using the default. @@ -275,7 +395,7 @@ a warning will be printed in the console. We only recommend using `aes-128-cbc` and `aes-256-cbc` to decrypt already encrypted data. -### Padding plaintext messages +#### Padding plaintext messages Some operation modes require the plaintext message to be a multiple of `16`. If that isn't the case, your message has to be padded. @@ -294,17 +414,17 @@ multiple of `16`. This option is only present to enable the decryption of already encrypted data. To encrypt new data, we recommend using the default. -### How to use the IV parameter +#### How to use the IV parameter The `iv` parameter of the `encrypt` function must be unique, or the security -of the encryption algorithm can be compromissed. +of the encryption algorithm can be compromised. You can generate a new `iv` using the `random` module. Note that to decrypt a value, you have to provide the same `iv` used to encrypt it. -### How to handle errors with this module +#### How to handle errors with this module Sensitive information can be leaked via error messages when using this module. To avoid this, you should make sure that the errors you return don't @@ -315,228 +435,81 @@ Note that implementing this can mean catching all errors that can be thrown when calling on of this module's functions, and just throwing a new generic exception. -### Function types - -```ts -function encrypt(msg: Buffer, key: Buffer, iv: Buffer, mode = "aes-128-ctr", pkcs7PaddingEnabled = true): Buffer; - -function decrypt(cypherText: Buffer, key: Buffer, iv: Buffer, mode = "aes-128-ctr", pkcs7PaddingEnabled = true): Buffer -``` - -### Example usage - -```js -const { encrypt } = require("ethereum-cryptography/aes"); - -console.log( - encrypt( - Buffer.from("message", "ascii"), - Buffer.from("2b7e151628aed2a6abf7158809cf4f3c", "hex"), - Buffer.from("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", "hex") - ).toString("hex") -); -``` - -## Secp256k1 submodule +## Upgrading -The `secp256k1` submodule provides a library for elliptic curve operations on -the curve Secp256k1. +### Changelog -It has the exact same API than the version `4.x` of the [`secp256k1`](https://github.com/cryptocoinjs/secp256k1-node) -module from cryptocoinjs, with two added function to create private keys. +- v3.0 (Sep 2024): new modules `bls`, `bn`, `math` + change async AES to non-native sync, + improve typescript compatibility, new dependency [noble-ciphers](https://github.com/paulmillr/noble-ciphers) +- v2.0 (Apr 2023): switched + [noble-secp256k1](https://github.com/paulmillr/noble-secp256k1) to + [noble-curves](https://github.com/paulmillr/noble-curves), + which changes re-exported api of `secp256k1` submodule. +- v1.0 (Jan 2022): rewritten the library from + scratch and [audited](#security) it. It became **6x smaller:** ~5,000 lines of + code instead of ~24,000 (with all deps); 650KB instead of 10.2MB. + 5 dependencies by 1 author are now used, instead of 38 by 5 authors. -### Creating private keys +### From v2 to v3 -Secp256k1 private keys need to be cryptographycally secure random numbers with -certain caracteristics. If this is not the case, the security of Secp256k1 is -compromissed. +1. utils: `crypto` var had been removed +2. aes: async methods became sync -We strongly recommend to use this module to create new private keys. - -### Function types - -Functions to create private keys: - -```ts -function createPrivateKey(): Promise; - -function function createPrivateKeySync(): Uint8Array; -``` - -For the rest of the functions, pleasse read [`secp256k1`'s documentation](https://github.com/cryptocoinjs/secp256k1-node). - -### Example usage - -```js -const { createPrivateKeySync, ecdsaSign } = require("ethereum-cryptography/secp256k1"); - -const msgHash = Buffer.from( - "82ff40c0a986c6a5cfad4ddf4c3aa6996f1a7837f9c398e17e5de5cbd5a12b28", - "hex" -); - -const privateKey = createPrivateKeySync(); - -console.log(Buffer.from(ecdsaSign(msgHash, privateKey).signature).toString("hex")); -``` +### From v1 to v2 -## Hierarchical Deterministic keys submodule +1. `secp256k1` module was changed massively: + before, it was using [noble-secp256k1 1.7](https://github.com/paulmillr/noble-secp256k1); + now it uses safer [noble-curves](https://github.com/paulmillr/noble-curves). Please refer + to [upgrading section from curves README](https://github.com/paulmillr/noble-curves#upgrading). + Main changes to keep in mind: a) `sign` now returns `Signature` instance + b) `recoverPublicKey` got moved onto a `Signature` instance +2. node.js 14 and older support was dropped. Upgrade to node.js 16 or later. -The `hdkey` submodule provides a library for keys derivation according to -[BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki). +### From v0.1 to v1 -It has almost the exact same API than the version `1.x` of -[`hdkey` from cryptocoinjs](https://github.com/cryptocoinjs/hdkey), -but it's backed by this package's primitives, and has built-in TypeScript types. -Its only difference is that it has to be be used with a named import. - -### Function types - -This module exports a single class whose type is - -```ts -class HDKey { - public static HARDENED_OFFSET: number; - public static fromMasterSeed(seed: Buffer, versions: Versions): HDKey; - public static fromExtendedKey(base58key: string, versions: Versions): HDKey; - public static fromJSON(json: { xpriv: string }): HDKey; - - public versions: Versions; - public depth: number; - public index: number; - public chainCode: Buffer | null; - public privateKey: Buffer | null; - public publicKey: Buffer | null; - public fingerprint: number; - public parentFingerprint: number; - public pubKeyHash: Buffer | undefined; - public identifier: Buffer | undefined; - public privateExtendedKey: string; - public publicExtendedKey: string; - - private constructor(versios: Versions); - public derive(path: string): HDKey; - public deriveChild(index: number): HDKey; - public sign(hash: Buffer): Buffer; - public verify(hash: Buffer, signature: Buffer): boolean; - public wipePrivateData(): this; - public toJSON(): { xpriv: string; xpub: string }; -} - -interface Versions { - private: number; - public: number; -} -``` +All old APIs remain the same except for the breaking changes: -### Example usage +1. We return `Uint8Array` from all methods that worked with `Buffer` before. + `Buffer` has never been supported in browsers, while `Uint8Array`s are supported natively in both + browsers and node.js. +2. We target runtimes with [bigint](https://caniuse.com/bigint) support, + which is Chrome 67+, Edge 79+, Firefox 68+, Safari 14+, node.js 10+. If you need to support older runtimes, use `ethereum-cryptography@0.1` +3. If you've used `secp256k1`, [rename it to `secp256k1-compat`](#legacy-secp256k1-compatibility-layer) ```js -const { HDKey } = require("ethereum-cryptography/hdkey"); - -const seed = "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542"; -const hdkey = HDKey.fromMasterSeed(Buffer.from(seed, "hex")); -const childkey = hdkey.derive("m/0/2147483647'/1"); - -console.log(childkey.privateExtendedKey); -``` - -## Seed recovery phrases - -The `bip39` submodule provides functions to generate, validate and use seed -recovery phrases according to [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki). +import { sha256 } from "ethereum-cryptography/sha256.js"; -### Function types +// Old usage +const hasho = sha256(Buffer.from("string", "utf8")).toString("hex"); -```ts -function generateMnemonic(wordlist: string[], strength: number = 128): string; +// New usage +import { toHex } from "ethereum-cryptography/utils.js"; +const hashn = toHex(sha256("string")); -function mnemonicToEntropy(mnemonic: string, wordlist: string[]): Buffer; - -function entropyToMnemonic(entropy: Buffer, wordlist: string[]): string; - -function validateMnemonic(mnemonic: string, wordlist: string[]): boolean; - -async function mnemonicToSeed(mnemonic: string, passphrase: string = ""): Promise; - -function mnemonicToSeedSync(mnemonic: string, passphrase: string = ""): Buffer; +// If you have `Buffer` module and want to preserve it: +const hashb = Buffer.from(sha256("string")); +const hashbo = hashb.toString("hex"); ``` -### Word lists - -This submodule also contains the word lists defined by BIP39 for Czech, English, -French, Italian, Japanese, Korean, Simplified and Traditional Chinese, and -Spanish. These are not imported by default, as that would increase bundle sizes -too much. Instead, you should import and use them explicitly. - -The word lists are exported as a `wordlist` variable in each of these submodules: - -* `ethereum-cryptography/bip39/wordlists/czech.js` - -* `ethereum-cryptography/bip39/wordlists/english.js` - -* `ethereum-cryptography/bip39/wordlists/french.js` +## Security -* `ethereum-cryptography/bip39/wordlists/italian.js` +Audited by Cure53 on Jan 5, 2022. Check out the audit [PDF](./audit/2022-01-05-cure53-audit-nbl2.pdf) & [URL](https://cure53.de/pentest-report_hashing-libs.pdf). -* `ethereum-cryptography/bip39/wordlists/japanese.js` +Dependencies are having separate regular audits: check out their documentation for more info. -* `ethereum-cryptography/bip39/wordlists/korean.js` - -* `ethereum-cryptography/bip39/wordlists/simplified-chinese.js` - -* `ethereum-cryptography/bip39/wordlists/spanish.js` - -* `ethereum-cryptography/bip39/wordlists/traditional-chinese.js` - -### Example usage - -```js - -const { generateMnemonic } = require("ethereum-cryptography/bip39"); -const { wordlist } = require("ethereum-cryptography/bip39/wordlists/english"); - -console.log(generateMnemonic(wordlist)); -``` - -## Browser usage - -This package works with all the major Javascript bundlers. It is -tested with `webpack`, `Rollup`, `Parcel`, and `Browserify`. - -For using it with `Rollup` you need to use these plugins: -* [`rollup-plugin-node-builtins`](https://www.npmjs.com/package/rollup-plugin-node-builtins) with the `browser` option set to `true`, and `preferBuiltins` to `false`. -* [`rollup-plugin-node-globals`](https://www.npmjs.com/package/rollup-plugin-node-globals) -* [`rollup-plugin-json`](https://www.npmjs.com/package/rollup-plugin-json). - -## Missing cryptographic primitives - -This package intentionally excludes the the cryptographic primitives necessary -to implement the following EIPs: - -* [EIP 196: Precompiled contracts for addition and scalar multiplication on the elliptic curve alt_bn128](https://eips.ethereum.org/EIPS/eip-196) -* [EIP 197: Precompiled contracts for optimal ate pairing check on the elliptic curve alt_bn128](https://eips.ethereum.org/EIPS/eip-197) -* [EIP 198: Big integer modular exponentiation](https://eips.ethereum.org/EIPS/eip-198) -* [EIP 152: Add Blake2 compression function `F` precompile](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md) +## License -Feel free to open an issue if you want this decision to be reconsidered, or if -you found another primitive that is missing. +`ethereum-cryptography` is released under The MIT License (MIT) -## Security audit +Copyright (c) 2021 Patricio Palladino, Paul Miller, ethereum-cryptography contributors -This library has been audited by [Trail of Bits](https://www.trailofbits.com/). -You can see the results of the audit and the changes implemented as a result of -it in [`audit/`](./audit). +See [LICENSE](./LICENSE) file. -## License +`hdkey` is loosely based on [hdkey](https://github.com/cryptocoinjs/hdkey), +which had [MIT License](https://github.com/cryptocoinjs/hdkey/blob/3f3c0b5cedb98f971835b5116ebea05b3c09422a/LICENSE) -`ethereum-cryptography` is released under [the MIT License](./LICENSE). +Copyright (c) 2018 cryptocoinjs -[1]: https://img.shields.io/npm/v/ethereum-cryptography.svg -[2]: https://www.npmjs.com/package/ethereum-cryptography -[3]: https://img.shields.io/travis/ethereum/js-ethereum-cryptography/master.svg?label=Travis%20CI -[4]: https://travis-ci.org/ethereum/js-ethereum-cryptography -[5]: https://img.shields.io/npm/l/ethereum-cryptography -[6]: https://github.com/ethereum/js-ethereum-cryptography/blob/master/packages/ethereum-cryptography/LICENSE -[7]: https://img.shields.io/npm/types/ethereum-cryptography.svg -[8]: https://www.npmjs.com/package/ethereum-cryptography +[1]: https://www.npmjs.com/package/ethereum-cryptography +[2]: https://github.com/ethereum/js-ethereum-cryptography/blob/master/packages/ethereum-cryptography/LICENSE diff --git a/audit/2022-01-05-cure53-audit-nbl2.pdf b/audit/2022-01-05-cure53-audit-nbl2.pdf new file mode 100644 index 0000000..1a7c9d5 Binary files /dev/null and b/audit/2022-01-05-cure53-audit-nbl2.pdf differ diff --git a/audit/Changes_after_audit.md b/audit/Changes_after_audit.md deleted file mode 100644 index 11647b0..0000000 --- a/audit/Changes_after_audit.md +++ /dev/null @@ -1,82 +0,0 @@ -# Changes implemented in response to the audit - -This documents contains a list of the changes that have been implemented as a result of [the audit report](./Trail_of_Bits_audit_report.pdf). - -## TOB-NOMIC-001: AES modes of operation - -### Changes -* Set aes-ctr-128 as default operation mode and recommend using that. -* Update readme to mention that only aes-128-ctr, aes-128-cbc, and aes-256-cbc are supported. -* Print a warning if an unsupported mode is used. -* Recommend using aes-128-cbc and aes-256-cbc only to decrypt already encrypted data. -* Add an explanation about IVs having to be unique, and instructing the users to use the random module to get them. -* Add a warning about error messages and recommend using generic errors messages if the encryption/decryption fails. - -### Commits -* deb0844ae816d241c1c5930b13e3ea0b84eab933 - - -## TOB-NOMIC-002: secp256k1 interface for key generation - -### Changes -* Added two functions to the module to create private keys. These use the random module get random values and use secp256k1's private key validation function. - -### Commits -* 56c9edf58b123f2d4c62d625980abcc558770c8e - - -## TOB-NOMIC-003: Strong types for security - -No action was taken yet. This change requires more discussion with potential consumers of the library. - - -## TOB-NOMIC-004: Duplicated code - -### Changes -* Removal of duplicated code in aes, random, pbkdf2 and hashing modules. - -### Commits -* 03f8b75cd40d106847a53834531ee7c85894b5f6 -* 8c669d6ac0d759289de9be96dbd9c456ccbeb0cc -* fb998dec7cb1ade2de8079fe8db115f3cf15fdcf -* 434478c611f052b3d8201a34d100ae79bb2fcca3 -* 6c27cc4404c0975401dd97140eb03cde83b29db9 -* 373fcb331e361bf78de4574a33e5b316ec4f95d4 - - -## TOB-NOMIC-005: Dependency management - -### Changes -* Updated secp256k1 to v4. -* Replace js-sha3 with keccack v3. -* Run npm audit and fixed all non-dev-dependencies warnings. - -## Commits -* 063ba25c152abbb5005150ac9aad4b828245560d -* b6e244093fc1ddcf0c2f1874509c0ad3f302d67b -* 9a097accb1c5d1fed8eaa9ae60db3bc19b7faede -* 373fcb331e361bf78de4574a33e5b316ec4f95d4 - - -## TOB-NOMIC-006: Submodule management - -### Changes -* Update hdkey submodule. -* Update bip39 submodule. -* Replace scriptsy with scrypt-js and remove its submodule. -* Remove secp256k1 submodule, as secp256k1 v4 uses N-API and already meets the goals of this project. - -### Commits -* a1402f9701eb4b324e5940b06f80d35eb8ce1b9e -* d5d4859257ebf3be0c0dcbef24e05647b28ca02b -* 3cfa5516fba6b850461f2d3c8a1ff66550461012 -* b6e244093fc1ddcf0c2f1874509c0ad3f302d67b -* 9a097accb1c5d1fed8eaa9ae60db3bc19b7faede - -## OTHER CHANGES: Remove ethreum-cryptography-native package - -By updating kecack and secp256k1 to their N-API versions, there were little performance gains to obtain by using the native version of the package. We removed it to simplify the project. - -### Commits -* d5d4859257ebf3be0c0dcbef24e05647b28ca02b -* 05576f9a349352178c37cc0cc458766887bd2b9e diff --git a/audit/README.md b/audit/README.md new file mode 100644 index 0000000..abbf1ad --- /dev/null +++ b/audit/README.md @@ -0,0 +1,3 @@ +# Audit + +The PDF was saved from cure53.de site: [URL](https://cure53.de/pentest-report_hashing-libs.pdf). See information about audit and fuzzing in root [README](../README.md). diff --git a/audit/Trail_of_Bits_audit_report.pdf b/audit/Trail_of_Bits_audit_report.pdf deleted file mode 100644 index bd6e0b9..0000000 Binary files a/audit/Trail_of_Bits_audit_report.pdf and /dev/null differ diff --git a/bip39-lib b/bip39-lib deleted file mode 160000 index cfea218..0000000 --- a/bip39-lib +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cfea218ee2e6c3157baabb1e2ec684d36cce89c5 diff --git a/bip39-without-wordlists-config/README.md b/bip39-without-wordlists-config/README.md deleted file mode 100644 index 8b9df00..0000000 --- a/bip39-without-wordlists-config/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# hdkey-without-crypto - -This folder contains the necessary config to bundle `bip39` with Rollup, but -without including its wordlits. - -## Why do we do this? - -Including its wordlists would make this module huge. - -## How does this work? - -We have a git submodule with the latests release of `bip39`, and bundle it -with Rollup. - -We replace the imports of `./_wordlists` with an empty module. - diff --git a/bip39-without-wordlists-config/rollup.config.js b/bip39-without-wordlists-config/rollup.config.js deleted file mode 100644 index 3a273fc..0000000 --- a/bip39-without-wordlists-config/rollup.config.js +++ /dev/null @@ -1,23 +0,0 @@ -import commonjs from "rollup-plugin-commonjs"; -import alias from "rollup-plugin-alias"; - -export default { - input: __dirname + "/../bip39-lib/src/index.js", - output: { - file: - __dirname + - "/../bip39-without-wordlists-build/bip39-without-wordlists.js", - format: "cjs", - sourcemap: false, - exports: "named" - }, - external: ["create-hash", "randombytes", "pbkdf2"], - plugins: [ - alias({ - entries: [ - { find: "./_wordlists", replacement: __dirname + "/empty-module.js" } - ] - }), - commonjs() - ] -}; diff --git a/esm/package.json b/esm/package.json new file mode 100644 index 0000000..aead43d --- /dev/null +++ b/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} \ No newline at end of file diff --git a/hdkey b/hdkey deleted file mode 160000 index 42637e3..0000000 --- a/hdkey +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 42637e381bdef0c8f785b14f5b66a80dad969514 diff --git a/hdkey-without-crypto-config/README.md b/hdkey-without-crypto-config/README.md deleted file mode 100644 index 317d359..0000000 --- a/hdkey-without-crypto-config/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# hdkey-without-crypto - -This folder contains the necessary config to bundle `hdkey` with Rollup, but -without including the `crypto` built-in module nor `crypto-browserify`, and -using our local version of `secp256k1` instead of the native version. - -## Why do we do this? - -`crypto-browserify` is a very large bundle that doesn't work well with some -bundlers (e.g. Rollup). - -Also, `hdkey` depends on `secp256k1`, so installing it will compile a native -dependency. - -## How does this work? - -We have a git submodule with the latests release of `hdkey`, and bundle it -with Rollup. - -We replace the imports of `crypto` for `./shims/crypto`. We do this in two -steps. First we alias `crypto` to `/crypto-shim.js`, which just -imports `./shims/crypt`. This is done in this way because aliases are always -resolved after Rollup's commonjs plugin's ignore logic. - -We also replace the imports of `secp256k1` for `./secp256k1` using the same -technique. diff --git a/hdkey-without-crypto-config/crypto-shim.js b/hdkey-without-crypto-config/crypto-shim.js deleted file mode 100644 index a4d3c64..0000000 --- a/hdkey-without-crypto-config/crypto-shim.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("../shims/hdkey-crypto"); diff --git a/hdkey-without-crypto-config/rollup.config.js b/hdkey-without-crypto-config/rollup.config.js deleted file mode 100644 index eed91ad..0000000 --- a/hdkey-without-crypto-config/rollup.config.js +++ /dev/null @@ -1,25 +0,0 @@ -import commonjs from "rollup-plugin-commonjs"; -import alias from "rollup-plugin-alias"; - -export default { - input: __dirname + "/../hdkey/lib/hdkey.js", - output: { - file: - __dirname + - "/../hdkey-without-crypto-build/hdkey-without-crypto.js", - format: "cjs", - sourcemap: false - }, - external: ['assert', 'safe-buffer', 'bs58check'], - plugins: [ - alias({ - entries: [ - { find: "crypto", replacement: __dirname + "/crypto-shim.js" }, - { find: "secp256k1", replacement: __dirname + "/secp256k1-shim.js" } - ] - }), - commonjs({ - ignore: ["../shims/hdkey-crypto", "../shims/hdkey-secp256k1v3"] - }) - ] -}; diff --git a/hdkey-without-crypto-config/secp256k1-shim.js b/hdkey-without-crypto-config/secp256k1-shim.js deleted file mode 100644 index e657fde..0000000 --- a/hdkey-without-crypto-config/secp256k1-shim.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("../shims/hdkey-secp256k1v3"); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3962846 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5881 @@ +{ + "name": "ethereum-cryptography", + "version": "3.2.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ethereum-cryptography", + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "@noble/ciphers": "1.3.0", + "@noble/curves": "1.9.0", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0" + }, + "devDependencies": { + "@types/estree": "1.0.0", + "@types/mocha": "10.0.7", + "@types/node": "22.14.1", + "@typescript-eslint/eslint-plugin": "5.30.6", + "@typescript-eslint/parser": "5.30.6", + "eslint": "8.38.0", + "eslint-plugin-prettier": "4.2.1", + "karma": "6.4.4", + "karma-chrome-launcher": "3.1.1", + "karma-mocha": "2.0.1", + "karma-mocha-reporter": "2.2.5", + "mocha": "10.7.3", + "npm-run-all": "4.1.5", + "prettier": "2.7.1", + "ts-node": "10.9.1", + "typescript": "5.8.3" + }, + "engines": { + "node": "^14.21.3 || >=16", + "npm": ">=9" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", + "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", + "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.0.tgz", + "integrity": "sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@scure/base": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.5.tgz", + "integrity": "sha512-9rE6EOVeIQzt5TSu4v+K523F8u6DhBsoZWPGKlnCshhlDhy0kJzUX4V+tr2dWmzF1GdekvThABoEQBGBQI7xZw==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", + "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.6.tgz", + "integrity": "sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/type-utils": "5.30.6", + "@typescript-eslint/utils": "5.30.6", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.6.tgz", + "integrity": "sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/typescript-estree": "5.30.6", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz", + "integrity": "sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.6.tgz", + "integrity": "sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.30.6", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.6.tgz", + "integrity": "sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz", + "integrity": "sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.6.tgz", + "integrity": "sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/typescript-estree": "5.30.6", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz", + "integrity": "sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.30.6", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/ent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "punycode": "^1.4.1", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", + "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.38.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-sdsl": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", + "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/karma": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.3" + } + }, + "node_modules/karma-mocha-reporter": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", + "integrity": "sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "strip-ansi": "^4.0.0" + }, + "peerDependencies": { + "karma": ">=0.13" + } + }, + "node_modules/karma-mocha-reporter/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/karma-mocha-reporter/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma-mocha-reporter/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/karma-mocha-reporter/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/npm-run-all/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm-run-all/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz", + "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index ae66dc3..30fd561 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,304 @@ { "name": "ethereum-cryptography", - "version": "0.1.2", - "description": "All the cryptographic primitives used in Ethereum", - "contributors": [ - { - "name": "Patricio Palladino", - "email": "patricio@nomiclabs.io" - } - ], - "repository": "github:ethereum/js-ethereum-cryptography", + "version": "3.2.0", + "description": "All the cryptographic primitives used in Ethereum.", + "repository": "https://github.com/ethereum/js-ethereum-cryptography", "license": "MIT", + "main": "./index.js", + "engines": { + "node": "^14.21.3 || >=16", + "npm": ">=9" + }, + "files": [ + "bip39/*.js", + "bip39/*.d.ts", + "bip39/wordlists/*.js", + "bip39/wordlists/*.d.ts", + "*.js", + "*.d.ts", + "esm" + ], + "dependencies": { + "@noble/ciphers": "1.3.0", + "@noble/curves": "1.9.0", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0" + }, + "exports": { + ".": { + "import": "./esm/index.js", + "require": "./index.js" + }, + "./aes": { + "import": "./esm/aes.js", + "require": "./aes.js" + }, + "./bip39": { + "import": "./esm/bip39/index.js", + "require": "./bip39/index.js" + }, + "./blake2b": { + "import": "./esm/blake2b.js", + "require": "./blake2b.js" + }, + "./bls": { + "import": "./esm/bls.js", + "require": "./bls.js" + }, + "./bn": { + "import": "./esm/bn.js", + "require": "./bn.js" + }, + "./hdkey": { + "import": "./esm/hdkey.js", + "require": "./hdkey.js" + }, + "./index": { + "import": "./esm/index.js", + "require": "./index.js" + }, + "./math": { + "import": "./esm/math.js", + "require": "./math.js" + }, + "./keccak": { + "import": "./esm/keccak.js", + "require": "./keccak.js" + }, + "./pbkdf2": { + "import": "./esm/pbkdf2.js", + "require": "./pbkdf2.js" + }, + "./random": { + "import": "./esm/random.js", + "require": "./random.js" + }, + "./ripemd160": { + "import": "./esm/ripemd160.js", + "require": "./ripemd160.js" + }, + "./scrypt": { + "import": "./esm/scrypt.js", + "require": "./scrypt.js" + }, + "./secp256k1-compat": { + "import": "./esm/secp256k1-compat.js", + "require": "./secp256k1-compat.js" + }, + "./secp256k1": { + "import": "./esm/secp256k1.js", + "require": "./secp256k1.js" + }, + "./sha256": { + "import": "./esm/sha256.js", + "require": "./sha256.js" + }, + "./sha512": { + "import": "./esm/sha512.js", + "require": "./sha512.js" + }, + "./utils": { + "import": "./esm/utils.js", + "require": "./utils.js" + }, + "./bip39/index": { + "import": "./esm/bip39/index.js", + "require": "./bip39/index.js" + }, + "./bip39/wordlists/czech": { + "import": "./esm/bip39/wordlists/czech.js", + "require": "./bip39/wordlists/czech.js" + }, + "./bip39/wordlists/english": { + "import": "./esm/bip39/wordlists/english.js", + "require": "./bip39/wordlists/english.js" + }, + "./bip39/wordlists/french": { + "import": "./esm/bip39/wordlists/french.js", + "require": "./bip39/wordlists/french.js" + }, + "./bip39/wordlists/italian": { + "import": "./esm/bip39/wordlists/italian.js", + "require": "./bip39/wordlists/italian.js" + }, + "./bip39/wordlists/japanese": { + "import": "./esm/bip39/wordlists/japanese.js", + "require": "./bip39/wordlists/japanese.js" + }, + "./bip39/wordlists/korean": { + "import": "./esm/bip39/wordlists/korean.js", + "require": "./bip39/wordlists/korean.js" + }, + "./bip39/wordlists/portuguese": { + "import": "./esm/bip39/wordlists/portuguese.js", + "require": "./bip39/wordlists/portuguese.js" + }, + "./bip39/wordlists/simplified-chinese": { + "import": "./esm/bip39/wordlists/simplified-chinese.js", + "require": "./bip39/wordlists/simplified-chinese.js" + }, + "./bip39/wordlists/spanish": { + "import": "./esm/bip39/wordlists/spanish.js", + "require": "./bip39/wordlists/spanish.js" + }, + "./bip39/wordlists/traditional-chinese": { + "import": "./esm/bip39/wordlists/traditional-chinese.js", + "require": "./bip39/wordlists/traditional-chinese.js" + }, + "./aes.js": { + "import": "./esm/aes.js", + "require": "./aes.js" + }, + "./bip39.js": { + "import": "./esm/bip39/index.js", + "require": "./bip39/index.js" + }, + "./blake2b.js": { + "import": "./esm/blake2b.js", + "require": "./blake2b.js" + }, + "./bls.js": { + "import": "./esm/bls.js", + "require": "./bls.js" + }, + "./bn.js": { + "import": "./esm/bn.js", + "require": "./bn.js" + }, + "./hdkey.js": { + "import": "./esm/hdkey.js", + "require": "./hdkey.js" + }, + "./index.js": { + "import": "./esm/index.js", + "require": "./index.js" + }, + "./math.js": { + "import": "./esm/math.js", + "require": "./math.js" + }, + "./keccak.js": { + "import": "./esm/keccak.js", + "require": "./keccak.js" + }, + "./pbkdf2.js": { + "import": "./esm/pbkdf2.js", + "require": "./pbkdf2.js" + }, + "./random.js": { + "import": "./esm/random.js", + "require": "./random.js" + }, + "./ripemd160.js": { + "import": "./esm/ripemd160.js", + "require": "./ripemd160.js" + }, + "./scrypt.js": { + "import": "./esm/scrypt.js", + "require": "./scrypt.js" + }, + "./secp256k1-compat.js": { + "import": "./esm/secp256k1-compat.js", + "require": "./secp256k1-compat.js" + }, + "./secp256k1.js": { + "import": "./esm/secp256k1.js", + "require": "./secp256k1.js" + }, + "./sha256.js": { + "import": "./esm/sha256.js", + "require": "./sha256.js" + }, + "./sha512.js": { + "import": "./esm/sha512.js", + "require": "./sha512.js" + }, + "./utils.js": { + "import": "./esm/utils.js", + "require": "./utils.js" + }, + "./bip39/index.js": { + "import": "./esm/bip39/index.js", + "require": "./bip39/index.js" + }, + "./bip39/wordlists/czech.js": { + "import": "./esm/bip39/wordlists/czech.js", + "require": "./bip39/wordlists/czech.js" + }, + "./bip39/wordlists/english.js": { + "import": "./esm/bip39/wordlists/english.js", + "require": "./bip39/wordlists/english.js" + }, + "./bip39/wordlists/french.js": { + "import": "./esm/bip39/wordlists/french.js", + "require": "./bip39/wordlists/french.js" + }, + "./bip39/wordlists/italian.js": { + "import": "./esm/bip39/wordlists/italian.js", + "require": "./bip39/wordlists/italian.js" + }, + "./bip39/wordlists/japanese.js": { + "import": "./esm/bip39/wordlists/japanese.js", + "require": "./bip39/wordlists/japanese.js" + }, + "./bip39/wordlists/korean.js": { + "import": "./esm/bip39/wordlists/korean.js", + "require": "./bip39/wordlists/korean.js" + }, + "./bip39/wordlists/simplified-chinese.js": { + "import": "./esm/bip39/wordlists/simplified-chinese.js", + "require": "./bip39/wordlists/simplified-chinese.js" + }, + "./bip39/wordlists/spanish.js": { + "import": "./esm/bip39/wordlists/spanish.js", + "require": "./bip39/wordlists/spanish.js" + }, + "./bip39/wordlists/traditional-chinese.js": { + "import": "./esm/bip39/wordlists/traditional-chinese.js", + "require": "./bip39/wordlists/traditional-chinese.js" + } + }, + "browser": { + "crypto": false + }, + "sideEffects": false, + "scripts": { + "prepare": "npm run build", + "build": "npm-run-all build:tsc", + "build:tsc": "tsc --project tsconfig.prod.json && tsc --project tsconfig.prod.esm.json", + "test": "npm-run-all test:node", + "test:node": "cd test && npm install && cd .. && mocha", + "clean": "rm -rf test/test-builds bip39 *.js *.js.map *.d.ts *.d.ts.map src/**/*.js", + "lint": "eslint", + "lint:fix": "eslint --fix", + "browser-tests": "npm-run-all browser-tests:build browser-tests:test", + "browser-tests:build": "bash -x ./scripts/build-browser-tests.sh", + "browser-tests:test": "npm-run-all browser-tests:test-parcel browser-tests:test-browserify browser-tests:test-webpack browser-tests:test-rollup", + "browser-tests:test-parcel": "karma start --single-run --browsers ChromeHeadless test/karma.parcel.conf.js", + "browser-tests:test-browserify": "karma start --single-run --browsers ChromeHeadless test/karma.browserify.conf.js", + "browser-tests:test-webpack": "karma start --single-run --browsers ChromeHeadless test/karma.webpack.conf.js", + "browser-tests:test-rollup": "karma start --single-run --browsers ChromeHeadless test/karma.rollup.conf.js" + }, + "devDependencies": { + "@types/estree": "1.0.0", + "@types/mocha": "10.0.7", + "@types/node": "22.14.1", + "@typescript-eslint/eslint-plugin": "5.30.6", + "@typescript-eslint/parser": "5.30.6", + "eslint": "8.38.0", + "eslint-plugin-prettier": "4.2.1", + "karma": "6.4.4", + "karma-chrome-launcher": "3.1.1", + "karma-mocha": "2.0.1", + "karma-mocha-reporter": "2.2.5", + "mocha": "10.7.3", + "npm-run-all": "4.1.5", + "prettier": "2.7.1", + "ts-node": "10.9.1", + "typescript": "5.8.3" + }, + "packageManager": "npm@9.9.4", "keywords": [ "ethereum", "cryptography", @@ -24,7 +313,7 @@ "ripemd-160", "blake2b", "aes", - "advanced encryption standar", + "advanced encryption standard", "secp256k1", "ecdsa", "bip32", @@ -32,96 +321,19 @@ "hdwallet", "hdkeys" ], - "main": "./index.js", - "types": "./index.d.ts", - "files": [ - "src", - "vendor", - "shims", - "bip39", - "*.js", - "*.js.map", - "*.d.ts", - "*.d.ts.map", - "pure/**/*.js", - "pure/**/*.js.map", - "pure/**/*.d.ts", - "pure/**/*.d.ts.map" + "contributors": [ + { + "name": "Patricio Palladino", + "email": "patricio@nomiclabs.io" + }, + { + "name": "Paul Miller", + "url": "https://paulmillr.com" + } ], - "browser": { - "./hdkey.js": "./pure/hdkey.js", - "./ripemd160.js": "./pure/ripemd160.js", - "./sha256.js": "./pure/sha256.js" - }, - "sideEffects": false, - "scripts": { - "prepare": "npm run build", - "build": "npm-run-all build:tsc hdkey-without-crypto:build hdkey-without-crypto:copy bip39-without-wordlists:build bip39-without-wordlists:copy", - "build:tsc": "tsc --project tsconfig.prod.json", - "test": "npm-run-all hdkey-without-crypto:build bip39-without-wordlists:build test:node", - "test:node": "mocha", - "clean": "rimraf vendor test-builds pure shims hdkey-without-crypto-build bip39-without-wordlists-build bip39 '*.js' '*.js.map' '*.d.ts' '*.d.ts.map' 'src/**/*.js'", - "lint": "tslint --project tsconfig.json", - "lint:fix": "tslint --fix --project tsconfig.json", - "browser-tests": "npm-run-all browser-tests:build browser-tests:test", - "browser-tests:build": "bash -x ./scripts/build-browser-tests.sh", - "browser-tests:test": "npm-run-all browser-tests:test-parcel browser-tests:test-browserify browser-tests:test-webpack browser-tests:test-rollup", - "browser-tests:test-parcel": "karma start --single-run --browsers ChromeHeadless test/karma.parcel.conf.js", - "browser-tests:test-browserify": "karma start --single-run --browsers ChromeHeadless test/karma.browserify.conf.js", - "browser-tests:test-webpack": "karma start --single-run --browsers ChromeHeadless test/karma.webpack.conf.js", - "browser-tests:test-rollup": "karma start --single-run --browsers ChromeHeadless test/karma.rollup.conf.js", - "hdkey-without-crypto:build": "bash -x scripts/build-hdkey-without-crypto.sh", - "hdkey-without-crypto:copy": "mkdir -p vendor pure/vendor && cp src/vendor/hdkey-without-crypto.js ./vendor && cp src/pure/vendor/hdkey-without-crypto.js ./pure/vendor", - "bip39-without-wordlists:build": "bash -x scripts/build-bip39-without-wordlists.sh", - "bip39-without-wordlists:copy": "mkdir -p vendor && cp src/vendor/bip39-without-wordlists.js ./vendor" - }, - "devDependencies": { - "@types/chai": "^4.2.1", - "@types/mocha": "^5.2.7", - "@types/node": "^8.10.52", - "browserify": "^16.5.0", - "chai": "^4.2.0", - "karma": "^4.3.0", - "karma-chai": "^0.1.0", - "karma-chrome-launcher": "^3.1.0", - "karma-mocha": "^1.3.0", - "karma-mocha-reporter": "^2.2.5", - "mocha": "^6.2.0", - "npm-run-all": "^4.1.5", - "parcel-bundler": "^1.12.3", - "prettier": "1.18.2", - "rimraf": "^3.0.0", - "rollup": "^1.20.3", - "rollup-plugin-alias": "^2.0.0", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-json": "^4.0.0", - "rollup-plugin-node-builtins": "^2.1.2", - "rollup-plugin-node-globals": "^1.4.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-replace": "^2.2.0", - "ts-node": "^8.3.0", - "tslint": "^5.19.0", - "tslint-config-prettier": "^1.18.0", - "tslint-plugin-prettier": "^2.0.1", - "typescript": "~3.6.2", - "webpack": "^4.39.3", - "webpack-cli": "^3.3.8" - }, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "targets": { + "parcel_tests": { + "context": "browser" + } } } diff --git a/scripts/build-bip39-without-wordlists.sh b/scripts/build-bip39-without-wordlists.sh deleted file mode 100644 index 3316f3f..0000000 --- a/scripts/build-bip39-without-wordlists.sh +++ /dev/null @@ -1,7 +0,0 @@ -set -e - -echo "Bundling bip39 with Rollup" -npx rollup -c bip39-without-wordlists-config/rollup.config.js - -echo "Copying output" -cp bip39-without-wordlists-build/bip39-without-wordlists.js ./src/vendor diff --git a/scripts/build-browser-tests.sh b/scripts/build-browser-tests.sh index a5b4492..049ecee 100644 --- a/scripts/build-browser-tests.sh +++ b/scripts/build-browser-tests.sh @@ -1,27 +1,24 @@ set -e -echo "Building tests with TypeScript" -npx tsc --project tsconfig.json +cd ./test/ +echo "Install package to tests" +# Cleanup old module build +rm -rf ./node_modules +npm install --production=false -echo "Building hdkey-without-crypto" -npm run hdkey-without-crypto:build -mkdir -p test-builds/tsc/src/vendor test-builds/tsc/src/pure/vendor -cp src/vendor/hdkey-without-crypto.js test-builds/tsc/src/vendor -cp src/pure/vendor/hdkey-without-crypto.js test-builds/tsc/src/pure/vendor +export PATH="${PWD}/node_modules/.bin:${PATH}" -echo "Building bip39-without-wordlists" -npm run bip39-without-wordlists:build -mkdir -p test-builds/tsc/src/vendor -cp src/vendor/bip39-without-wordlists.js test-builds/tsc/src/vendor +echo "Building tests with TypeScript" +tsc --project ./tsconfig.json echo "Building tests with Parcel" -npx parcel build --no-cache --no-minify test-builds/tsc/src/pure/*.js test-builds/tsc/test/pure/*.js -d test-builds/parcel +parcel build --no-cache --no-optimize ./test-builds/tsc/test/test-vectors/*.js --dist-dir ./test-builds/parcel --target parcel_tests echo "Building tests with Browserify" -npx browserify test-builds/tsc/src/pure/*.js test-builds/tsc/test/pure/*.js > test-builds/browserify-build.js +browserify ./test-builds/tsc/test/test-vectors/*.js > ./test-builds/browserify-build.js echo "Building tests with webpack" -npx webpack --mode development test-builds/tsc/src/pure/*.js test-builds/tsc/test/pure/*.js --output test-builds/webpack-build.js +webpack --mode development ./test-builds/tsc/test/test-vectors/*.js --output-path ./test-builds echo "Building tests with Rollup" -rollup -c test/rollup.config.js +rollup -c ./rollup.config.js diff --git a/scripts/build-hdkey-without-crypto.sh b/scripts/build-hdkey-without-crypto.sh deleted file mode 100644 index 2083478..0000000 --- a/scripts/build-hdkey-without-crypto.sh +++ /dev/null @@ -1,8 +0,0 @@ -set -e - -echo "Bundling hdkey with Rollup" -npx rollup -c hdkey-without-crypto-config/rollup.config.js - -echo "Copying output" -cp hdkey-without-crypto-build/hdkey-without-crypto.js ./src/vendor -cp hdkey-without-crypto-build/hdkey-without-crypto.js ./src/pure/vendor diff --git a/scripts/check-browser-field.js b/scripts/check-browser-field.js deleted file mode 100644 index 73b5775..0000000 --- a/scripts/check-browser-field.js +++ /dev/null @@ -1,22 +0,0 @@ -const fs = require("fs"); - -const pkg = JSON.parse(fs.readFileSync(__dirname + "/../package.json", "utf8")); - -const files = fs - .readdirSync(__dirname + "/../pure") - .filter(f => f.endsWith(".js")); - -for (const file of files) { - const mapping = pkg.browser["./" + file]; - const expected = "./pure/" + file; - - if (mapping !== expected) { - console.error( - `Incorrect or missing mappnig of ${file} in the package.browser` - ); - - console.error(`It should be "${expected}" but is "${mapping}"`); - - process.exit(1); - } -} diff --git a/scripts/validate-wordlists.js b/scripts/validate-wordlists.js new file mode 100644 index 0000000..07848e3 --- /dev/null +++ b/scripts/validate-wordlists.js @@ -0,0 +1,55 @@ +const fs = require("fs"); +const https = require("https"); +const assert = require("assert"); + +const WORDLIST_NAMES = { + czech: "czech", + english: "english", + french: "french", + italian: "italian", + japanese: "japanese", + korean: "korean", + "simplified-chinese": "chinese_simplified", + spanish: "spanish", + "traditional-chinese": "chinese_traditional" +}; + +const download = name => + new Promise((resolve, reject) => { + { + name = WORDLIST_NAMES[name]; + const url = `https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/${name}.txt`; + const req = https.get(url, { encoding: "utf8" }, res => { + const chunks = []; + res.on("data", chunk => chunks.push(chunk)); + res.on("end", () => { + resolve( + Buffer.concat(chunks) + .toString("utf8") + .trim() + .split("\n") + ); + }); + }); + req.on("error", reject); + req.end(); + } + }); + +const files = fs + .readdirSync(__dirname + "/../bip39/wordlists") + .filter(f => f.endsWith(".js")); + +(async () => { + try { + for (const file of files) { + const actual = require(`../bip39/wordlists/${file}`).wordlist; + let expected = await download(file.slice(0, -3)); + assert.deepStrictEqual(actual, expected); + console.log(`CHECKED: ${file}`); + } + } catch (e) { + console.log("ERROR", e); + process.exit(1); + } +})(); diff --git a/src/aes.ts b/src/aes.ts index dda99dd..b7eb0be 100644 --- a/src/aes.ts +++ b/src/aes.ts @@ -1,52 +1,50 @@ -const browserifyAes = require("browserify-aes"); +import { cbc, ctr } from "@noble/ciphers/aes"; +import type { CipherWithOutput } from "@noble/ciphers/utils"; -const SUPPORTED_MODES = ["aes-128-ctr", "aes-128-cbc", "aes-256-cbc"]; - -function ensureAesMode(mode: string) { +function getCipher( + key: Uint8Array, + iv: Uint8Array, + mode: string, + pkcs7PaddingEnabled = true +): CipherWithOutput { if (!mode.startsWith("aes-")) { - throw new Error(`AES submodule doesn't support mode ${mode}`); + throw new Error("AES: unsupported mode"); } -} - -function warnIfUnsuportedMode(mode: string) { - if (!SUPPORTED_MODES.includes(mode)) { - // tslint:disable-next-line no-console - console.warn("Using an unsupported AES mode. Consider using aes-128-ctr."); + const len = key.length; + if ( + (mode.startsWith("aes-128") && len !== 16) || + (mode.startsWith("aes-256") && len !== 32) + ) { + throw new Error("AES: wrong key length"); + } + if (iv.length !== 16) { + throw new Error("AES: wrong IV length"); + } + if (["aes-128-cbc", "aes-256-cbc"].includes(mode)) { + return cbc(key, iv, { disablePadding: !pkcs7PaddingEnabled }); + } + if (["aes-128-ctr", "aes-256-ctr"].includes(mode)) { + return ctr(key, iv); } + throw new Error("AES: unsupported mode"); } export function encrypt( - msg: Buffer, - key: Buffer, - iv: Buffer, + msg: Uint8Array, + key: Uint8Array, + iv: Uint8Array, mode = "aes-128-ctr", pkcs7PaddingEnabled = true -): Buffer { - ensureAesMode(mode); - - const cipher = browserifyAes.createCipheriv(mode, key, iv); - cipher.setAutoPadding(pkcs7PaddingEnabled); - - const encrypted = cipher.update(msg); - const final = cipher.final(); - - return Buffer.concat([encrypted, final]); +): Uint8Array { + return getCipher(key, iv, mode, pkcs7PaddingEnabled).encrypt(msg); } export function decrypt( - cypherText: Buffer, - key: Buffer, - iv: Buffer, + ciphertext: Uint8Array, + key: Uint8Array, + iv: Uint8Array, mode = "aes-128-ctr", pkcs7PaddingEnabled = true -): Buffer { - ensureAesMode(mode); - - const decipher = browserifyAes.createDecipheriv(mode, key, iv); - decipher.setAutoPadding(pkcs7PaddingEnabled); - - const encrypted = decipher.update(cypherText); - const final = decipher.final(); - - return Buffer.concat([encrypted, final]); +): Uint8Array { + return getCipher(key, iv, mode, pkcs7PaddingEnabled).decrypt(ciphertext); } diff --git a/src/bip39/index.ts b/src/bip39/index.ts index 0592c1a..ef53783 100644 --- a/src/bip39/index.ts +++ b/src/bip39/index.ts @@ -1,40 +1,8 @@ -const bip39 = require("../vendor/bip39-without-wordlists"); - -export function generateMnemonic( - wordlist: string[], - strength: number = 128 -): string { - return bip39.generateMnemonic(strength, undefined, wordlist); -} - -export function mnemonicToEntropy( - mnemonic: string, - wordlist: string[] -): Buffer { - return bip39.mnemonicToEntropy(mnemonic, wordlist); -} - -export function entropyToMnemonic(entropy: Buffer, wordlist: string[]): string { - return bip39.entropyToMnemonic(entropy, wordlist); -} - -export function validateMnemonic( - mnemonic: string, - wordlist: string[] -): boolean { - return bip39.validateMnemonic(mnemonic, wordlist); -} - -export async function mnemonicToSeed( - mnemonic: string, - passphrase: string = "" -): Promise { - return bip39.mnemonicToSeed(mnemonic, passphrase); -} - -export function mnemonicToSeedSync( - mnemonic: string, - passphrase: string = "" -): Buffer { - return bip39.mnemonicToSeedSync(mnemonic, passphrase); -} +export { + generateMnemonic, + mnemonicToEntropy, + entropyToMnemonic, + validateMnemonic, + mnemonicToSeed, + mnemonicToSeedSync +} from "@scure/bip39"; diff --git a/src/bip39/wordlists/czech.ts b/src/bip39/wordlists/czech.ts index f072707..a8cd030 100644 --- a/src/bip39/wordlists/czech.ts +++ b/src/bip39/wordlists/czech.ts @@ -1,2050 +1 @@ -export const wordlist: string[] = [ - "abdikace", - "abeceda", - "adresa", - "agrese", - "akce", - "aktovka", - "alej", - "alkohol", - "amputace", - "ananas", - "andulka", - "anekdota", - "anketa", - "antika", - "anulovat", - "archa", - "arogance", - "asfalt", - "asistent", - "aspirace", - "astma", - "astronom", - "atlas", - "atletika", - "atol", - "autobus", - "azyl", - "babka", - "bachor", - "bacil", - "baculka", - "badatel", - "bageta", - "bagr", - "bahno", - "bakterie", - "balada", - "baletka", - "balkon", - "balonek", - "balvan", - "balza", - "bambus", - "bankomat", - "barbar", - "baret", - "barman", - "baroko", - "barva", - "baterka", - "batoh", - "bavlna", - "bazalka", - "bazilika", - "bazuka", - "bedna", - "beran", - "beseda", - "bestie", - "beton", - "bezinka", - "bezmoc", - "beztak", - "bicykl", - "bidlo", - "biftek", - "bikiny", - "bilance", - "biograf", - "biolog", - "bitva", - "bizon", - "blahobyt", - "blatouch", - "blecha", - "bledule", - "blesk", - "blikat", - "blizna", - "blokovat", - "bloudit", - "blud", - "bobek", - "bobr", - "bodlina", - "bodnout", - "bohatost", - "bojkot", - "bojovat", - "bokorys", - "bolest", - "borec", - "borovice", - "bota", - "boubel", - "bouchat", - "bouda", - "boule", - "bourat", - "boxer", - "bradavka", - "brambora", - "branka", - "bratr", - "brepta", - "briketa", - "brko", - "brloh", - "bronz", - "broskev", - "brunetka", - "brusinka", - "brzda", - "brzy", - "bublina", - "bubnovat", - "buchta", - "buditel", - "budka", - "budova", - "bufet", - "bujarost", - "bukvice", - "buldok", - "bulva", - "bunda", - "bunkr", - "burza", - "butik", - "buvol", - "buzola", - "bydlet", - "bylina", - "bytovka", - "bzukot", - "capart", - "carevna", - "cedr", - "cedule", - "cejch", - "cejn", - "cela", - "celer", - "celkem", - "celnice", - "cenina", - "cennost", - "cenovka", - "centrum", - "cenzor", - "cestopis", - "cetka", - "chalupa", - "chapadlo", - "charita", - "chata", - "chechtat", - "chemie", - "chichot", - "chirurg", - "chlad", - "chleba", - "chlubit", - "chmel", - "chmura", - "chobot", - "chochol", - "chodba", - "cholera", - "chomout", - "chopit", - "choroba", - "chov", - "chrapot", - "chrlit", - "chrt", - "chrup", - "chtivost", - "chudina", - "chutnat", - "chvat", - "chvilka", - "chvost", - "chyba", - "chystat", - "chytit", - "cibule", - "cigareta", - "cihelna", - "cihla", - "cinkot", - "cirkus", - "cisterna", - "citace", - "citrus", - "cizinec", - "cizost", - "clona", - "cokoliv", - "couvat", - "ctitel", - "ctnost", - "cudnost", - "cuketa", - "cukr", - "cupot", - "cvaknout", - "cval", - "cvik", - "cvrkot", - "cyklista", - "daleko", - "dareba", - "datel", - "datum", - "dcera", - "debata", - "dechovka", - "decibel", - "deficit", - "deflace", - "dekl", - "dekret", - "demokrat", - "deprese", - "derby", - "deska", - "detektiv", - "dikobraz", - "diktovat", - "dioda", - "diplom", - "disk", - "displej", - "divadlo", - "divoch", - "dlaha", - "dlouho", - "dluhopis", - "dnes", - "dobro", - "dobytek", - "docent", - "dochutit", - "dodnes", - "dohled", - "dohoda", - "dohra", - "dojem", - "dojnice", - "doklad", - "dokola", - "doktor", - "dokument", - "dolar", - "doleva", - "dolina", - "doma", - "dominant", - "domluvit", - "domov", - "donutit", - "dopad", - "dopis", - "doplnit", - "doposud", - "doprovod", - "dopustit", - "dorazit", - "dorost", - "dort", - "dosah", - "doslov", - "dostatek", - "dosud", - "dosyta", - "dotaz", - "dotek", - "dotknout", - "doufat", - "doutnat", - "dovozce", - "dozadu", - "doznat", - "dozorce", - "drahota", - "drak", - "dramatik", - "dravec", - "draze", - "drdol", - "drobnost", - "drogerie", - "drozd", - "drsnost", - "drtit", - "drzost", - "duben", - "duchovno", - "dudek", - "duha", - "duhovka", - "dusit", - "dusno", - "dutost", - "dvojice", - "dvorec", - "dynamit", - "ekolog", - "ekonomie", - "elektron", - "elipsa", - "email", - "emise", - "emoce", - "empatie", - "epizoda", - "epocha", - "epopej", - "epos", - "esej", - "esence", - "eskorta", - "eskymo", - "etiketa", - "euforie", - "evoluce", - "exekuce", - "exkurze", - "expedice", - "exploze", - "export", - "extrakt", - "facka", - "fajfka", - "fakulta", - "fanatik", - "fantazie", - "farmacie", - "favorit", - "fazole", - "federace", - "fejeton", - "fenka", - "fialka", - "figurant", - "filozof", - "filtr", - "finance", - "finta", - "fixace", - "fjord", - "flanel", - "flirt", - "flotila", - "fond", - "fosfor", - "fotbal", - "fotka", - "foton", - "frakce", - "freska", - "fronta", - "fukar", - "funkce", - "fyzika", - "galeje", - "garant", - "genetika", - "geolog", - "gilotina", - "glazura", - "glejt", - "golem", - "golfista", - "gotika", - "graf", - "gramofon", - "granule", - "grep", - "gril", - "grog", - "groteska", - "guma", - "hadice", - "hadr", - "hala", - "halenka", - "hanba", - "hanopis", - "harfa", - "harpuna", - "havran", - "hebkost", - "hejkal", - "hejno", - "hejtman", - "hektar", - "helma", - "hematom", - "herec", - "herna", - "heslo", - "hezky", - "historik", - "hladovka", - "hlasivky", - "hlava", - "hledat", - "hlen", - "hlodavec", - "hloh", - "hloupost", - "hltat", - "hlubina", - "hluchota", - "hmat", - "hmota", - "hmyz", - "hnis", - "hnojivo", - "hnout", - "hoblina", - "hoboj", - "hoch", - "hodiny", - "hodlat", - "hodnota", - "hodovat", - "hojnost", - "hokej", - "holinka", - "holka", - "holub", - "homole", - "honitba", - "honorace", - "horal", - "horda", - "horizont", - "horko", - "horlivec", - "hormon", - "hornina", - "horoskop", - "horstvo", - "hospoda", - "hostina", - "hotovost", - "houba", - "houf", - "houpat", - "houska", - "hovor", - "hradba", - "hranice", - "hravost", - "hrazda", - "hrbolek", - "hrdina", - "hrdlo", - "hrdost", - "hrnek", - "hrobka", - "hromada", - "hrot", - "hrouda", - "hrozen", - "hrstka", - "hrubost", - "hryzat", - "hubenost", - "hubnout", - "hudba", - "hukot", - "humr", - "husita", - "hustota", - "hvozd", - "hybnost", - "hydrant", - "hygiena", - "hymna", - "hysterik", - "idylka", - "ihned", - "ikona", - "iluze", - "imunita", - "infekce", - "inflace", - "inkaso", - "inovace", - "inspekce", - "internet", - "invalida", - "investor", - "inzerce", - "ironie", - "jablko", - "jachta", - "jahoda", - "jakmile", - "jakost", - "jalovec", - "jantar", - "jarmark", - "jaro", - "jasan", - "jasno", - "jatka", - "javor", - "jazyk", - "jedinec", - "jedle", - "jednatel", - "jehlan", - "jekot", - "jelen", - "jelito", - "jemnost", - "jenom", - "jepice", - "jeseter", - "jevit", - "jezdec", - "jezero", - "jinak", - "jindy", - "jinoch", - "jiskra", - "jistota", - "jitrnice", - "jizva", - "jmenovat", - "jogurt", - "jurta", - "kabaret", - "kabel", - "kabinet", - "kachna", - "kadet", - "kadidlo", - "kahan", - "kajak", - "kajuta", - "kakao", - "kaktus", - "kalamita", - "kalhoty", - "kalibr", - "kalnost", - "kamera", - "kamkoliv", - "kamna", - "kanibal", - "kanoe", - "kantor", - "kapalina", - "kapela", - "kapitola", - "kapka", - "kaple", - "kapota", - "kapr", - "kapusta", - "kapybara", - "karamel", - "karotka", - "karton", - "kasa", - "katalog", - "katedra", - "kauce", - "kauza", - "kavalec", - "kazajka", - "kazeta", - "kazivost", - "kdekoliv", - "kdesi", - "kedluben", - "kemp", - "keramika", - "kino", - "klacek", - "kladivo", - "klam", - "klapot", - "klasika", - "klaun", - "klec", - "klenba", - "klepat", - "klesnout", - "klid", - "klima", - "klisna", - "klobouk", - "klokan", - "klopa", - "kloub", - "klubovna", - "klusat", - "kluzkost", - "kmen", - "kmitat", - "kmotr", - "kniha", - "knot", - "koalice", - "koberec", - "kobka", - "kobliha", - "kobyla", - "kocour", - "kohout", - "kojenec", - "kokos", - "koktejl", - "kolaps", - "koleda", - "kolize", - "kolo", - "komando", - "kometa", - "komik", - "komnata", - "komora", - "kompas", - "komunita", - "konat", - "koncept", - "kondice", - "konec", - "konfese", - "kongres", - "konina", - "konkurs", - "kontakt", - "konzerva", - "kopanec", - "kopie", - "kopnout", - "koprovka", - "korbel", - "korektor", - "kormidlo", - "koroptev", - "korpus", - "koruna", - "koryto", - "korzet", - "kosatec", - "kostka", - "kotel", - "kotleta", - "kotoul", - "koukat", - "koupelna", - "kousek", - "kouzlo", - "kovboj", - "koza", - "kozoroh", - "krabice", - "krach", - "krajina", - "kralovat", - "krasopis", - "kravata", - "kredit", - "krejcar", - "kresba", - "kreveta", - "kriket", - "kritik", - "krize", - "krkavec", - "krmelec", - "krmivo", - "krocan", - "krok", - "kronika", - "kropit", - "kroupa", - "krovka", - "krtek", - "kruhadlo", - "krupice", - "krutost", - "krvinka", - "krychle", - "krypta", - "krystal", - "kryt", - "kudlanka", - "kufr", - "kujnost", - "kukla", - "kulajda", - "kulich", - "kulka", - "kulomet", - "kultura", - "kuna", - "kupodivu", - "kurt", - "kurzor", - "kutil", - "kvalita", - "kvasinka", - "kvestor", - "kynolog", - "kyselina", - "kytara", - "kytice", - "kytka", - "kytovec", - "kyvadlo", - "labrador", - "lachtan", - "ladnost", - "laik", - "lakomec", - "lamela", - "lampa", - "lanovka", - "lasice", - "laso", - "lastura", - "latinka", - "lavina", - "lebka", - "leckdy", - "leden", - "lednice", - "ledovka", - "ledvina", - "legenda", - "legie", - "legrace", - "lehce", - "lehkost", - "lehnout", - "lektvar", - "lenochod", - "lentilka", - "lepenka", - "lepidlo", - "letadlo", - "letec", - "letmo", - "letokruh", - "levhart", - "levitace", - "levobok", - "libra", - "lichotka", - "lidojed", - "lidskost", - "lihovina", - "lijavec", - "lilek", - "limetka", - "linie", - "linka", - "linoleum", - "listopad", - "litina", - "litovat", - "lobista", - "lodivod", - "logika", - "logoped", - "lokalita", - "loket", - "lomcovat", - "lopata", - "lopuch", - "lord", - "losos", - "lotr", - "loudal", - "louh", - "louka", - "louskat", - "lovec", - "lstivost", - "lucerna", - "lucifer", - "lump", - "lusk", - "lustrace", - "lvice", - "lyra", - "lyrika", - "lysina", - "madam", - "madlo", - "magistr", - "mahagon", - "majetek", - "majitel", - "majorita", - "makak", - "makovice", - "makrela", - "malba", - "malina", - "malovat", - "malvice", - "maminka", - "mandle", - "manko", - "marnost", - "masakr", - "maskot", - "masopust", - "matice", - "matrika", - "maturita", - "mazanec", - "mazivo", - "mazlit", - "mazurka", - "mdloba", - "mechanik", - "meditace", - "medovina", - "melasa", - "meloun", - "mentolka", - "metla", - "metoda", - "metr", - "mezera", - "migrace", - "mihnout", - "mihule", - "mikina", - "mikrofon", - "milenec", - "milimetr", - "milost", - "mimika", - "mincovna", - "minibar", - "minomet", - "minulost", - "miska", - "mistr", - "mixovat", - "mladost", - "mlha", - "mlhovina", - "mlok", - "mlsat", - "mluvit", - "mnich", - "mnohem", - "mobil", - "mocnost", - "modelka", - "modlitba", - "mohyla", - "mokro", - "molekula", - "momentka", - "monarcha", - "monokl", - "monstrum", - "montovat", - "monzun", - "mosaz", - "moskyt", - "most", - "motivace", - "motorka", - "motyka", - "moucha", - "moudrost", - "mozaika", - "mozek", - "mozol", - "mramor", - "mravenec", - "mrkev", - "mrtvola", - "mrzet", - "mrzutost", - "mstitel", - "mudrc", - "muflon", - "mulat", - "mumie", - "munice", - "muset", - "mutace", - "muzeum", - "muzikant", - "myslivec", - "mzda", - "nabourat", - "nachytat", - "nadace", - "nadbytek", - "nadhoz", - "nadobro", - "nadpis", - "nahlas", - "nahnat", - "nahodile", - "nahradit", - "naivita", - "najednou", - "najisto", - "najmout", - "naklonit", - "nakonec", - "nakrmit", - "nalevo", - "namazat", - "namluvit", - "nanometr", - "naoko", - "naopak", - "naostro", - "napadat", - "napevno", - "naplnit", - "napnout", - "naposled", - "naprosto", - "narodit", - "naruby", - "narychlo", - "nasadit", - "nasekat", - "naslepo", - "nastat", - "natolik", - "navenek", - "navrch", - "navzdory", - "nazvat", - "nebe", - "nechat", - "necky", - "nedaleko", - "nedbat", - "neduh", - "negace", - "nehet", - "nehoda", - "nejen", - "nejprve", - "neklid", - "nelibost", - "nemilost", - "nemoc", - "neochota", - "neonka", - "nepokoj", - "nerost", - "nerv", - "nesmysl", - "nesoulad", - "netvor", - "neuron", - "nevina", - "nezvykle", - "nicota", - "nijak", - "nikam", - "nikdy", - "nikl", - "nikterak", - "nitro", - "nocleh", - "nohavice", - "nominace", - "nora", - "norek", - "nositel", - "nosnost", - "nouze", - "noviny", - "novota", - "nozdra", - "nuda", - "nudle", - "nuget", - "nutit", - "nutnost", - "nutrie", - "nymfa", - "obal", - "obarvit", - "obava", - "obdiv", - "obec", - "obehnat", - "obejmout", - "obezita", - "obhajoba", - "obilnice", - "objasnit", - "objekt", - "obklopit", - "oblast", - "oblek", - "obliba", - "obloha", - "obluda", - "obnos", - "obohatit", - "obojek", - "obout", - "obrazec", - "obrna", - "obruba", - "obrys", - "obsah", - "obsluha", - "obstarat", - "obuv", - "obvaz", - "obvinit", - "obvod", - "obvykle", - "obyvatel", - "obzor", - "ocas", - "ocel", - "ocenit", - "ochladit", - "ochota", - "ochrana", - "ocitnout", - "odboj", - "odbyt", - "odchod", - "odcizit", - "odebrat", - "odeslat", - "odevzdat", - "odezva", - "odhadce", - "odhodit", - "odjet", - "odjinud", - "odkaz", - "odkoupit", - "odliv", - "odluka", - "odmlka", - "odolnost", - "odpad", - "odpis", - "odplout", - "odpor", - "odpustit", - "odpykat", - "odrazka", - "odsoudit", - "odstup", - "odsun", - "odtok", - "odtud", - "odvaha", - "odveta", - "odvolat", - "odvracet", - "odznak", - "ofina", - "ofsajd", - "ohlas", - "ohnisko", - "ohrada", - "ohrozit", - "ohryzek", - "okap", - "okenice", - "oklika", - "okno", - "okouzlit", - "okovy", - "okrasa", - "okres", - "okrsek", - "okruh", - "okupant", - "okurka", - "okusit", - "olejnina", - "olizovat", - "omak", - "omeleta", - "omezit", - "omladina", - "omlouvat", - "omluva", - "omyl", - "onehdy", - "opakovat", - "opasek", - "operace", - "opice", - "opilost", - "opisovat", - "opora", - "opozice", - "opravdu", - "oproti", - "orbital", - "orchestr", - "orgie", - "orlice", - "orloj", - "ortel", - "osada", - "oschnout", - "osika", - "osivo", - "oslava", - "oslepit", - "oslnit", - "oslovit", - "osnova", - "osoba", - "osolit", - "ospalec", - "osten", - "ostraha", - "ostuda", - "ostych", - "osvojit", - "oteplit", - "otisk", - "otop", - "otrhat", - "otrlost", - "otrok", - "otruby", - "otvor", - "ovanout", - "ovar", - "oves", - "ovlivnit", - "ovoce", - "oxid", - "ozdoba", - "pachatel", - "pacient", - "padouch", - "pahorek", - "pakt", - "palanda", - "palec", - "palivo", - "paluba", - "pamflet", - "pamlsek", - "panenka", - "panika", - "panna", - "panovat", - "panstvo", - "pantofle", - "paprika", - "parketa", - "parodie", - "parta", - "paruka", - "paryba", - "paseka", - "pasivita", - "pastelka", - "patent", - "patrona", - "pavouk", - "pazneht", - "pazourek", - "pecka", - "pedagog", - "pejsek", - "peklo", - "peloton", - "penalta", - "pendrek", - "penze", - "periskop", - "pero", - "pestrost", - "petarda", - "petice", - "petrolej", - "pevnina", - "pexeso", - "pianista", - "piha", - "pijavice", - "pikle", - "piknik", - "pilina", - "pilnost", - "pilulka", - "pinzeta", - "pipeta", - "pisatel", - "pistole", - "pitevna", - "pivnice", - "pivovar", - "placenta", - "plakat", - "plamen", - "planeta", - "plastika", - "platit", - "plavidlo", - "plaz", - "plech", - "plemeno", - "plenta", - "ples", - "pletivo", - "plevel", - "plivat", - "plnit", - "plno", - "plocha", - "plodina", - "plomba", - "plout", - "pluk", - "plyn", - "pobavit", - "pobyt", - "pochod", - "pocit", - "poctivec", - "podat", - "podcenit", - "podepsat", - "podhled", - "podivit", - "podklad", - "podmanit", - "podnik", - "podoba", - "podpora", - "podraz", - "podstata", - "podvod", - "podzim", - "poezie", - "pohanka", - "pohnutka", - "pohovor", - "pohroma", - "pohyb", - "pointa", - "pojistka", - "pojmout", - "pokazit", - "pokles", - "pokoj", - "pokrok", - "pokuta", - "pokyn", - "poledne", - "polibek", - "polknout", - "poloha", - "polynom", - "pomalu", - "pominout", - "pomlka", - "pomoc", - "pomsta", - "pomyslet", - "ponechat", - "ponorka", - "ponurost", - "popadat", - "popel", - "popisek", - "poplach", - "poprosit", - "popsat", - "popud", - "poradce", - "porce", - "porod", - "porucha", - "poryv", - "posadit", - "posed", - "posila", - "poskok", - "poslanec", - "posoudit", - "pospolu", - "postava", - "posudek", - "posyp", - "potah", - "potkan", - "potlesk", - "potomek", - "potrava", - "potupa", - "potvora", - "poukaz", - "pouto", - "pouzdro", - "povaha", - "povidla", - "povlak", - "povoz", - "povrch", - "povstat", - "povyk", - "povzdech", - "pozdrav", - "pozemek", - "poznatek", - "pozor", - "pozvat", - "pracovat", - "prahory", - "praktika", - "prales", - "praotec", - "praporek", - "prase", - "pravda", - "princip", - "prkno", - "probudit", - "procento", - "prodej", - "profese", - "prohra", - "projekt", - "prolomit", - "promile", - "pronikat", - "propad", - "prorok", - "prosba", - "proton", - "proutek", - "provaz", - "prskavka", - "prsten", - "prudkost", - "prut", - "prvek", - "prvohory", - "psanec", - "psovod", - "pstruh", - "ptactvo", - "puberta", - "puch", - "pudl", - "pukavec", - "puklina", - "pukrle", - "pult", - "pumpa", - "punc", - "pupen", - "pusa", - "pusinka", - "pustina", - "putovat", - "putyka", - "pyramida", - "pysk", - "pytel", - "racek", - "rachot", - "radiace", - "radnice", - "radon", - "raft", - "ragby", - "raketa", - "rakovina", - "rameno", - "rampouch", - "rande", - "rarach", - "rarita", - "rasovna", - "rastr", - "ratolest", - "razance", - "razidlo", - "reagovat", - "reakce", - "recept", - "redaktor", - "referent", - "reflex", - "rejnok", - "reklama", - "rekord", - "rekrut", - "rektor", - "reputace", - "revize", - "revma", - "revolver", - "rezerva", - "riskovat", - "riziko", - "robotika", - "rodokmen", - "rohovka", - "rokle", - "rokoko", - "romaneto", - "ropovod", - "ropucha", - "rorejs", - "rosol", - "rostlina", - "rotmistr", - "rotoped", - "rotunda", - "roubenka", - "roucho", - "roup", - "roura", - "rovina", - "rovnice", - "rozbor", - "rozchod", - "rozdat", - "rozeznat", - "rozhodce", - "rozinka", - "rozjezd", - "rozkaz", - "rozloha", - "rozmar", - "rozpad", - "rozruch", - "rozsah", - "roztok", - "rozum", - "rozvod", - "rubrika", - "ruchadlo", - "rukavice", - "rukopis", - "ryba", - "rybolov", - "rychlost", - "rydlo", - "rypadlo", - "rytina", - "ryzost", - "sadista", - "sahat", - "sako", - "samec", - "samizdat", - "samota", - "sanitka", - "sardinka", - "sasanka", - "satelit", - "sazba", - "sazenice", - "sbor", - "schovat", - "sebranka", - "secese", - "sedadlo", - "sediment", - "sedlo", - "sehnat", - "sejmout", - "sekera", - "sekta", - "sekunda", - "sekvoje", - "semeno", - "seno", - "servis", - "sesadit", - "seshora", - "seskok", - "seslat", - "sestra", - "sesuv", - "sesypat", - "setba", - "setina", - "setkat", - "setnout", - "setrvat", - "sever", - "seznam", - "shoda", - "shrnout", - "sifon", - "silnice", - "sirka", - "sirotek", - "sirup", - "situace", - "skafandr", - "skalisko", - "skanzen", - "skaut", - "skeptik", - "skica", - "skladba", - "sklenice", - "sklo", - "skluz", - "skoba", - "skokan", - "skoro", - "skripta", - "skrz", - "skupina", - "skvost", - "skvrna", - "slabika", - "sladidlo", - "slanina", - "slast", - "slavnost", - "sledovat", - "slepec", - "sleva", - "slezina", - "slib", - "slina", - "sliznice", - "slon", - "sloupek", - "slovo", - "sluch", - "sluha", - "slunce", - "slupka", - "slza", - "smaragd", - "smetana", - "smilstvo", - "smlouva", - "smog", - "smrad", - "smrk", - "smrtka", - "smutek", - "smysl", - "snad", - "snaha", - "snob", - "sobota", - "socha", - "sodovka", - "sokol", - "sopka", - "sotva", - "souboj", - "soucit", - "soudce", - "souhlas", - "soulad", - "soumrak", - "souprava", - "soused", - "soutok", - "souviset", - "spalovna", - "spasitel", - "spis", - "splav", - "spodek", - "spojenec", - "spolu", - "sponzor", - "spornost", - "spousta", - "sprcha", - "spustit", - "sranda", - "sraz", - "srdce", - "srna", - "srnec", - "srovnat", - "srpen", - "srst", - "srub", - "stanice", - "starosta", - "statika", - "stavba", - "stehno", - "stezka", - "stodola", - "stolek", - "stopa", - "storno", - "stoupat", - "strach", - "stres", - "strhnout", - "strom", - "struna", - "studna", - "stupnice", - "stvol", - "styk", - "subjekt", - "subtropy", - "suchar", - "sudost", - "sukno", - "sundat", - "sunout", - "surikata", - "surovina", - "svah", - "svalstvo", - "svetr", - "svatba", - "svazek", - "svisle", - "svitek", - "svoboda", - "svodidlo", - "svorka", - "svrab", - "sykavka", - "sykot", - "synek", - "synovec", - "sypat", - "sypkost", - "syrovost", - "sysel", - "sytost", - "tabletka", - "tabule", - "tahoun", - "tajemno", - "tajfun", - "tajga", - "tajit", - "tajnost", - "taktika", - "tamhle", - "tampon", - "tancovat", - "tanec", - "tanker", - "tapeta", - "tavenina", - "tazatel", - "technika", - "tehdy", - "tekutina", - "telefon", - "temnota", - "tendence", - "tenista", - "tenor", - "teplota", - "tepna", - "teprve", - "terapie", - "termoska", - "textil", - "ticho", - "tiskopis", - "titulek", - "tkadlec", - "tkanina", - "tlapka", - "tleskat", - "tlukot", - "tlupa", - "tmel", - "toaleta", - "topinka", - "topol", - "torzo", - "touha", - "toulec", - "tradice", - "traktor", - "tramp", - "trasa", - "traverza", - "trefit", - "trest", - "trezor", - "trhavina", - "trhlina", - "trochu", - "trojice", - "troska", - "trouba", - "trpce", - "trpitel", - "trpkost", - "trubec", - "truchlit", - "truhlice", - "trus", - "trvat", - "tudy", - "tuhnout", - "tuhost", - "tundra", - "turista", - "turnaj", - "tuzemsko", - "tvaroh", - "tvorba", - "tvrdost", - "tvrz", - "tygr", - "tykev", - "ubohost", - "uboze", - "ubrat", - "ubrousek", - "ubrus", - "ubytovna", - "ucho", - "uctivost", - "udivit", - "uhradit", - "ujednat", - "ujistit", - "ujmout", - "ukazatel", - "uklidnit", - "uklonit", - "ukotvit", - "ukrojit", - "ulice", - "ulita", - "ulovit", - "umyvadlo", - "unavit", - "uniforma", - "uniknout", - "upadnout", - "uplatnit", - "uplynout", - "upoutat", - "upravit", - "uran", - "urazit", - "usednout", - "usilovat", - "usmrtit", - "usnadnit", - "usnout", - "usoudit", - "ustlat", - "ustrnout", - "utahovat", - "utkat", - "utlumit", - "utonout", - "utopenec", - "utrousit", - "uvalit", - "uvolnit", - "uvozovka", - "uzdravit", - "uzel", - "uzenina", - "uzlina", - "uznat", - "vagon", - "valcha", - "valoun", - "vana", - "vandal", - "vanilka", - "varan", - "varhany", - "varovat", - "vcelku", - "vchod", - "vdova", - "vedro", - "vegetace", - "vejce", - "velbloud", - "veletrh", - "velitel", - "velmoc", - "velryba", - "venkov", - "veranda", - "verze", - "veselka", - "veskrze", - "vesnice", - "vespodu", - "vesta", - "veterina", - "veverka", - "vibrace", - "vichr", - "videohra", - "vidina", - "vidle", - "vila", - "vinice", - "viset", - "vitalita", - "vize", - "vizitka", - "vjezd", - "vklad", - "vkus", - "vlajka", - "vlak", - "vlasec", - "vlevo", - "vlhkost", - "vliv", - "vlnovka", - "vloupat", - "vnucovat", - "vnuk", - "voda", - "vodivost", - "vodoznak", - "vodstvo", - "vojensky", - "vojna", - "vojsko", - "volant", - "volba", - "volit", - "volno", - "voskovka", - "vozidlo", - "vozovna", - "vpravo", - "vrabec", - "vracet", - "vrah", - "vrata", - "vrba", - "vrcholek", - "vrhat", - "vrstva", - "vrtule", - "vsadit", - "vstoupit", - "vstup", - "vtip", - "vybavit", - "vybrat", - "vychovat", - "vydat", - "vydra", - "vyfotit", - "vyhledat", - "vyhnout", - "vyhodit", - "vyhradit", - "vyhubit", - "vyjasnit", - "vyjet", - "vyjmout", - "vyklopit", - "vykonat", - "vylekat", - "vymazat", - "vymezit", - "vymizet", - "vymyslet", - "vynechat", - "vynikat", - "vynutit", - "vypadat", - "vyplatit", - "vypravit", - "vypustit", - "vyrazit", - "vyrovnat", - "vyrvat", - "vyslovit", - "vysoko", - "vystavit", - "vysunout", - "vysypat", - "vytasit", - "vytesat", - "vytratit", - "vyvinout", - "vyvolat", - "vyvrhel", - "vyzdobit", - "vyznat", - "vzadu", - "vzbudit", - "vzchopit", - "vzdor", - "vzduch", - "vzdychat", - "vzestup", - "vzhledem", - "vzkaz", - "vzlykat", - "vznik", - "vzorek", - "vzpoura", - "vztah", - "vztek", - "xylofon", - "zabrat", - "zabydlet", - "zachovat", - "zadarmo", - "zadusit", - "zafoukat", - "zahltit", - "zahodit", - "zahrada", - "zahynout", - "zajatec", - "zajet", - "zajistit", - "zaklepat", - "zakoupit", - "zalepit", - "zamezit", - "zamotat", - "zamyslet", - "zanechat", - "zanikat", - "zaplatit", - "zapojit", - "zapsat", - "zarazit", - "zastavit", - "zasunout", - "zatajit", - "zatemnit", - "zatknout", - "zaujmout", - "zavalit", - "zavelet", - "zavinit", - "zavolat", - "zavrtat", - "zazvonit", - "zbavit", - "zbrusu", - "zbudovat", - "zbytek", - "zdaleka", - "zdarma", - "zdatnost", - "zdivo", - "zdobit", - "zdroj", - "zdvih", - "zdymadlo", - "zelenina", - "zeman", - "zemina", - "zeptat", - "zezadu", - "zezdola", - "zhatit", - "zhltnout", - "zhluboka", - "zhotovit", - "zhruba", - "zima", - "zimnice", - "zjemnit", - "zklamat", - "zkoumat", - "zkratka", - "zkumavka", - "zlato", - "zlehka", - "zloba", - "zlom", - "zlost", - "zlozvyk", - "zmapovat", - "zmar", - "zmatek", - "zmije", - "zmizet", - "zmocnit", - "zmodrat", - "zmrzlina", - "zmutovat", - "znak", - "znalost", - "znamenat", - "znovu", - "zobrazit", - "zotavit", - "zoubek", - "zoufale", - "zplodit", - "zpomalit", - "zprava", - "zprostit", - "zprudka", - "zprvu", - "zrada", - "zranit", - "zrcadlo", - "zrnitost", - "zrno", - "zrovna", - "zrychlit", - "zrzavost", - "zticha", - "ztratit", - "zubovina", - "zubr", - "zvednout", - "zvenku", - "zvesela", - "zvon", - "zvrat", - "zvukovod", - "zvyk" -]; +export { wordlist } from "@scure/bip39/wordlists/czech"; diff --git a/src/bip39/wordlists/english.ts b/src/bip39/wordlists/english.ts index a80487d..77b99ba 100644 --- a/src/bip39/wordlists/english.ts +++ b/src/bip39/wordlists/english.ts @@ -1,2050 +1 @@ -export const wordlist: string[] = [ - "abandon", - "ability", - "able", - "about", - "above", - "absent", - "absorb", - "abstract", - "absurd", - "abuse", - "access", - "accident", - "account", - "accuse", - "achieve", - "acid", - "acoustic", - "acquire", - "across", - "act", - "action", - "actor", - "actress", - "actual", - "adapt", - "add", - "addict", - "address", - "adjust", - "admit", - "adult", - "advance", - "advice", - "aerobic", - "affair", - "afford", - "afraid", - "again", - "age", - "agent", - "agree", - "ahead", - "aim", - "air", - "airport", - "aisle", - "alarm", - "album", - "alcohol", - "alert", - "alien", - "all", - "alley", - "allow", - "almost", - "alone", - "alpha", - "already", - "also", - "alter", - "always", - "amateur", - "amazing", - "among", - "amount", - "amused", - "analyst", - "anchor", - "ancient", - "anger", - "angle", - "angry", - "animal", - "ankle", - "announce", - "annual", - "another", - "answer", - "antenna", - "antique", - "anxiety", - "any", - "apart", - "apology", - "appear", - "apple", - "approve", - "april", - "arch", - "arctic", - "area", - "arena", - "argue", - "arm", - "armed", - "armor", - "army", - "around", - "arrange", - "arrest", - "arrive", - "arrow", - "art", - "artefact", - "artist", - "artwork", - "ask", - "aspect", - "assault", - "asset", - "assist", - "assume", - "asthma", - "athlete", - "atom", - "attack", - "attend", - "attitude", - "attract", - "auction", - "audit", - "august", - "aunt", - "author", - "auto", - "autumn", - "average", - "avocado", - "avoid", - "awake", - "aware", - "away", - "awesome", - "awful", - "awkward", - "axis", - "baby", - "bachelor", - "bacon", - "badge", - "bag", - "balance", - "balcony", - "ball", - "bamboo", - "banana", - "banner", - "bar", - "barely", - "bargain", - "barrel", - "base", - "basic", - "basket", - "battle", - "beach", - "bean", - "beauty", - "because", - "become", - "beef", - "before", - "begin", - "behave", - "behind", - "believe", - "below", - "belt", - "bench", - "benefit", - "best", - "betray", - "better", - "between", - "beyond", - "bicycle", - "bid", - "bike", - "bind", - "biology", - "bird", - "birth", - "bitter", - "black", - "blade", - "blame", - "blanket", - "blast", - "bleak", - "bless", - "blind", - "blood", - "blossom", - "blouse", - "blue", - "blur", - "blush", - "board", - "boat", - "body", - "boil", - "bomb", - "bone", - "bonus", - "book", - "boost", - "border", - "boring", - "borrow", - "boss", - "bottom", - "bounce", - "box", - "boy", - "bracket", - "brain", - "brand", - "brass", - "brave", - "bread", - "breeze", - "brick", - "bridge", - "brief", - "bright", - "bring", - "brisk", - "broccoli", - "broken", - "bronze", - "broom", - "brother", - "brown", - "brush", - "bubble", - "buddy", - "budget", - "buffalo", - "build", - "bulb", - "bulk", - "bullet", - "bundle", - "bunker", - "burden", - "burger", - "burst", - "bus", - "business", - "busy", - "butter", - "buyer", - "buzz", - "cabbage", - "cabin", - "cable", - "cactus", - "cage", - "cake", - "call", - "calm", - "camera", - "camp", - "can", - "canal", - "cancel", - "candy", - "cannon", - "canoe", - "canvas", - "canyon", - "capable", - "capital", - "captain", - "car", - "carbon", - "card", - "cargo", - "carpet", - "carry", - "cart", - "case", - "cash", - "casino", - "castle", - "casual", - "cat", - "catalog", - "catch", - "category", - "cattle", - "caught", - "cause", - "caution", - "cave", - "ceiling", - "celery", - "cement", - "census", - "century", - "cereal", - "certain", - "chair", - "chalk", - "champion", - "change", - "chaos", - "chapter", - "charge", - "chase", - "chat", - "cheap", - "check", - "cheese", - "chef", - "cherry", - "chest", - "chicken", - "chief", - "child", - "chimney", - "choice", - "choose", - "chronic", - "chuckle", - "chunk", - "churn", - "cigar", - "cinnamon", - "circle", - "citizen", - "city", - "civil", - "claim", - "clap", - "clarify", - "claw", - "clay", - "clean", - "clerk", - "clever", - "click", - "client", - "cliff", - "climb", - "clinic", - "clip", - "clock", - "clog", - "close", - "cloth", - "cloud", - "clown", - "club", - "clump", - "cluster", - "clutch", - "coach", - "coast", - "coconut", - "code", - "coffee", - "coil", - "coin", - "collect", - "color", - "column", - "combine", - "come", - "comfort", - "comic", - "common", - "company", - "concert", - "conduct", - "confirm", - "congress", - "connect", - "consider", - "control", - "convince", - "cook", - "cool", - "copper", - "copy", - "coral", - "core", - "corn", - "correct", - "cost", - "cotton", - "couch", - "country", - "couple", - "course", - "cousin", - "cover", - "coyote", - "crack", - "cradle", - "craft", - "cram", - "crane", - "crash", - "crater", - "crawl", - "crazy", - "cream", - "credit", - "creek", - "crew", - "cricket", - "crime", - "crisp", - "critic", - "crop", - "cross", - "crouch", - "crowd", - "crucial", - "cruel", - "cruise", - "crumble", - "crunch", - "crush", - "cry", - "crystal", - "cube", - "culture", - "cup", - "cupboard", - "curious", - "current", - "curtain", - "curve", - "cushion", - "custom", - "cute", - "cycle", - "dad", - "damage", - "damp", - "dance", - "danger", - "daring", - "dash", - "daughter", - "dawn", - "day", - "deal", - "debate", - "debris", - "decade", - "december", - "decide", - "decline", - "decorate", - "decrease", - "deer", - "defense", - "define", - "defy", - "degree", - "delay", - "deliver", - "demand", - "demise", - "denial", - "dentist", - "deny", - "depart", - "depend", - "deposit", - "depth", - "deputy", - "derive", - "describe", - "desert", - "design", - "desk", - "despair", - "destroy", - "detail", - "detect", - "develop", - "device", - "devote", - "diagram", - "dial", - "diamond", - "diary", - "dice", - "diesel", - "diet", - "differ", - "digital", - "dignity", - "dilemma", - "dinner", - "dinosaur", - "direct", - "dirt", - "disagree", - "discover", - "disease", - "dish", - "dismiss", - "disorder", - "display", - "distance", - "divert", - "divide", - "divorce", - "dizzy", - "doctor", - "document", - "dog", - "doll", - "dolphin", - "domain", - "donate", - "donkey", - "donor", - "door", - "dose", - "double", - "dove", - "draft", - "dragon", - "drama", - "drastic", - "draw", - "dream", - "dress", - "drift", - "drill", - "drink", - "drip", - "drive", - "drop", - "drum", - "dry", - "duck", - "dumb", - "dune", - "during", - "dust", - "dutch", - "duty", - "dwarf", - "dynamic", - "eager", - "eagle", - "early", - "earn", - "earth", - "easily", - "east", - "easy", - "echo", - "ecology", - "economy", - "edge", - "edit", - "educate", - "effort", - "egg", - "eight", - "either", - "elbow", - "elder", - "electric", - "elegant", - "element", - "elephant", - "elevator", - "elite", - "else", - "embark", - "embody", - "embrace", - "emerge", - "emotion", - "employ", - "empower", - "empty", - "enable", - "enact", - "end", - "endless", - "endorse", - "enemy", - "energy", - "enforce", - "engage", - "engine", - "enhance", - "enjoy", - "enlist", - "enough", - "enrich", - "enroll", - "ensure", - "enter", - "entire", - "entry", - "envelope", - "episode", - "equal", - "equip", - "era", - "erase", - "erode", - "erosion", - "error", - "erupt", - "escape", - "essay", - "essence", - "estate", - "eternal", - "ethics", - "evidence", - "evil", - "evoke", - "evolve", - "exact", - "example", - "excess", - "exchange", - "excite", - "exclude", - "excuse", - "execute", - "exercise", - "exhaust", - "exhibit", - "exile", - "exist", - "exit", - "exotic", - "expand", - "expect", - "expire", - "explain", - "expose", - "express", - "extend", - "extra", - "eye", - "eyebrow", - "fabric", - "face", - "faculty", - "fade", - "faint", - "faith", - "fall", - "false", - "fame", - "family", - "famous", - "fan", - "fancy", - "fantasy", - "farm", - "fashion", - "fat", - "fatal", - "father", - "fatigue", - "fault", - "favorite", - "feature", - "february", - "federal", - "fee", - "feed", - "feel", - "female", - "fence", - "festival", - "fetch", - "fever", - "few", - "fiber", - "fiction", - "field", - "figure", - "file", - "film", - "filter", - "final", - "find", - "fine", - "finger", - "finish", - "fire", - "firm", - "first", - "fiscal", - "fish", - "fit", - "fitness", - "fix", - "flag", - "flame", - "flash", - "flat", - "flavor", - "flee", - "flight", - "flip", - "float", - "flock", - "floor", - "flower", - "fluid", - "flush", - "fly", - "foam", - "focus", - "fog", - "foil", - "fold", - "follow", - "food", - "foot", - "force", - "forest", - "forget", - "fork", - "fortune", - "forum", - "forward", - "fossil", - "foster", - "found", - "fox", - "fragile", - "frame", - "frequent", - "fresh", - "friend", - "fringe", - "frog", - "front", - "frost", - "frown", - "frozen", - "fruit", - "fuel", - "fun", - "funny", - "furnace", - "fury", - "future", - "gadget", - "gain", - "galaxy", - "gallery", - "game", - "gap", - "garage", - "garbage", - "garden", - "garlic", - "garment", - "gas", - "gasp", - "gate", - "gather", - "gauge", - "gaze", - "general", - "genius", - "genre", - "gentle", - "genuine", - "gesture", - "ghost", - "giant", - "gift", - "giggle", - "ginger", - "giraffe", - "girl", - "give", - "glad", - "glance", - "glare", - "glass", - "glide", - "glimpse", - "globe", - "gloom", - "glory", - "glove", - "glow", - "glue", - "goat", - "goddess", - "gold", - "good", - "goose", - "gorilla", - "gospel", - "gossip", - "govern", - "gown", - "grab", - "grace", - "grain", - "grant", - "grape", - "grass", - "gravity", - "great", - "green", - "grid", - "grief", - "grit", - "grocery", - "group", - "grow", - "grunt", - "guard", - "guess", - "guide", - "guilt", - "guitar", - "gun", - "gym", - "habit", - "hair", - "half", - "hammer", - "hamster", - "hand", - "happy", - "harbor", - "hard", - "harsh", - "harvest", - "hat", - "have", - "hawk", - "hazard", - "head", - "health", - "heart", - "heavy", - "hedgehog", - "height", - "hello", - "helmet", - "help", - "hen", - "hero", - "hidden", - "high", - "hill", - "hint", - "hip", - "hire", - "history", - "hobby", - "hockey", - "hold", - "hole", - "holiday", - "hollow", - "home", - "honey", - "hood", - "hope", - "horn", - "horror", - "horse", - "hospital", - "host", - "hotel", - "hour", - "hover", - "hub", - "huge", - "human", - "humble", - "humor", - "hundred", - "hungry", - "hunt", - "hurdle", - "hurry", - "hurt", - "husband", - "hybrid", - "ice", - "icon", - "idea", - "identify", - "idle", - "ignore", - "ill", - "illegal", - "illness", - "image", - "imitate", - "immense", - "immune", - "impact", - "impose", - "improve", - "impulse", - "inch", - "include", - "income", - "increase", - "index", - "indicate", - "indoor", - "industry", - "infant", - "inflict", - "inform", - "inhale", - "inherit", - "initial", - "inject", - "injury", - "inmate", - "inner", - "innocent", - "input", - "inquiry", - "insane", - "insect", - "inside", - "inspire", - "install", - "intact", - "interest", - "into", - "invest", - "invite", - "involve", - "iron", - "island", - "isolate", - "issue", - "item", - "ivory", - "jacket", - "jaguar", - "jar", - "jazz", - "jealous", - "jeans", - "jelly", - "jewel", - "job", - "join", - "joke", - "journey", - "joy", - "judge", - "juice", - "jump", - "jungle", - "junior", - "junk", - "just", - "kangaroo", - "keen", - "keep", - "ketchup", - "key", - "kick", - "kid", - "kidney", - "kind", - "kingdom", - "kiss", - "kit", - "kitchen", - "kite", - "kitten", - "kiwi", - "knee", - "knife", - "knock", - "know", - "lab", - "label", - "labor", - "ladder", - "lady", - "lake", - "lamp", - "language", - "laptop", - "large", - "later", - "latin", - "laugh", - "laundry", - "lava", - "law", - "lawn", - "lawsuit", - "layer", - "lazy", - "leader", - "leaf", - "learn", - "leave", - "lecture", - "left", - "leg", - "legal", - "legend", - "leisure", - "lemon", - "lend", - "length", - "lens", - "leopard", - "lesson", - "letter", - "level", - "liar", - "liberty", - "library", - "license", - "life", - "lift", - "light", - "like", - "limb", - "limit", - "link", - "lion", - "liquid", - "list", - "little", - "live", - "lizard", - "load", - "loan", - "lobster", - "local", - "lock", - "logic", - "lonely", - "long", - "loop", - "lottery", - "loud", - "lounge", - "love", - "loyal", - "lucky", - "luggage", - "lumber", - "lunar", - "lunch", - "luxury", - "lyrics", - "machine", - "mad", - "magic", - "magnet", - "maid", - "mail", - "main", - "major", - "make", - "mammal", - "man", - "manage", - "mandate", - "mango", - "mansion", - "manual", - "maple", - "marble", - "march", - "margin", - "marine", - "market", - "marriage", - "mask", - "mass", - "master", - "match", - "material", - "math", - "matrix", - "matter", - "maximum", - "maze", - "meadow", - "mean", - "measure", - "meat", - "mechanic", - "medal", - "media", - "melody", - "melt", - "member", - "memory", - "mention", - "menu", - "mercy", - "merge", - "merit", - "merry", - "mesh", - "message", - "metal", - "method", - "middle", - "midnight", - "milk", - "million", - "mimic", - "mind", - "minimum", - "minor", - "minute", - "miracle", - "mirror", - "misery", - "miss", - "mistake", - "mix", - "mixed", - "mixture", - "mobile", - "model", - "modify", - "mom", - "moment", - "monitor", - "monkey", - "monster", - "month", - "moon", - "moral", - "more", - "morning", - "mosquito", - "mother", - "motion", - "motor", - "mountain", - "mouse", - "move", - "movie", - "much", - "muffin", - "mule", - "multiply", - "muscle", - "museum", - "mushroom", - "music", - "must", - "mutual", - "myself", - "mystery", - "myth", - "naive", - "name", - "napkin", - "narrow", - "nasty", - "nation", - "nature", - "near", - "neck", - "need", - "negative", - "neglect", - "neither", - "nephew", - "nerve", - "nest", - "net", - "network", - "neutral", - "never", - "news", - "next", - "nice", - "night", - "noble", - "noise", - "nominee", - "noodle", - "normal", - "north", - "nose", - "notable", - "note", - "nothing", - "notice", - "novel", - "now", - "nuclear", - "number", - "nurse", - "nut", - "oak", - "obey", - "object", - "oblige", - "obscure", - "observe", - "obtain", - "obvious", - "occur", - "ocean", - "october", - "odor", - "off", - "offer", - "office", - "often", - "oil", - "okay", - "old", - "olive", - "olympic", - "omit", - "once", - "one", - "onion", - "online", - "only", - "open", - "opera", - "opinion", - "oppose", - "option", - "orange", - "orbit", - "orchard", - "order", - "ordinary", - "organ", - "orient", - "original", - "orphan", - "ostrich", - "other", - "outdoor", - "outer", - "output", - "outside", - "oval", - "oven", - "over", - "own", - "owner", - "oxygen", - "oyster", - "ozone", - "pact", - "paddle", - "page", - "pair", - "palace", - "palm", - "panda", - "panel", - "panic", - "panther", - "paper", - "parade", - "parent", - "park", - "parrot", - "party", - "pass", - "patch", - "path", - "patient", - "patrol", - "pattern", - "pause", - "pave", - "payment", - "peace", - "peanut", - "pear", - "peasant", - "pelican", - "pen", - "penalty", - "pencil", - "people", - "pepper", - "perfect", - "permit", - "person", - "pet", - "phone", - "photo", - "phrase", - "physical", - "piano", - "picnic", - "picture", - "piece", - "pig", - "pigeon", - "pill", - "pilot", - "pink", - "pioneer", - "pipe", - "pistol", - "pitch", - "pizza", - "place", - "planet", - "plastic", - "plate", - "play", - "please", - "pledge", - "pluck", - "plug", - "plunge", - "poem", - "poet", - "point", - "polar", - "pole", - "police", - "pond", - "pony", - "pool", - "popular", - "portion", - "position", - "possible", - "post", - "potato", - "pottery", - "poverty", - "powder", - "power", - "practice", - "praise", - "predict", - "prefer", - "prepare", - "present", - "pretty", - "prevent", - "price", - "pride", - "primary", - "print", - "priority", - "prison", - "private", - "prize", - "problem", - "process", - "produce", - "profit", - "program", - "project", - "promote", - "proof", - "property", - "prosper", - "protect", - "proud", - "provide", - "public", - "pudding", - "pull", - "pulp", - "pulse", - "pumpkin", - "punch", - "pupil", - "puppy", - "purchase", - "purity", - "purpose", - "purse", - "push", - "put", - "puzzle", - "pyramid", - "quality", - "quantum", - "quarter", - "question", - "quick", - "quit", - "quiz", - "quote", - "rabbit", - "raccoon", - "race", - "rack", - "radar", - "radio", - "rail", - "rain", - "raise", - "rally", - "ramp", - "ranch", - "random", - "range", - "rapid", - "rare", - "rate", - "rather", - "raven", - "raw", - "razor", - "ready", - "real", - "reason", - "rebel", - "rebuild", - "recall", - "receive", - "recipe", - "record", - "recycle", - "reduce", - "reflect", - "reform", - "refuse", - "region", - "regret", - "regular", - "reject", - "relax", - "release", - "relief", - "rely", - "remain", - "remember", - "remind", - "remove", - "render", - "renew", - "rent", - "reopen", - "repair", - "repeat", - "replace", - "report", - "require", - "rescue", - "resemble", - "resist", - "resource", - "response", - "result", - "retire", - "retreat", - "return", - "reunion", - "reveal", - "review", - "reward", - "rhythm", - "rib", - "ribbon", - "rice", - "rich", - "ride", - "ridge", - "rifle", - "right", - "rigid", - "ring", - "riot", - "ripple", - "risk", - "ritual", - "rival", - "river", - "road", - "roast", - "robot", - "robust", - "rocket", - "romance", - "roof", - "rookie", - "room", - "rose", - "rotate", - "rough", - "round", - "route", - "royal", - "rubber", - "rude", - "rug", - "rule", - "run", - "runway", - "rural", - "sad", - "saddle", - "sadness", - "safe", - "sail", - "salad", - "salmon", - "salon", - "salt", - "salute", - "same", - "sample", - "sand", - "satisfy", - "satoshi", - "sauce", - "sausage", - "save", - "say", - "scale", - "scan", - "scare", - "scatter", - "scene", - "scheme", - "school", - "science", - "scissors", - "scorpion", - "scout", - "scrap", - "screen", - "script", - "scrub", - "sea", - "search", - "season", - "seat", - "second", - "secret", - "section", - "security", - "seed", - "seek", - "segment", - "select", - "sell", - "seminar", - "senior", - "sense", - "sentence", - "series", - "service", - "session", - "settle", - "setup", - "seven", - "shadow", - "shaft", - "shallow", - "share", - "shed", - "shell", - "sheriff", - "shield", - "shift", - "shine", - "ship", - "shiver", - "shock", - "shoe", - "shoot", - "shop", - "short", - "shoulder", - "shove", - "shrimp", - "shrug", - "shuffle", - "shy", - "sibling", - "sick", - "side", - "siege", - "sight", - "sign", - "silent", - "silk", - "silly", - "silver", - "similar", - "simple", - "since", - "sing", - "siren", - "sister", - "situate", - "six", - "size", - "skate", - "sketch", - "ski", - "skill", - "skin", - "skirt", - "skull", - "slab", - "slam", - "sleep", - "slender", - "slice", - "slide", - "slight", - "slim", - "slogan", - "slot", - "slow", - "slush", - "small", - "smart", - "smile", - "smoke", - "smooth", - "snack", - "snake", - "snap", - "sniff", - "snow", - "soap", - "soccer", - "social", - "sock", - "soda", - "soft", - "solar", - "soldier", - "solid", - "solution", - "solve", - "someone", - "song", - "soon", - "sorry", - "sort", - "soul", - "sound", - "soup", - "source", - "south", - "space", - "spare", - "spatial", - "spawn", - "speak", - "special", - "speed", - "spell", - "spend", - "sphere", - "spice", - "spider", - "spike", - "spin", - "spirit", - "split", - "spoil", - "sponsor", - "spoon", - "sport", - "spot", - "spray", - "spread", - "spring", - "spy", - "square", - "squeeze", - "squirrel", - "stable", - "stadium", - "staff", - "stage", - "stairs", - "stamp", - "stand", - "start", - "state", - "stay", - "steak", - "steel", - "stem", - "step", - "stereo", - "stick", - "still", - "sting", - "stock", - "stomach", - "stone", - "stool", - "story", - "stove", - "strategy", - "street", - "strike", - "strong", - "struggle", - "student", - "stuff", - "stumble", - "style", - "subject", - "submit", - "subway", - "success", - "such", - "sudden", - "suffer", - "sugar", - "suggest", - "suit", - "summer", - "sun", - "sunny", - "sunset", - "super", - "supply", - "supreme", - "sure", - "surface", - "surge", - "surprise", - "surround", - "survey", - "suspect", - "sustain", - "swallow", - "swamp", - "swap", - "swarm", - "swear", - "sweet", - "swift", - "swim", - "swing", - "switch", - "sword", - "symbol", - "symptom", - "syrup", - "system", - "table", - "tackle", - "tag", - "tail", - "talent", - "talk", - "tank", - "tape", - "target", - "task", - "taste", - "tattoo", - "taxi", - "teach", - "team", - "tell", - "ten", - "tenant", - "tennis", - "tent", - "term", - "test", - "text", - "thank", - "that", - "theme", - "then", - "theory", - "there", - "they", - "thing", - "this", - "thought", - "three", - "thrive", - "throw", - "thumb", - "thunder", - "ticket", - "tide", - "tiger", - "tilt", - "timber", - "time", - "tiny", - "tip", - "tired", - "tissue", - "title", - "toast", - "tobacco", - "today", - "toddler", - "toe", - "together", - "toilet", - "token", - "tomato", - "tomorrow", - "tone", - "tongue", - "tonight", - "tool", - "tooth", - "top", - "topic", - "topple", - "torch", - "tornado", - "tortoise", - "toss", - "total", - "tourist", - "toward", - "tower", - "town", - "toy", - "track", - "trade", - "traffic", - "tragic", - "train", - "transfer", - "trap", - "trash", - "travel", - "tray", - "treat", - "tree", - "trend", - "trial", - "tribe", - "trick", - "trigger", - "trim", - "trip", - "trophy", - "trouble", - "truck", - "true", - "truly", - "trumpet", - "trust", - "truth", - "try", - "tube", - "tuition", - "tumble", - "tuna", - "tunnel", - "turkey", - "turn", - "turtle", - "twelve", - "twenty", - "twice", - "twin", - "twist", - "two", - "type", - "typical", - "ugly", - "umbrella", - "unable", - "unaware", - "uncle", - "uncover", - "under", - "undo", - "unfair", - "unfold", - "unhappy", - "uniform", - "unique", - "unit", - "universe", - "unknown", - "unlock", - "until", - "unusual", - "unveil", - "update", - "upgrade", - "uphold", - "upon", - "upper", - "upset", - "urban", - "urge", - "usage", - "use", - "used", - "useful", - "useless", - "usual", - "utility", - "vacant", - "vacuum", - "vague", - "valid", - "valley", - "valve", - "van", - "vanish", - "vapor", - "various", - "vast", - "vault", - "vehicle", - "velvet", - "vendor", - "venture", - "venue", - "verb", - "verify", - "version", - "very", - "vessel", - "veteran", - "viable", - "vibrant", - "vicious", - "victory", - "video", - "view", - "village", - "vintage", - "violin", - "virtual", - "virus", - "visa", - "visit", - "visual", - "vital", - "vivid", - "vocal", - "voice", - "void", - "volcano", - "volume", - "vote", - "voyage", - "wage", - "wagon", - "wait", - "walk", - "wall", - "walnut", - "want", - "warfare", - "warm", - "warrior", - "wash", - "wasp", - "waste", - "water", - "wave", - "way", - "wealth", - "weapon", - "wear", - "weasel", - "weather", - "web", - "wedding", - "weekend", - "weird", - "welcome", - "west", - "wet", - "whale", - "what", - "wheat", - "wheel", - "when", - "where", - "whip", - "whisper", - "wide", - "width", - "wife", - "wild", - "will", - "win", - "window", - "wine", - "wing", - "wink", - "winner", - "winter", - "wire", - "wisdom", - "wise", - "wish", - "witness", - "wolf", - "woman", - "wonder", - "wood", - "wool", - "word", - "work", - "world", - "worry", - "worth", - "wrap", - "wreck", - "wrestle", - "wrist", - "write", - "wrong", - "yard", - "year", - "yellow", - "you", - "young", - "youth", - "zebra", - "zero", - "zone", - "zoo" -]; +export { wordlist } from "@scure/bip39/wordlists/english"; diff --git a/src/bip39/wordlists/french.ts b/src/bip39/wordlists/french.ts index 5ac0f18..c95f532 100644 --- a/src/bip39/wordlists/french.ts +++ b/src/bip39/wordlists/french.ts @@ -1,2050 +1 @@ -export const wordlist: string[] = [ - "abaisser", - "abandon", - "abdiquer", - "abeille", - "abolir", - "aborder", - "aboutir", - "aboyer", - "abrasif", - "abreuver", - "abriter", - "abroger", - "abrupt", - "absence", - "absolu", - "absurde", - "abusif", - "abyssal", - "académie", - "acajou", - "acarien", - "accabler", - "accepter", - "acclamer", - "accolade", - "accroche", - "accuser", - "acerbe", - "achat", - "acheter", - "aciduler", - "acier", - "acompte", - "acquérir", - "acronyme", - "acteur", - "actif", - "actuel", - "adepte", - "adéquat", - "adhésif", - "adjectif", - "adjuger", - "admettre", - "admirer", - "adopter", - "adorer", - "adoucir", - "adresse", - "adroit", - "adulte", - "adverbe", - "aérer", - "aéronef", - "affaire", - "affecter", - "affiche", - "affreux", - "affubler", - "agacer", - "agencer", - "agile", - "agiter", - "agrafer", - "agréable", - "agrume", - "aider", - "aiguille", - "ailier", - "aimable", - "aisance", - "ajouter", - "ajuster", - "alarmer", - "alchimie", - "alerte", - "algèbre", - "algue", - "aliéner", - "aliment", - "alléger", - "alliage", - "allouer", - "allumer", - "alourdir", - "alpaga", - "altesse", - "alvéole", - "amateur", - "ambigu", - "ambre", - "aménager", - "amertume", - "amidon", - "amiral", - "amorcer", - "amour", - "amovible", - "amphibie", - "ampleur", - "amusant", - "analyse", - "anaphore", - "anarchie", - "anatomie", - "ancien", - "anéantir", - "angle", - "angoisse", - "anguleux", - "animal", - "annexer", - "annonce", - "annuel", - "anodin", - "anomalie", - "anonyme", - "anormal", - "antenne", - "antidote", - "anxieux", - "apaiser", - "apéritif", - "aplanir", - "apologie", - "appareil", - "appeler", - "apporter", - "appuyer", - "aquarium", - "aqueduc", - "arbitre", - "arbuste", - "ardeur", - "ardoise", - "argent", - "arlequin", - "armature", - "armement", - "armoire", - "armure", - "arpenter", - "arracher", - "arriver", - "arroser", - "arsenic", - "artériel", - "article", - "aspect", - "asphalte", - "aspirer", - "assaut", - "asservir", - "assiette", - "associer", - "assurer", - "asticot", - "astre", - "astuce", - "atelier", - "atome", - "atrium", - "atroce", - "attaque", - "attentif", - "attirer", - "attraper", - "aubaine", - "auberge", - "audace", - "audible", - "augurer", - "aurore", - "automne", - "autruche", - "avaler", - "avancer", - "avarice", - "avenir", - "averse", - "aveugle", - "aviateur", - "avide", - "avion", - "aviser", - "avoine", - "avouer", - "avril", - "axial", - "axiome", - "badge", - "bafouer", - "bagage", - "baguette", - "baignade", - "balancer", - "balcon", - "baleine", - "balisage", - "bambin", - "bancaire", - "bandage", - "banlieue", - "bannière", - "banquier", - "barbier", - "baril", - "baron", - "barque", - "barrage", - "bassin", - "bastion", - "bataille", - "bateau", - "batterie", - "baudrier", - "bavarder", - "belette", - "bélier", - "belote", - "bénéfice", - "berceau", - "berger", - "berline", - "bermuda", - "besace", - "besogne", - "bétail", - "beurre", - "biberon", - "bicycle", - "bidule", - "bijou", - "bilan", - "bilingue", - "billard", - "binaire", - "biologie", - "biopsie", - "biotype", - "biscuit", - "bison", - "bistouri", - "bitume", - "bizarre", - "blafard", - "blague", - "blanchir", - "blessant", - "blinder", - "blond", - "bloquer", - "blouson", - "bobard", - "bobine", - "boire", - "boiser", - "bolide", - "bonbon", - "bondir", - "bonheur", - "bonifier", - "bonus", - "bordure", - "borne", - "botte", - "boucle", - "boueux", - "bougie", - "boulon", - "bouquin", - "bourse", - "boussole", - "boutique", - "boxeur", - "branche", - "brasier", - "brave", - "brebis", - "brèche", - "breuvage", - "bricoler", - "brigade", - "brillant", - "brioche", - "brique", - "brochure", - "broder", - "bronzer", - "brousse", - "broyeur", - "brume", - "brusque", - "brutal", - "bruyant", - "buffle", - "buisson", - "bulletin", - "bureau", - "burin", - "bustier", - "butiner", - "butoir", - "buvable", - "buvette", - "cabanon", - "cabine", - "cachette", - "cadeau", - "cadre", - "caféine", - "caillou", - "caisson", - "calculer", - "calepin", - "calibre", - "calmer", - "calomnie", - "calvaire", - "camarade", - "caméra", - "camion", - "campagne", - "canal", - "caneton", - "canon", - "cantine", - "canular", - "capable", - "caporal", - "caprice", - "capsule", - "capter", - "capuche", - "carabine", - "carbone", - "caresser", - "caribou", - "carnage", - "carotte", - "carreau", - "carton", - "cascade", - "casier", - "casque", - "cassure", - "causer", - "caution", - "cavalier", - "caverne", - "caviar", - "cédille", - "ceinture", - "céleste", - "cellule", - "cendrier", - "censurer", - "central", - "cercle", - "cérébral", - "cerise", - "cerner", - "cerveau", - "cesser", - "chagrin", - "chaise", - "chaleur", - "chambre", - "chance", - "chapitre", - "charbon", - "chasseur", - "chaton", - "chausson", - "chavirer", - "chemise", - "chenille", - "chéquier", - "chercher", - "cheval", - "chien", - "chiffre", - "chignon", - "chimère", - "chiot", - "chlorure", - "chocolat", - "choisir", - "chose", - "chouette", - "chrome", - "chute", - "cigare", - "cigogne", - "cimenter", - "cinéma", - "cintrer", - "circuler", - "cirer", - "cirque", - "citerne", - "citoyen", - "citron", - "civil", - "clairon", - "clameur", - "claquer", - "classe", - "clavier", - "client", - "cligner", - "climat", - "clivage", - "cloche", - "clonage", - "cloporte", - "cobalt", - "cobra", - "cocasse", - "cocotier", - "coder", - "codifier", - "coffre", - "cogner", - "cohésion", - "coiffer", - "coincer", - "colère", - "colibri", - "colline", - "colmater", - "colonel", - "combat", - "comédie", - "commande", - "compact", - "concert", - "conduire", - "confier", - "congeler", - "connoter", - "consonne", - "contact", - "convexe", - "copain", - "copie", - "corail", - "corbeau", - "cordage", - "corniche", - "corpus", - "correct", - "cortège", - "cosmique", - "costume", - "coton", - "coude", - "coupure", - "courage", - "couteau", - "couvrir", - "coyote", - "crabe", - "crainte", - "cravate", - "crayon", - "créature", - "créditer", - "crémeux", - "creuser", - "crevette", - "cribler", - "crier", - "cristal", - "critère", - "croire", - "croquer", - "crotale", - "crucial", - "cruel", - "crypter", - "cubique", - "cueillir", - "cuillère", - "cuisine", - "cuivre", - "culminer", - "cultiver", - "cumuler", - "cupide", - "curatif", - "curseur", - "cyanure", - "cycle", - "cylindre", - "cynique", - "daigner", - "damier", - "danger", - "danseur", - "dauphin", - "débattre", - "débiter", - "déborder", - "débrider", - "débutant", - "décaler", - "décembre", - "déchirer", - "décider", - "déclarer", - "décorer", - "décrire", - "décupler", - "dédale", - "déductif", - "déesse", - "défensif", - "défiler", - "défrayer", - "dégager", - "dégivrer", - "déglutir", - "dégrafer", - "déjeuner", - "délice", - "déloger", - "demander", - "demeurer", - "démolir", - "dénicher", - "dénouer", - "dentelle", - "dénuder", - "départ", - "dépenser", - "déphaser", - "déplacer", - "déposer", - "déranger", - "dérober", - "désastre", - "descente", - "désert", - "désigner", - "désobéir", - "dessiner", - "destrier", - "détacher", - "détester", - "détourer", - "détresse", - "devancer", - "devenir", - "deviner", - "devoir", - "diable", - "dialogue", - "diamant", - "dicter", - "différer", - "digérer", - "digital", - "digne", - "diluer", - "dimanche", - "diminuer", - "dioxyde", - "directif", - "diriger", - "discuter", - "disposer", - "dissiper", - "distance", - "divertir", - "diviser", - "docile", - "docteur", - "dogme", - "doigt", - "domaine", - "domicile", - "dompter", - "donateur", - "donjon", - "donner", - "dopamine", - "dortoir", - "dorure", - "dosage", - "doseur", - "dossier", - "dotation", - "douanier", - "double", - "douceur", - "douter", - "doyen", - "dragon", - "draper", - "dresser", - "dribbler", - "droiture", - "duperie", - "duplexe", - "durable", - "durcir", - "dynastie", - "éblouir", - "écarter", - "écharpe", - "échelle", - "éclairer", - "éclipse", - "éclore", - "écluse", - "école", - "économie", - "écorce", - "écouter", - "écraser", - "écrémer", - "écrivain", - "écrou", - "écume", - "écureuil", - "édifier", - "éduquer", - "effacer", - "effectif", - "effigie", - "effort", - "effrayer", - "effusion", - "égaliser", - "égarer", - "éjecter", - "élaborer", - "élargir", - "électron", - "élégant", - "éléphant", - "élève", - "éligible", - "élitisme", - "éloge", - "élucider", - "éluder", - "emballer", - "embellir", - "embryon", - "émeraude", - "émission", - "emmener", - "émotion", - "émouvoir", - "empereur", - "employer", - "emporter", - "emprise", - "émulsion", - "encadrer", - "enchère", - "enclave", - "encoche", - "endiguer", - "endosser", - "endroit", - "enduire", - "énergie", - "enfance", - "enfermer", - "enfouir", - "engager", - "engin", - "englober", - "énigme", - "enjamber", - "enjeu", - "enlever", - "ennemi", - "ennuyeux", - "enrichir", - "enrobage", - "enseigne", - "entasser", - "entendre", - "entier", - "entourer", - "entraver", - "énumérer", - "envahir", - "enviable", - "envoyer", - "enzyme", - "éolien", - "épaissir", - "épargne", - "épatant", - "épaule", - "épicerie", - "épidémie", - "épier", - "épilogue", - "épine", - "épisode", - "épitaphe", - "époque", - "épreuve", - "éprouver", - "épuisant", - "équerre", - "équipe", - "ériger", - "érosion", - "erreur", - "éruption", - "escalier", - "espadon", - "espèce", - "espiègle", - "espoir", - "esprit", - "esquiver", - "essayer", - "essence", - "essieu", - "essorer", - "estime", - "estomac", - "estrade", - "étagère", - "étaler", - "étanche", - "étatique", - "éteindre", - "étendoir", - "éternel", - "éthanol", - "éthique", - "ethnie", - "étirer", - "étoffer", - "étoile", - "étonnant", - "étourdir", - "étrange", - "étroit", - "étude", - "euphorie", - "évaluer", - "évasion", - "éventail", - "évidence", - "éviter", - "évolutif", - "évoquer", - "exact", - "exagérer", - "exaucer", - "exceller", - "excitant", - "exclusif", - "excuse", - "exécuter", - "exemple", - "exercer", - "exhaler", - "exhorter", - "exigence", - "exiler", - "exister", - "exotique", - "expédier", - "explorer", - "exposer", - "exprimer", - "exquis", - "extensif", - "extraire", - "exulter", - "fable", - "fabuleux", - "facette", - "facile", - "facture", - "faiblir", - "falaise", - "fameux", - "famille", - "farceur", - "farfelu", - "farine", - "farouche", - "fasciner", - "fatal", - "fatigue", - "faucon", - "fautif", - "faveur", - "favori", - "fébrile", - "féconder", - "fédérer", - "félin", - "femme", - "fémur", - "fendoir", - "féodal", - "fermer", - "féroce", - "ferveur", - "festival", - "feuille", - "feutre", - "février", - "fiasco", - "ficeler", - "fictif", - "fidèle", - "figure", - "filature", - "filetage", - "filière", - "filleul", - "filmer", - "filou", - "filtrer", - "financer", - "finir", - "fiole", - "firme", - "fissure", - "fixer", - "flairer", - "flamme", - "flasque", - "flatteur", - "fléau", - "flèche", - "fleur", - "flexion", - "flocon", - "flore", - "fluctuer", - "fluide", - "fluvial", - "folie", - "fonderie", - "fongible", - "fontaine", - "forcer", - "forgeron", - "formuler", - "fortune", - "fossile", - "foudre", - "fougère", - "fouiller", - "foulure", - "fourmi", - "fragile", - "fraise", - "franchir", - "frapper", - "frayeur", - "frégate", - "freiner", - "frelon", - "frémir", - "frénésie", - "frère", - "friable", - "friction", - "frisson", - "frivole", - "froid", - "fromage", - "frontal", - "frotter", - "fruit", - "fugitif", - "fuite", - "fureur", - "furieux", - "furtif", - "fusion", - "futur", - "gagner", - "galaxie", - "galerie", - "gambader", - "garantir", - "gardien", - "garnir", - "garrigue", - "gazelle", - "gazon", - "géant", - "gélatine", - "gélule", - "gendarme", - "général", - "génie", - "genou", - "gentil", - "géologie", - "géomètre", - "géranium", - "germe", - "gestuel", - "geyser", - "gibier", - "gicler", - "girafe", - "givre", - "glace", - "glaive", - "glisser", - "globe", - "gloire", - "glorieux", - "golfeur", - "gomme", - "gonfler", - "gorge", - "gorille", - "goudron", - "gouffre", - "goulot", - "goupille", - "gourmand", - "goutte", - "graduel", - "graffiti", - "graine", - "grand", - "grappin", - "gratuit", - "gravir", - "grenat", - "griffure", - "griller", - "grimper", - "grogner", - "gronder", - "grotte", - "groupe", - "gruger", - "grutier", - "gruyère", - "guépard", - "guerrier", - "guide", - "guimauve", - "guitare", - "gustatif", - "gymnaste", - "gyrostat", - "habitude", - "hachoir", - "halte", - "hameau", - "hangar", - "hanneton", - "haricot", - "harmonie", - "harpon", - "hasard", - "hélium", - "hématome", - "herbe", - "hérisson", - "hermine", - "héron", - "hésiter", - "heureux", - "hiberner", - "hibou", - "hilarant", - "histoire", - "hiver", - "homard", - "hommage", - "homogène", - "honneur", - "honorer", - "honteux", - "horde", - "horizon", - "horloge", - "hormone", - "horrible", - "houleux", - "housse", - "hublot", - "huileux", - "humain", - "humble", - "humide", - "humour", - "hurler", - "hydromel", - "hygiène", - "hymne", - "hypnose", - "idylle", - "ignorer", - "iguane", - "illicite", - "illusion", - "image", - "imbiber", - "imiter", - "immense", - "immobile", - "immuable", - "impact", - "impérial", - "implorer", - "imposer", - "imprimer", - "imputer", - "incarner", - "incendie", - "incident", - "incliner", - "incolore", - "indexer", - "indice", - "inductif", - "inédit", - "ineptie", - "inexact", - "infini", - "infliger", - "informer", - "infusion", - "ingérer", - "inhaler", - "inhiber", - "injecter", - "injure", - "innocent", - "inoculer", - "inonder", - "inscrire", - "insecte", - "insigne", - "insolite", - "inspirer", - "instinct", - "insulter", - "intact", - "intense", - "intime", - "intrigue", - "intuitif", - "inutile", - "invasion", - "inventer", - "inviter", - "invoquer", - "ironique", - "irradier", - "irréel", - "irriter", - "isoler", - "ivoire", - "ivresse", - "jaguar", - "jaillir", - "jambe", - "janvier", - "jardin", - "jauger", - "jaune", - "javelot", - "jetable", - "jeton", - "jeudi", - "jeunesse", - "joindre", - "joncher", - "jongler", - "joueur", - "jouissif", - "journal", - "jovial", - "joyau", - "joyeux", - "jubiler", - "jugement", - "junior", - "jupon", - "juriste", - "justice", - "juteux", - "juvénile", - "kayak", - "kimono", - "kiosque", - "label", - "labial", - "labourer", - "lacérer", - "lactose", - "lagune", - "laine", - "laisser", - "laitier", - "lambeau", - "lamelle", - "lampe", - "lanceur", - "langage", - "lanterne", - "lapin", - "largeur", - "larme", - "laurier", - "lavabo", - "lavoir", - "lecture", - "légal", - "léger", - "légume", - "lessive", - "lettre", - "levier", - "lexique", - "lézard", - "liasse", - "libérer", - "libre", - "licence", - "licorne", - "liège", - "lièvre", - "ligature", - "ligoter", - "ligue", - "limer", - "limite", - "limonade", - "limpide", - "linéaire", - "lingot", - "lionceau", - "liquide", - "lisière", - "lister", - "lithium", - "litige", - "littoral", - "livreur", - "logique", - "lointain", - "loisir", - "lombric", - "loterie", - "louer", - "lourd", - "loutre", - "louve", - "loyal", - "lubie", - "lucide", - "lucratif", - "lueur", - "lugubre", - "luisant", - "lumière", - "lunaire", - "lundi", - "luron", - "lutter", - "luxueux", - "machine", - "magasin", - "magenta", - "magique", - "maigre", - "maillon", - "maintien", - "mairie", - "maison", - "majorer", - "malaxer", - "maléfice", - "malheur", - "malice", - "mallette", - "mammouth", - "mandater", - "maniable", - "manquant", - "manteau", - "manuel", - "marathon", - "marbre", - "marchand", - "mardi", - "maritime", - "marqueur", - "marron", - "marteler", - "mascotte", - "massif", - "matériel", - "matière", - "matraque", - "maudire", - "maussade", - "mauve", - "maximal", - "méchant", - "méconnu", - "médaille", - "médecin", - "méditer", - "méduse", - "meilleur", - "mélange", - "mélodie", - "membre", - "mémoire", - "menacer", - "mener", - "menhir", - "mensonge", - "mentor", - "mercredi", - "mérite", - "merle", - "messager", - "mesure", - "métal", - "météore", - "méthode", - "métier", - "meuble", - "miauler", - "microbe", - "miette", - "mignon", - "migrer", - "milieu", - "million", - "mimique", - "mince", - "minéral", - "minimal", - "minorer", - "minute", - "miracle", - "miroiter", - "missile", - "mixte", - "mobile", - "moderne", - "moelleux", - "mondial", - "moniteur", - "monnaie", - "monotone", - "monstre", - "montagne", - "monument", - "moqueur", - "morceau", - "morsure", - "mortier", - "moteur", - "motif", - "mouche", - "moufle", - "moulin", - "mousson", - "mouton", - "mouvant", - "multiple", - "munition", - "muraille", - "murène", - "murmure", - "muscle", - "muséum", - "musicien", - "mutation", - "muter", - "mutuel", - "myriade", - "myrtille", - "mystère", - "mythique", - "nageur", - "nappe", - "narquois", - "narrer", - "natation", - "nation", - "nature", - "naufrage", - "nautique", - "navire", - "nébuleux", - "nectar", - "néfaste", - "négation", - "négliger", - "négocier", - "neige", - "nerveux", - "nettoyer", - "neurone", - "neutron", - "neveu", - "niche", - "nickel", - "nitrate", - "niveau", - "noble", - "nocif", - "nocturne", - "noirceur", - "noisette", - "nomade", - "nombreux", - "nommer", - "normatif", - "notable", - "notifier", - "notoire", - "nourrir", - "nouveau", - "novateur", - "novembre", - "novice", - "nuage", - "nuancer", - "nuire", - "nuisible", - "numéro", - "nuptial", - "nuque", - "nutritif", - "obéir", - "objectif", - "obliger", - "obscur", - "observer", - "obstacle", - "obtenir", - "obturer", - "occasion", - "occuper", - "océan", - "octobre", - "octroyer", - "octupler", - "oculaire", - "odeur", - "odorant", - "offenser", - "officier", - "offrir", - "ogive", - "oiseau", - "oisillon", - "olfactif", - "olivier", - "ombrage", - "omettre", - "onctueux", - "onduler", - "onéreux", - "onirique", - "opale", - "opaque", - "opérer", - "opinion", - "opportun", - "opprimer", - "opter", - "optique", - "orageux", - "orange", - "orbite", - "ordonner", - "oreille", - "organe", - "orgueil", - "orifice", - "ornement", - "orque", - "ortie", - "osciller", - "osmose", - "ossature", - "otarie", - "ouragan", - "ourson", - "outil", - "outrager", - "ouvrage", - "ovation", - "oxyde", - "oxygène", - "ozone", - "paisible", - "palace", - "palmarès", - "palourde", - "palper", - "panache", - "panda", - "pangolin", - "paniquer", - "panneau", - "panorama", - "pantalon", - "papaye", - "papier", - "papoter", - "papyrus", - "paradoxe", - "parcelle", - "paresse", - "parfumer", - "parler", - "parole", - "parrain", - "parsemer", - "partager", - "parure", - "parvenir", - "passion", - "pastèque", - "paternel", - "patience", - "patron", - "pavillon", - "pavoiser", - "payer", - "paysage", - "peigne", - "peintre", - "pelage", - "pélican", - "pelle", - "pelouse", - "peluche", - "pendule", - "pénétrer", - "pénible", - "pensif", - "pénurie", - "pépite", - "péplum", - "perdrix", - "perforer", - "période", - "permuter", - "perplexe", - "persil", - "perte", - "peser", - "pétale", - "petit", - "pétrir", - "peuple", - "pharaon", - "phobie", - "phoque", - "photon", - "phrase", - "physique", - "piano", - "pictural", - "pièce", - "pierre", - "pieuvre", - "pilote", - "pinceau", - "pipette", - "piquer", - "pirogue", - "piscine", - "piston", - "pivoter", - "pixel", - "pizza", - "placard", - "plafond", - "plaisir", - "planer", - "plaque", - "plastron", - "plateau", - "pleurer", - "plexus", - "pliage", - "plomb", - "plonger", - "pluie", - "plumage", - "pochette", - "poésie", - "poète", - "pointe", - "poirier", - "poisson", - "poivre", - "polaire", - "policier", - "pollen", - "polygone", - "pommade", - "pompier", - "ponctuel", - "pondérer", - "poney", - "portique", - "position", - "posséder", - "posture", - "potager", - "poteau", - "potion", - "pouce", - "poulain", - "poumon", - "pourpre", - "poussin", - "pouvoir", - "prairie", - "pratique", - "précieux", - "prédire", - "préfixe", - "prélude", - "prénom", - "présence", - "prétexte", - "prévoir", - "primitif", - "prince", - "prison", - "priver", - "problème", - "procéder", - "prodige", - "profond", - "progrès", - "proie", - "projeter", - "prologue", - "promener", - "propre", - "prospère", - "protéger", - "prouesse", - "proverbe", - "prudence", - "pruneau", - "psychose", - "public", - "puceron", - "puiser", - "pulpe", - "pulsar", - "punaise", - "punitif", - "pupitre", - "purifier", - "puzzle", - "pyramide", - "quasar", - "querelle", - "question", - "quiétude", - "quitter", - "quotient", - "racine", - "raconter", - "radieux", - "ragondin", - "raideur", - "raisin", - "ralentir", - "rallonge", - "ramasser", - "rapide", - "rasage", - "ratisser", - "ravager", - "ravin", - "rayonner", - "réactif", - "réagir", - "réaliser", - "réanimer", - "recevoir", - "réciter", - "réclamer", - "récolter", - "recruter", - "reculer", - "recycler", - "rédiger", - "redouter", - "refaire", - "réflexe", - "réformer", - "refrain", - "refuge", - "régalien", - "région", - "réglage", - "régulier", - "réitérer", - "rejeter", - "rejouer", - "relatif", - "relever", - "relief", - "remarque", - "remède", - "remise", - "remonter", - "remplir", - "remuer", - "renard", - "renfort", - "renifler", - "renoncer", - "rentrer", - "renvoi", - "replier", - "reporter", - "reprise", - "reptile", - "requin", - "réserve", - "résineux", - "résoudre", - "respect", - "rester", - "résultat", - "rétablir", - "retenir", - "réticule", - "retomber", - "retracer", - "réunion", - "réussir", - "revanche", - "revivre", - "révolte", - "révulsif", - "richesse", - "rideau", - "rieur", - "rigide", - "rigoler", - "rincer", - "riposter", - "risible", - "risque", - "rituel", - "rival", - "rivière", - "rocheux", - "romance", - "rompre", - "ronce", - "rondin", - "roseau", - "rosier", - "rotatif", - "rotor", - "rotule", - "rouge", - "rouille", - "rouleau", - "routine", - "royaume", - "ruban", - "rubis", - "ruche", - "ruelle", - "rugueux", - "ruiner", - "ruisseau", - "ruser", - "rustique", - "rythme", - "sabler", - "saboter", - "sabre", - "sacoche", - "safari", - "sagesse", - "saisir", - "salade", - "salive", - "salon", - "saluer", - "samedi", - "sanction", - "sanglier", - "sarcasme", - "sardine", - "saturer", - "saugrenu", - "saumon", - "sauter", - "sauvage", - "savant", - "savonner", - "scalpel", - "scandale", - "scélérat", - "scénario", - "sceptre", - "schéma", - "science", - "scinder", - "score", - "scrutin", - "sculpter", - "séance", - "sécable", - "sécher", - "secouer", - "sécréter", - "sédatif", - "séduire", - "seigneur", - "séjour", - "sélectif", - "semaine", - "sembler", - "semence", - "séminal", - "sénateur", - "sensible", - "sentence", - "séparer", - "séquence", - "serein", - "sergent", - "sérieux", - "serrure", - "sérum", - "service", - "sésame", - "sévir", - "sevrage", - "sextuple", - "sidéral", - "siècle", - "siéger", - "siffler", - "sigle", - "signal", - "silence", - "silicium", - "simple", - "sincère", - "sinistre", - "siphon", - "sirop", - "sismique", - "situer", - "skier", - "social", - "socle", - "sodium", - "soigneux", - "soldat", - "soleil", - "solitude", - "soluble", - "sombre", - "sommeil", - "somnoler", - "sonde", - "songeur", - "sonnette", - "sonore", - "sorcier", - "sortir", - "sosie", - "sottise", - "soucieux", - "soudure", - "souffle", - "soulever", - "soupape", - "source", - "soutirer", - "souvenir", - "spacieux", - "spatial", - "spécial", - "sphère", - "spiral", - "stable", - "station", - "sternum", - "stimulus", - "stipuler", - "strict", - "studieux", - "stupeur", - "styliste", - "sublime", - "substrat", - "subtil", - "subvenir", - "succès", - "sucre", - "suffixe", - "suggérer", - "suiveur", - "sulfate", - "superbe", - "supplier", - "surface", - "suricate", - "surmener", - "surprise", - "sursaut", - "survie", - "suspect", - "syllabe", - "symbole", - "symétrie", - "synapse", - "syntaxe", - "système", - "tabac", - "tablier", - "tactile", - "tailler", - "talent", - "talisman", - "talonner", - "tambour", - "tamiser", - "tangible", - "tapis", - "taquiner", - "tarder", - "tarif", - "tartine", - "tasse", - "tatami", - "tatouage", - "taupe", - "taureau", - "taxer", - "témoin", - "temporel", - "tenaille", - "tendre", - "teneur", - "tenir", - "tension", - "terminer", - "terne", - "terrible", - "tétine", - "texte", - "thème", - "théorie", - "thérapie", - "thorax", - "tibia", - "tiède", - "timide", - "tirelire", - "tiroir", - "tissu", - "titane", - "titre", - "tituber", - "toboggan", - "tolérant", - "tomate", - "tonique", - "tonneau", - "toponyme", - "torche", - "tordre", - "tornade", - "torpille", - "torrent", - "torse", - "tortue", - "totem", - "toucher", - "tournage", - "tousser", - "toxine", - "traction", - "trafic", - "tragique", - "trahir", - "train", - "trancher", - "travail", - "trèfle", - "tremper", - "trésor", - "treuil", - "triage", - "tribunal", - "tricoter", - "trilogie", - "triomphe", - "tripler", - "triturer", - "trivial", - "trombone", - "tronc", - "tropical", - "troupeau", - "tuile", - "tulipe", - "tumulte", - "tunnel", - "turbine", - "tuteur", - "tutoyer", - "tuyau", - "tympan", - "typhon", - "typique", - "tyran", - "ubuesque", - "ultime", - "ultrason", - "unanime", - "unifier", - "union", - "unique", - "unitaire", - "univers", - "uranium", - "urbain", - "urticant", - "usage", - "usine", - "usuel", - "usure", - "utile", - "utopie", - "vacarme", - "vaccin", - "vagabond", - "vague", - "vaillant", - "vaincre", - "vaisseau", - "valable", - "valise", - "vallon", - "valve", - "vampire", - "vanille", - "vapeur", - "varier", - "vaseux", - "vassal", - "vaste", - "vecteur", - "vedette", - "végétal", - "véhicule", - "veinard", - "véloce", - "vendredi", - "vénérer", - "venger", - "venimeux", - "ventouse", - "verdure", - "vérin", - "vernir", - "verrou", - "verser", - "vertu", - "veston", - "vétéran", - "vétuste", - "vexant", - "vexer", - "viaduc", - "viande", - "victoire", - "vidange", - "vidéo", - "vignette", - "vigueur", - "vilain", - "village", - "vinaigre", - "violon", - "vipère", - "virement", - "virtuose", - "virus", - "visage", - "viseur", - "vision", - "visqueux", - "visuel", - "vital", - "vitesse", - "viticole", - "vitrine", - "vivace", - "vivipare", - "vocation", - "voguer", - "voile", - "voisin", - "voiture", - "volaille", - "volcan", - "voltiger", - "volume", - "vorace", - "vortex", - "voter", - "vouloir", - "voyage", - "voyelle", - "wagon", - "xénon", - "yacht", - "zèbre", - "zénith", - "zeste", - "zoologie" -]; +export { wordlist } from "@scure/bip39/wordlists/french"; diff --git a/src/bip39/wordlists/italian.ts b/src/bip39/wordlists/italian.ts index 147f5c0..75b7ebc 100644 --- a/src/bip39/wordlists/italian.ts +++ b/src/bip39/wordlists/italian.ts @@ -1,2050 +1 @@ -export const wordlist: string[] = [ - "abaco", - "abbaglio", - "abbinato", - "abete", - "abisso", - "abolire", - "abrasivo", - "abrogato", - "accadere", - "accenno", - "accusato", - "acetone", - "achille", - "acido", - "acqua", - "acre", - "acrilico", - "acrobata", - "acuto", - "adagio", - "addebito", - "addome", - "adeguato", - "aderire", - "adipe", - "adottare", - "adulare", - "affabile", - "affetto", - "affisso", - "affranto", - "aforisma", - "afoso", - "africano", - "agave", - "agente", - "agevole", - "aggancio", - "agire", - "agitare", - "agonismo", - "agricolo", - "agrumeto", - "aguzzo", - "alabarda", - "alato", - "albatro", - "alberato", - "albo", - "albume", - "alce", - "alcolico", - "alettone", - "alfa", - "algebra", - "aliante", - "alibi", - "alimento", - "allagato", - "allegro", - "allievo", - "allodola", - "allusivo", - "almeno", - "alogeno", - "alpaca", - "alpestre", - "altalena", - "alterno", - "alticcio", - "altrove", - "alunno", - "alveolo", - "alzare", - "amalgama", - "amanita", - "amarena", - "ambito", - "ambrato", - "ameba", - "america", - "ametista", - "amico", - "ammasso", - "ammenda", - "ammirare", - "ammonito", - "amore", - "ampio", - "ampliare", - "amuleto", - "anacardo", - "anagrafe", - "analista", - "anarchia", - "anatra", - "anca", - "ancella", - "ancora", - "andare", - "andrea", - "anello", - "angelo", - "angolare", - "angusto", - "anima", - "annegare", - "annidato", - "anno", - "annuncio", - "anonimo", - "anticipo", - "anzi", - "apatico", - "apertura", - "apode", - "apparire", - "appetito", - "appoggio", - "approdo", - "appunto", - "aprile", - "arabica", - "arachide", - "aragosta", - "araldica", - "arancio", - "aratura", - "arazzo", - "arbitro", - "archivio", - "ardito", - "arenile", - "argento", - "argine", - "arguto", - "aria", - "armonia", - "arnese", - "arredato", - "arringa", - "arrosto", - "arsenico", - "arso", - "artefice", - "arzillo", - "asciutto", - "ascolto", - "asepsi", - "asettico", - "asfalto", - "asino", - "asola", - "aspirato", - "aspro", - "assaggio", - "asse", - "assoluto", - "assurdo", - "asta", - "astenuto", - "astice", - "astratto", - "atavico", - "ateismo", - "atomico", - "atono", - "attesa", - "attivare", - "attorno", - "attrito", - "attuale", - "ausilio", - "austria", - "autista", - "autonomo", - "autunno", - "avanzato", - "avere", - "avvenire", - "avviso", - "avvolgere", - "azione", - "azoto", - "azzimo", - "azzurro", - "babele", - "baccano", - "bacino", - "baco", - "badessa", - "badilata", - "bagnato", - "baita", - "balcone", - "baldo", - "balena", - "ballata", - "balzano", - "bambino", - "bandire", - "baraonda", - "barbaro", - "barca", - "baritono", - "barlume", - "barocco", - "basilico", - "basso", - "batosta", - "battuto", - "baule", - "bava", - "bavosa", - "becco", - "beffa", - "belgio", - "belva", - "benda", - "benevole", - "benigno", - "benzina", - "bere", - "berlina", - "beta", - "bibita", - "bici", - "bidone", - "bifido", - "biga", - "bilancia", - "bimbo", - "binocolo", - "biologo", - "bipede", - "bipolare", - "birbante", - "birra", - "biscotto", - "bisesto", - "bisnonno", - "bisonte", - "bisturi", - "bizzarro", - "blando", - "blatta", - "bollito", - "bonifico", - "bordo", - "bosco", - "botanico", - "bottino", - "bozzolo", - "braccio", - "bradipo", - "brama", - "branca", - "bravura", - "bretella", - "brevetto", - "brezza", - "briglia", - "brillante", - "brindare", - "broccolo", - "brodo", - "bronzina", - "brullo", - "bruno", - "bubbone", - "buca", - "budino", - "buffone", - "buio", - "bulbo", - "buono", - "burlone", - "burrasca", - "bussola", - "busta", - "cadetto", - "caduco", - "calamaro", - "calcolo", - "calesse", - "calibro", - "calmo", - "caloria", - "cambusa", - "camerata", - "camicia", - "cammino", - "camola", - "campale", - "canapa", - "candela", - "cane", - "canino", - "canotto", - "cantina", - "capace", - "capello", - "capitolo", - "capogiro", - "cappero", - "capra", - "capsula", - "carapace", - "carcassa", - "cardo", - "carisma", - "carovana", - "carretto", - "cartolina", - "casaccio", - "cascata", - "caserma", - "caso", - "cassone", - "castello", - "casuale", - "catasta", - "catena", - "catrame", - "cauto", - "cavillo", - "cedibile", - "cedrata", - "cefalo", - "celebre", - "cellulare", - "cena", - "cenone", - "centesimo", - "ceramica", - "cercare", - "certo", - "cerume", - "cervello", - "cesoia", - "cespo", - "ceto", - "chela", - "chiaro", - "chicca", - "chiedere", - "chimera", - "china", - "chirurgo", - "chitarra", - "ciao", - "ciclismo", - "cifrare", - "cigno", - "cilindro", - "ciottolo", - "circa", - "cirrosi", - "citrico", - "cittadino", - "ciuffo", - "civetta", - "civile", - "classico", - "clinica", - "cloro", - "cocco", - "codardo", - "codice", - "coerente", - "cognome", - "collare", - "colmato", - "colore", - "colposo", - "coltivato", - "colza", - "coma", - "cometa", - "commando", - "comodo", - "computer", - "comune", - "conciso", - "condurre", - "conferma", - "congelare", - "coniuge", - "connesso", - "conoscere", - "consumo", - "continuo", - "convegno", - "coperto", - "copione", - "coppia", - "copricapo", - "corazza", - "cordata", - "coricato", - "cornice", - "corolla", - "corpo", - "corredo", - "corsia", - "cortese", - "cosmico", - "costante", - "cottura", - "covato", - "cratere", - "cravatta", - "creato", - "credere", - "cremoso", - "crescita", - "creta", - "criceto", - "crinale", - "crisi", - "critico", - "croce", - "cronaca", - "crostata", - "cruciale", - "crusca", - "cucire", - "cuculo", - "cugino", - "cullato", - "cupola", - "curatore", - "cursore", - "curvo", - "cuscino", - "custode", - "dado", - "daino", - "dalmata", - "damerino", - "daniela", - "dannoso", - "danzare", - "datato", - "davanti", - "davvero", - "debutto", - "decennio", - "deciso", - "declino", - "decollo", - "decreto", - "dedicato", - "definito", - "deforme", - "degno", - "delegare", - "delfino", - "delirio", - "delta", - "demenza", - "denotato", - "dentro", - "deposito", - "derapata", - "derivare", - "deroga", - "descritto", - "deserto", - "desiderio", - "desumere", - "detersivo", - "devoto", - "diametro", - "dicembre", - "diedro", - "difeso", - "diffuso", - "digerire", - "digitale", - "diluvio", - "dinamico", - "dinnanzi", - "dipinto", - "diploma", - "dipolo", - "diradare", - "dire", - "dirotto", - "dirupo", - "disagio", - "discreto", - "disfare", - "disgelo", - "disposto", - "distanza", - "disumano", - "dito", - "divano", - "divelto", - "dividere", - "divorato", - "doblone", - "docente", - "doganale", - "dogma", - "dolce", - "domato", - "domenica", - "dominare", - "dondolo", - "dono", - "dormire", - "dote", - "dottore", - "dovuto", - "dozzina", - "drago", - "druido", - "dubbio", - "dubitare", - "ducale", - "duna", - "duomo", - "duplice", - "duraturo", - "ebano", - "eccesso", - "ecco", - "eclissi", - "economia", - "edera", - "edicola", - "edile", - "editoria", - "educare", - "egemonia", - "egli", - "egoismo", - "egregio", - "elaborato", - "elargire", - "elegante", - "elencato", - "eletto", - "elevare", - "elfico", - "elica", - "elmo", - "elsa", - "eluso", - "emanato", - "emblema", - "emesso", - "emiro", - "emotivo", - "emozione", - "empirico", - "emulo", - "endemico", - "enduro", - "energia", - "enfasi", - "enoteca", - "entrare", - "enzima", - "epatite", - "epilogo", - "episodio", - "epocale", - "eppure", - "equatore", - "erario", - "erba", - "erboso", - "erede", - "eremita", - "erigere", - "ermetico", - "eroe", - "erosivo", - "errante", - "esagono", - "esame", - "esanime", - "esaudire", - "esca", - "esempio", - "esercito", - "esibito", - "esigente", - "esistere", - "esito", - "esofago", - "esortato", - "esoso", - "espanso", - "espresso", - "essenza", - "esso", - "esteso", - "estimare", - "estonia", - "estroso", - "esultare", - "etilico", - "etnico", - "etrusco", - "etto", - "euclideo", - "europa", - "evaso", - "evidenza", - "evitato", - "evoluto", - "evviva", - "fabbrica", - "faccenda", - "fachiro", - "falco", - "famiglia", - "fanale", - "fanfara", - "fango", - "fantasma", - "fare", - "farfalla", - "farinoso", - "farmaco", - "fascia", - "fastoso", - "fasullo", - "faticare", - "fato", - "favoloso", - "febbre", - "fecola", - "fede", - "fegato", - "felpa", - "feltro", - "femmina", - "fendere", - "fenomeno", - "fermento", - "ferro", - "fertile", - "fessura", - "festivo", - "fetta", - "feudo", - "fiaba", - "fiducia", - "fifa", - "figurato", - "filo", - "finanza", - "finestra", - "finire", - "fiore", - "fiscale", - "fisico", - "fiume", - "flacone", - "flamenco", - "flebo", - "flemma", - "florido", - "fluente", - "fluoro", - "fobico", - "focaccia", - "focoso", - "foderato", - "foglio", - "folata", - "folclore", - "folgore", - "fondente", - "fonetico", - "fonia", - "fontana", - "forbito", - "forchetta", - "foresta", - "formica", - "fornaio", - "foro", - "fortezza", - "forzare", - "fosfato", - "fosso", - "fracasso", - "frana", - "frassino", - "fratello", - "freccetta", - "frenata", - "fresco", - "frigo", - "frollino", - "fronde", - "frugale", - "frutta", - "fucilata", - "fucsia", - "fuggente", - "fulmine", - "fulvo", - "fumante", - "fumetto", - "fumoso", - "fune", - "funzione", - "fuoco", - "furbo", - "furgone", - "furore", - "fuso", - "futile", - "gabbiano", - "gaffe", - "galateo", - "gallina", - "galoppo", - "gambero", - "gamma", - "garanzia", - "garbo", - "garofano", - "garzone", - "gasdotto", - "gasolio", - "gastrico", - "gatto", - "gaudio", - "gazebo", - "gazzella", - "geco", - "gelatina", - "gelso", - "gemello", - "gemmato", - "gene", - "genitore", - "gennaio", - "genotipo", - "gergo", - "ghepardo", - "ghiaccio", - "ghisa", - "giallo", - "gilda", - "ginepro", - "giocare", - "gioiello", - "giorno", - "giove", - "girato", - "girone", - "gittata", - "giudizio", - "giurato", - "giusto", - "globulo", - "glutine", - "gnomo", - "gobba", - "golf", - "gomito", - "gommone", - "gonfio", - "gonna", - "governo", - "gracile", - "grado", - "grafico", - "grammo", - "grande", - "grattare", - "gravoso", - "grazia", - "greca", - "gregge", - "grifone", - "grigio", - "grinza", - "grotta", - "gruppo", - "guadagno", - "guaio", - "guanto", - "guardare", - "gufo", - "guidare", - "ibernato", - "icona", - "identico", - "idillio", - "idolo", - "idra", - "idrico", - "idrogeno", - "igiene", - "ignaro", - "ignorato", - "ilare", - "illeso", - "illogico", - "illudere", - "imballo", - "imbevuto", - "imbocco", - "imbuto", - "immane", - "immerso", - "immolato", - "impacco", - "impeto", - "impiego", - "importo", - "impronta", - "inalare", - "inarcare", - "inattivo", - "incanto", - "incendio", - "inchino", - "incisivo", - "incluso", - "incontro", - "incrocio", - "incubo", - "indagine", - "india", - "indole", - "inedito", - "infatti", - "infilare", - "inflitto", - "ingaggio", - "ingegno", - "inglese", - "ingordo", - "ingrosso", - "innesco", - "inodore", - "inoltrare", - "inondato", - "insano", - "insetto", - "insieme", - "insonnia", - "insulina", - "intasato", - "intero", - "intonaco", - "intuito", - "inumidire", - "invalido", - "invece", - "invito", - "iperbole", - "ipnotico", - "ipotesi", - "ippica", - "iride", - "irlanda", - "ironico", - "irrigato", - "irrorare", - "isolato", - "isotopo", - "isterico", - "istituto", - "istrice", - "italia", - "iterare", - "labbro", - "labirinto", - "lacca", - "lacerato", - "lacrima", - "lacuna", - "laddove", - "lago", - "lampo", - "lancetta", - "lanterna", - "lardoso", - "larga", - "laringe", - "lastra", - "latenza", - "latino", - "lattuga", - "lavagna", - "lavoro", - "legale", - "leggero", - "lembo", - "lentezza", - "lenza", - "leone", - "lepre", - "lesivo", - "lessato", - "lesto", - "letterale", - "leva", - "levigato", - "libero", - "lido", - "lievito", - "lilla", - "limatura", - "limitare", - "limpido", - "lineare", - "lingua", - "liquido", - "lira", - "lirica", - "lisca", - "lite", - "litigio", - "livrea", - "locanda", - "lode", - "logica", - "lombare", - "londra", - "longevo", - "loquace", - "lorenzo", - "loto", - "lotteria", - "luce", - "lucidato", - "lumaca", - "luminoso", - "lungo", - "lupo", - "luppolo", - "lusinga", - "lusso", - "lutto", - "macabro", - "macchina", - "macero", - "macinato", - "madama", - "magico", - "maglia", - "magnete", - "magro", - "maiolica", - "malafede", - "malgrado", - "malinteso", - "malsano", - "malto", - "malumore", - "mana", - "mancia", - "mandorla", - "mangiare", - "manifesto", - "mannaro", - "manovra", - "mansarda", - "mantide", - "manubrio", - "mappa", - "maratona", - "marcire", - "maretta", - "marmo", - "marsupio", - "maschera", - "massaia", - "mastino", - "materasso", - "matricola", - "mattone", - "maturo", - "mazurca", - "meandro", - "meccanico", - "mecenate", - "medesimo", - "meditare", - "mega", - "melassa", - "melis", - "melodia", - "meninge", - "meno", - "mensola", - "mercurio", - "merenda", - "merlo", - "meschino", - "mese", - "messere", - "mestolo", - "metallo", - "metodo", - "mettere", - "miagolare", - "mica", - "micelio", - "michele", - "microbo", - "midollo", - "miele", - "migliore", - "milano", - "milite", - "mimosa", - "minerale", - "mini", - "minore", - "mirino", - "mirtillo", - "miscela", - "missiva", - "misto", - "misurare", - "mitezza", - "mitigare", - "mitra", - "mittente", - "mnemonico", - "modello", - "modifica", - "modulo", - "mogano", - "mogio", - "mole", - "molosso", - "monastero", - "monco", - "mondina", - "monetario", - "monile", - "monotono", - "monsone", - "montato", - "monviso", - "mora", - "mordere", - "morsicato", - "mostro", - "motivato", - "motosega", - "motto", - "movenza", - "movimento", - "mozzo", - "mucca", - "mucosa", - "muffa", - "mughetto", - "mugnaio", - "mulatto", - "mulinello", - "multiplo", - "mummia", - "munto", - "muovere", - "murale", - "musa", - "muscolo", - "musica", - "mutevole", - "muto", - "nababbo", - "nafta", - "nanometro", - "narciso", - "narice", - "narrato", - "nascere", - "nastrare", - "naturale", - "nautica", - "naviglio", - "nebulosa", - "necrosi", - "negativo", - "negozio", - "nemmeno", - "neofita", - "neretto", - "nervo", - "nessuno", - "nettuno", - "neutrale", - "neve", - "nevrotico", - "nicchia", - "ninfa", - "nitido", - "nobile", - "nocivo", - "nodo", - "nome", - "nomina", - "nordico", - "normale", - "norvegese", - "nostrano", - "notare", - "notizia", - "notturno", - "novella", - "nucleo", - "nulla", - "numero", - "nuovo", - "nutrire", - "nuvola", - "nuziale", - "oasi", - "obbedire", - "obbligo", - "obelisco", - "oblio", - "obolo", - "obsoleto", - "occasione", - "occhio", - "occidente", - "occorrere", - "occultare", - "ocra", - "oculato", - "odierno", - "odorare", - "offerta", - "offrire", - "offuscato", - "oggetto", - "oggi", - "ognuno", - "olandese", - "olfatto", - "oliato", - "oliva", - "ologramma", - "oltre", - "omaggio", - "ombelico", - "ombra", - "omega", - "omissione", - "ondoso", - "onere", - "onice", - "onnivoro", - "onorevole", - "onta", - "operato", - "opinione", - "opposto", - "oracolo", - "orafo", - "ordine", - "orecchino", - "orefice", - "orfano", - "organico", - "origine", - "orizzonte", - "orma", - "ormeggio", - "ornativo", - "orologio", - "orrendo", - "orribile", - "ortensia", - "ortica", - "orzata", - "orzo", - "osare", - "oscurare", - "osmosi", - "ospedale", - "ospite", - "ossa", - "ossidare", - "ostacolo", - "oste", - "otite", - "otre", - "ottagono", - "ottimo", - "ottobre", - "ovale", - "ovest", - "ovino", - "oviparo", - "ovocito", - "ovunque", - "ovviare", - "ozio", - "pacchetto", - "pace", - "pacifico", - "padella", - "padrone", - "paese", - "paga", - "pagina", - "palazzina", - "palesare", - "pallido", - "palo", - "palude", - "pandoro", - "pannello", - "paolo", - "paonazzo", - "paprica", - "parabola", - "parcella", - "parere", - "pargolo", - "pari", - "parlato", - "parola", - "partire", - "parvenza", - "parziale", - "passivo", - "pasticca", - "patacca", - "patologia", - "pattume", - "pavone", - "peccato", - "pedalare", - "pedonale", - "peggio", - "peloso", - "penare", - "pendice", - "penisola", - "pennuto", - "penombra", - "pensare", - "pentola", - "pepe", - "pepita", - "perbene", - "percorso", - "perdonato", - "perforare", - "pergamena", - "periodo", - "permesso", - "perno", - "perplesso", - "persuaso", - "pertugio", - "pervaso", - "pesatore", - "pesista", - "peso", - "pestifero", - "petalo", - "pettine", - "petulante", - "pezzo", - "piacere", - "pianta", - "piattino", - "piccino", - "picozza", - "piega", - "pietra", - "piffero", - "pigiama", - "pigolio", - "pigro", - "pila", - "pilifero", - "pillola", - "pilota", - "pimpante", - "pineta", - "pinna", - "pinolo", - "pioggia", - "piombo", - "piramide", - "piretico", - "pirite", - "pirolisi", - "pitone", - "pizzico", - "placebo", - "planare", - "plasma", - "platano", - "plenario", - "pochezza", - "poderoso", - "podismo", - "poesia", - "poggiare", - "polenta", - "poligono", - "pollice", - "polmonite", - "polpetta", - "polso", - "poltrona", - "polvere", - "pomice", - "pomodoro", - "ponte", - "popoloso", - "porfido", - "poroso", - "porpora", - "porre", - "portata", - "posa", - "positivo", - "possesso", - "postulato", - "potassio", - "potere", - "pranzo", - "prassi", - "pratica", - "precluso", - "predica", - "prefisso", - "pregiato", - "prelievo", - "premere", - "prenotare", - "preparato", - "presenza", - "pretesto", - "prevalso", - "prima", - "principe", - "privato", - "problema", - "procura", - "produrre", - "profumo", - "progetto", - "prolunga", - "promessa", - "pronome", - "proposta", - "proroga", - "proteso", - "prova", - "prudente", - "prugna", - "prurito", - "psiche", - "pubblico", - "pudica", - "pugilato", - "pugno", - "pulce", - "pulito", - "pulsante", - "puntare", - "pupazzo", - "pupilla", - "puro", - "quadro", - "qualcosa", - "quasi", - "querela", - "quota", - "raccolto", - "raddoppio", - "radicale", - "radunato", - "raffica", - "ragazzo", - "ragione", - "ragno", - "ramarro", - "ramingo", - "ramo", - "randagio", - "rantolare", - "rapato", - "rapina", - "rappreso", - "rasatura", - "raschiato", - "rasente", - "rassegna", - "rastrello", - "rata", - "ravveduto", - "reale", - "recepire", - "recinto", - "recluta", - "recondito", - "recupero", - "reddito", - "redimere", - "regalato", - "registro", - "regola", - "regresso", - "relazione", - "remare", - "remoto", - "renna", - "replica", - "reprimere", - "reputare", - "resa", - "residente", - "responso", - "restauro", - "rete", - "retina", - "retorica", - "rettifica", - "revocato", - "riassunto", - "ribadire", - "ribelle", - "ribrezzo", - "ricarica", - "ricco", - "ricevere", - "riciclato", - "ricordo", - "ricreduto", - "ridicolo", - "ridurre", - "rifasare", - "riflesso", - "riforma", - "rifugio", - "rigare", - "rigettato", - "righello", - "rilassato", - "rilevato", - "rimanere", - "rimbalzo", - "rimedio", - "rimorchio", - "rinascita", - "rincaro", - "rinforzo", - "rinnovo", - "rinomato", - "rinsavito", - "rintocco", - "rinuncia", - "rinvenire", - "riparato", - "ripetuto", - "ripieno", - "riportare", - "ripresa", - "ripulire", - "risata", - "rischio", - "riserva", - "risibile", - "riso", - "rispetto", - "ristoro", - "risultato", - "risvolto", - "ritardo", - "ritegno", - "ritmico", - "ritrovo", - "riunione", - "riva", - "riverso", - "rivincita", - "rivolto", - "rizoma", - "roba", - "robotico", - "robusto", - "roccia", - "roco", - "rodaggio", - "rodere", - "roditore", - "rogito", - "rollio", - "romantico", - "rompere", - "ronzio", - "rosolare", - "rospo", - "rotante", - "rotondo", - "rotula", - "rovescio", - "rubizzo", - "rubrica", - "ruga", - "rullino", - "rumine", - "rumoroso", - "ruolo", - "rupe", - "russare", - "rustico", - "sabato", - "sabbiare", - "sabotato", - "sagoma", - "salasso", - "saldatura", - "salgemma", - "salivare", - "salmone", - "salone", - "saltare", - "saluto", - "salvo", - "sapere", - "sapido", - "saporito", - "saraceno", - "sarcasmo", - "sarto", - "sassoso", - "satellite", - "satira", - "satollo", - "saturno", - "savana", - "savio", - "saziato", - "sbadiglio", - "sbalzo", - "sbancato", - "sbarra", - "sbattere", - "sbavare", - "sbendare", - "sbirciare", - "sbloccato", - "sbocciato", - "sbrinare", - "sbruffone", - "sbuffare", - "scabroso", - "scadenza", - "scala", - "scambiare", - "scandalo", - "scapola", - "scarso", - "scatenare", - "scavato", - "scelto", - "scenico", - "scettro", - "scheda", - "schiena", - "sciarpa", - "scienza", - "scindere", - "scippo", - "sciroppo", - "scivolo", - "sclerare", - "scodella", - "scolpito", - "scomparto", - "sconforto", - "scoprire", - "scorta", - "scossone", - "scozzese", - "scriba", - "scrollare", - "scrutinio", - "scuderia", - "scultore", - "scuola", - "scuro", - "scusare", - "sdebitare", - "sdoganare", - "seccatura", - "secondo", - "sedano", - "seggiola", - "segnalato", - "segregato", - "seguito", - "selciato", - "selettivo", - "sella", - "selvaggio", - "semaforo", - "sembrare", - "seme", - "seminato", - "sempre", - "senso", - "sentire", - "sepolto", - "sequenza", - "serata", - "serbato", - "sereno", - "serio", - "serpente", - "serraglio", - "servire", - "sestina", - "setola", - "settimana", - "sfacelo", - "sfaldare", - "sfamato", - "sfarzoso", - "sfaticato", - "sfera", - "sfida", - "sfilato", - "sfinge", - "sfocato", - "sfoderare", - "sfogo", - "sfoltire", - "sforzato", - "sfratto", - "sfruttato", - "sfuggito", - "sfumare", - "sfuso", - "sgabello", - "sgarbato", - "sgonfiare", - "sgorbio", - "sgrassato", - "sguardo", - "sibilo", - "siccome", - "sierra", - "sigla", - "signore", - "silenzio", - "sillaba", - "simbolo", - "simpatico", - "simulato", - "sinfonia", - "singolo", - "sinistro", - "sino", - "sintesi", - "sinusoide", - "sipario", - "sisma", - "sistole", - "situato", - "slitta", - "slogatura", - "sloveno", - "smarrito", - "smemorato", - "smentito", - "smeraldo", - "smilzo", - "smontare", - "smottato", - "smussato", - "snellire", - "snervato", - "snodo", - "sobbalzo", - "sobrio", - "soccorso", - "sociale", - "sodale", - "soffitto", - "sogno", - "soldato", - "solenne", - "solido", - "sollazzo", - "solo", - "solubile", - "solvente", - "somatico", - "somma", - "sonda", - "sonetto", - "sonnifero", - "sopire", - "soppeso", - "sopra", - "sorgere", - "sorpasso", - "sorriso", - "sorso", - "sorteggio", - "sorvolato", - "sospiro", - "sosta", - "sottile", - "spada", - "spalla", - "spargere", - "spatola", - "spavento", - "spazzola", - "specie", - "spedire", - "spegnere", - "spelatura", - "speranza", - "spessore", - "spettrale", - "spezzato", - "spia", - "spigoloso", - "spillato", - "spinoso", - "spirale", - "splendido", - "sportivo", - "sposo", - "spranga", - "sprecare", - "spronato", - "spruzzo", - "spuntino", - "squillo", - "sradicare", - "srotolato", - "stabile", - "stacco", - "staffa", - "stagnare", - "stampato", - "stantio", - "starnuto", - "stasera", - "statuto", - "stelo", - "steppa", - "sterzo", - "stiletto", - "stima", - "stirpe", - "stivale", - "stizzoso", - "stonato", - "storico", - "strappo", - "stregato", - "stridulo", - "strozzare", - "strutto", - "stuccare", - "stufo", - "stupendo", - "subentro", - "succoso", - "sudore", - "suggerito", - "sugo", - "sultano", - "suonare", - "superbo", - "supporto", - "surgelato", - "surrogato", - "sussurro", - "sutura", - "svagare", - "svedese", - "sveglio", - "svelare", - "svenuto", - "svezia", - "sviluppo", - "svista", - "svizzera", - "svolta", - "svuotare", - "tabacco", - "tabulato", - "tacciare", - "taciturno", - "tale", - "talismano", - "tampone", - "tannino", - "tara", - "tardivo", - "targato", - "tariffa", - "tarpare", - "tartaruga", - "tasto", - "tattico", - "taverna", - "tavolata", - "tazza", - "teca", - "tecnico", - "telefono", - "temerario", - "tempo", - "temuto", - "tendone", - "tenero", - "tensione", - "tentacolo", - "teorema", - "terme", - "terrazzo", - "terzetto", - "tesi", - "tesserato", - "testato", - "tetro", - "tettoia", - "tifare", - "tigella", - "timbro", - "tinto", - "tipico", - "tipografo", - "tiraggio", - "tiro", - "titanio", - "titolo", - "titubante", - "tizio", - "tizzone", - "toccare", - "tollerare", - "tolto", - "tombola", - "tomo", - "tonfo", - "tonsilla", - "topazio", - "topologia", - "toppa", - "torba", - "tornare", - "torrone", - "tortora", - "toscano", - "tossire", - "tostatura", - "totano", - "trabocco", - "trachea", - "trafila", - "tragedia", - "tralcio", - "tramonto", - "transito", - "trapano", - "trarre", - "trasloco", - "trattato", - "trave", - "treccia", - "tremolio", - "trespolo", - "tributo", - "tricheco", - "trifoglio", - "trillo", - "trincea", - "trio", - "tristezza", - "triturato", - "trivella", - "tromba", - "trono", - "troppo", - "trottola", - "trovare", - "truccato", - "tubatura", - "tuffato", - "tulipano", - "tumulto", - "tunisia", - "turbare", - "turchino", - "tuta", - "tutela", - "ubicato", - "uccello", - "uccisore", - "udire", - "uditivo", - "uffa", - "ufficio", - "uguale", - "ulisse", - "ultimato", - "umano", - "umile", - "umorismo", - "uncinetto", - "ungere", - "ungherese", - "unicorno", - "unificato", - "unisono", - "unitario", - "unte", - "uovo", - "upupa", - "uragano", - "urgenza", - "urlo", - "usanza", - "usato", - "uscito", - "usignolo", - "usuraio", - "utensile", - "utilizzo", - "utopia", - "vacante", - "vaccinato", - "vagabondo", - "vagliato", - "valanga", - "valgo", - "valico", - "valletta", - "valoroso", - "valutare", - "valvola", - "vampata", - "vangare", - "vanitoso", - "vano", - "vantaggio", - "vanvera", - "vapore", - "varano", - "varcato", - "variante", - "vasca", - "vedetta", - "vedova", - "veduto", - "vegetale", - "veicolo", - "velcro", - "velina", - "velluto", - "veloce", - "venato", - "vendemmia", - "vento", - "verace", - "verbale", - "vergogna", - "verifica", - "vero", - "verruca", - "verticale", - "vescica", - "vessillo", - "vestale", - "veterano", - "vetrina", - "vetusto", - "viandante", - "vibrante", - "vicenda", - "vichingo", - "vicinanza", - "vidimare", - "vigilia", - "vigneto", - "vigore", - "vile", - "villano", - "vimini", - "vincitore", - "viola", - "vipera", - "virgola", - "virologo", - "virulento", - "viscoso", - "visione", - "vispo", - "vissuto", - "visura", - "vita", - "vitello", - "vittima", - "vivanda", - "vivido", - "viziare", - "voce", - "voga", - "volatile", - "volere", - "volpe", - "voragine", - "vulcano", - "zampogna", - "zanna", - "zappato", - "zattera", - "zavorra", - "zefiro", - "zelante", - "zelo", - "zenzero", - "zerbino", - "zibetto", - "zinco", - "zircone", - "zitto", - "zolla", - "zotico", - "zucchero", - "zufolo", - "zulu", - "zuppa" -]; +export { wordlist } from "@scure/bip39/wordlists/italian"; diff --git a/src/bip39/wordlists/japanese.ts b/src/bip39/wordlists/japanese.ts index 193cd5b..f7b72c3 100644 --- a/src/bip39/wordlists/japanese.ts +++ b/src/bip39/wordlists/japanese.ts @@ -1,2050 +1 @@ -export const wordlist: string[] = [ - "あいこくしん", - "あいさつ", - "あいだ", - "あおぞら", - "あかちゃん", - "あきる", - "あけがた", - "あける", - "あこがれる", - "あさい", - "あさひ", - "あしあと", - "あじわう", - "あずかる", - "あずき", - "あそぶ", - "あたえる", - "あたためる", - "あたりまえ", - "あたる", - "あつい", - "あつかう", - "あっしゅく", - "あつまり", - "あつめる", - "あてな", - "あてはまる", - "あひる", - "あぶら", - "あぶる", - "あふれる", - "あまい", - "あまど", - "あまやかす", - "あまり", - "あみもの", - "あめりか", - "あやまる", - "あゆむ", - "あらいぐま", - "あらし", - "あらすじ", - "あらためる", - "あらゆる", - "あらわす", - "ありがとう", - "あわせる", - "あわてる", - "あんい", - "あんがい", - "あんこ", - "あんぜん", - "あんてい", - "あんない", - "あんまり", - "いいだす", - "いおん", - "いがい", - "いがく", - "いきおい", - "いきなり", - "いきもの", - "いきる", - "いくじ", - "いくぶん", - "いけばな", - "いけん", - "いこう", - "いこく", - "いこつ", - "いさましい", - "いさん", - "いしき", - "いじゅう", - "いじょう", - "いじわる", - "いずみ", - "いずれ", - "いせい", - "いせえび", - "いせかい", - "いせき", - "いぜん", - "いそうろう", - "いそがしい", - "いだい", - "いだく", - "いたずら", - "いたみ", - "いたりあ", - "いちおう", - "いちじ", - "いちど", - "いちば", - "いちぶ", - "いちりゅう", - "いつか", - "いっしゅん", - "いっせい", - "いっそう", - "いったん", - "いっち", - "いってい", - "いっぽう", - "いてざ", - "いてん", - "いどう", - "いとこ", - "いない", - "いなか", - "いねむり", - "いのち", - "いのる", - "いはつ", - "いばる", - "いはん", - "いびき", - "いひん", - "いふく", - "いへん", - "いほう", - "いみん", - "いもうと", - "いもたれ", - "いもり", - "いやがる", - "いやす", - "いよかん", - "いよく", - "いらい", - "いらすと", - "いりぐち", - "いりょう", - "いれい", - "いれもの", - "いれる", - "いろえんぴつ", - "いわい", - "いわう", - "いわかん", - "いわば", - "いわゆる", - "いんげんまめ", - "いんさつ", - "いんしょう", - "いんよう", - "うえき", - "うえる", - "うおざ", - "うがい", - "うかぶ", - "うかべる", - "うきわ", - "うくらいな", - "うくれれ", - "うけたまわる", - "うけつけ", - "うけとる", - "うけもつ", - "うける", - "うごかす", - "うごく", - "うこん", - "うさぎ", - "うしなう", - "うしろがみ", - "うすい", - "うすぎ", - "うすぐらい", - "うすめる", - "うせつ", - "うちあわせ", - "うちがわ", - "うちき", - "うちゅう", - "うっかり", - "うつくしい", - "うったえる", - "うつる", - "うどん", - "うなぎ", - "うなじ", - "うなずく", - "うなる", - "うねる", - "うのう", - "うぶげ", - "うぶごえ", - "うまれる", - "うめる", - "うもう", - "うやまう", - "うよく", - "うらがえす", - "うらぐち", - "うらない", - "うりあげ", - "うりきれ", - "うるさい", - "うれしい", - "うれゆき", - "うれる", - "うろこ", - "うわき", - "うわさ", - "うんこう", - "うんちん", - "うんてん", - "うんどう", - "えいえん", - "えいが", - "えいきょう", - "えいご", - "えいせい", - "えいぶん", - "えいよう", - "えいわ", - "えおり", - "えがお", - "えがく", - "えきたい", - "えくせる", - "えしゃく", - "えすて", - "えつらん", - "えのぐ", - "えほうまき", - "えほん", - "えまき", - "えもじ", - "えもの", - "えらい", - "えらぶ", - "えりあ", - "えんえん", - "えんかい", - "えんぎ", - "えんげき", - "えんしゅう", - "えんぜつ", - "えんそく", - "えんちょう", - "えんとつ", - "おいかける", - "おいこす", - "おいしい", - "おいつく", - "おうえん", - "おうさま", - "おうじ", - "おうせつ", - "おうたい", - "おうふく", - "おうべい", - "おうよう", - "おえる", - "おおい", - "おおう", - "おおどおり", - "おおや", - "おおよそ", - "おかえり", - "おかず", - "おがむ", - "おかわり", - "おぎなう", - "おきる", - "おくさま", - "おくじょう", - "おくりがな", - "おくる", - "おくれる", - "おこす", - "おこなう", - "おこる", - "おさえる", - "おさない", - "おさめる", - "おしいれ", - "おしえる", - "おじぎ", - "おじさん", - "おしゃれ", - "おそらく", - "おそわる", - "おたがい", - "おたく", - "おだやか", - "おちつく", - "おっと", - "おつり", - "おでかけ", - "おとしもの", - "おとなしい", - "おどり", - "おどろかす", - "おばさん", - "おまいり", - "おめでとう", - "おもいで", - "おもう", - "おもたい", - "おもちゃ", - "おやつ", - "おやゆび", - "およぼす", - "おらんだ", - "おろす", - "おんがく", - "おんけい", - "おんしゃ", - "おんせん", - "おんだん", - "おんちゅう", - "おんどけい", - "かあつ", - "かいが", - "がいき", - "がいけん", - "がいこう", - "かいさつ", - "かいしゃ", - "かいすいよく", - "かいぜん", - "かいぞうど", - "かいつう", - "かいてん", - "かいとう", - "かいふく", - "がいへき", - "かいほう", - "かいよう", - "がいらい", - "かいわ", - "かえる", - "かおり", - "かかえる", - "かがく", - "かがし", - "かがみ", - "かくご", - "かくとく", - "かざる", - "がぞう", - "かたい", - "かたち", - "がちょう", - "がっきゅう", - "がっこう", - "がっさん", - "がっしょう", - "かなざわし", - "かのう", - "がはく", - "かぶか", - "かほう", - "かほご", - "かまう", - "かまぼこ", - "かめれおん", - "かゆい", - "かようび", - "からい", - "かるい", - "かろう", - "かわく", - "かわら", - "がんか", - "かんけい", - "かんこう", - "かんしゃ", - "かんそう", - "かんたん", - "かんち", - "がんばる", - "きあい", - "きあつ", - "きいろ", - "ぎいん", - "きうい", - "きうん", - "きえる", - "きおう", - "きおく", - "きおち", - "きおん", - "きかい", - "きかく", - "きかんしゃ", - "ききて", - "きくばり", - "きくらげ", - "きけんせい", - "きこう", - "きこえる", - "きこく", - "きさい", - "きさく", - "きさま", - "きさらぎ", - "ぎじかがく", - "ぎしき", - "ぎじたいけん", - "ぎじにってい", - "ぎじゅつしゃ", - "きすう", - "きせい", - "きせき", - "きせつ", - "きそう", - "きぞく", - "きぞん", - "きたえる", - "きちょう", - "きつえん", - "ぎっちり", - "きつつき", - "きつね", - "きてい", - "きどう", - "きどく", - "きない", - "きなが", - "きなこ", - "きぬごし", - "きねん", - "きのう", - "きのした", - "きはく", - "きびしい", - "きひん", - "きふく", - "きぶん", - "きぼう", - "きほん", - "きまる", - "きみつ", - "きむずかしい", - "きめる", - "きもだめし", - "きもち", - "きもの", - "きゃく", - "きやく", - "ぎゅうにく", - "きよう", - "きょうりゅう", - "きらい", - "きらく", - "きりん", - "きれい", - "きれつ", - "きろく", - "ぎろん", - "きわめる", - "ぎんいろ", - "きんかくじ", - "きんじょ", - "きんようび", - "ぐあい", - "くいず", - "くうかん", - "くうき", - "くうぐん", - "くうこう", - "ぐうせい", - "くうそう", - "ぐうたら", - "くうふく", - "くうぼ", - "くかん", - "くきょう", - "くげん", - "ぐこう", - "くさい", - "くさき", - "くさばな", - "くさる", - "くしゃみ", - "くしょう", - "くすのき", - "くすりゆび", - "くせげ", - "くせん", - "ぐたいてき", - "くださる", - "くたびれる", - "くちこみ", - "くちさき", - "くつした", - "ぐっすり", - "くつろぐ", - "くとうてん", - "くどく", - "くなん", - "くねくね", - "くのう", - "くふう", - "くみあわせ", - "くみたてる", - "くめる", - "くやくしょ", - "くらす", - "くらべる", - "くるま", - "くれる", - "くろう", - "くわしい", - "ぐんかん", - "ぐんしょく", - "ぐんたい", - "ぐんて", - "けあな", - "けいかく", - "けいけん", - "けいこ", - "けいさつ", - "げいじゅつ", - "けいたい", - "げいのうじん", - "けいれき", - "けいろ", - "けおとす", - "けおりもの", - "げきか", - "げきげん", - "げきだん", - "げきちん", - "げきとつ", - "げきは", - "げきやく", - "げこう", - "げこくじょう", - "げざい", - "けさき", - "げざん", - "けしき", - "けしごむ", - "けしょう", - "げすと", - "けたば", - "けちゃっぷ", - "けちらす", - "けつあつ", - "けつい", - "けつえき", - "けっこん", - "けつじょ", - "けっせき", - "けってい", - "けつまつ", - "げつようび", - "げつれい", - "けつろん", - "げどく", - "けとばす", - "けとる", - "けなげ", - "けなす", - "けなみ", - "けぬき", - "げねつ", - "けねん", - "けはい", - "げひん", - "けぶかい", - "げぼく", - "けまり", - "けみかる", - "けむし", - "けむり", - "けもの", - "けらい", - "けろけろ", - "けわしい", - "けんい", - "けんえつ", - "けんお", - "けんか", - "げんき", - "けんげん", - "けんこう", - "けんさく", - "けんしゅう", - "けんすう", - "げんそう", - "けんちく", - "けんてい", - "けんとう", - "けんない", - "けんにん", - "げんぶつ", - "けんま", - "けんみん", - "けんめい", - "けんらん", - "けんり", - "こあくま", - "こいぬ", - "こいびと", - "ごうい", - "こうえん", - "こうおん", - "こうかん", - "ごうきゅう", - "ごうけい", - "こうこう", - "こうさい", - "こうじ", - "こうすい", - "ごうせい", - "こうそく", - "こうたい", - "こうちゃ", - "こうつう", - "こうてい", - "こうどう", - "こうない", - "こうはい", - "ごうほう", - "ごうまん", - "こうもく", - "こうりつ", - "こえる", - "こおり", - "ごかい", - "ごがつ", - "ごかん", - "こくご", - "こくさい", - "こくとう", - "こくない", - "こくはく", - "こぐま", - "こけい", - "こける", - "ここのか", - "こころ", - "こさめ", - "こしつ", - "こすう", - "こせい", - "こせき", - "こぜん", - "こそだて", - "こたい", - "こたえる", - "こたつ", - "こちょう", - "こっか", - "こつこつ", - "こつばん", - "こつぶ", - "こてい", - "こてん", - "ことがら", - "ことし", - "ことば", - "ことり", - "こなごな", - "こねこね", - "このまま", - "このみ", - "このよ", - "ごはん", - "こひつじ", - "こふう", - "こふん", - "こぼれる", - "ごまあぶら", - "こまかい", - "ごますり", - "こまつな", - "こまる", - "こむぎこ", - "こもじ", - "こもち", - "こもの", - "こもん", - "こやく", - "こやま", - "こゆう", - "こゆび", - "こよい", - "こよう", - "こりる", - "これくしょん", - "ころっけ", - "こわもて", - "こわれる", - "こんいん", - "こんかい", - "こんき", - "こんしゅう", - "こんすい", - "こんだて", - "こんとん", - "こんなん", - "こんびに", - "こんぽん", - "こんまけ", - "こんや", - "こんれい", - "こんわく", - "ざいえき", - "さいかい", - "さいきん", - "ざいげん", - "ざいこ", - "さいしょ", - "さいせい", - "ざいたく", - "ざいちゅう", - "さいてき", - "ざいりょう", - "さうな", - "さかいし", - "さがす", - "さかな", - "さかみち", - "さがる", - "さぎょう", - "さくし", - "さくひん", - "さくら", - "さこく", - "さこつ", - "さずかる", - "ざせき", - "さたん", - "さつえい", - "ざつおん", - "ざっか", - "ざつがく", - "さっきょく", - "ざっし", - "さつじん", - "ざっそう", - "さつたば", - "さつまいも", - "さてい", - "さといも", - "さとう", - "さとおや", - "さとし", - "さとる", - "さのう", - "さばく", - "さびしい", - "さべつ", - "さほう", - "さほど", - "さます", - "さみしい", - "さみだれ", - "さむけ", - "さめる", - "さやえんどう", - "さゆう", - "さよう", - "さよく", - "さらだ", - "ざるそば", - "さわやか", - "さわる", - "さんいん", - "さんか", - "さんきゃく", - "さんこう", - "さんさい", - "ざんしょ", - "さんすう", - "さんせい", - "さんそ", - "さんち", - "さんま", - "さんみ", - "さんらん", - "しあい", - "しあげ", - "しあさって", - "しあわせ", - "しいく", - "しいん", - "しうち", - "しえい", - "しおけ", - "しかい", - "しかく", - "じかん", - "しごと", - "しすう", - "じだい", - "したうけ", - "したぎ", - "したて", - "したみ", - "しちょう", - "しちりん", - "しっかり", - "しつじ", - "しつもん", - "してい", - "してき", - "してつ", - "じてん", - "じどう", - "しなぎれ", - "しなもの", - "しなん", - "しねま", - "しねん", - "しのぐ", - "しのぶ", - "しはい", - "しばかり", - "しはつ", - "しはらい", - "しはん", - "しひょう", - "しふく", - "じぶん", - "しへい", - "しほう", - "しほん", - "しまう", - "しまる", - "しみん", - "しむける", - "じむしょ", - "しめい", - "しめる", - "しもん", - "しゃいん", - "しゃうん", - "しゃおん", - "じゃがいも", - "しやくしょ", - "しゃくほう", - "しゃけん", - "しゃこ", - "しゃざい", - "しゃしん", - "しゃせん", - "しゃそう", - "しゃたい", - "しゃちょう", - "しゃっきん", - "じゃま", - "しゃりん", - "しゃれい", - "じゆう", - "じゅうしょ", - "しゅくはく", - "じゅしん", - "しゅっせき", - "しゅみ", - "しゅらば", - "じゅんばん", - "しょうかい", - "しょくたく", - "しょっけん", - "しょどう", - "しょもつ", - "しらせる", - "しらべる", - "しんか", - "しんこう", - "じんじゃ", - "しんせいじ", - "しんちく", - "しんりん", - "すあげ", - "すあし", - "すあな", - "ずあん", - "すいえい", - "すいか", - "すいとう", - "ずいぶん", - "すいようび", - "すうがく", - "すうじつ", - "すうせん", - "すおどり", - "すきま", - "すくう", - "すくない", - "すける", - "すごい", - "すこし", - "ずさん", - "すずしい", - "すすむ", - "すすめる", - "すっかり", - "ずっしり", - "ずっと", - "すてき", - "すてる", - "すねる", - "すのこ", - "すはだ", - "すばらしい", - "ずひょう", - "ずぶぬれ", - "すぶり", - "すふれ", - "すべて", - "すべる", - "ずほう", - "すぼん", - "すまい", - "すめし", - "すもう", - "すやき", - "すらすら", - "するめ", - "すれちがう", - "すろっと", - "すわる", - "すんぜん", - "すんぽう", - "せあぶら", - "せいかつ", - "せいげん", - "せいじ", - "せいよう", - "せおう", - "せかいかん", - "せきにん", - "せきむ", - "せきゆ", - "せきらんうん", - "せけん", - "せこう", - "せすじ", - "せたい", - "せたけ", - "せっかく", - "せっきゃく", - "ぜっく", - "せっけん", - "せっこつ", - "せっさたくま", - "せつぞく", - "せつだん", - "せつでん", - "せっぱん", - "せつび", - "せつぶん", - "せつめい", - "せつりつ", - "せなか", - "せのび", - "せはば", - "せびろ", - "せぼね", - "せまい", - "せまる", - "せめる", - "せもたれ", - "せりふ", - "ぜんあく", - "せんい", - "せんえい", - "せんか", - "せんきょ", - "せんく", - "せんげん", - "ぜんご", - "せんさい", - "せんしゅ", - "せんすい", - "せんせい", - "せんぞ", - "せんたく", - "せんちょう", - "せんてい", - "せんとう", - "せんぬき", - "せんねん", - "せんぱい", - "ぜんぶ", - "ぜんぽう", - "せんむ", - "せんめんじょ", - "せんもん", - "せんやく", - "せんゆう", - "せんよう", - "ぜんら", - "ぜんりゃく", - "せんれい", - "せんろ", - "そあく", - "そいとげる", - "そいね", - "そうがんきょう", - "そうき", - "そうご", - "そうしん", - "そうだん", - "そうなん", - "そうび", - "そうめん", - "そうり", - "そえもの", - "そえん", - "そがい", - "そげき", - "そこう", - "そこそこ", - "そざい", - "そしな", - "そせい", - "そせん", - "そそぐ", - "そだてる", - "そつう", - "そつえん", - "そっかん", - "そつぎょう", - "そっけつ", - "そっこう", - "そっせん", - "そっと", - "そとがわ", - "そとづら", - "そなえる", - "そなた", - "そふぼ", - "そぼく", - "そぼろ", - "そまつ", - "そまる", - "そむく", - "そむりえ", - "そめる", - "そもそも", - "そよかぜ", - "そらまめ", - "そろう", - "そんかい", - "そんけい", - "そんざい", - "そんしつ", - "そんぞく", - "そんちょう", - "ぞんび", - "ぞんぶん", - "そんみん", - "たあい", - "たいいん", - "たいうん", - "たいえき", - "たいおう", - "だいがく", - "たいき", - "たいぐう", - "たいけん", - "たいこ", - "たいざい", - "だいじょうぶ", - "だいすき", - "たいせつ", - "たいそう", - "だいたい", - "たいちょう", - "たいてい", - "だいどころ", - "たいない", - "たいねつ", - "たいのう", - "たいはん", - "だいひょう", - "たいふう", - "たいへん", - "たいほ", - "たいまつばな", - "たいみんぐ", - "たいむ", - "たいめん", - "たいやき", - "たいよう", - "たいら", - "たいりょく", - "たいる", - "たいわん", - "たうえ", - "たえる", - "たおす", - "たおる", - "たおれる", - "たかい", - "たかね", - "たきび", - "たくさん", - "たこく", - "たこやき", - "たさい", - "たしざん", - "だじゃれ", - "たすける", - "たずさわる", - "たそがれ", - "たたかう", - "たたく", - "ただしい", - "たたみ", - "たちばな", - "だっかい", - "だっきゃく", - "だっこ", - "だっしゅつ", - "だったい", - "たてる", - "たとえる", - "たなばた", - "たにん", - "たぬき", - "たのしみ", - "たはつ", - "たぶん", - "たべる", - "たぼう", - "たまご", - "たまる", - "だむる", - "ためいき", - "ためす", - "ためる", - "たもつ", - "たやすい", - "たよる", - "たらす", - "たりきほんがん", - "たりょう", - "たりる", - "たると", - "たれる", - "たれんと", - "たろっと", - "たわむれる", - "だんあつ", - "たんい", - "たんおん", - "たんか", - "たんき", - "たんけん", - "たんご", - "たんさん", - "たんじょうび", - "だんせい", - "たんそく", - "たんたい", - "だんち", - "たんてい", - "たんとう", - "だんな", - "たんにん", - "だんねつ", - "たんのう", - "たんぴん", - "だんぼう", - "たんまつ", - "たんめい", - "だんれつ", - "だんろ", - "だんわ", - "ちあい", - "ちあん", - "ちいき", - "ちいさい", - "ちえん", - "ちかい", - "ちから", - "ちきゅう", - "ちきん", - "ちけいず", - "ちけん", - "ちこく", - "ちさい", - "ちしき", - "ちしりょう", - "ちせい", - "ちそう", - "ちたい", - "ちたん", - "ちちおや", - "ちつじょ", - "ちてき", - "ちてん", - "ちぬき", - "ちぬり", - "ちのう", - "ちひょう", - "ちへいせん", - "ちほう", - "ちまた", - "ちみつ", - "ちみどろ", - "ちめいど", - "ちゃんこなべ", - "ちゅうい", - "ちゆりょく", - "ちょうし", - "ちょさくけん", - "ちらし", - "ちらみ", - "ちりがみ", - "ちりょう", - "ちるど", - "ちわわ", - "ちんたい", - "ちんもく", - "ついか", - "ついたち", - "つうか", - "つうじょう", - "つうはん", - "つうわ", - "つかう", - "つかれる", - "つくね", - "つくる", - "つけね", - "つける", - "つごう", - "つたえる", - "つづく", - "つつじ", - "つつむ", - "つとめる", - "つながる", - "つなみ", - "つねづね", - "つのる", - "つぶす", - "つまらない", - "つまる", - "つみき", - "つめたい", - "つもり", - "つもる", - "つよい", - "つるぼ", - "つるみく", - "つわもの", - "つわり", - "てあし", - "てあて", - "てあみ", - "ていおん", - "ていか", - "ていき", - "ていけい", - "ていこく", - "ていさつ", - "ていし", - "ていせい", - "ていたい", - "ていど", - "ていねい", - "ていひょう", - "ていへん", - "ていぼう", - "てうち", - "ておくれ", - "てきとう", - "てくび", - "でこぼこ", - "てさぎょう", - "てさげ", - "てすり", - "てそう", - "てちがい", - "てちょう", - "てつがく", - "てつづき", - "でっぱ", - "てつぼう", - "てつや", - "でぬかえ", - "てぬき", - "てぬぐい", - "てのひら", - "てはい", - "てぶくろ", - "てふだ", - "てほどき", - "てほん", - "てまえ", - "てまきずし", - "てみじか", - "てみやげ", - "てらす", - "てれび", - "てわけ", - "てわたし", - "でんあつ", - "てんいん", - "てんかい", - "てんき", - "てんぐ", - "てんけん", - "てんごく", - "てんさい", - "てんし", - "てんすう", - "でんち", - "てんてき", - "てんとう", - "てんない", - "てんぷら", - "てんぼうだい", - "てんめつ", - "てんらんかい", - "でんりょく", - "でんわ", - "どあい", - "といれ", - "どうかん", - "とうきゅう", - "どうぐ", - "とうし", - "とうむぎ", - "とおい", - "とおか", - "とおく", - "とおす", - "とおる", - "とかい", - "とかす", - "ときおり", - "ときどき", - "とくい", - "とくしゅう", - "とくてん", - "とくに", - "とくべつ", - "とけい", - "とける", - "とこや", - "とさか", - "としょかん", - "とそう", - "とたん", - "とちゅう", - "とっきゅう", - "とっくん", - "とつぜん", - "とつにゅう", - "とどける", - "ととのえる", - "とない", - "となえる", - "となり", - "とのさま", - "とばす", - "どぶがわ", - "とほう", - "とまる", - "とめる", - "ともだち", - "ともる", - "どようび", - "とらえる", - "とんかつ", - "どんぶり", - "ないかく", - "ないこう", - "ないしょ", - "ないす", - "ないせん", - "ないそう", - "なおす", - "ながい", - "なくす", - "なげる", - "なこうど", - "なさけ", - "なたでここ", - "なっとう", - "なつやすみ", - "ななおし", - "なにごと", - "なにもの", - "なにわ", - "なのか", - "なふだ", - "なまいき", - "なまえ", - "なまみ", - "なみだ", - "なめらか", - "なめる", - "なやむ", - "ならう", - "ならび", - "ならぶ", - "なれる", - "なわとび", - "なわばり", - "にあう", - "にいがた", - "にうけ", - "におい", - "にかい", - "にがて", - "にきび", - "にくしみ", - "にくまん", - "にげる", - "にさんかたんそ", - "にしき", - "にせもの", - "にちじょう", - "にちようび", - "にっか", - "にっき", - "にっけい", - "にっこう", - "にっさん", - "にっしょく", - "にっすう", - "にっせき", - "にってい", - "になう", - "にほん", - "にまめ", - "にもつ", - "にやり", - "にゅういん", - "にりんしゃ", - "にわとり", - "にんい", - "にんか", - "にんき", - "にんげん", - "にんしき", - "にんずう", - "にんそう", - "にんたい", - "にんち", - "にんてい", - "にんにく", - "にんぷ", - "にんまり", - "にんむ", - "にんめい", - "にんよう", - "ぬいくぎ", - "ぬかす", - "ぬぐいとる", - "ぬぐう", - "ぬくもり", - "ぬすむ", - "ぬまえび", - "ぬめり", - "ぬらす", - "ぬんちゃく", - "ねあげ", - "ねいき", - "ねいる", - "ねいろ", - "ねぐせ", - "ねくたい", - "ねくら", - "ねこぜ", - "ねこむ", - "ねさげ", - "ねすごす", - "ねそべる", - "ねだん", - "ねつい", - "ねっしん", - "ねつぞう", - "ねったいぎょ", - "ねぶそく", - "ねふだ", - "ねぼう", - "ねほりはほり", - "ねまき", - "ねまわし", - "ねみみ", - "ねむい", - "ねむたい", - "ねもと", - "ねらう", - "ねわざ", - "ねんいり", - "ねんおし", - "ねんかん", - "ねんきん", - "ねんぐ", - "ねんざ", - "ねんし", - "ねんちゃく", - "ねんど", - "ねんぴ", - "ねんぶつ", - "ねんまつ", - "ねんりょう", - "ねんれい", - "のいず", - "のおづま", - "のがす", - "のきなみ", - "のこぎり", - "のこす", - "のこる", - "のせる", - "のぞく", - "のぞむ", - "のたまう", - "のちほど", - "のっく", - "のばす", - "のはら", - "のべる", - "のぼる", - "のみもの", - "のやま", - "のらいぬ", - "のらねこ", - "のりもの", - "のりゆき", - "のれん", - "のんき", - "ばあい", - "はあく", - "ばあさん", - "ばいか", - "ばいく", - "はいけん", - "はいご", - "はいしん", - "はいすい", - "はいせん", - "はいそう", - "はいち", - "ばいばい", - "はいれつ", - "はえる", - "はおる", - "はかい", - "ばかり", - "はかる", - "はくしゅ", - "はけん", - "はこぶ", - "はさみ", - "はさん", - "はしご", - "ばしょ", - "はしる", - "はせる", - "ぱそこん", - "はそん", - "はたん", - "はちみつ", - "はつおん", - "はっかく", - "はづき", - "はっきり", - "はっくつ", - "はっけん", - "はっこう", - "はっさん", - "はっしん", - "はったつ", - "はっちゅう", - "はってん", - "はっぴょう", - "はっぽう", - "はなす", - "はなび", - "はにかむ", - "はぶらし", - "はみがき", - "はむかう", - "はめつ", - "はやい", - "はやし", - "はらう", - "はろうぃん", - "はわい", - "はんい", - "はんえい", - "はんおん", - "はんかく", - "はんきょう", - "ばんぐみ", - "はんこ", - "はんしゃ", - "はんすう", - "はんだん", - "ぱんち", - "ぱんつ", - "はんてい", - "はんとし", - "はんのう", - "はんぱ", - "はんぶん", - "はんぺん", - "はんぼうき", - "はんめい", - "はんらん", - "はんろん", - "ひいき", - "ひうん", - "ひえる", - "ひかく", - "ひかり", - "ひかる", - "ひかん", - "ひくい", - "ひけつ", - "ひこうき", - "ひこく", - "ひさい", - "ひさしぶり", - "ひさん", - "びじゅつかん", - "ひしょ", - "ひそか", - "ひそむ", - "ひたむき", - "ひだり", - "ひたる", - "ひつぎ", - "ひっこし", - "ひっし", - "ひつじゅひん", - "ひっす", - "ひつぜん", - "ぴったり", - "ぴっちり", - "ひつよう", - "ひてい", - "ひとごみ", - "ひなまつり", - "ひなん", - "ひねる", - "ひはん", - "ひびく", - "ひひょう", - "ひほう", - "ひまわり", - "ひまん", - "ひみつ", - "ひめい", - "ひめじし", - "ひやけ", - "ひやす", - "ひよう", - "びょうき", - "ひらがな", - "ひらく", - "ひりつ", - "ひりょう", - "ひるま", - "ひるやすみ", - "ひれい", - "ひろい", - "ひろう", - "ひろき", - "ひろゆき", - "ひんかく", - "ひんけつ", - "ひんこん", - "ひんしゅ", - "ひんそう", - "ぴんち", - "ひんぱん", - "びんぼう", - "ふあん", - "ふいうち", - "ふうけい", - "ふうせん", - "ぷうたろう", - "ふうとう", - "ふうふ", - "ふえる", - "ふおん", - "ふかい", - "ふきん", - "ふくざつ", - "ふくぶくろ", - "ふこう", - "ふさい", - "ふしぎ", - "ふじみ", - "ふすま", - "ふせい", - "ふせぐ", - "ふそく", - "ぶたにく", - "ふたん", - "ふちょう", - "ふつう", - "ふつか", - "ふっかつ", - "ふっき", - "ふっこく", - "ぶどう", - "ふとる", - "ふとん", - "ふのう", - "ふはい", - "ふひょう", - "ふへん", - "ふまん", - "ふみん", - "ふめつ", - "ふめん", - "ふよう", - "ふりこ", - "ふりる", - "ふるい", - "ふんいき", - "ぶんがく", - "ぶんぐ", - "ふんしつ", - "ぶんせき", - "ふんそう", - "ぶんぽう", - "へいあん", - "へいおん", - "へいがい", - "へいき", - "へいげん", - "へいこう", - "へいさ", - "へいしゃ", - "へいせつ", - "へいそ", - "へいたく", - "へいてん", - "へいねつ", - "へいわ", - "へきが", - "へこむ", - "べにいろ", - "べにしょうが", - "へらす", - "へんかん", - "べんきょう", - "べんごし", - "へんさい", - "へんたい", - "べんり", - "ほあん", - "ほいく", - "ぼうぎょ", - "ほうこく", - "ほうそう", - "ほうほう", - "ほうもん", - "ほうりつ", - "ほえる", - "ほおん", - "ほかん", - "ほきょう", - "ぼきん", - "ほくろ", - "ほけつ", - "ほけん", - "ほこう", - "ほこる", - "ほしい", - "ほしつ", - "ほしゅ", - "ほしょう", - "ほせい", - "ほそい", - "ほそく", - "ほたて", - "ほたる", - "ぽちぶくろ", - "ほっきょく", - "ほっさ", - "ほったん", - "ほとんど", - "ほめる", - "ほんい", - "ほんき", - "ほんけ", - "ほんしつ", - "ほんやく", - "まいにち", - "まかい", - "まかせる", - "まがる", - "まける", - "まこと", - "まさつ", - "まじめ", - "ますく", - "まぜる", - "まつり", - "まとめ", - "まなぶ", - "まぬけ", - "まねく", - "まほう", - "まもる", - "まゆげ", - "まよう", - "まろやか", - "まわす", - "まわり", - "まわる", - "まんが", - "まんきつ", - "まんぞく", - "まんなか", - "みいら", - "みうち", - "みえる", - "みがく", - "みかた", - "みかん", - "みけん", - "みこん", - "みじかい", - "みすい", - "みすえる", - "みせる", - "みっか", - "みつかる", - "みつける", - "みてい", - "みとめる", - "みなと", - "みなみかさい", - "みねらる", - "みのう", - "みのがす", - "みほん", - "みもと", - "みやげ", - "みらい", - "みりょく", - "みわく", - "みんか", - "みんぞく", - "むいか", - "むえき", - "むえん", - "むかい", - "むかう", - "むかえ", - "むかし", - "むぎちゃ", - "むける", - "むげん", - "むさぼる", - "むしあつい", - "むしば", - "むじゅん", - "むしろ", - "むすう", - "むすこ", - "むすぶ", - "むすめ", - "むせる", - "むせん", - "むちゅう", - "むなしい", - "むのう", - "むやみ", - "むよう", - "むらさき", - "むりょう", - "むろん", - "めいあん", - "めいうん", - "めいえん", - "めいかく", - "めいきょく", - "めいさい", - "めいし", - "めいそう", - "めいぶつ", - "めいれい", - "めいわく", - "めぐまれる", - "めざす", - "めした", - "めずらしい", - "めだつ", - "めまい", - "めやす", - "めんきょ", - "めんせき", - "めんどう", - "もうしあげる", - "もうどうけん", - "もえる", - "もくし", - "もくてき", - "もくようび", - "もちろん", - "もどる", - "もらう", - "もんく", - "もんだい", - "やおや", - "やける", - "やさい", - "やさしい", - "やすい", - "やすたろう", - "やすみ", - "やせる", - "やそう", - "やたい", - "やちん", - "やっと", - "やっぱり", - "やぶる", - "やめる", - "ややこしい", - "やよい", - "やわらかい", - "ゆうき", - "ゆうびんきょく", - "ゆうべ", - "ゆうめい", - "ゆけつ", - "ゆしゅつ", - "ゆせん", - "ゆそう", - "ゆたか", - "ゆちゃく", - "ゆでる", - "ゆにゅう", - "ゆびわ", - "ゆらい", - "ゆれる", - "ようい", - "ようか", - "ようきゅう", - "ようじ", - "ようす", - "ようちえん", - "よかぜ", - "よかん", - "よきん", - "よくせい", - "よくぼう", - "よけい", - "よごれる", - "よさん", - "よしゅう", - "よそう", - "よそく", - "よっか", - "よてい", - "よどがわく", - "よねつ", - "よやく", - "よゆう", - "よろこぶ", - "よろしい", - "らいう", - "らくがき", - "らくご", - "らくさつ", - "らくだ", - "らしんばん", - "らせん", - "らぞく", - "らたい", - "らっか", - "られつ", - "りえき", - "りかい", - "りきさく", - "りきせつ", - "りくぐん", - "りくつ", - "りけん", - "りこう", - "りせい", - "りそう", - "りそく", - "りてん", - "りねん", - "りゆう", - "りゅうがく", - "りよう", - "りょうり", - "りょかん", - "りょくちゃ", - "りょこう", - "りりく", - "りれき", - "りろん", - "りんご", - "るいけい", - "るいさい", - "るいじ", - "るいせき", - "るすばん", - "るりがわら", - "れいかん", - "れいぎ", - "れいせい", - "れいぞうこ", - "れいとう", - "れいぼう", - "れきし", - "れきだい", - "れんあい", - "れんけい", - "れんこん", - "れんさい", - "れんしゅう", - "れんぞく", - "れんらく", - "ろうか", - "ろうご", - "ろうじん", - "ろうそく", - "ろくが", - "ろこつ", - "ろじうら", - "ろしゅつ", - "ろせん", - "ろてん", - "ろめん", - "ろれつ", - "ろんぎ", - "ろんぱ", - "ろんぶん", - "ろんり", - "わかす", - "わかめ", - "わかやま", - "わかれる", - "わしつ", - "わじまし", - "わすれもの", - "わらう", - "われる" -]; +export { wordlist } from "@scure/bip39/wordlists/japanese"; diff --git a/src/bip39/wordlists/korean.ts b/src/bip39/wordlists/korean.ts index e2a5c7d..61b76bf 100644 --- a/src/bip39/wordlists/korean.ts +++ b/src/bip39/wordlists/korean.ts @@ -1,2050 +1 @@ -export const wordlist: string[] = [ - "가격", - "가끔", - "가난", - "가능", - "가득", - "가르침", - "가뭄", - "가방", - "가상", - "가슴", - "가운데", - "가을", - "가이드", - "가입", - "가장", - "가정", - "가족", - "가죽", - "각오", - "각자", - "간격", - "간부", - "간섭", - "간장", - "간접", - "간판", - "갈등", - "갈비", - "갈색", - "갈증", - "감각", - "감기", - "감소", - "감수성", - "감자", - "감정", - "갑자기", - "강남", - "강당", - "강도", - "강력히", - "강변", - "강북", - "강사", - "강수량", - "강아지", - "강원도", - "강의", - "강제", - "강조", - "같이", - "개구리", - "개나리", - "개방", - "개별", - "개선", - "개성", - "개인", - "객관적", - "거실", - "거액", - "거울", - "거짓", - "거품", - "걱정", - "건강", - "건물", - "건설", - "건조", - "건축", - "걸음", - "검사", - "검토", - "게시판", - "게임", - "겨울", - "견해", - "결과", - "결국", - "결론", - "결석", - "결승", - "결심", - "결정", - "결혼", - "경계", - "경고", - "경기", - "경력", - "경복궁", - "경비", - "경상도", - "경영", - "경우", - "경쟁", - "경제", - "경주", - "경찰", - "경치", - "경향", - "경험", - "계곡", - "계단", - "계란", - "계산", - "계속", - "계약", - "계절", - "계층", - "계획", - "고객", - "고구려", - "고궁", - "고급", - "고등학생", - "고무신", - "고민", - "고양이", - "고장", - "고전", - "고집", - "고춧가루", - "고통", - "고향", - "곡식", - "골목", - "골짜기", - "골프", - "공간", - "공개", - "공격", - "공군", - "공급", - "공기", - "공동", - "공무원", - "공부", - "공사", - "공식", - "공업", - "공연", - "공원", - "공장", - "공짜", - "공책", - "공통", - "공포", - "공항", - "공휴일", - "과목", - "과일", - "과장", - "과정", - "과학", - "관객", - "관계", - "관광", - "관념", - "관람", - "관련", - "관리", - "관습", - "관심", - "관점", - "관찰", - "광경", - "광고", - "광장", - "광주", - "괴로움", - "굉장히", - "교과서", - "교문", - "교복", - "교실", - "교양", - "교육", - "교장", - "교직", - "교통", - "교환", - "교훈", - "구경", - "구름", - "구멍", - "구별", - "구분", - "구석", - "구성", - "구속", - "구역", - "구입", - "구청", - "구체적", - "국가", - "국기", - "국내", - "국립", - "국물", - "국민", - "국수", - "국어", - "국왕", - "국적", - "국제", - "국회", - "군대", - "군사", - "군인", - "궁극적", - "권리", - "권위", - "권투", - "귀국", - "귀신", - "규정", - "규칙", - "균형", - "그날", - "그냥", - "그늘", - "그러나", - "그룹", - "그릇", - "그림", - "그제서야", - "그토록", - "극복", - "극히", - "근거", - "근교", - "근래", - "근로", - "근무", - "근본", - "근원", - "근육", - "근처", - "글씨", - "글자", - "금강산", - "금고", - "금년", - "금메달", - "금액", - "금연", - "금요일", - "금지", - "긍정적", - "기간", - "기관", - "기념", - "기능", - "기독교", - "기둥", - "기록", - "기름", - "기법", - "기본", - "기분", - "기쁨", - "기숙사", - "기술", - "기억", - "기업", - "기온", - "기운", - "기원", - "기적", - "기준", - "기침", - "기혼", - "기획", - "긴급", - "긴장", - "길이", - "김밥", - "김치", - "김포공항", - "깍두기", - "깜빡", - "깨달음", - "깨소금", - "껍질", - "꼭대기", - "꽃잎", - "나들이", - "나란히", - "나머지", - "나물", - "나침반", - "나흘", - "낙엽", - "난방", - "날개", - "날씨", - "날짜", - "남녀", - "남대문", - "남매", - "남산", - "남자", - "남편", - "남학생", - "낭비", - "낱말", - "내년", - "내용", - "내일", - "냄비", - "냄새", - "냇물", - "냉동", - "냉면", - "냉방", - "냉장고", - "넥타이", - "넷째", - "노동", - "노란색", - "노력", - "노인", - "녹음", - "녹차", - "녹화", - "논리", - "논문", - "논쟁", - "놀이", - "농구", - "농담", - "농민", - "농부", - "농업", - "농장", - "농촌", - "높이", - "눈동자", - "눈물", - "눈썹", - "뉴욕", - "느낌", - "늑대", - "능동적", - "능력", - "다방", - "다양성", - "다음", - "다이어트", - "다행", - "단계", - "단골", - "단독", - "단맛", - "단순", - "단어", - "단위", - "단점", - "단체", - "단추", - "단편", - "단풍", - "달걀", - "달러", - "달력", - "달리", - "닭고기", - "담당", - "담배", - "담요", - "담임", - "답변", - "답장", - "당근", - "당분간", - "당연히", - "당장", - "대규모", - "대낮", - "대단히", - "대답", - "대도시", - "대략", - "대량", - "대륙", - "대문", - "대부분", - "대신", - "대응", - "대장", - "대전", - "대접", - "대중", - "대책", - "대출", - "대충", - "대통령", - "대학", - "대한민국", - "대합실", - "대형", - "덩어리", - "데이트", - "도대체", - "도덕", - "도둑", - "도망", - "도서관", - "도심", - "도움", - "도입", - "도자기", - "도저히", - "도전", - "도중", - "도착", - "독감", - "독립", - "독서", - "독일", - "독창적", - "동화책", - "뒷모습", - "뒷산", - "딸아이", - "마누라", - "마늘", - "마당", - "마라톤", - "마련", - "마무리", - "마사지", - "마약", - "마요네즈", - "마을", - "마음", - "마이크", - "마중", - "마지막", - "마찬가지", - "마찰", - "마흔", - "막걸리", - "막내", - "막상", - "만남", - "만두", - "만세", - "만약", - "만일", - "만점", - "만족", - "만화", - "많이", - "말기", - "말씀", - "말투", - "맘대로", - "망원경", - "매년", - "매달", - "매력", - "매번", - "매스컴", - "매일", - "매장", - "맥주", - "먹이", - "먼저", - "먼지", - "멀리", - "메일", - "며느리", - "며칠", - "면담", - "멸치", - "명단", - "명령", - "명예", - "명의", - "명절", - "명칭", - "명함", - "모금", - "모니터", - "모델", - "모든", - "모범", - "모습", - "모양", - "모임", - "모조리", - "모집", - "모퉁이", - "목걸이", - "목록", - "목사", - "목소리", - "목숨", - "목적", - "목표", - "몰래", - "몸매", - "몸무게", - "몸살", - "몸속", - "몸짓", - "몸통", - "몹시", - "무관심", - "무궁화", - "무더위", - "무덤", - "무릎", - "무슨", - "무엇", - "무역", - "무용", - "무조건", - "무지개", - "무척", - "문구", - "문득", - "문법", - "문서", - "문제", - "문학", - "문화", - "물가", - "물건", - "물결", - "물고기", - "물론", - "물리학", - "물음", - "물질", - "물체", - "미국", - "미디어", - "미사일", - "미술", - "미역", - "미용실", - "미움", - "미인", - "미팅", - "미혼", - "민간", - "민족", - "민주", - "믿음", - "밀가루", - "밀리미터", - "밑바닥", - "바가지", - "바구니", - "바나나", - "바늘", - "바닥", - "바닷가", - "바람", - "바이러스", - "바탕", - "박물관", - "박사", - "박수", - "반대", - "반드시", - "반말", - "반발", - "반성", - "반응", - "반장", - "반죽", - "반지", - "반찬", - "받침", - "발가락", - "발걸음", - "발견", - "발달", - "발레", - "발목", - "발바닥", - "발생", - "발음", - "발자국", - "발전", - "발톱", - "발표", - "밤하늘", - "밥그릇", - "밥맛", - "밥상", - "밥솥", - "방금", - "방면", - "방문", - "방바닥", - "방법", - "방송", - "방식", - "방안", - "방울", - "방지", - "방학", - "방해", - "방향", - "배경", - "배꼽", - "배달", - "배드민턴", - "백두산", - "백색", - "백성", - "백인", - "백제", - "백화점", - "버릇", - "버섯", - "버튼", - "번개", - "번역", - "번지", - "번호", - "벌금", - "벌레", - "벌써", - "범위", - "범인", - "범죄", - "법률", - "법원", - "법적", - "법칙", - "베이징", - "벨트", - "변경", - "변동", - "변명", - "변신", - "변호사", - "변화", - "별도", - "별명", - "별일", - "병실", - "병아리", - "병원", - "보관", - "보너스", - "보라색", - "보람", - "보름", - "보상", - "보안", - "보자기", - "보장", - "보전", - "보존", - "보통", - "보편적", - "보험", - "복도", - "복사", - "복숭아", - "복습", - "볶음", - "본격적", - "본래", - "본부", - "본사", - "본성", - "본인", - "본질", - "볼펜", - "봉사", - "봉지", - "봉투", - "부근", - "부끄러움", - "부담", - "부동산", - "부문", - "부분", - "부산", - "부상", - "부엌", - "부인", - "부작용", - "부장", - "부정", - "부족", - "부지런히", - "부친", - "부탁", - "부품", - "부회장", - "북부", - "북한", - "분노", - "분량", - "분리", - "분명", - "분석", - "분야", - "분위기", - "분필", - "분홍색", - "불고기", - "불과", - "불교", - "불꽃", - "불만", - "불법", - "불빛", - "불안", - "불이익", - "불행", - "브랜드", - "비극", - "비난", - "비닐", - "비둘기", - "비디오", - "비로소", - "비만", - "비명", - "비밀", - "비바람", - "비빔밥", - "비상", - "비용", - "비율", - "비중", - "비타민", - "비판", - "빌딩", - "빗물", - "빗방울", - "빗줄기", - "빛깔", - "빨간색", - "빨래", - "빨리", - "사건", - "사계절", - "사나이", - "사냥", - "사람", - "사랑", - "사립", - "사모님", - "사물", - "사방", - "사상", - "사생활", - "사설", - "사슴", - "사실", - "사업", - "사용", - "사월", - "사장", - "사전", - "사진", - "사촌", - "사춘기", - "사탕", - "사투리", - "사흘", - "산길", - "산부인과", - "산업", - "산책", - "살림", - "살인", - "살짝", - "삼계탕", - "삼국", - "삼십", - "삼월", - "삼촌", - "상관", - "상금", - "상대", - "상류", - "상반기", - "상상", - "상식", - "상업", - "상인", - "상자", - "상점", - "상처", - "상추", - "상태", - "상표", - "상품", - "상황", - "새벽", - "색깔", - "색연필", - "생각", - "생명", - "생물", - "생방송", - "생산", - "생선", - "생신", - "생일", - "생활", - "서랍", - "서른", - "서명", - "서민", - "서비스", - "서양", - "서울", - "서적", - "서점", - "서쪽", - "서클", - "석사", - "석유", - "선거", - "선물", - "선배", - "선생", - "선수", - "선원", - "선장", - "선전", - "선택", - "선풍기", - "설거지", - "설날", - "설렁탕", - "설명", - "설문", - "설사", - "설악산", - "설치", - "설탕", - "섭씨", - "성공", - "성당", - "성명", - "성별", - "성인", - "성장", - "성적", - "성질", - "성함", - "세금", - "세미나", - "세상", - "세월", - "세종대왕", - "세탁", - "센터", - "센티미터", - "셋째", - "소규모", - "소극적", - "소금", - "소나기", - "소년", - "소득", - "소망", - "소문", - "소설", - "소속", - "소아과", - "소용", - "소원", - "소음", - "소중히", - "소지품", - "소질", - "소풍", - "소형", - "속담", - "속도", - "속옷", - "손가락", - "손길", - "손녀", - "손님", - "손등", - "손목", - "손뼉", - "손실", - "손질", - "손톱", - "손해", - "솔직히", - "솜씨", - "송아지", - "송이", - "송편", - "쇠고기", - "쇼핑", - "수건", - "수년", - "수단", - "수돗물", - "수동적", - "수면", - "수명", - "수박", - "수상", - "수석", - "수술", - "수시로", - "수업", - "수염", - "수영", - "수입", - "수준", - "수집", - "수출", - "수컷", - "수필", - "수학", - "수험생", - "수화기", - "숙녀", - "숙소", - "숙제", - "순간", - "순서", - "순수", - "순식간", - "순위", - "숟가락", - "술병", - "술집", - "숫자", - "스님", - "스물", - "스스로", - "스승", - "스웨터", - "스위치", - "스케이트", - "스튜디오", - "스트레스", - "스포츠", - "슬쩍", - "슬픔", - "습관", - "습기", - "승객", - "승리", - "승부", - "승용차", - "승진", - "시각", - "시간", - "시골", - "시금치", - "시나리오", - "시댁", - "시리즈", - "시멘트", - "시민", - "시부모", - "시선", - "시설", - "시스템", - "시아버지", - "시어머니", - "시월", - "시인", - "시일", - "시작", - "시장", - "시절", - "시점", - "시중", - "시즌", - "시집", - "시청", - "시합", - "시험", - "식구", - "식기", - "식당", - "식량", - "식료품", - "식물", - "식빵", - "식사", - "식생활", - "식초", - "식탁", - "식품", - "신고", - "신규", - "신념", - "신문", - "신발", - "신비", - "신사", - "신세", - "신용", - "신제품", - "신청", - "신체", - "신화", - "실감", - "실내", - "실력", - "실례", - "실망", - "실수", - "실습", - "실시", - "실장", - "실정", - "실질적", - "실천", - "실체", - "실컷", - "실태", - "실패", - "실험", - "실현", - "심리", - "심부름", - "심사", - "심장", - "심정", - "심판", - "쌍둥이", - "씨름", - "씨앗", - "아가씨", - "아나운서", - "아드님", - "아들", - "아쉬움", - "아스팔트", - "아시아", - "아울러", - "아저씨", - "아줌마", - "아직", - "아침", - "아파트", - "아프리카", - "아픔", - "아홉", - "아흔", - "악기", - "악몽", - "악수", - "안개", - "안경", - "안과", - "안내", - "안녕", - "안동", - "안방", - "안부", - "안주", - "알루미늄", - "알코올", - "암시", - "암컷", - "압력", - "앞날", - "앞문", - "애인", - "애정", - "액수", - "앨범", - "야간", - "야단", - "야옹", - "약간", - "약국", - "약속", - "약수", - "약점", - "약품", - "약혼녀", - "양념", - "양력", - "양말", - "양배추", - "양주", - "양파", - "어둠", - "어려움", - "어른", - "어젯밤", - "어쨌든", - "어쩌다가", - "어쩐지", - "언니", - "언덕", - "언론", - "언어", - "얼굴", - "얼른", - "얼음", - "얼핏", - "엄마", - "업무", - "업종", - "업체", - "엉덩이", - "엉망", - "엉터리", - "엊그제", - "에너지", - "에어컨", - "엔진", - "여건", - "여고생", - "여관", - "여군", - "여권", - "여대생", - "여덟", - "여동생", - "여든", - "여론", - "여름", - "여섯", - "여성", - "여왕", - "여인", - "여전히", - "여직원", - "여학생", - "여행", - "역사", - "역시", - "역할", - "연결", - "연구", - "연극", - "연기", - "연락", - "연설", - "연세", - "연속", - "연습", - "연애", - "연예인", - "연인", - "연장", - "연주", - "연출", - "연필", - "연합", - "연휴", - "열기", - "열매", - "열쇠", - "열심히", - "열정", - "열차", - "열흘", - "염려", - "엽서", - "영국", - "영남", - "영상", - "영양", - "영역", - "영웅", - "영원히", - "영하", - "영향", - "영혼", - "영화", - "옆구리", - "옆방", - "옆집", - "예감", - "예금", - "예방", - "예산", - "예상", - "예선", - "예술", - "예습", - "예식장", - "예약", - "예전", - "예절", - "예정", - "예컨대", - "옛날", - "오늘", - "오락", - "오랫동안", - "오렌지", - "오로지", - "오른발", - "오븐", - "오십", - "오염", - "오월", - "오전", - "오직", - "오징어", - "오페라", - "오피스텔", - "오히려", - "옥상", - "옥수수", - "온갖", - "온라인", - "온몸", - "온종일", - "온통", - "올가을", - "올림픽", - "올해", - "옷차림", - "와이셔츠", - "와인", - "완성", - "완전", - "왕비", - "왕자", - "왜냐하면", - "왠지", - "외갓집", - "외국", - "외로움", - "외삼촌", - "외출", - "외침", - "외할머니", - "왼발", - "왼손", - "왼쪽", - "요금", - "요일", - "요즘", - "요청", - "용기", - "용서", - "용어", - "우산", - "우선", - "우승", - "우연히", - "우정", - "우체국", - "우편", - "운동", - "운명", - "운반", - "운전", - "운행", - "울산", - "울음", - "움직임", - "웃어른", - "웃음", - "워낙", - "원고", - "원래", - "원서", - "원숭이", - "원인", - "원장", - "원피스", - "월급", - "월드컵", - "월세", - "월요일", - "웨이터", - "위반", - "위법", - "위성", - "위원", - "위험", - "위협", - "윗사람", - "유난히", - "유럽", - "유명", - "유물", - "유산", - "유적", - "유치원", - "유학", - "유행", - "유형", - "육군", - "육상", - "육십", - "육체", - "은행", - "음력", - "음료", - "음반", - "음성", - "음식", - "음악", - "음주", - "의견", - "의논", - "의문", - "의복", - "의식", - "의심", - "의외로", - "의욕", - "의원", - "의학", - "이것", - "이곳", - "이념", - "이놈", - "이달", - "이대로", - "이동", - "이렇게", - "이력서", - "이론적", - "이름", - "이민", - "이발소", - "이별", - "이불", - "이빨", - "이상", - "이성", - "이슬", - "이야기", - "이용", - "이웃", - "이월", - "이윽고", - "이익", - "이전", - "이중", - "이튿날", - "이틀", - "이혼", - "인간", - "인격", - "인공", - "인구", - "인근", - "인기", - "인도", - "인류", - "인물", - "인생", - "인쇄", - "인연", - "인원", - "인재", - "인종", - "인천", - "인체", - "인터넷", - "인하", - "인형", - "일곱", - "일기", - "일단", - "일대", - "일등", - "일반", - "일본", - "일부", - "일상", - "일생", - "일손", - "일요일", - "일월", - "일정", - "일종", - "일주일", - "일찍", - "일체", - "일치", - "일행", - "일회용", - "임금", - "임무", - "입대", - "입력", - "입맛", - "입사", - "입술", - "입시", - "입원", - "입장", - "입학", - "자가용", - "자격", - "자극", - "자동", - "자랑", - "자부심", - "자식", - "자신", - "자연", - "자원", - "자율", - "자전거", - "자정", - "자존심", - "자판", - "작가", - "작년", - "작성", - "작업", - "작용", - "작은딸", - "작품", - "잔디", - "잔뜩", - "잔치", - "잘못", - "잠깐", - "잠수함", - "잠시", - "잠옷", - "잠자리", - "잡지", - "장관", - "장군", - "장기간", - "장래", - "장례", - "장르", - "장마", - "장면", - "장모", - "장미", - "장비", - "장사", - "장소", - "장식", - "장애인", - "장인", - "장점", - "장차", - "장학금", - "재능", - "재빨리", - "재산", - "재생", - "재작년", - "재정", - "재채기", - "재판", - "재학", - "재활용", - "저것", - "저고리", - "저곳", - "저녁", - "저런", - "저렇게", - "저번", - "저울", - "저절로", - "저축", - "적극", - "적당히", - "적성", - "적용", - "적응", - "전개", - "전공", - "전기", - "전달", - "전라도", - "전망", - "전문", - "전반", - "전부", - "전세", - "전시", - "전용", - "전자", - "전쟁", - "전주", - "전철", - "전체", - "전통", - "전혀", - "전후", - "절대", - "절망", - "절반", - "절약", - "절차", - "점검", - "점수", - "점심", - "점원", - "점점", - "점차", - "접근", - "접시", - "접촉", - "젓가락", - "정거장", - "정도", - "정류장", - "정리", - "정말", - "정면", - "정문", - "정반대", - "정보", - "정부", - "정비", - "정상", - "정성", - "정오", - "정원", - "정장", - "정지", - "정치", - "정확히", - "제공", - "제과점", - "제대로", - "제목", - "제발", - "제법", - "제삿날", - "제안", - "제일", - "제작", - "제주도", - "제출", - "제품", - "제한", - "조각", - "조건", - "조금", - "조깅", - "조명", - "조미료", - "조상", - "조선", - "조용히", - "조절", - "조정", - "조직", - "존댓말", - "존재", - "졸업", - "졸음", - "종교", - "종로", - "종류", - "종소리", - "종업원", - "종종", - "종합", - "좌석", - "죄인", - "주관적", - "주름", - "주말", - "주머니", - "주먹", - "주문", - "주민", - "주방", - "주변", - "주식", - "주인", - "주일", - "주장", - "주전자", - "주택", - "준비", - "줄거리", - "줄기", - "줄무늬", - "중간", - "중계방송", - "중국", - "중년", - "중단", - "중독", - "중반", - "중부", - "중세", - "중소기업", - "중순", - "중앙", - "중요", - "중학교", - "즉석", - "즉시", - "즐거움", - "증가", - "증거", - "증권", - "증상", - "증세", - "지각", - "지갑", - "지경", - "지극히", - "지금", - "지급", - "지능", - "지름길", - "지리산", - "지방", - "지붕", - "지식", - "지역", - "지우개", - "지원", - "지적", - "지점", - "지진", - "지출", - "직선", - "직업", - "직원", - "직장", - "진급", - "진동", - "진로", - "진료", - "진리", - "진짜", - "진찰", - "진출", - "진통", - "진행", - "질문", - "질병", - "질서", - "짐작", - "집단", - "집안", - "집중", - "짜증", - "찌꺼기", - "차남", - "차라리", - "차량", - "차림", - "차별", - "차선", - "차츰", - "착각", - "찬물", - "찬성", - "참가", - "참기름", - "참새", - "참석", - "참여", - "참외", - "참조", - "찻잔", - "창가", - "창고", - "창구", - "창문", - "창밖", - "창작", - "창조", - "채널", - "채점", - "책가방", - "책방", - "책상", - "책임", - "챔피언", - "처벌", - "처음", - "천국", - "천둥", - "천장", - "천재", - "천천히", - "철도", - "철저히", - "철학", - "첫날", - "첫째", - "청년", - "청바지", - "청소", - "청춘", - "체계", - "체력", - "체온", - "체육", - "체중", - "체험", - "초등학생", - "초반", - "초밥", - "초상화", - "초순", - "초여름", - "초원", - "초저녁", - "초점", - "초청", - "초콜릿", - "촛불", - "총각", - "총리", - "총장", - "촬영", - "최근", - "최상", - "최선", - "최신", - "최악", - "최종", - "추석", - "추억", - "추진", - "추천", - "추측", - "축구", - "축소", - "축제", - "축하", - "출근", - "출발", - "출산", - "출신", - "출연", - "출입", - "출장", - "출판", - "충격", - "충고", - "충돌", - "충분히", - "충청도", - "취업", - "취직", - "취향", - "치약", - "친구", - "친척", - "칠십", - "칠월", - "칠판", - "침대", - "침묵", - "침실", - "칫솔", - "칭찬", - "카메라", - "카운터", - "칼국수", - "캐릭터", - "캠퍼스", - "캠페인", - "커튼", - "컨디션", - "컬러", - "컴퓨터", - "코끼리", - "코미디", - "콘서트", - "콜라", - "콤플렉스", - "콩나물", - "쾌감", - "쿠데타", - "크림", - "큰길", - "큰딸", - "큰소리", - "큰아들", - "큰어머니", - "큰일", - "큰절", - "클래식", - "클럽", - "킬로", - "타입", - "타자기", - "탁구", - "탁자", - "탄생", - "태권도", - "태양", - "태풍", - "택시", - "탤런트", - "터널", - "터미널", - "테니스", - "테스트", - "테이블", - "텔레비전", - "토론", - "토마토", - "토요일", - "통계", - "통과", - "통로", - "통신", - "통역", - "통일", - "통장", - "통제", - "통증", - "통합", - "통화", - "퇴근", - "퇴원", - "퇴직금", - "튀김", - "트럭", - "특급", - "특별", - "특성", - "특수", - "특징", - "특히", - "튼튼히", - "티셔츠", - "파란색", - "파일", - "파출소", - "판결", - "판단", - "판매", - "판사", - "팔십", - "팔월", - "팝송", - "패션", - "팩스", - "팩시밀리", - "팬티", - "퍼센트", - "페인트", - "편견", - "편의", - "편지", - "편히", - "평가", - "평균", - "평생", - "평소", - "평양", - "평일", - "평화", - "포스터", - "포인트", - "포장", - "포함", - "표면", - "표정", - "표준", - "표현", - "품목", - "품질", - "풍경", - "풍속", - "풍습", - "프랑스", - "프린터", - "플라스틱", - "피곤", - "피망", - "피아노", - "필름", - "필수", - "필요", - "필자", - "필통", - "핑계", - "하느님", - "하늘", - "하드웨어", - "하룻밤", - "하반기", - "하숙집", - "하순", - "하여튼", - "하지만", - "하천", - "하품", - "하필", - "학과", - "학교", - "학급", - "학기", - "학년", - "학력", - "학번", - "학부모", - "학비", - "학생", - "학술", - "학습", - "학용품", - "학원", - "학위", - "학자", - "학점", - "한계", - "한글", - "한꺼번에", - "한낮", - "한눈", - "한동안", - "한때", - "한라산", - "한마디", - "한문", - "한번", - "한복", - "한식", - "한여름", - "한쪽", - "할머니", - "할아버지", - "할인", - "함께", - "함부로", - "합격", - "합리적", - "항공", - "항구", - "항상", - "항의", - "해결", - "해군", - "해답", - "해당", - "해물", - "해석", - "해설", - "해수욕장", - "해안", - "핵심", - "핸드백", - "햄버거", - "햇볕", - "햇살", - "행동", - "행복", - "행사", - "행운", - "행위", - "향기", - "향상", - "향수", - "허락", - "허용", - "헬기", - "현관", - "현금", - "현대", - "현상", - "현실", - "현장", - "현재", - "현지", - "혈액", - "협력", - "형부", - "형사", - "형수", - "형식", - "형제", - "형태", - "형편", - "혜택", - "호기심", - "호남", - "호랑이", - "호박", - "호텔", - "호흡", - "혹시", - "홀로", - "홈페이지", - "홍보", - "홍수", - "홍차", - "화면", - "화분", - "화살", - "화요일", - "화장", - "화학", - "확보", - "확인", - "확장", - "확정", - "환갑", - "환경", - "환영", - "환율", - "환자", - "활기", - "활동", - "활발히", - "활용", - "활짝", - "회견", - "회관", - "회복", - "회색", - "회원", - "회장", - "회전", - "횟수", - "횡단보도", - "효율적", - "후반", - "후춧가루", - "훈련", - "훨씬", - "휴식", - "휴일", - "흉내", - "흐름", - "흑백", - "흑인", - "흔적", - "흔히", - "흥미", - "흥분", - "희곡", - "희망", - "희생", - "흰색", - "힘껏" -]; +export { wordlist } from "@scure/bip39/wordlists/korean"; diff --git a/src/bip39/wordlists/simplified-chinese.ts b/src/bip39/wordlists/simplified-chinese.ts index 46b3a39..1aff712 100644 --- a/src/bip39/wordlists/simplified-chinese.ts +++ b/src/bip39/wordlists/simplified-chinese.ts @@ -1,2050 +1 @@ -export const wordlist: string[] = [ - "的", - "一", - "是", - "在", - "不", - "了", - "有", - "和", - "人", - "这", - "中", - "大", - "为", - "上", - "个", - "国", - "我", - "以", - "要", - "他", - "时", - "来", - "用", - "们", - "生", - "到", - "作", - "地", - "于", - "出", - "就", - "分", - "对", - "成", - "会", - "可", - "主", - "发", - "年", - "动", - "同", - "工", - "也", - "能", - "下", - "过", - "子", - "说", - "产", - "种", - "面", - "而", - "方", - "后", - "多", - "定", - "行", - "学", - "法", - "所", - "民", - "得", - "经", - "十", - "三", - "之", - "进", - "着", - "等", - "部", - "度", - "家", - "电", - "力", - "里", - "如", - "水", - "化", - "高", - "自", - "二", - "理", - "起", - "小", - "物", - "现", - "实", - "加", - "量", - "都", - "两", - "体", - "制", - "机", - "当", - "使", - "点", - "从", - "业", - "本", - "去", - "把", - "性", - "好", - "应", - "开", - "它", - "合", - "还", - "因", - "由", - "其", - "些", - "然", - "前", - "外", - "天", - "政", - "四", - "日", - "那", - "社", - "义", - "事", - "平", - "形", - "相", - "全", - "表", - "间", - "样", - "与", - "关", - "各", - "重", - "新", - "线", - "内", - "数", - "正", - "心", - "反", - "你", - "明", - "看", - "原", - "又", - "么", - "利", - "比", - "或", - "但", - "质", - "气", - "第", - "向", - "道", - "命", - "此", - "变", - "条", - "只", - "没", - "结", - "解", - "问", - "意", - "建", - "月", - "公", - "无", - "系", - "军", - "很", - "情", - "者", - "最", - "立", - "代", - "想", - "已", - "通", - "并", - "提", - "直", - "题", - "党", - "程", - "展", - "五", - "果", - "料", - "象", - "员", - "革", - "位", - "入", - "常", - "文", - "总", - "次", - "品", - "式", - "活", - "设", - "及", - "管", - "特", - "件", - "长", - "求", - "老", - "头", - "基", - "资", - "边", - "流", - "路", - "级", - "少", - "图", - "山", - "统", - "接", - "知", - "较", - "将", - "组", - "见", - "计", - "别", - "她", - "手", - "角", - "期", - "根", - "论", - "运", - "农", - "指", - "几", - "九", - "区", - "强", - "放", - "决", - "西", - "被", - "干", - "做", - "必", - "战", - "先", - "回", - "则", - "任", - "取", - "据", - "处", - "队", - "南", - "给", - "色", - "光", - "门", - "即", - "保", - "治", - "北", - "造", - "百", - "规", - "热", - "领", - "七", - "海", - "口", - "东", - "导", - "器", - "压", - "志", - "世", - "金", - "增", - "争", - "济", - "阶", - "油", - "思", - "术", - "极", - "交", - "受", - "联", - "什", - "认", - "六", - "共", - "权", - "收", - "证", - "改", - "清", - "美", - "再", - "采", - "转", - "更", - "单", - "风", - "切", - "打", - "白", - "教", - "速", - "花", - "带", - "安", - "场", - "身", - "车", - "例", - "真", - "务", - "具", - "万", - "每", - "目", - "至", - "达", - "走", - "积", - "示", - "议", - "声", - "报", - "斗", - "完", - "类", - "八", - "离", - "华", - "名", - "确", - "才", - "科", - "张", - "信", - "马", - "节", - "话", - "米", - "整", - "空", - "元", - "况", - "今", - "集", - "温", - "传", - "土", - "许", - "步", - "群", - "广", - "石", - "记", - "需", - "段", - "研", - "界", - "拉", - "林", - "律", - "叫", - "且", - "究", - "观", - "越", - "织", - "装", - "影", - "算", - "低", - "持", - "音", - "众", - "书", - "布", - "复", - "容", - "儿", - "须", - "际", - "商", - "非", - "验", - "连", - "断", - "深", - "难", - "近", - "矿", - "千", - "周", - "委", - "素", - "技", - "备", - "半", - "办", - "青", - "省", - "列", - "习", - "响", - "约", - "支", - "般", - "史", - "感", - "劳", - "便", - "团", - "往", - "酸", - "历", - "市", - "克", - "何", - "除", - "消", - "构", - "府", - "称", - "太", - "准", - "精", - "值", - "号", - "率", - "族", - "维", - "划", - "选", - "标", - "写", - "存", - "候", - "毛", - "亲", - "快", - "效", - "斯", - "院", - "查", - "江", - "型", - "眼", - "王", - "按", - "格", - "养", - "易", - "置", - "派", - "层", - "片", - "始", - "却", - "专", - "状", - "育", - "厂", - "京", - "识", - "适", - "属", - "圆", - "包", - "火", - "住", - "调", - "满", - "县", - "局", - "照", - "参", - "红", - "细", - "引", - "听", - "该", - "铁", - "价", - "严", - "首", - "底", - "液", - "官", - "德", - "随", - "病", - "苏", - "失", - "尔", - "死", - "讲", - "配", - "女", - "黄", - "推", - "显", - "谈", - "罪", - "神", - "艺", - "呢", - "席", - "含", - "企", - "望", - "密", - "批", - "营", - "项", - "防", - "举", - "球", - "英", - "氧", - "势", - "告", - "李", - "台", - "落", - "木", - "帮", - "轮", - "破", - "亚", - "师", - "围", - "注", - "远", - "字", - "材", - "排", - "供", - "河", - "态", - "封", - "另", - "施", - "减", - "树", - "溶", - "怎", - "止", - "案", - "言", - "士", - "均", - "武", - "固", - "叶", - "鱼", - "波", - "视", - "仅", - "费", - "紧", - "爱", - "左", - "章", - "早", - "朝", - "害", - "续", - "轻", - "服", - "试", - "食", - "充", - "兵", - "源", - "判", - "护", - "司", - "足", - "某", - "练", - "差", - "致", - "板", - "田", - "降", - "黑", - "犯", - "负", - "击", - "范", - "继", - "兴", - "似", - "余", - "坚", - "曲", - "输", - "修", - "故", - "城", - "夫", - "够", - "送", - "笔", - "船", - "占", - "右", - "财", - "吃", - "富", - "春", - "职", - "觉", - "汉", - "画", - "功", - "巴", - "跟", - "虽", - "杂", - "飞", - "检", - "吸", - "助", - "升", - "阳", - "互", - "初", - "创", - "抗", - "考", - "投", - "坏", - "策", - "古", - "径", - "换", - "未", - "跑", - "留", - "钢", - "曾", - "端", - "责", - "站", - "简", - "述", - "钱", - "副", - "尽", - "帝", - "射", - "草", - "冲", - "承", - "独", - "令", - "限", - "阿", - "宣", - "环", - "双", - "请", - "超", - "微", - "让", - "控", - "州", - "良", - "轴", - "找", - "否", - "纪", - "益", - "依", - "优", - "顶", - "础", - "载", - "倒", - "房", - "突", - "坐", - "粉", - "敌", - "略", - "客", - "袁", - "冷", - "胜", - "绝", - "析", - "块", - "剂", - "测", - "丝", - "协", - "诉", - "念", - "陈", - "仍", - "罗", - "盐", - "友", - "洋", - "错", - "苦", - "夜", - "刑", - "移", - "频", - "逐", - "靠", - "混", - "母", - "短", - "皮", - "终", - "聚", - "汽", - "村", - "云", - "哪", - "既", - "距", - "卫", - "停", - "烈", - "央", - "察", - "烧", - "迅", - "境", - "若", - "印", - "洲", - "刻", - "括", - "激", - "孔", - "搞", - "甚", - "室", - "待", - "核", - "校", - "散", - "侵", - "吧", - "甲", - "游", - "久", - "菜", - "味", - "旧", - "模", - "湖", - "货", - "损", - "预", - "阻", - "毫", - "普", - "稳", - "乙", - "妈", - "植", - "息", - "扩", - "银", - "语", - "挥", - "酒", - "守", - "拿", - "序", - "纸", - "医", - "缺", - "雨", - "吗", - "针", - "刘", - "啊", - "急", - "唱", - "误", - "训", - "愿", - "审", - "附", - "获", - "茶", - "鲜", - "粮", - "斤", - "孩", - "脱", - "硫", - "肥", - "善", - "龙", - "演", - "父", - "渐", - "血", - "欢", - "械", - "掌", - "歌", - "沙", - "刚", - "攻", - "谓", - "盾", - "讨", - "晚", - "粒", - "乱", - "燃", - "矛", - "乎", - "杀", - "药", - "宁", - "鲁", - "贵", - "钟", - "煤", - "读", - "班", - "伯", - "香", - "介", - "迫", - "句", - "丰", - "培", - "握", - "兰", - "担", - "弦", - "蛋", - "沉", - "假", - "穿", - "执", - "答", - "乐", - "谁", - "顺", - "烟", - "缩", - "征", - "脸", - "喜", - "松", - "脚", - "困", - "异", - "免", - "背", - "星", - "福", - "买", - "染", - "井", - "概", - "慢", - "怕", - "磁", - "倍", - "祖", - "皇", - "促", - "静", - "补", - "评", - "翻", - "肉", - "践", - "尼", - "衣", - "宽", - "扬", - "棉", - "希", - "伤", - "操", - "垂", - "秋", - "宜", - "氢", - "套", - "督", - "振", - "架", - "亮", - "末", - "宪", - "庆", - "编", - "牛", - "触", - "映", - "雷", - "销", - "诗", - "座", - "居", - "抓", - "裂", - "胞", - "呼", - "娘", - "景", - "威", - "绿", - "晶", - "厚", - "盟", - "衡", - "鸡", - "孙", - "延", - "危", - "胶", - "屋", - "乡", - "临", - "陆", - "顾", - "掉", - "呀", - "灯", - "岁", - "措", - "束", - "耐", - "剧", - "玉", - "赵", - "跳", - "哥", - "季", - "课", - "凯", - "胡", - "额", - "款", - "绍", - "卷", - "齐", - "伟", - "蒸", - "殖", - "永", - "宗", - "苗", - "川", - "炉", - "岩", - "弱", - "零", - "杨", - "奏", - "沿", - "露", - "杆", - "探", - "滑", - "镇", - "饭", - "浓", - "航", - "怀", - "赶", - "库", - "夺", - "伊", - "灵", - "税", - "途", - "灭", - "赛", - "归", - "召", - "鼓", - "播", - "盘", - "裁", - "险", - "康", - "唯", - "录", - "菌", - "纯", - "借", - "糖", - "盖", - "横", - "符", - "私", - "努", - "堂", - "域", - "枪", - "润", - "幅", - "哈", - "竟", - "熟", - "虫", - "泽", - "脑", - "壤", - "碳", - "欧", - "遍", - "侧", - "寨", - "敢", - "彻", - "虑", - "斜", - "薄", - "庭", - "纳", - "弹", - "饲", - "伸", - "折", - "麦", - "湿", - "暗", - "荷", - "瓦", - "塞", - "床", - "筑", - "恶", - "户", - "访", - "塔", - "奇", - "透", - "梁", - "刀", - "旋", - "迹", - "卡", - "氯", - "遇", - "份", - "毒", - "泥", - "退", - "洗", - "摆", - "灰", - "彩", - "卖", - "耗", - "夏", - "择", - "忙", - "铜", - "献", - "硬", - "予", - "繁", - "圈", - "雪", - "函", - "亦", - "抽", - "篇", - "阵", - "阴", - "丁", - "尺", - "追", - "堆", - "雄", - "迎", - "泛", - "爸", - "楼", - "避", - "谋", - "吨", - "野", - "猪", - "旗", - "累", - "偏", - "典", - "馆", - "索", - "秦", - "脂", - "潮", - "爷", - "豆", - "忽", - "托", - "惊", - "塑", - "遗", - "愈", - "朱", - "替", - "纤", - "粗", - "倾", - "尚", - "痛", - "楚", - "谢", - "奋", - "购", - "磨", - "君", - "池", - "旁", - "碎", - "骨", - "监", - "捕", - "弟", - "暴", - "割", - "贯", - "殊", - "释", - "词", - "亡", - "壁", - "顿", - "宝", - "午", - "尘", - "闻", - "揭", - "炮", - "残", - "冬", - "桥", - "妇", - "警", - "综", - "招", - "吴", - "付", - "浮", - "遭", - "徐", - "您", - "摇", - "谷", - "赞", - "箱", - "隔", - "订", - "男", - "吹", - "园", - "纷", - "唐", - "败", - "宋", - "玻", - "巨", - "耕", - "坦", - "荣", - "闭", - "湾", - "键", - "凡", - "驻", - "锅", - "救", - "恩", - "剥", - "凝", - "碱", - "齿", - "截", - "炼", - "麻", - "纺", - "禁", - "废", - "盛", - "版", - "缓", - "净", - "睛", - "昌", - "婚", - "涉", - "筒", - "嘴", - "插", - "岸", - "朗", - "庄", - "街", - "藏", - "姑", - "贸", - "腐", - "奴", - "啦", - "惯", - "乘", - "伙", - "恢", - "匀", - "纱", - "扎", - "辩", - "耳", - "彪", - "臣", - "亿", - "璃", - "抵", - "脉", - "秀", - "萨", - "俄", - "网", - "舞", - "店", - "喷", - "纵", - "寸", - "汗", - "挂", - "洪", - "贺", - "闪", - "柬", - "爆", - "烯", - "津", - "稻", - "墙", - "软", - "勇", - "像", - "滚", - "厘", - "蒙", - "芳", - "肯", - "坡", - "柱", - "荡", - "腿", - "仪", - "旅", - "尾", - "轧", - "冰", - "贡", - "登", - "黎", - "削", - "钻", - "勒", - "逃", - "障", - "氨", - "郭", - "峰", - "币", - "港", - "伏", - "轨", - "亩", - "毕", - "擦", - "莫", - "刺", - "浪", - "秘", - "援", - "株", - "健", - "售", - "股", - "岛", - "甘", - "泡", - "睡", - "童", - "铸", - "汤", - "阀", - "休", - "汇", - "舍", - "牧", - "绕", - "炸", - "哲", - "磷", - "绩", - "朋", - "淡", - "尖", - "启", - "陷", - "柴", - "呈", - "徒", - "颜", - "泪", - "稍", - "忘", - "泵", - "蓝", - "拖", - "洞", - "授", - "镜", - "辛", - "壮", - "锋", - "贫", - "虚", - "弯", - "摩", - "泰", - "幼", - "廷", - "尊", - "窗", - "纲", - "弄", - "隶", - "疑", - "氏", - "宫", - "姐", - "震", - "瑞", - "怪", - "尤", - "琴", - "循", - "描", - "膜", - "违", - "夹", - "腰", - "缘", - "珠", - "穷", - "森", - "枝", - "竹", - "沟", - "催", - "绳", - "忆", - "邦", - "剩", - "幸", - "浆", - "栏", - "拥", - "牙", - "贮", - "礼", - "滤", - "钠", - "纹", - "罢", - "拍", - "咱", - "喊", - "袖", - "埃", - "勤", - "罚", - "焦", - "潜", - "伍", - "墨", - "欲", - "缝", - "姓", - "刊", - "饱", - "仿", - "奖", - "铝", - "鬼", - "丽", - "跨", - "默", - "挖", - "链", - "扫", - "喝", - "袋", - "炭", - "污", - "幕", - "诸", - "弧", - "励", - "梅", - "奶", - "洁", - "灾", - "舟", - "鉴", - "苯", - "讼", - "抱", - "毁", - "懂", - "寒", - "智", - "埔", - "寄", - "届", - "跃", - "渡", - "挑", - "丹", - "艰", - "贝", - "碰", - "拔", - "爹", - "戴", - "码", - "梦", - "芽", - "熔", - "赤", - "渔", - "哭", - "敬", - "颗", - "奔", - "铅", - "仲", - "虎", - "稀", - "妹", - "乏", - "珍", - "申", - "桌", - "遵", - "允", - "隆", - "螺", - "仓", - "魏", - "锐", - "晓", - "氮", - "兼", - "隐", - "碍", - "赫", - "拨", - "忠", - "肃", - "缸", - "牵", - "抢", - "博", - "巧", - "壳", - "兄", - "杜", - "讯", - "诚", - "碧", - "祥", - "柯", - "页", - "巡", - "矩", - "悲", - "灌", - "龄", - "伦", - "票", - "寻", - "桂", - "铺", - "圣", - "恐", - "恰", - "郑", - "趣", - "抬", - "荒", - "腾", - "贴", - "柔", - "滴", - "猛", - "阔", - "辆", - "妻", - "填", - "撤", - "储", - "签", - "闹", - "扰", - "紫", - "砂", - "递", - "戏", - "吊", - "陶", - "伐", - "喂", - "疗", - "瓶", - "婆", - "抚", - "臂", - "摸", - "忍", - "虾", - "蜡", - "邻", - "胸", - "巩", - "挤", - "偶", - "弃", - "槽", - "劲", - "乳", - "邓", - "吉", - "仁", - "烂", - "砖", - "租", - "乌", - "舰", - "伴", - "瓜", - "浅", - "丙", - "暂", - "燥", - "橡", - "柳", - "迷", - "暖", - "牌", - "秧", - "胆", - "详", - "簧", - "踏", - "瓷", - "谱", - "呆", - "宾", - "糊", - "洛", - "辉", - "愤", - "竞", - "隙", - "怒", - "粘", - "乃", - "绪", - "肩", - "籍", - "敏", - "涂", - "熙", - "皆", - "侦", - "悬", - "掘", - "享", - "纠", - "醒", - "狂", - "锁", - "淀", - "恨", - "牲", - "霸", - "爬", - "赏", - "逆", - "玩", - "陵", - "祝", - "秒", - "浙", - "貌", - "役", - "彼", - "悉", - "鸭", - "趋", - "凤", - "晨", - "畜", - "辈", - "秩", - "卵", - "署", - "梯", - "炎", - "滩", - "棋", - "驱", - "筛", - "峡", - "冒", - "啥", - "寿", - "译", - "浸", - "泉", - "帽", - "迟", - "硅", - "疆", - "贷", - "漏", - "稿", - "冠", - "嫩", - "胁", - "芯", - "牢", - "叛", - "蚀", - "奥", - "鸣", - "岭", - "羊", - "凭", - "串", - "塘", - "绘", - "酵", - "融", - "盆", - "锡", - "庙", - "筹", - "冻", - "辅", - "摄", - "袭", - "筋", - "拒", - "僚", - "旱", - "钾", - "鸟", - "漆", - "沈", - "眉", - "疏", - "添", - "棒", - "穗", - "硝", - "韩", - "逼", - "扭", - "侨", - "凉", - "挺", - "碗", - "栽", - "炒", - "杯", - "患", - "馏", - "劝", - "豪", - "辽", - "勃", - "鸿", - "旦", - "吏", - "拜", - "狗", - "埋", - "辊", - "掩", - "饮", - "搬", - "骂", - "辞", - "勾", - "扣", - "估", - "蒋", - "绒", - "雾", - "丈", - "朵", - "姆", - "拟", - "宇", - "辑", - "陕", - "雕", - "偿", - "蓄", - "崇", - "剪", - "倡", - "厅", - "咬", - "驶", - "薯", - "刷", - "斥", - "番", - "赋", - "奉", - "佛", - "浇", - "漫", - "曼", - "扇", - "钙", - "桃", - "扶", - "仔", - "返", - "俗", - "亏", - "腔", - "鞋", - "棱", - "覆", - "框", - "悄", - "叔", - "撞", - "骗", - "勘", - "旺", - "沸", - "孤", - "吐", - "孟", - "渠", - "屈", - "疾", - "妙", - "惜", - "仰", - "狠", - "胀", - "谐", - "抛", - "霉", - "桑", - "岗", - "嘛", - "衰", - "盗", - "渗", - "脏", - "赖", - "涌", - "甜", - "曹", - "阅", - "肌", - "哩", - "厉", - "烃", - "纬", - "毅", - "昨", - "伪", - "症", - "煮", - "叹", - "钉", - "搭", - "茎", - "笼", - "酷", - "偷", - "弓", - "锥", - "恒", - "杰", - "坑", - "鼻", - "翼", - "纶", - "叙", - "狱", - "逮", - "罐", - "络", - "棚", - "抑", - "膨", - "蔬", - "寺", - "骤", - "穆", - "冶", - "枯", - "册", - "尸", - "凸", - "绅", - "坯", - "牺", - "焰", - "轰", - "欣", - "晋", - "瘦", - "御", - "锭", - "锦", - "丧", - "旬", - "锻", - "垄", - "搜", - "扑", - "邀", - "亭", - "酯", - "迈", - "舒", - "脆", - "酶", - "闲", - "忧", - "酚", - "顽", - "羽", - "涨", - "卸", - "仗", - "陪", - "辟", - "惩", - "杭", - "姚", - "肚", - "捉", - "飘", - "漂", - "昆", - "欺", - "吾", - "郎", - "烷", - "汁", - "呵", - "饰", - "萧", - "雅", - "邮", - "迁", - "燕", - "撒", - "姻", - "赴", - "宴", - "烦", - "债", - "帐", - "斑", - "铃", - "旨", - "醇", - "董", - "饼", - "雏", - "姿", - "拌", - "傅", - "腹", - "妥", - "揉", - "贤", - "拆", - "歪", - "葡", - "胺", - "丢", - "浩", - "徽", - "昂", - "垫", - "挡", - "览", - "贪", - "慰", - "缴", - "汪", - "慌", - "冯", - "诺", - "姜", - "谊", - "凶", - "劣", - "诬", - "耀", - "昏", - "躺", - "盈", - "骑", - "乔", - "溪", - "丛", - "卢", - "抹", - "闷", - "咨", - "刮", - "驾", - "缆", - "悟", - "摘", - "铒", - "掷", - "颇", - "幻", - "柄", - "惠", - "惨", - "佳", - "仇", - "腊", - "窝", - "涤", - "剑", - "瞧", - "堡", - "泼", - "葱", - "罩", - "霍", - "捞", - "胎", - "苍", - "滨", - "俩", - "捅", - "湘", - "砍", - "霞", - "邵", - "萄", - "疯", - "淮", - "遂", - "熊", - "粪", - "烘", - "宿", - "档", - "戈", - "驳", - "嫂", - "裕", - "徙", - "箭", - "捐", - "肠", - "撑", - "晒", - "辨", - "殿", - "莲", - "摊", - "搅", - "酱", - "屏", - "疫", - "哀", - "蔡", - "堵", - "沫", - "皱", - "畅", - "叠", - "阁", - "莱", - "敲", - "辖", - "钩", - "痕", - "坝", - "巷", - "饿", - "祸", - "丘", - "玄", - "溜", - "曰", - "逻", - "彭", - "尝", - "卿", - "妨", - "艇", - "吞", - "韦", - "怨", - "矮", - "歇" -]; +export { wordlist } from "@scure/bip39/wordlists/simplified-chinese"; diff --git a/src/bip39/wordlists/spanish.ts b/src/bip39/wordlists/spanish.ts index fa5cc88..abf9af7 100644 --- a/src/bip39/wordlists/spanish.ts +++ b/src/bip39/wordlists/spanish.ts @@ -1,2050 +1 @@ -export const wordlist: string[] = [ - "ábaco", - "abdomen", - "abeja", - "abierto", - "abogado", - "abono", - "aborto", - "abrazo", - "abrir", - "abuelo", - "abuso", - "acabar", - "academia", - "acceso", - "acción", - "aceite", - "acelga", - "acento", - "aceptar", - "ácido", - "aclarar", - "acné", - "acoger", - "acoso", - "activo", - "acto", - "actriz", - "actuar", - "acudir", - "acuerdo", - "acusar", - "adicto", - "admitir", - "adoptar", - "adorno", - "aduana", - "adulto", - "aéreo", - "afectar", - "afición", - "afinar", - "afirmar", - "ágil", - "agitar", - "agonía", - "agosto", - "agotar", - "agregar", - "agrio", - "agua", - "agudo", - "águila", - "aguja", - "ahogo", - "ahorro", - "aire", - "aislar", - "ajedrez", - "ajeno", - "ajuste", - "alacrán", - "alambre", - "alarma", - "alba", - "álbum", - "alcalde", - "aldea", - "alegre", - "alejar", - "alerta", - "aleta", - "alfiler", - "alga", - "algodón", - "aliado", - "aliento", - "alivio", - "alma", - "almeja", - "almíbar", - "altar", - "alteza", - "altivo", - "alto", - "altura", - "alumno", - "alzar", - "amable", - "amante", - "amapola", - "amargo", - "amasar", - "ámbar", - "ámbito", - "ameno", - "amigo", - "amistad", - "amor", - "amparo", - "amplio", - "ancho", - "anciano", - "ancla", - "andar", - "andén", - "anemia", - "ángulo", - "anillo", - "ánimo", - "anís", - "anotar", - "antena", - "antiguo", - "antojo", - "anual", - "anular", - "anuncio", - "añadir", - "añejo", - "año", - "apagar", - "aparato", - "apetito", - "apio", - "aplicar", - "apodo", - "aporte", - "apoyo", - "aprender", - "aprobar", - "apuesta", - "apuro", - "arado", - "araña", - "arar", - "árbitro", - "árbol", - "arbusto", - "archivo", - "arco", - "arder", - "ardilla", - "arduo", - "área", - "árido", - "aries", - "armonía", - "arnés", - "aroma", - "arpa", - "arpón", - "arreglo", - "arroz", - "arruga", - "arte", - "artista", - "asa", - "asado", - "asalto", - "ascenso", - "asegurar", - "aseo", - "asesor", - "asiento", - "asilo", - "asistir", - "asno", - "asombro", - "áspero", - "astilla", - "astro", - "astuto", - "asumir", - "asunto", - "atajo", - "ataque", - "atar", - "atento", - "ateo", - "ático", - "atleta", - "átomo", - "atraer", - "atroz", - "atún", - "audaz", - "audio", - "auge", - "aula", - "aumento", - "ausente", - "autor", - "aval", - "avance", - "avaro", - "ave", - "avellana", - "avena", - "avestruz", - "avión", - "aviso", - "ayer", - "ayuda", - "ayuno", - "azafrán", - "azar", - "azote", - "azúcar", - "azufre", - "azul", - "baba", - "babor", - "bache", - "bahía", - "baile", - "bajar", - "balanza", - "balcón", - "balde", - "bambú", - "banco", - "banda", - "baño", - "barba", - "barco", - "barniz", - "barro", - "báscula", - "bastón", - "basura", - "batalla", - "batería", - "batir", - "batuta", - "baúl", - "bazar", - "bebé", - "bebida", - "bello", - "besar", - "beso", - "bestia", - "bicho", - "bien", - "bingo", - "blanco", - "bloque", - "blusa", - "boa", - "bobina", - "bobo", - "boca", - "bocina", - "boda", - "bodega", - "boina", - "bola", - "bolero", - "bolsa", - "bomba", - "bondad", - "bonito", - "bono", - "bonsái", - "borde", - "borrar", - "bosque", - "bote", - "botín", - "bóveda", - "bozal", - "bravo", - "brazo", - "brecha", - "breve", - "brillo", - "brinco", - "brisa", - "broca", - "broma", - "bronce", - "brote", - "bruja", - "brusco", - "bruto", - "buceo", - "bucle", - "bueno", - "buey", - "bufanda", - "bufón", - "búho", - "buitre", - "bulto", - "burbuja", - "burla", - "burro", - "buscar", - "butaca", - "buzón", - "caballo", - "cabeza", - "cabina", - "cabra", - "cacao", - "cadáver", - "cadena", - "caer", - "café", - "caída", - "caimán", - "caja", - "cajón", - "cal", - "calamar", - "calcio", - "caldo", - "calidad", - "calle", - "calma", - "calor", - "calvo", - "cama", - "cambio", - "camello", - "camino", - "campo", - "cáncer", - "candil", - "canela", - "canguro", - "canica", - "canto", - "caña", - "cañón", - "caoba", - "caos", - "capaz", - "capitán", - "capote", - "captar", - "capucha", - "cara", - "carbón", - "cárcel", - "careta", - "carga", - "cariño", - "carne", - "carpeta", - "carro", - "carta", - "casa", - "casco", - "casero", - "caspa", - "castor", - "catorce", - "catre", - "caudal", - "causa", - "cazo", - "cebolla", - "ceder", - "cedro", - "celda", - "célebre", - "celoso", - "célula", - "cemento", - "ceniza", - "centro", - "cerca", - "cerdo", - "cereza", - "cero", - "cerrar", - "certeza", - "césped", - "cetro", - "chacal", - "chaleco", - "champú", - "chancla", - "chapa", - "charla", - "chico", - "chiste", - "chivo", - "choque", - "choza", - "chuleta", - "chupar", - "ciclón", - "ciego", - "cielo", - "cien", - "cierto", - "cifra", - "cigarro", - "cima", - "cinco", - "cine", - "cinta", - "ciprés", - "circo", - "ciruela", - "cisne", - "cita", - "ciudad", - "clamor", - "clan", - "claro", - "clase", - "clave", - "cliente", - "clima", - "clínica", - "cobre", - "cocción", - "cochino", - "cocina", - "coco", - "código", - "codo", - "cofre", - "coger", - "cohete", - "cojín", - "cojo", - "cola", - "colcha", - "colegio", - "colgar", - "colina", - "collar", - "colmo", - "columna", - "combate", - "comer", - "comida", - "cómodo", - "compra", - "conde", - "conejo", - "conga", - "conocer", - "consejo", - "contar", - "copa", - "copia", - "corazón", - "corbata", - "corcho", - "cordón", - "corona", - "correr", - "coser", - "cosmos", - "costa", - "cráneo", - "cráter", - "crear", - "crecer", - "creído", - "crema", - "cría", - "crimen", - "cripta", - "crisis", - "cromo", - "crónica", - "croqueta", - "crudo", - "cruz", - "cuadro", - "cuarto", - "cuatro", - "cubo", - "cubrir", - "cuchara", - "cuello", - "cuento", - "cuerda", - "cuesta", - "cueva", - "cuidar", - "culebra", - "culpa", - "culto", - "cumbre", - "cumplir", - "cuna", - "cuneta", - "cuota", - "cupón", - "cúpula", - "curar", - "curioso", - "curso", - "curva", - "cutis", - "dama", - "danza", - "dar", - "dardo", - "dátil", - "deber", - "débil", - "década", - "decir", - "dedo", - "defensa", - "definir", - "dejar", - "delfín", - "delgado", - "delito", - "demora", - "denso", - "dental", - "deporte", - "derecho", - "derrota", - "desayuno", - "deseo", - "desfile", - "desnudo", - "destino", - "desvío", - "detalle", - "detener", - "deuda", - "día", - "diablo", - "diadema", - "diamante", - "diana", - "diario", - "dibujo", - "dictar", - "diente", - "dieta", - "diez", - "difícil", - "digno", - "dilema", - "diluir", - "dinero", - "directo", - "dirigir", - "disco", - "diseño", - "disfraz", - "diva", - "divino", - "doble", - "doce", - "dolor", - "domingo", - "don", - "donar", - "dorado", - "dormir", - "dorso", - "dos", - "dosis", - "dragón", - "droga", - "ducha", - "duda", - "duelo", - "dueño", - "dulce", - "dúo", - "duque", - "durar", - "dureza", - "duro", - "ébano", - "ebrio", - "echar", - "eco", - "ecuador", - "edad", - "edición", - "edificio", - "editor", - "educar", - "efecto", - "eficaz", - "eje", - "ejemplo", - "elefante", - "elegir", - "elemento", - "elevar", - "elipse", - "élite", - "elixir", - "elogio", - "eludir", - "embudo", - "emitir", - "emoción", - "empate", - "empeño", - "empleo", - "empresa", - "enano", - "encargo", - "enchufe", - "encía", - "enemigo", - "enero", - "enfado", - "enfermo", - "engaño", - "enigma", - "enlace", - "enorme", - "enredo", - "ensayo", - "enseñar", - "entero", - "entrar", - "envase", - "envío", - "época", - "equipo", - "erizo", - "escala", - "escena", - "escolar", - "escribir", - "escudo", - "esencia", - "esfera", - "esfuerzo", - "espada", - "espejo", - "espía", - "esposa", - "espuma", - "esquí", - "estar", - "este", - "estilo", - "estufa", - "etapa", - "eterno", - "ética", - "etnia", - "evadir", - "evaluar", - "evento", - "evitar", - "exacto", - "examen", - "exceso", - "excusa", - "exento", - "exigir", - "exilio", - "existir", - "éxito", - "experto", - "explicar", - "exponer", - "extremo", - "fábrica", - "fábula", - "fachada", - "fácil", - "factor", - "faena", - "faja", - "falda", - "fallo", - "falso", - "faltar", - "fama", - "familia", - "famoso", - "faraón", - "farmacia", - "farol", - "farsa", - "fase", - "fatiga", - "fauna", - "favor", - "fax", - "febrero", - "fecha", - "feliz", - "feo", - "feria", - "feroz", - "fértil", - "fervor", - "festín", - "fiable", - "fianza", - "fiar", - "fibra", - "ficción", - "ficha", - "fideo", - "fiebre", - "fiel", - "fiera", - "fiesta", - "figura", - "fijar", - "fijo", - "fila", - "filete", - "filial", - "filtro", - "fin", - "finca", - "fingir", - "finito", - "firma", - "flaco", - "flauta", - "flecha", - "flor", - "flota", - "fluir", - "flujo", - "flúor", - "fobia", - "foca", - "fogata", - "fogón", - "folio", - "folleto", - "fondo", - "forma", - "forro", - "fortuna", - "forzar", - "fosa", - "foto", - "fracaso", - "frágil", - "franja", - "frase", - "fraude", - "freír", - "freno", - "fresa", - "frío", - "frito", - "fruta", - "fuego", - "fuente", - "fuerza", - "fuga", - "fumar", - "función", - "funda", - "furgón", - "furia", - "fusil", - "fútbol", - "futuro", - "gacela", - "gafas", - "gaita", - "gajo", - "gala", - "galería", - "gallo", - "gamba", - "ganar", - "gancho", - "ganga", - "ganso", - "garaje", - "garza", - "gasolina", - "gastar", - "gato", - "gavilán", - "gemelo", - "gemir", - "gen", - "género", - "genio", - "gente", - "geranio", - "gerente", - "germen", - "gesto", - "gigante", - "gimnasio", - "girar", - "giro", - "glaciar", - "globo", - "gloria", - "gol", - "golfo", - "goloso", - "golpe", - "goma", - "gordo", - "gorila", - "gorra", - "gota", - "goteo", - "gozar", - "grada", - "gráfico", - "grano", - "grasa", - "gratis", - "grave", - "grieta", - "grillo", - "gripe", - "gris", - "grito", - "grosor", - "grúa", - "grueso", - "grumo", - "grupo", - "guante", - "guapo", - "guardia", - "guerra", - "guía", - "guiño", - "guion", - "guiso", - "guitarra", - "gusano", - "gustar", - "haber", - "hábil", - "hablar", - "hacer", - "hacha", - "hada", - "hallar", - "hamaca", - "harina", - "haz", - "hazaña", - "hebilla", - "hebra", - "hecho", - "helado", - "helio", - "hembra", - "herir", - "hermano", - "héroe", - "hervir", - "hielo", - "hierro", - "hígado", - "higiene", - "hijo", - "himno", - "historia", - "hocico", - "hogar", - "hoguera", - "hoja", - "hombre", - "hongo", - "honor", - "honra", - "hora", - "hormiga", - "horno", - "hostil", - "hoyo", - "hueco", - "huelga", - "huerta", - "hueso", - "huevo", - "huida", - "huir", - "humano", - "húmedo", - "humilde", - "humo", - "hundir", - "huracán", - "hurto", - "icono", - "ideal", - "idioma", - "ídolo", - "iglesia", - "iglú", - "igual", - "ilegal", - "ilusión", - "imagen", - "imán", - "imitar", - "impar", - "imperio", - "imponer", - "impulso", - "incapaz", - "índice", - "inerte", - "infiel", - "informe", - "ingenio", - "inicio", - "inmenso", - "inmune", - "innato", - "insecto", - "instante", - "interés", - "íntimo", - "intuir", - "inútil", - "invierno", - "ira", - "iris", - "ironía", - "isla", - "islote", - "jabalí", - "jabón", - "jamón", - "jarabe", - "jardín", - "jarra", - "jaula", - "jazmín", - "jefe", - "jeringa", - "jinete", - "jornada", - "joroba", - "joven", - "joya", - "juerga", - "jueves", - "juez", - "jugador", - "jugo", - "juguete", - "juicio", - "junco", - "jungla", - "junio", - "juntar", - "júpiter", - "jurar", - "justo", - "juvenil", - "juzgar", - "kilo", - "koala", - "labio", - "lacio", - "lacra", - "lado", - "ladrón", - "lagarto", - "lágrima", - "laguna", - "laico", - "lamer", - "lámina", - "lámpara", - "lana", - "lancha", - "langosta", - "lanza", - "lápiz", - "largo", - "larva", - "lástima", - "lata", - "látex", - "latir", - "laurel", - "lavar", - "lazo", - "leal", - "lección", - "leche", - "lector", - "leer", - "legión", - "legumbre", - "lejano", - "lengua", - "lento", - "leña", - "león", - "leopardo", - "lesión", - "letal", - "letra", - "leve", - "leyenda", - "libertad", - "libro", - "licor", - "líder", - "lidiar", - "lienzo", - "liga", - "ligero", - "lima", - "límite", - "limón", - "limpio", - "lince", - "lindo", - "línea", - "lingote", - "lino", - "linterna", - "líquido", - "liso", - "lista", - "litera", - "litio", - "litro", - "llaga", - "llama", - "llanto", - "llave", - "llegar", - "llenar", - "llevar", - "llorar", - "llover", - "lluvia", - "lobo", - "loción", - "loco", - "locura", - "lógica", - "logro", - "lombriz", - "lomo", - "lonja", - "lote", - "lucha", - "lucir", - "lugar", - "lujo", - "luna", - "lunes", - "lupa", - "lustro", - "luto", - "luz", - "maceta", - "macho", - "madera", - "madre", - "maduro", - "maestro", - "mafia", - "magia", - "mago", - "maíz", - "maldad", - "maleta", - "malla", - "malo", - "mamá", - "mambo", - "mamut", - "manco", - "mando", - "manejar", - "manga", - "maniquí", - "manjar", - "mano", - "manso", - "manta", - "mañana", - "mapa", - "máquina", - "mar", - "marco", - "marea", - "marfil", - "margen", - "marido", - "mármol", - "marrón", - "martes", - "marzo", - "masa", - "máscara", - "masivo", - "matar", - "materia", - "matiz", - "matriz", - "máximo", - "mayor", - "mazorca", - "mecha", - "medalla", - "medio", - "médula", - "mejilla", - "mejor", - "melena", - "melón", - "memoria", - "menor", - "mensaje", - "mente", - "menú", - "mercado", - "merengue", - "mérito", - "mes", - "mesón", - "meta", - "meter", - "método", - "metro", - "mezcla", - "miedo", - "miel", - "miembro", - "miga", - "mil", - "milagro", - "militar", - "millón", - "mimo", - "mina", - "minero", - "mínimo", - "minuto", - "miope", - "mirar", - "misa", - "miseria", - "misil", - "mismo", - "mitad", - "mito", - "mochila", - "moción", - "moda", - "modelo", - "moho", - "mojar", - "molde", - "moler", - "molino", - "momento", - "momia", - "monarca", - "moneda", - "monja", - "monto", - "moño", - "morada", - "morder", - "moreno", - "morir", - "morro", - "morsa", - "mortal", - "mosca", - "mostrar", - "motivo", - "mover", - "móvil", - "mozo", - "mucho", - "mudar", - "mueble", - "muela", - "muerte", - "muestra", - "mugre", - "mujer", - "mula", - "muleta", - "multa", - "mundo", - "muñeca", - "mural", - "muro", - "músculo", - "museo", - "musgo", - "música", - "muslo", - "nácar", - "nación", - "nadar", - "naipe", - "naranja", - "nariz", - "narrar", - "nasal", - "natal", - "nativo", - "natural", - "náusea", - "naval", - "nave", - "navidad", - "necio", - "néctar", - "negar", - "negocio", - "negro", - "neón", - "nervio", - "neto", - "neutro", - "nevar", - "nevera", - "nicho", - "nido", - "niebla", - "nieto", - "niñez", - "niño", - "nítido", - "nivel", - "nobleza", - "noche", - "nómina", - "noria", - "norma", - "norte", - "nota", - "noticia", - "novato", - "novela", - "novio", - "nube", - "nuca", - "núcleo", - "nudillo", - "nudo", - "nuera", - "nueve", - "nuez", - "nulo", - "número", - "nutria", - "oasis", - "obeso", - "obispo", - "objeto", - "obra", - "obrero", - "observar", - "obtener", - "obvio", - "oca", - "ocaso", - "océano", - "ochenta", - "ocho", - "ocio", - "ocre", - "octavo", - "octubre", - "oculto", - "ocupar", - "ocurrir", - "odiar", - "odio", - "odisea", - "oeste", - "ofensa", - "oferta", - "oficio", - "ofrecer", - "ogro", - "oído", - "oír", - "ojo", - "ola", - "oleada", - "olfato", - "olivo", - "olla", - "olmo", - "olor", - "olvido", - "ombligo", - "onda", - "onza", - "opaco", - "opción", - "ópera", - "opinar", - "oponer", - "optar", - "óptica", - "opuesto", - "oración", - "orador", - "oral", - "órbita", - "orca", - "orden", - "oreja", - "órgano", - "orgía", - "orgullo", - "oriente", - "origen", - "orilla", - "oro", - "orquesta", - "oruga", - "osadía", - "oscuro", - "osezno", - "oso", - "ostra", - "otoño", - "otro", - "oveja", - "óvulo", - "óxido", - "oxígeno", - "oyente", - "ozono", - "pacto", - "padre", - "paella", - "página", - "pago", - "país", - "pájaro", - "palabra", - "palco", - "paleta", - "pálido", - "palma", - "paloma", - "palpar", - "pan", - "panal", - "pánico", - "pantera", - "pañuelo", - "papá", - "papel", - "papilla", - "paquete", - "parar", - "parcela", - "pared", - "parir", - "paro", - "párpado", - "parque", - "párrafo", - "parte", - "pasar", - "paseo", - "pasión", - "paso", - "pasta", - "pata", - "patio", - "patria", - "pausa", - "pauta", - "pavo", - "payaso", - "peatón", - "pecado", - "pecera", - "pecho", - "pedal", - "pedir", - "pegar", - "peine", - "pelar", - "peldaño", - "pelea", - "peligro", - "pellejo", - "pelo", - "peluca", - "pena", - "pensar", - "peñón", - "peón", - "peor", - "pepino", - "pequeño", - "pera", - "percha", - "perder", - "pereza", - "perfil", - "perico", - "perla", - "permiso", - "perro", - "persona", - "pesa", - "pesca", - "pésimo", - "pestaña", - "pétalo", - "petróleo", - "pez", - "pezuña", - "picar", - "pichón", - "pie", - "piedra", - "pierna", - "pieza", - "pijama", - "pilar", - "piloto", - "pimienta", - "pino", - "pintor", - "pinza", - "piña", - "piojo", - "pipa", - "pirata", - "pisar", - "piscina", - "piso", - "pista", - "pitón", - "pizca", - "placa", - "plan", - "plata", - "playa", - "plaza", - "pleito", - "pleno", - "plomo", - "pluma", - "plural", - "pobre", - "poco", - "poder", - "podio", - "poema", - "poesía", - "poeta", - "polen", - "policía", - "pollo", - "polvo", - "pomada", - "pomelo", - "pomo", - "pompa", - "poner", - "porción", - "portal", - "posada", - "poseer", - "posible", - "poste", - "potencia", - "potro", - "pozo", - "prado", - "precoz", - "pregunta", - "premio", - "prensa", - "preso", - "previo", - "primo", - "príncipe", - "prisión", - "privar", - "proa", - "probar", - "proceso", - "producto", - "proeza", - "profesor", - "programa", - "prole", - "promesa", - "pronto", - "propio", - "próximo", - "prueba", - "público", - "puchero", - "pudor", - "pueblo", - "puerta", - "puesto", - "pulga", - "pulir", - "pulmón", - "pulpo", - "pulso", - "puma", - "punto", - "puñal", - "puño", - "pupa", - "pupila", - "puré", - "quedar", - "queja", - "quemar", - "querer", - "queso", - "quieto", - "química", - "quince", - "quitar", - "rábano", - "rabia", - "rabo", - "ración", - "radical", - "raíz", - "rama", - "rampa", - "rancho", - "rango", - "rapaz", - "rápido", - "rapto", - "rasgo", - "raspa", - "rato", - "rayo", - "raza", - "razón", - "reacción", - "realidad", - "rebaño", - "rebote", - "recaer", - "receta", - "rechazo", - "recoger", - "recreo", - "recto", - "recurso", - "red", - "redondo", - "reducir", - "reflejo", - "reforma", - "refrán", - "refugio", - "regalo", - "regir", - "regla", - "regreso", - "rehén", - "reino", - "reír", - "reja", - "relato", - "relevo", - "relieve", - "relleno", - "reloj", - "remar", - "remedio", - "remo", - "rencor", - "rendir", - "renta", - "reparto", - "repetir", - "reposo", - "reptil", - "res", - "rescate", - "resina", - "respeto", - "resto", - "resumen", - "retiro", - "retorno", - "retrato", - "reunir", - "revés", - "revista", - "rey", - "rezar", - "rico", - "riego", - "rienda", - "riesgo", - "rifa", - "rígido", - "rigor", - "rincón", - "riñón", - "río", - "riqueza", - "risa", - "ritmo", - "rito", - "rizo", - "roble", - "roce", - "rociar", - "rodar", - "rodeo", - "rodilla", - "roer", - "rojizo", - "rojo", - "romero", - "romper", - "ron", - "ronco", - "ronda", - "ropa", - "ropero", - "rosa", - "rosca", - "rostro", - "rotar", - "rubí", - "rubor", - "rudo", - "rueda", - "rugir", - "ruido", - "ruina", - "ruleta", - "rulo", - "rumbo", - "rumor", - "ruptura", - "ruta", - "rutina", - "sábado", - "saber", - "sabio", - "sable", - "sacar", - "sagaz", - "sagrado", - "sala", - "saldo", - "salero", - "salir", - "salmón", - "salón", - "salsa", - "salto", - "salud", - "salvar", - "samba", - "sanción", - "sandía", - "sanear", - "sangre", - "sanidad", - "sano", - "santo", - "sapo", - "saque", - "sardina", - "sartén", - "sastre", - "satán", - "sauna", - "saxofón", - "sección", - "seco", - "secreto", - "secta", - "sed", - "seguir", - "seis", - "sello", - "selva", - "semana", - "semilla", - "senda", - "sensor", - "señal", - "señor", - "separar", - "sepia", - "sequía", - "ser", - "serie", - "sermón", - "servir", - "sesenta", - "sesión", - "seta", - "setenta", - "severo", - "sexo", - "sexto", - "sidra", - "siesta", - "siete", - "siglo", - "signo", - "sílaba", - "silbar", - "silencio", - "silla", - "símbolo", - "simio", - "sirena", - "sistema", - "sitio", - "situar", - "sobre", - "socio", - "sodio", - "sol", - "solapa", - "soldado", - "soledad", - "sólido", - "soltar", - "solución", - "sombra", - "sondeo", - "sonido", - "sonoro", - "sonrisa", - "sopa", - "soplar", - "soporte", - "sordo", - "sorpresa", - "sorteo", - "sostén", - "sótano", - "suave", - "subir", - "suceso", - "sudor", - "suegra", - "suelo", - "sueño", - "suerte", - "sufrir", - "sujeto", - "sultán", - "sumar", - "superar", - "suplir", - "suponer", - "supremo", - "sur", - "surco", - "sureño", - "surgir", - "susto", - "sutil", - "tabaco", - "tabique", - "tabla", - "tabú", - "taco", - "tacto", - "tajo", - "talar", - "talco", - "talento", - "talla", - "talón", - "tamaño", - "tambor", - "tango", - "tanque", - "tapa", - "tapete", - "tapia", - "tapón", - "taquilla", - "tarde", - "tarea", - "tarifa", - "tarjeta", - "tarot", - "tarro", - "tarta", - "tatuaje", - "tauro", - "taza", - "tazón", - "teatro", - "techo", - "tecla", - "técnica", - "tejado", - "tejer", - "tejido", - "tela", - "teléfono", - "tema", - "temor", - "templo", - "tenaz", - "tender", - "tener", - "tenis", - "tenso", - "teoría", - "terapia", - "terco", - "término", - "ternura", - "terror", - "tesis", - "tesoro", - "testigo", - "tetera", - "texto", - "tez", - "tibio", - "tiburón", - "tiempo", - "tienda", - "tierra", - "tieso", - "tigre", - "tijera", - "tilde", - "timbre", - "tímido", - "timo", - "tinta", - "tío", - "típico", - "tipo", - "tira", - "tirón", - "titán", - "títere", - "título", - "tiza", - "toalla", - "tobillo", - "tocar", - "tocino", - "todo", - "toga", - "toldo", - "tomar", - "tono", - "tonto", - "topar", - "tope", - "toque", - "tórax", - "torero", - "tormenta", - "torneo", - "toro", - "torpedo", - "torre", - "torso", - "tortuga", - "tos", - "tosco", - "toser", - "tóxico", - "trabajo", - "tractor", - "traer", - "tráfico", - "trago", - "traje", - "tramo", - "trance", - "trato", - "trauma", - "trazar", - "trébol", - "tregua", - "treinta", - "tren", - "trepar", - "tres", - "tribu", - "trigo", - "tripa", - "triste", - "triunfo", - "trofeo", - "trompa", - "tronco", - "tropa", - "trote", - "trozo", - "truco", - "trueno", - "trufa", - "tubería", - "tubo", - "tuerto", - "tumba", - "tumor", - "túnel", - "túnica", - "turbina", - "turismo", - "turno", - "tutor", - "ubicar", - "úlcera", - "umbral", - "unidad", - "unir", - "universo", - "uno", - "untar", - "uña", - "urbano", - "urbe", - "urgente", - "urna", - "usar", - "usuario", - "útil", - "utopía", - "uva", - "vaca", - "vacío", - "vacuna", - "vagar", - "vago", - "vaina", - "vajilla", - "vale", - "válido", - "valle", - "valor", - "válvula", - "vampiro", - "vara", - "variar", - "varón", - "vaso", - "vecino", - "vector", - "vehículo", - "veinte", - "vejez", - "vela", - "velero", - "veloz", - "vena", - "vencer", - "venda", - "veneno", - "vengar", - "venir", - "venta", - "venus", - "ver", - "verano", - "verbo", - "verde", - "vereda", - "verja", - "verso", - "verter", - "vía", - "viaje", - "vibrar", - "vicio", - "víctima", - "vida", - "vídeo", - "vidrio", - "viejo", - "viernes", - "vigor", - "vil", - "villa", - "vinagre", - "vino", - "viñedo", - "violín", - "viral", - "virgo", - "virtud", - "visor", - "víspera", - "vista", - "vitamina", - "viudo", - "vivaz", - "vivero", - "vivir", - "vivo", - "volcán", - "volumen", - "volver", - "voraz", - "votar", - "voto", - "voz", - "vuelo", - "vulgar", - "yacer", - "yate", - "yegua", - "yema", - "yerno", - "yeso", - "yodo", - "yoga", - "yogur", - "zafiro", - "zanja", - "zapato", - "zarza", - "zona", - "zorro", - "zumo", - "zurdo" -]; +export { wordlist } from "@scure/bip39/wordlists/spanish"; diff --git a/src/bip39/wordlists/traditional-chinese.ts b/src/bip39/wordlists/traditional-chinese.ts index 51ae8ea..e2ff71c 100644 --- a/src/bip39/wordlists/traditional-chinese.ts +++ b/src/bip39/wordlists/traditional-chinese.ts @@ -1,2050 +1 @@ -export const wordlist: string[] = [ - "的", - "一", - "是", - "在", - "不", - "了", - "有", - "和", - "人", - "這", - "中", - "大", - "為", - "上", - "個", - "國", - "我", - "以", - "要", - "他", - "時", - "來", - "用", - "們", - "生", - "到", - "作", - "地", - "於", - "出", - "就", - "分", - "對", - "成", - "會", - "可", - "主", - "發", - "年", - "動", - "同", - "工", - "也", - "能", - "下", - "過", - "子", - "說", - "產", - "種", - "面", - "而", - "方", - "後", - "多", - "定", - "行", - "學", - "法", - "所", - "民", - "得", - "經", - "十", - "三", - "之", - "進", - "著", - "等", - "部", - "度", - "家", - "電", - "力", - "裡", - "如", - "水", - "化", - "高", - "自", - "二", - "理", - "起", - "小", - "物", - "現", - "實", - "加", - "量", - "都", - "兩", - "體", - "制", - "機", - "當", - "使", - "點", - "從", - "業", - "本", - "去", - "把", - "性", - "好", - "應", - "開", - "它", - "合", - "還", - "因", - "由", - "其", - "些", - "然", - "前", - "外", - "天", - "政", - "四", - "日", - "那", - "社", - "義", - "事", - "平", - "形", - "相", - "全", - "表", - "間", - "樣", - "與", - "關", - "各", - "重", - "新", - "線", - "內", - "數", - "正", - "心", - "反", - "你", - "明", - "看", - "原", - "又", - "麼", - "利", - "比", - "或", - "但", - "質", - "氣", - "第", - "向", - "道", - "命", - "此", - "變", - "條", - "只", - "沒", - "結", - "解", - "問", - "意", - "建", - "月", - "公", - "無", - "系", - "軍", - "很", - "情", - "者", - "最", - "立", - "代", - "想", - "已", - "通", - "並", - "提", - "直", - "題", - "黨", - "程", - "展", - "五", - "果", - "料", - "象", - "員", - "革", - "位", - "入", - "常", - "文", - "總", - "次", - "品", - "式", - "活", - "設", - "及", - "管", - "特", - "件", - "長", - "求", - "老", - "頭", - "基", - "資", - "邊", - "流", - "路", - "級", - "少", - "圖", - "山", - "統", - "接", - "知", - "較", - "將", - "組", - "見", - "計", - "別", - "她", - "手", - "角", - "期", - "根", - "論", - "運", - "農", - "指", - "幾", - "九", - "區", - "強", - "放", - "決", - "西", - "被", - "幹", - "做", - "必", - "戰", - "先", - "回", - "則", - "任", - "取", - "據", - "處", - "隊", - "南", - "給", - "色", - "光", - "門", - "即", - "保", - "治", - "北", - "造", - "百", - "規", - "熱", - "領", - "七", - "海", - "口", - "東", - "導", - "器", - "壓", - "志", - "世", - "金", - "增", - "爭", - "濟", - "階", - "油", - "思", - "術", - "極", - "交", - "受", - "聯", - "什", - "認", - "六", - "共", - "權", - "收", - "證", - "改", - "清", - "美", - "再", - "採", - "轉", - "更", - "單", - "風", - "切", - "打", - "白", - "教", - "速", - "花", - "帶", - "安", - "場", - "身", - "車", - "例", - "真", - "務", - "具", - "萬", - "每", - "目", - "至", - "達", - "走", - "積", - "示", - "議", - "聲", - "報", - "鬥", - "完", - "類", - "八", - "離", - "華", - "名", - "確", - "才", - "科", - "張", - "信", - "馬", - "節", - "話", - "米", - "整", - "空", - "元", - "況", - "今", - "集", - "溫", - "傳", - "土", - "許", - "步", - "群", - "廣", - "石", - "記", - "需", - "段", - "研", - "界", - "拉", - "林", - "律", - "叫", - "且", - "究", - "觀", - "越", - "織", - "裝", - "影", - "算", - "低", - "持", - "音", - "眾", - "書", - "布", - "复", - "容", - "兒", - "須", - "際", - "商", - "非", - "驗", - "連", - "斷", - "深", - "難", - "近", - "礦", - "千", - "週", - "委", - "素", - "技", - "備", - "半", - "辦", - "青", - "省", - "列", - "習", - "響", - "約", - "支", - "般", - "史", - "感", - "勞", - "便", - "團", - "往", - "酸", - "歷", - "市", - "克", - "何", - "除", - "消", - "構", - "府", - "稱", - "太", - "準", - "精", - "值", - "號", - "率", - "族", - "維", - "劃", - "選", - "標", - "寫", - "存", - "候", - "毛", - "親", - "快", - "效", - "斯", - "院", - "查", - "江", - "型", - "眼", - "王", - "按", - "格", - "養", - "易", - "置", - "派", - "層", - "片", - "始", - "卻", - "專", - "狀", - "育", - "廠", - "京", - "識", - "適", - "屬", - "圓", - "包", - "火", - "住", - "調", - "滿", - "縣", - "局", - "照", - "參", - "紅", - "細", - "引", - "聽", - "該", - "鐵", - "價", - "嚴", - "首", - "底", - "液", - "官", - "德", - "隨", - "病", - "蘇", - "失", - "爾", - "死", - "講", - "配", - "女", - "黃", - "推", - "顯", - "談", - "罪", - "神", - "藝", - "呢", - "席", - "含", - "企", - "望", - "密", - "批", - "營", - "項", - "防", - "舉", - "球", - "英", - "氧", - "勢", - "告", - "李", - "台", - "落", - "木", - "幫", - "輪", - "破", - "亞", - "師", - "圍", - "注", - "遠", - "字", - "材", - "排", - "供", - "河", - "態", - "封", - "另", - "施", - "減", - "樹", - "溶", - "怎", - "止", - "案", - "言", - "士", - "均", - "武", - "固", - "葉", - "魚", - "波", - "視", - "僅", - "費", - "緊", - "愛", - "左", - "章", - "早", - "朝", - "害", - "續", - "輕", - "服", - "試", - "食", - "充", - "兵", - "源", - "判", - "護", - "司", - "足", - "某", - "練", - "差", - "致", - "板", - "田", - "降", - "黑", - "犯", - "負", - "擊", - "范", - "繼", - "興", - "似", - "餘", - "堅", - "曲", - "輸", - "修", - "故", - "城", - "夫", - "夠", - "送", - "筆", - "船", - "佔", - "右", - "財", - "吃", - "富", - "春", - "職", - "覺", - "漢", - "畫", - "功", - "巴", - "跟", - "雖", - "雜", - "飛", - "檢", - "吸", - "助", - "昇", - "陽", - "互", - "初", - "創", - "抗", - "考", - "投", - "壞", - "策", - "古", - "徑", - "換", - "未", - "跑", - "留", - "鋼", - "曾", - "端", - "責", - "站", - "簡", - "述", - "錢", - "副", - "盡", - "帝", - "射", - "草", - "衝", - "承", - "獨", - "令", - "限", - "阿", - "宣", - "環", - "雙", - "請", - "超", - "微", - "讓", - "控", - "州", - "良", - "軸", - "找", - "否", - "紀", - "益", - "依", - "優", - "頂", - "礎", - "載", - "倒", - "房", - "突", - "坐", - "粉", - "敵", - "略", - "客", - "袁", - "冷", - "勝", - "絕", - "析", - "塊", - "劑", - "測", - "絲", - "協", - "訴", - "念", - "陳", - "仍", - "羅", - "鹽", - "友", - "洋", - "錯", - "苦", - "夜", - "刑", - "移", - "頻", - "逐", - "靠", - "混", - "母", - "短", - "皮", - "終", - "聚", - "汽", - "村", - "雲", - "哪", - "既", - "距", - "衛", - "停", - "烈", - "央", - "察", - "燒", - "迅", - "境", - "若", - "印", - "洲", - "刻", - "括", - "激", - "孔", - "搞", - "甚", - "室", - "待", - "核", - "校", - "散", - "侵", - "吧", - "甲", - "遊", - "久", - "菜", - "味", - "舊", - "模", - "湖", - "貨", - "損", - "預", - "阻", - "毫", - "普", - "穩", - "乙", - "媽", - "植", - "息", - "擴", - "銀", - "語", - "揮", - "酒", - "守", - "拿", - "序", - "紙", - "醫", - "缺", - "雨", - "嗎", - "針", - "劉", - "啊", - "急", - "唱", - "誤", - "訓", - "願", - "審", - "附", - "獲", - "茶", - "鮮", - "糧", - "斤", - "孩", - "脫", - "硫", - "肥", - "善", - "龍", - "演", - "父", - "漸", - "血", - "歡", - "械", - "掌", - "歌", - "沙", - "剛", - "攻", - "謂", - "盾", - "討", - "晚", - "粒", - "亂", - "燃", - "矛", - "乎", - "殺", - "藥", - "寧", - "魯", - "貴", - "鐘", - "煤", - "讀", - "班", - "伯", - "香", - "介", - "迫", - "句", - "豐", - "培", - "握", - "蘭", - "擔", - "弦", - "蛋", - "沉", - "假", - "穿", - "執", - "答", - "樂", - "誰", - "順", - "煙", - "縮", - "徵", - "臉", - "喜", - "松", - "腳", - "困", - "異", - "免", - "背", - "星", - "福", - "買", - "染", - "井", - "概", - "慢", - "怕", - "磁", - "倍", - "祖", - "皇", - "促", - "靜", - "補", - "評", - "翻", - "肉", - "踐", - "尼", - "衣", - "寬", - "揚", - "棉", - "希", - "傷", - "操", - "垂", - "秋", - "宜", - "氫", - "套", - "督", - "振", - "架", - "亮", - "末", - "憲", - "慶", - "編", - "牛", - "觸", - "映", - "雷", - "銷", - "詩", - "座", - "居", - "抓", - "裂", - "胞", - "呼", - "娘", - "景", - "威", - "綠", - "晶", - "厚", - "盟", - "衡", - "雞", - "孫", - "延", - "危", - "膠", - "屋", - "鄉", - "臨", - "陸", - "顧", - "掉", - "呀", - "燈", - "歲", - "措", - "束", - "耐", - "劇", - "玉", - "趙", - "跳", - "哥", - "季", - "課", - "凱", - "胡", - "額", - "款", - "紹", - "卷", - "齊", - "偉", - "蒸", - "殖", - "永", - "宗", - "苗", - "川", - "爐", - "岩", - "弱", - "零", - "楊", - "奏", - "沿", - "露", - "桿", - "探", - "滑", - "鎮", - "飯", - "濃", - "航", - "懷", - "趕", - "庫", - "奪", - "伊", - "靈", - "稅", - "途", - "滅", - "賽", - "歸", - "召", - "鼓", - "播", - "盤", - "裁", - "險", - "康", - "唯", - "錄", - "菌", - "純", - "借", - "糖", - "蓋", - "橫", - "符", - "私", - "努", - "堂", - "域", - "槍", - "潤", - "幅", - "哈", - "竟", - "熟", - "蟲", - "澤", - "腦", - "壤", - "碳", - "歐", - "遍", - "側", - "寨", - "敢", - "徹", - "慮", - "斜", - "薄", - "庭", - "納", - "彈", - "飼", - "伸", - "折", - "麥", - "濕", - "暗", - "荷", - "瓦", - "塞", - "床", - "築", - "惡", - "戶", - "訪", - "塔", - "奇", - "透", - "梁", - "刀", - "旋", - "跡", - "卡", - "氯", - "遇", - "份", - "毒", - "泥", - "退", - "洗", - "擺", - "灰", - "彩", - "賣", - "耗", - "夏", - "擇", - "忙", - "銅", - "獻", - "硬", - "予", - "繁", - "圈", - "雪", - "函", - "亦", - "抽", - "篇", - "陣", - "陰", - "丁", - "尺", - "追", - "堆", - "雄", - "迎", - "泛", - "爸", - "樓", - "避", - "謀", - "噸", - "野", - "豬", - "旗", - "累", - "偏", - "典", - "館", - "索", - "秦", - "脂", - "潮", - "爺", - "豆", - "忽", - "托", - "驚", - "塑", - "遺", - "愈", - "朱", - "替", - "纖", - "粗", - "傾", - "尚", - "痛", - "楚", - "謝", - "奮", - "購", - "磨", - "君", - "池", - "旁", - "碎", - "骨", - "監", - "捕", - "弟", - "暴", - "割", - "貫", - "殊", - "釋", - "詞", - "亡", - "壁", - "頓", - "寶", - "午", - "塵", - "聞", - "揭", - "炮", - "殘", - "冬", - "橋", - "婦", - "警", - "綜", - "招", - "吳", - "付", - "浮", - "遭", - "徐", - "您", - "搖", - "谷", - "贊", - "箱", - "隔", - "訂", - "男", - "吹", - "園", - "紛", - "唐", - "敗", - "宋", - "玻", - "巨", - "耕", - "坦", - "榮", - "閉", - "灣", - "鍵", - "凡", - "駐", - "鍋", - "救", - "恩", - "剝", - "凝", - "鹼", - "齒", - "截", - "煉", - "麻", - "紡", - "禁", - "廢", - "盛", - "版", - "緩", - "淨", - "睛", - "昌", - "婚", - "涉", - "筒", - "嘴", - "插", - "岸", - "朗", - "莊", - "街", - "藏", - "姑", - "貿", - "腐", - "奴", - "啦", - "慣", - "乘", - "夥", - "恢", - "勻", - "紗", - "扎", - "辯", - "耳", - "彪", - "臣", - "億", - "璃", - "抵", - "脈", - "秀", - "薩", - "俄", - "網", - "舞", - "店", - "噴", - "縱", - "寸", - "汗", - "掛", - "洪", - "賀", - "閃", - "柬", - "爆", - "烯", - "津", - "稻", - "牆", - "軟", - "勇", - "像", - "滾", - "厘", - "蒙", - "芳", - "肯", - "坡", - "柱", - "盪", - "腿", - "儀", - "旅", - "尾", - "軋", - "冰", - "貢", - "登", - "黎", - "削", - "鑽", - "勒", - "逃", - "障", - "氨", - "郭", - "峰", - "幣", - "港", - "伏", - "軌", - "畝", - "畢", - "擦", - "莫", - "刺", - "浪", - "秘", - "援", - "株", - "健", - "售", - "股", - "島", - "甘", - "泡", - "睡", - "童", - "鑄", - "湯", - "閥", - "休", - "匯", - "舍", - "牧", - "繞", - "炸", - "哲", - "磷", - "績", - "朋", - "淡", - "尖", - "啟", - "陷", - "柴", - "呈", - "徒", - "顏", - "淚", - "稍", - "忘", - "泵", - "藍", - "拖", - "洞", - "授", - "鏡", - "辛", - "壯", - "鋒", - "貧", - "虛", - "彎", - "摩", - "泰", - "幼", - "廷", - "尊", - "窗", - "綱", - "弄", - "隸", - "疑", - "氏", - "宮", - "姐", - "震", - "瑞", - "怪", - "尤", - "琴", - "循", - "描", - "膜", - "違", - "夾", - "腰", - "緣", - "珠", - "窮", - "森", - "枝", - "竹", - "溝", - "催", - "繩", - "憶", - "邦", - "剩", - "幸", - "漿", - "欄", - "擁", - "牙", - "貯", - "禮", - "濾", - "鈉", - "紋", - "罷", - "拍", - "咱", - "喊", - "袖", - "埃", - "勤", - "罰", - "焦", - "潛", - "伍", - "墨", - "欲", - "縫", - "姓", - "刊", - "飽", - "仿", - "獎", - "鋁", - "鬼", - "麗", - "跨", - "默", - "挖", - "鏈", - "掃", - "喝", - "袋", - "炭", - "污", - "幕", - "諸", - "弧", - "勵", - "梅", - "奶", - "潔", - "災", - "舟", - "鑑", - "苯", - "訟", - "抱", - "毀", - "懂", - "寒", - "智", - "埔", - "寄", - "屆", - "躍", - "渡", - "挑", - "丹", - "艱", - "貝", - "碰", - "拔", - "爹", - "戴", - "碼", - "夢", - "芽", - "熔", - "赤", - "漁", - "哭", - "敬", - "顆", - "奔", - "鉛", - "仲", - "虎", - "稀", - "妹", - "乏", - "珍", - "申", - "桌", - "遵", - "允", - "隆", - "螺", - "倉", - "魏", - "銳", - "曉", - "氮", - "兼", - "隱", - "礙", - "赫", - "撥", - "忠", - "肅", - "缸", - "牽", - "搶", - "博", - "巧", - "殼", - "兄", - "杜", - "訊", - "誠", - "碧", - "祥", - "柯", - "頁", - "巡", - "矩", - "悲", - "灌", - "齡", - "倫", - "票", - "尋", - "桂", - "鋪", - "聖", - "恐", - "恰", - "鄭", - "趣", - "抬", - "荒", - "騰", - "貼", - "柔", - "滴", - "猛", - "闊", - "輛", - "妻", - "填", - "撤", - "儲", - "簽", - "鬧", - "擾", - "紫", - "砂", - "遞", - "戲", - "吊", - "陶", - "伐", - "餵", - "療", - "瓶", - "婆", - "撫", - "臂", - "摸", - "忍", - "蝦", - "蠟", - "鄰", - "胸", - "鞏", - "擠", - "偶", - "棄", - "槽", - "勁", - "乳", - "鄧", - "吉", - "仁", - "爛", - "磚", - "租", - "烏", - "艦", - "伴", - "瓜", - "淺", - "丙", - "暫", - "燥", - "橡", - "柳", - "迷", - "暖", - "牌", - "秧", - "膽", - "詳", - "簧", - "踏", - "瓷", - "譜", - "呆", - "賓", - "糊", - "洛", - "輝", - "憤", - "競", - "隙", - "怒", - "粘", - "乃", - "緒", - "肩", - "籍", - "敏", - "塗", - "熙", - "皆", - "偵", - "懸", - "掘", - "享", - "糾", - "醒", - "狂", - "鎖", - "淀", - "恨", - "牲", - "霸", - "爬", - "賞", - "逆", - "玩", - "陵", - "祝", - "秒", - "浙", - "貌", - "役", - "彼", - "悉", - "鴨", - "趨", - "鳳", - "晨", - "畜", - "輩", - "秩", - "卵", - "署", - "梯", - "炎", - "灘", - "棋", - "驅", - "篩", - "峽", - "冒", - "啥", - "壽", - "譯", - "浸", - "泉", - "帽", - "遲", - "矽", - "疆", - "貸", - "漏", - "稿", - "冠", - "嫩", - "脅", - "芯", - "牢", - "叛", - "蝕", - "奧", - "鳴", - "嶺", - "羊", - "憑", - "串", - "塘", - "繪", - "酵", - "融", - "盆", - "錫", - "廟", - "籌", - "凍", - "輔", - "攝", - "襲", - "筋", - "拒", - "僚", - "旱", - "鉀", - "鳥", - "漆", - "沈", - "眉", - "疏", - "添", - "棒", - "穗", - "硝", - "韓", - "逼", - "扭", - "僑", - "涼", - "挺", - "碗", - "栽", - "炒", - "杯", - "患", - "餾", - "勸", - "豪", - "遼", - "勃", - "鴻", - "旦", - "吏", - "拜", - "狗", - "埋", - "輥", - "掩", - "飲", - "搬", - "罵", - "辭", - "勾", - "扣", - "估", - "蔣", - "絨", - "霧", - "丈", - "朵", - "姆", - "擬", - "宇", - "輯", - "陝", - "雕", - "償", - "蓄", - "崇", - "剪", - "倡", - "廳", - "咬", - "駛", - "薯", - "刷", - "斥", - "番", - "賦", - "奉", - "佛", - "澆", - "漫", - "曼", - "扇", - "鈣", - "桃", - "扶", - "仔", - "返", - "俗", - "虧", - "腔", - "鞋", - "棱", - "覆", - "框", - "悄", - "叔", - "撞", - "騙", - "勘", - "旺", - "沸", - "孤", - "吐", - "孟", - "渠", - "屈", - "疾", - "妙", - "惜", - "仰", - "狠", - "脹", - "諧", - "拋", - "黴", - "桑", - "崗", - "嘛", - "衰", - "盜", - "滲", - "臟", - "賴", - "湧", - "甜", - "曹", - "閱", - "肌", - "哩", - "厲", - "烴", - "緯", - "毅", - "昨", - "偽", - "症", - "煮", - "嘆", - "釘", - "搭", - "莖", - "籠", - "酷", - "偷", - "弓", - "錐", - "恆", - "傑", - "坑", - "鼻", - "翼", - "綸", - "敘", - "獄", - "逮", - "罐", - "絡", - "棚", - "抑", - "膨", - "蔬", - "寺", - "驟", - "穆", - "冶", - "枯", - "冊", - "屍", - "凸", - "紳", - "坯", - "犧", - "焰", - "轟", - "欣", - "晉", - "瘦", - "禦", - "錠", - "錦", - "喪", - "旬", - "鍛", - "壟", - "搜", - "撲", - "邀", - "亭", - "酯", - "邁", - "舒", - "脆", - "酶", - "閒", - "憂", - "酚", - "頑", - "羽", - "漲", - "卸", - "仗", - "陪", - "闢", - "懲", - "杭", - "姚", - "肚", - "捉", - "飄", - "漂", - "昆", - "欺", - "吾", - "郎", - "烷", - "汁", - "呵", - "飾", - "蕭", - "雅", - "郵", - "遷", - "燕", - "撒", - "姻", - "赴", - "宴", - "煩", - "債", - "帳", - "斑", - "鈴", - "旨", - "醇", - "董", - "餅", - "雛", - "姿", - "拌", - "傅", - "腹", - "妥", - "揉", - "賢", - "拆", - "歪", - "葡", - "胺", - "丟", - "浩", - "徽", - "昂", - "墊", - "擋", - "覽", - "貪", - "慰", - "繳", - "汪", - "慌", - "馮", - "諾", - "姜", - "誼", - "兇", - "劣", - "誣", - "耀", - "昏", - "躺", - "盈", - "騎", - "喬", - "溪", - "叢", - "盧", - "抹", - "悶", - "諮", - "刮", - "駕", - "纜", - "悟", - "摘", - "鉺", - "擲", - "頗", - "幻", - "柄", - "惠", - "慘", - "佳", - "仇", - "臘", - "窩", - "滌", - "劍", - "瞧", - "堡", - "潑", - "蔥", - "罩", - "霍", - "撈", - "胎", - "蒼", - "濱", - "倆", - "捅", - "湘", - "砍", - "霞", - "邵", - "萄", - "瘋", - "淮", - "遂", - "熊", - "糞", - "烘", - "宿", - "檔", - "戈", - "駁", - "嫂", - "裕", - "徙", - "箭", - "捐", - "腸", - "撐", - "曬", - "辨", - "殿", - "蓮", - "攤", - "攪", - "醬", - "屏", - "疫", - "哀", - "蔡", - "堵", - "沫", - "皺", - "暢", - "疊", - "閣", - "萊", - "敲", - "轄", - "鉤", - "痕", - "壩", - "巷", - "餓", - "禍", - "丘", - "玄", - "溜", - "曰", - "邏", - "彭", - "嘗", - "卿", - "妨", - "艇", - "吞", - "韋", - "怨", - "矮", - "歇" -]; +export { wordlist } from "@scure/bip39/wordlists/traditional-chinese"; diff --git a/src/blake2b.ts b/src/blake2b.ts index 1c93eeb..1848d45 100644 --- a/src/blake2b.ts +++ b/src/blake2b.ts @@ -1,9 +1,10 @@ -const blake2bJs = require("blakejs"); +import { blake2b as _blake2b } from "@noble/hashes/blake2"; +import { assertBytes } from "./utils.js"; -export function blake2b(input: Buffer, outputLength = 64): Buffer { +export const blake2b = (msg: Uint8Array, outputLength = 64): Uint8Array => { + assertBytes(msg); if (outputLength <= 0 || outputLength > 64) { throw Error("Invalid outputLength"); } - - return Buffer.from(blake2bJs.blake2b(input, undefined, outputLength)); -} + return _blake2b(msg, { dkLen: outputLength }); +}; diff --git a/src/bls.ts b/src/bls.ts new file mode 100644 index 0000000..21dfc9b --- /dev/null +++ b/src/bls.ts @@ -0,0 +1 @@ +export { bls12_381 } from '@noble/curves/bls12-381'; \ No newline at end of file diff --git a/src/bn.ts b/src/bn.ts new file mode 100644 index 0000000..383bd22 --- /dev/null +++ b/src/bn.ts @@ -0,0 +1 @@ +export { bn254 } from '@noble/curves/bn254'; \ No newline at end of file diff --git a/src/hash-utils.ts b/src/hash-utils.ts deleted file mode 100644 index 066e19f..0000000 --- a/src/hash-utils.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Hash } from "crypto"; - -export function createHashFunction( - hashConstructor: () => Hash -): (msg: Buffer) => Buffer { - return msg => { - const hash = hashConstructor(); - hash.update(msg); - return Buffer.from(hash.digest()); - }; -} diff --git a/src/hdkey.ts b/src/hdkey.ts index bd26c62..79eab99 100644 --- a/src/hdkey.ts +++ b/src/hdkey.ts @@ -1,5 +1 @@ -import * as hdkeyPure from "./pure/hdkey"; - -const hdkey: typeof hdkeyPure.HDKey = require("./vendor/hdkey-without-crypto"); - -export const HDKey = hdkey; +export { HARDENED_OFFSET, HDKey } from "@scure/bip32"; diff --git a/src/keccak.ts b/src/keccak.ts index 369065f..d977faf 100644 --- a/src/keccak.ts +++ b/src/keccak.ts @@ -1,19 +1,24 @@ -import { createHashFunction } from "./hash-utils"; +import { + Keccak, + keccak_224, + keccak_256, + keccak_384, + keccak_512 +} from "@noble/hashes/sha3"; +import { Hash } from "@noble/hashes/utils"; +import { wrapHash } from "./utils.js"; -const createKeccakHash = require("keccak"); +// Expose create only for keccak256 +interface K256 { + (data: Uint8Array): Uint8Array; + create(): Hash; +} -export const keccak224 = createHashFunction(() => - createKeccakHash("keccak224") -); - -export const keccak256 = createHashFunction(() => - createKeccakHash("keccak256") -); - -export const keccak384 = createHashFunction(() => - createKeccakHash("keccak384") -); - -export const keccak512 = createHashFunction(() => - createKeccakHash("keccak512") -); +export const keccak224 = wrapHash(keccak_224); +export const keccak256: K256 = (() => { + const k: any = wrapHash(keccak_256); + k.create = keccak_256.create; + return k; +})(); +export const keccak384 = wrapHash(keccak_384); +export const keccak512 = wrapHash(keccak_512); diff --git a/src/math.ts b/src/math.ts new file mode 100644 index 0000000..f862360 --- /dev/null +++ b/src/math.ts @@ -0,0 +1,4 @@ +import { pow, invert } from "@noble/curves/abstract/modular"; + +export const modPow = pow; +export const modInvert = invert; diff --git a/src/pbkdf2.ts b/src/pbkdf2.ts index c61992f..7b595d1 100644 --- a/src/pbkdf2.ts +++ b/src/pbkdf2.ts @@ -1,37 +1,42 @@ -import * as pbkdf2Js from "pbkdf2"; +import { + pbkdf2 as _pbkdf2, + pbkdf2Async as _pbkdf2Async +} from "@noble/hashes/pbkdf2"; +import { sha256, sha512 } from "@noble/hashes/sha2"; +import { assertBytes } from "./utils.js"; -export function pbkdf2( - password: Buffer, - salt: Buffer, +export async function pbkdf2( + password: Uint8Array, + salt: Uint8Array, iterations: number, keylen: number, digest: string -): Promise { - return new Promise((resolve, reject) => { - pbkdf2Js.pbkdf2( - password, - salt, - iterations, - keylen, - digest, - (err, result) => { - if (err) { - reject(err); - return; - } - - resolve(result); - } - ); +): Promise { + if (!["sha256", "sha512"].includes(digest)) { + throw new Error("Only sha256 and sha512 are supported"); + } + assertBytes(password); + assertBytes(salt); + return _pbkdf2Async(digest === "sha256" ? sha256 : sha512, password, salt, { + c: iterations, + dkLen: keylen }); } export function pbkdf2Sync( - password: Buffer, - salt: Buffer, + password: Uint8Array, + salt: Uint8Array, iterations: number, keylen: number, digest: string -): Buffer { - return pbkdf2Js.pbkdf2Sync(password, salt, iterations, keylen, digest); +): Uint8Array { + if (!["sha256", "sha512"].includes(digest)) { + throw new Error("Only sha256 and sha512 are supported"); + } + assertBytes(password); + assertBytes(salt); + return _pbkdf2(digest === "sha256" ? sha256 : sha512, password, salt, { + c: iterations, + dkLen: keylen + }); } diff --git a/src/pure/hdkey.ts b/src/pure/hdkey.ts deleted file mode 100644 index be997e9..0000000 --- a/src/pure/hdkey.ts +++ /dev/null @@ -1,36 +0,0 @@ -export interface Versions { - private: number; - public: number; -} - -export declare class HDKeyT { - public static HARDENED_OFFSET: number; - public static fromMasterSeed(seed: Buffer, versions?: Versions): HDKeyT; - public static fromExtendedKey(base58key: string, versions?: Versions): HDKeyT; - public static fromJSON(json: { xpriv: string }): HDKeyT; - - public versions: Versions; - public depth: number; - public index: number; - public chainCode: Buffer | null; - public privateKey: Buffer | null; - public publicKey: Buffer | null; - public fingerprint: number; - public parentFingerprint: number; - public pubKeyHash: Buffer | undefined; - public identifier: Buffer | undefined; - public privateExtendedKey: string; - public publicExtendedKey: string; - - private constructor(versios: Versions); - public derive(path: string): HDKeyT; - public deriveChild(index: number): HDKeyT; - public sign(hash: Buffer): Buffer; - public verify(hash: Buffer, signature: Buffer): boolean; - public wipePrivateData(): this; - public toJSON(): { xpriv: string; xpub: string }; -} - -const hdkey: typeof HDKeyT = require("./vendor/hdkey-without-crypto"); - -export const HDKey = hdkey; diff --git a/src/pure/ripemd160.ts b/src/pure/ripemd160.ts deleted file mode 100644 index 4243f04..0000000 --- a/src/pure/ripemd160.ts +++ /dev/null @@ -1,5 +0,0 @@ -const { ripemd160: Ripemd160 } = require("hash.js/lib/hash/ripemd"); - -import { createHashFunction } from "../hash-utils"; - -export const ripemd160 = createHashFunction(() => new Ripemd160()); diff --git a/src/pure/sha256.ts b/src/pure/sha256.ts deleted file mode 100644 index 669cca9..0000000 --- a/src/pure/sha256.ts +++ /dev/null @@ -1,5 +0,0 @@ -const Sha256Hash = require("hash.js/lib/hash/sha/256"); - -import { createHashFunction } from "../hash-utils"; - -export const sha256 = createHashFunction(() => new Sha256Hash()); diff --git a/src/pure/shims/hdkey-crypto.ts b/src/pure/shims/hdkey-crypto.ts deleted file mode 100644 index 077dfdb..0000000 --- a/src/pure/shims/hdkey-crypto.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ripemd160 } from "../ripemd160"; -import { sha256 } from "../sha256"; - -export const createHmac = require("create-hmac"); -export const randomBytes = require("randombytes"); - -class Hash { - private buffers: Buffer[] = []; - - constructor(private readonly hashFunction: (msg: Buffer) => Buffer) {} - - public update(buffer: Buffer): this { - if (!Buffer.isBuffer(buffer)) { - throw new Error("hdkey-crypto shim is outdated"); - } - - this.buffers.push(buffer); - - return this; - } - - public digest(param: any): Buffer { - if (param) { - throw new Error("hdkey-crypto shim is outdated"); - } - - return this.hashFunction(Buffer.concat(this.buffers)); - } -} - -// We don't use create-hash here, as it doesn't work well with Rollup -export const createHash = (name: string) => { - if (name === "ripemd160") { - return new Hash(ripemd160); - } - - if (name === "sha256") { - return new Hash(sha256); - } - - throw new Error("hdkey-crypto shim is outdated"); -}; diff --git a/src/pure/shims/hdkey-secp256k1v3.ts b/src/pure/shims/hdkey-secp256k1v3.ts deleted file mode 100644 index 23e8dab..0000000 --- a/src/pure/shims/hdkey-secp256k1v3.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "../../shims/hdkey-secp256k1v3"; diff --git a/src/pure/vendor/.gitignore b/src/pure/vendor/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/src/random.ts b/src/random.ts index f0d50b7..1be79d0 100644 --- a/src/random.ts +++ b/src/random.ts @@ -1,18 +1,9 @@ -const randombytes = require("randombytes"); +import { randomBytes } from "@noble/hashes/utils"; -export function getRandomBytes(bytes: number): Promise { - return new Promise((resolve, reject) => { - randombytes(bytes, function(err: any, resp: Buffer) { - if (err) { - reject(err); - return; - } - - resolve(resp); - }); - }); +export function getRandomBytesSync(bytes: number): Uint8Array { + return randomBytes(bytes); } -export function getRandomBytesSync(bytes: number): Buffer { - return randombytes(bytes); +export async function getRandomBytes(bytes: number): Promise { + return randomBytes(bytes); } diff --git a/src/ripemd160.ts b/src/ripemd160.ts index 18add62..0d533be 100644 --- a/src/ripemd160.ts +++ b/src/ripemd160.ts @@ -1,7 +1,4 @@ -import crypto from "crypto"; +import { ripemd160 as _ripemd160 } from "@noble/hashes/legacy"; +import { wrapHash } from "./utils.js"; -import { createHashFunction } from "./hash-utils"; - -export const ripemd160 = createHashFunction(() => - crypto.createHash("ripemd160") -); +export const ripemd160 = wrapHash(_ripemd160); diff --git a/src/scrypt.ts b/src/scrypt.ts index af86de0..489c761 100644 --- a/src/scrypt.ts +++ b/src/scrypt.ts @@ -1,24 +1,32 @@ -import "scrypt-js/thirdparty/setImmediate"; -const scryptJs = require("scrypt-js"); +import { scrypt as _sync, scryptAsync as _async } from "@noble/hashes/scrypt"; +import { assertBytes } from "./utils.js"; + +type OnProgressCallback = (progress: number) => void; export async function scrypt( - password: Buffer, - salt: Buffer, + password: Uint8Array, + salt: Uint8Array, n: number, p: number, r: number, - dklen: number -): Promise { - return Buffer.from(await scryptJs.scrypt(password, salt, n, r, p, dklen)); + dkLen: number, + onProgress?: OnProgressCallback +): Promise { + assertBytes(password); + assertBytes(salt); + return _async(password, salt, { N: n, r, p, dkLen, onProgress }); } export function scryptSync( - password: Buffer, - salt: Buffer, + password: Uint8Array, + salt: Uint8Array, n: number, p: number, r: number, - dklen: number -): Buffer { - return Buffer.from(scryptJs.syncScrypt(password, salt, n, r, p, dklen)); + dkLen: number, + onProgress?: OnProgressCallback +): Uint8Array { + assertBytes(password); + assertBytes(salt); + return _sync(password, salt, { N: n, r, p, dkLen, onProgress }); } diff --git a/src/secp256k1-compat.ts b/src/secp256k1-compat.ts new file mode 100644 index 0000000..6f94a93 --- /dev/null +++ b/src/secp256k1-compat.ts @@ -0,0 +1,360 @@ +import { mod } from "@noble/curves/abstract/modular"; +import { sha256 } from "@noble/hashes/sha256"; +import { secp256k1 } from "./secp256k1.js"; +import { assertBool, assertBytes, hexToBytes, toHex } from "./utils.js"; + +// Use `secp256k1` module directly. +// This is a legacy compatibility layer for the npm package `secp256k1` via noble-secp256k1 + +const Point = secp256k1.ProjectivePoint; + +function hexToNumber(hex: string): bigint { + if (typeof hex !== "string") { + throw new TypeError("hexToNumber: expected string, got " + typeof hex); + } + return BigInt(`0x${hex}`); +} + +// Copy-paste from secp256k1, maybe export it? +const bytesToNumber = (bytes: Uint8Array) => hexToNumber(toHex(bytes)); +const numberToHex = (num: number | bigint) => + num.toString(16).padStart(64, "0"); +const numberToBytes = (num: number | bigint) => hexToBytes(numberToHex(num)); + +const ORDER = secp256k1.CURVE.n; + +type Output = Uint8Array | ((len: number) => Uint8Array); +interface Signature { + signature: Uint8Array; + recid: number; +} + +function output( + out: Output = (len: number): Uint8Array => new Uint8Array(len), + length: number, + value?: Uint8Array +): Uint8Array { + if (typeof out === "function") { + out = out(length); + } + assertBytes(out, length); + if (value) { + out.set(value); + } + return out; +} + +function getSignature(signature: Uint8Array) { + assertBytes(signature, 64); + return secp256k1.Signature.fromCompact(signature); +} + +export function createPrivateKeySync(): Uint8Array { + return secp256k1.utils.randomPrivateKey(); +} + +export async function createPrivateKey(): Promise { + return createPrivateKeySync(); +} + +export function privateKeyVerify(privateKey: Uint8Array): boolean { + assertBytes(privateKey, 32); + return secp256k1.utils.isValidPrivateKey(privateKey); +} + +export function publicKeyCreate( + privateKey: Uint8Array, + compressed = true, + out?: Output +): Uint8Array { + assertBytes(privateKey, 32); + assertBool("compressed", compressed); + const res = secp256k1.getPublicKey(privateKey, compressed); + return output(out, compressed ? 33 : 65, res); +} + +export function publicKeyVerify(publicKey: Uint8Array): boolean { + assertBytes(publicKey, 33, 65); + try { + Point.fromHex(publicKey); + return true; + } catch (e) { + return false; + } +} + +export function publicKeyConvert( + publicKey: Uint8Array, + compressed = true, + out?: Output +): Uint8Array { + assertBytes(publicKey, 33, 65); + assertBool("compressed", compressed); + const res = Point.fromHex(publicKey).toRawBytes(compressed); + return output(out, compressed ? 33 : 65, res); +} + +export function ecdsaSign( + msgHash: Uint8Array, + privateKey: Uint8Array, + options = { noncefn: undefined, data: undefined }, + out?: Output +): Signature { + assertBytes(msgHash, 32); + assertBytes(privateKey, 32); + if (typeof options !== "object" || options === null) { + throw new TypeError("secp256k1.ecdsaSign: options should be object"); + } + // noble-secp256k1 uses hmac instead of hmac-drbg here + if ( + options && + (options.noncefn !== undefined || options.data !== undefined) + ) { + throw new Error("Secp256k1: noncefn && data is unsupported"); + } + const sig = secp256k1.sign(msgHash, privateKey); + const recid = sig.recovery!; + return { signature: output(out, 64, sig.toCompactRawBytes()), recid }; +} + +export function ecdsaRecover( + signature: Uint8Array, + recid: number, + msgHash: Uint8Array, + compressed = true, + out?: Output +): Uint8Array { + assertBytes(msgHash, 32); + assertBool("compressed", compressed); + const sign = getSignature(signature); + const point = sign.addRecoveryBit(recid).recoverPublicKey(msgHash); + return output(out, compressed ? 33 : 65, point.toRawBytes(compressed)); +} + +export function ecdsaVerify( + signature: Uint8Array, + msgHash: Uint8Array, + publicKey: Uint8Array +) { + assertBytes(signature, 64); + assertBytes(msgHash, 32); + assertBytes(publicKey, 33, 65); + assertBytes(signature, 64); + const r = bytesToNumber(signature.slice(0, 32)); + const s = bytesToNumber(signature.slice(32, 64)); + if (r >= ORDER || s >= ORDER) { + throw new Error("Cannot parse signature"); + } + const pub = Point.fromHex(publicKey); // can throw error + pub; // typescript + let sig; + try { + sig = getSignature(signature); + } catch (error) { + return false; + } + return secp256k1.verify(sig, msgHash, publicKey); +} + +export function privateKeyTweakAdd( + privateKey: Uint8Array, + tweak: Uint8Array +): Uint8Array { + assertBytes(privateKey, 32); + assertBytes(tweak, 32); + let t = bytesToNumber(tweak); + if (t === 0n) { + throw new Error("Tweak must not be zero"); + } + if (t >= ORDER) { + throw new Error("Tweak bigger than curve order"); + } + t += bytesToNumber(privateKey); + if (t >= ORDER) { + t -= ORDER; + } + if (t === 0n) { + throw new Error( + "The tweak was out of range or the resulted private key is invalid" + ); + } + privateKey.set(hexToBytes(numberToHex(t))); + return privateKey; +} + +export function privateKeyNegate(privateKey: Uint8Array): Uint8Array { + assertBytes(privateKey, 32); + const bn = mod(-bytesToNumber(privateKey), ORDER); + privateKey.set(hexToBytes(numberToHex(bn))); + return privateKey; +} + +export function publicKeyNegate( + publicKey: Uint8Array, + compressed = true, + out?: Output +): Uint8Array { + assertBytes(publicKey, 33, 65); + assertBool("compressed", compressed); + const point = Point.fromHex(publicKey).negate(); + return output(out, compressed ? 33 : 65, point.toRawBytes(compressed)); +} + +export function publicKeyCombine( + publicKeys: Uint8Array[], + compressed = true, + out?: Output +): Uint8Array { + if (!Array.isArray(publicKeys) || !publicKeys.length) { + throw new TypeError( + `Expected array with one or more items, not ${publicKeys}` + ); + } + for (const publicKey of publicKeys) { + assertBytes(publicKey, 33, 65); + } + assertBool("compressed", compressed); + const combined = publicKeys + .map((pub) => Point.fromHex(pub)) + .reduce((res, curr) => res.add(curr), Point.ZERO); + // Prohibit returning ZERO point + if (combined.equals(Point.ZERO)) { + throw new Error("Combined result must not be zero"); + } + return output(out, compressed ? 33 : 65, combined.toRawBytes(compressed)); +} + +export function publicKeyTweakAdd( + publicKey: Uint8Array, + tweak: Uint8Array, + compressed = true, + out?: Output +): Uint8Array { + assertBytes(publicKey, 33, 65); + assertBytes(tweak, 32); + assertBool("compressed", compressed); + const p1 = Point.fromHex(publicKey); + const p2 = Point.fromPrivateKey(tweak); + const point = p1.add(p2); + if (p2.equals(Point.ZERO) || point.equals(Point.ZERO)) { + throw new Error("Tweak must not be zero"); + } + return output(out, compressed ? 33 : 65, point.toRawBytes(compressed)); +} + +export function publicKeyTweakMul( + publicKey: Uint8Array, + tweak: Uint8Array, + compressed = true, + out?: Output +): Uint8Array { + assertBytes(publicKey, 33, 65); + assertBytes(tweak, 32); + assertBool("compressed", compressed); + const bn = bytesToNumber(tweak); + if (bn === 0n) { + throw new Error("Tweak must not be zero"); + } + if (bn <= 1 || bn >= ORDER) { + throw new Error("Tweak is zero or bigger than curve order"); + } + const point = Point.fromHex(publicKey).multiply(bn); + return output(out, compressed ? 33 : 65, point.toRawBytes(compressed)); +} + +export function privateKeyTweakMul( + privateKey: Uint8Array, + tweak: Uint8Array +): Uint8Array { + assertBytes(privateKey, 32); + assertBytes(tweak, 32); + const bn = bytesToNumber(tweak); + if (bn <= 1 || bn >= ORDER) { + throw new Error("Tweak is zero or bigger than curve order"); + } + const res = mod(bn * bytesToNumber(privateKey), ORDER); + if (res === 0n) { + throw new Error( + "The tweak was out of range or the resulted private key is invalid" + ); + } + privateKey.set(hexToBytes(numberToHex(res))); + return privateKey; +} +// internal -> DER +export function signatureExport( + signature: Uint8Array, + out?: Output +): Uint8Array { + const res = getSignature(signature).toDERRawBytes(); + return output(out, 72, res.slice()).slice(0, res.length); +} +// DER -> internal +export function signatureImport( + signature: Uint8Array, + out?: Output +): Uint8Array { + assertBytes(signature); + const sig = secp256k1.Signature.fromDER(signature); + return output(out, 64, hexToBytes(sig.toCompactHex())); +} + +export function signatureNormalize(signature: Uint8Array): Uint8Array { + const res = getSignature(signature); + if (res.s > ORDER / 2n) { + signature.set(numberToBytes(ORDER - res.s), 32); + } + return signature; +} + +export function ecdh( + publicKey: Uint8Array, + privateKey: Uint8Array, + options: { + xbuf?: Uint8Array; + ybuf?: Uint8Array; + data?: Uint8Array; + hashfn?: (x: Uint8Array, y: Uint8Array, data: Uint8Array) => Uint8Array; + } = {}, + out?: Output +): Uint8Array { + assertBytes(publicKey, 33, 65); + assertBytes(privateKey, 32); + if (typeof options !== "object" || options === null) { + throw new TypeError("secp256k1.ecdh: options should be object"); + } + if (options.data !== undefined) { + assertBytes(options.data); + } + const point = Point.fromHex(secp256k1.getSharedSecret(privateKey, publicKey)); + if (options.hashfn === undefined) { + return output(out, 32, sha256(point.toRawBytes(true))); + } + if (typeof options.hashfn !== "function") { + throw new TypeError("secp256k1.ecdh: options.hashfn should be function"); + } + if (options.xbuf !== undefined) { + assertBytes(options.xbuf, 32); + } + if (options.ybuf !== undefined) { + assertBytes(options.ybuf, 32); + } + assertBytes(out as Uint8Array, 32); + const { x, y } = point.toAffine(); + const xbuf = options.xbuf || new Uint8Array(32); + xbuf.set(numberToBytes(x)); + const ybuf = options.ybuf || new Uint8Array(32); + ybuf.set(numberToBytes(y)); + const hash = options.hashfn(xbuf, ybuf, options.data!); + if (!(hash instanceof Uint8Array) || hash.length !== 32) { + throw new Error("secp256k1.ecdh: invalid options.hashfn output"); + } + return output(out, 32, hash); +} + +export function contextRandomize(seed: Uint8Array) { + if (seed !== null) { + assertBytes(seed, 32); + } + // There is no context to randomize +} diff --git a/src/secp256k1.ts b/src/secp256k1.ts index a7797e2..28f4d1f 100644 --- a/src/secp256k1.ts +++ b/src/secp256k1.ts @@ -1,24 +1 @@ -import { privateKeyVerify } from "secp256k1"; -import { getRandomBytes, getRandomBytesSync } from "./random"; - -const SECP256K1_PRIVATE_KEY_SIZE = 32; - -export async function createPrivateKey(): Promise { - while (true) { - const pk = await getRandomBytes(SECP256K1_PRIVATE_KEY_SIZE); - if (privateKeyVerify(pk)) { - return pk; - } - } -} - -export function createPrivateKeySync(): Uint8Array { - while (true) { - const pk = getRandomBytesSync(SECP256K1_PRIVATE_KEY_SIZE); - if (privateKeyVerify(pk)) { - return pk; - } - } -} - -export * from "secp256k1"; +export { secp256k1 } from "@noble/curves/secp256k1"; diff --git a/src/sha256.ts b/src/sha256.ts index 34a5fb0..c843a31 100644 --- a/src/sha256.ts +++ b/src/sha256.ts @@ -1,5 +1,4 @@ -import crypto from "crypto"; +import { sha256 as _sha256 } from "@noble/hashes/sha2"; +import { wrapHash } from "./utils.js"; -import { createHashFunction } from "./hash-utils"; - -export const sha256 = createHashFunction(() => crypto.createHash("sha256")); +export const sha256 = wrapHash(_sha256); diff --git a/src/sha512.ts b/src/sha512.ts new file mode 100644 index 0000000..9d79e0d --- /dev/null +++ b/src/sha512.ts @@ -0,0 +1,4 @@ +import { sha512 as _sha512 } from "@noble/hashes/sha2"; +import { wrapHash } from "./utils.js"; + +export const sha512 = wrapHash(_sha512); diff --git a/src/shims/hdkey-crypto.ts b/src/shims/hdkey-crypto.ts deleted file mode 100644 index 5b6c25d..0000000 --- a/src/shims/hdkey-crypto.ts +++ /dev/null @@ -1 +0,0 @@ -export { createHash, createHmac, randomBytes } from "crypto"; diff --git a/src/shims/hdkey-secp256k1v3.ts b/src/shims/hdkey-secp256k1v3.ts deleted file mode 100644 index 75cf52d..0000000 --- a/src/shims/hdkey-secp256k1v3.ts +++ /dev/null @@ -1,49 +0,0 @@ -import * as secp256k1 from "secp256k1"; - -export function privateKeyVerify(privateKey: Buffer): boolean { - return secp256k1.privateKeyVerify(privateKey); -} - -export function publicKeyCreate(privateKey: Buffer, compressed = true): Buffer { - return Buffer.from(secp256k1.publicKeyCreate(privateKey, compressed)); -} - -export function publicKeyVerify(publicKey: Buffer): boolean { - return secp256k1.publicKeyVerify(publicKey); -} - -export function publicKeyConvert(publicKey: Buffer, compressed = true): Buffer { - return Buffer.from(secp256k1.publicKeyConvert(publicKey, compressed)); -} - -export function privateKeyTweakAdd(publicKey: Buffer, tweak: Buffer): Buffer { - return Buffer.from( - secp256k1.privateKeyTweakAdd(Buffer.from(publicKey), tweak) - ); -} - -export function publicKeyTweakAdd( - publicKey: Buffer, - tweak: Buffer, - compressed = true -): Buffer { - return Buffer.from( - secp256k1.publicKeyTweakAdd(Buffer.from(publicKey), tweak, compressed) - ); -} - -export function sign( - message: Buffer, - privateKey: Buffer -): { signature: Buffer; recovery: number } { - const ret = secp256k1.ecdsaSign(message, privateKey); - return { signature: Buffer.from(ret.signature), recovery: ret.recid }; -} - -export function verify( - message: Buffer, - signature: Buffer, - publicKey: Buffer -): boolean { - return secp256k1.ecdsaVerify(signature, message, publicKey); -} diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..ac424e7 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,53 @@ +import { abool as assertBool } from "@noble/curves/abstract/utils"; +import { abytes as assertBytes } from "@noble/hashes/_assert"; +import { hexToBytes as _hexToBytes } from "@noble/hashes/utils"; + +export { + bytesToHex, + concatBytes, + createView, + bytesToHex as toHex, + utf8ToBytes +} from "@noble/hashes/utils"; +export { assertBool, assertBytes }; + +// buf.toString('hex') -> toHex(buf) + +// Global symbols in both browsers and Node.js since v11 +// See https://github.com/microsoft/TypeScript/issues/31535 +declare const TextEncoder: any; +declare const TextDecoder: any; + +// buf.toString('utf8') -> bytesToUtf8(buf) +export function bytesToUtf8(data: Uint8Array): string { + if (!(data instanceof Uint8Array)) { + throw new TypeError(`bytesToUtf8 expected Uint8Array, got ${typeof data}`); + } + return new TextDecoder().decode(data); +} + +export function hexToBytes(data: string): Uint8Array { + const sliced = data.startsWith("0x") ? data.substring(2) : data; + return _hexToBytes(sliced); +} + +// buf.equals(buf2) -> equalsBytes(buf, buf2) +export function equalsBytes(a: Uint8Array, b: Uint8Array): boolean { + if (a.length !== b.length) { + return false; + } + for (let i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; +} + +// Internal utils +export function wrapHash(hash: (msg: Uint8Array) => Uint8Array) { + return (msg: Uint8Array): Uint8Array => { + assertBytes(msg); + return hash(msg); + }; +} diff --git a/src/vendor/.gitignore b/src/vendor/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/bip39-without-wordlists-config/empty-module.js b/test/.npmrc similarity index 100% rename from bip39-without-wordlists-config/empty-module.js rename to test/.npmrc diff --git a/test/karma.browserify.conf.js b/test/karma.browserify.conf.js index 129ac1e..2ec476a 100644 --- a/test/karma.browserify.conf.js +++ b/test/karma.browserify.conf.js @@ -1,7 +1,7 @@ -module.exports = function(config) { +module.exports = function (config) { config.set({ - frameworks: ["mocha", "chai"], - files: ["../test-builds/browserify-build.js"], + frameworks: ["mocha"], + files: ["./test-builds/browserify-build.js"], colors: true, logLevel: config.LOG_INFO, browsers: ["ChromeHeadless"], @@ -12,7 +12,7 @@ module.exports = function(config) { concurrency: Infinity, reporters: ["mocha"], client: { - captureConsole: true - } + captureConsole: true, + }, }); }; diff --git a/test/karma.parcel.conf.js b/test/karma.parcel.conf.js index bce12a7..a614952 100644 --- a/test/karma.parcel.conf.js +++ b/test/karma.parcel.conf.js @@ -1,7 +1,7 @@ -module.exports = function(config) { +module.exports = function (config) { config.set({ - frameworks: ["mocha", "chai"], - files: ["../test-builds/parcel/test/pure/*.js"], + frameworks: ["mocha"], + files: ["./test-builds/parcel/*.js"], colors: true, logLevel: config.LOG_INFO, browsers: ["ChromeHeadless"], @@ -12,7 +12,7 @@ module.exports = function(config) { concurrency: Infinity, reporters: ["mocha"], client: { - captureConsole: true - } + captureConsole: true, + }, }); }; diff --git a/test/karma.rollup.conf.js b/test/karma.rollup.conf.js index 72c1a01..9c716dd 100644 --- a/test/karma.rollup.conf.js +++ b/test/karma.rollup.conf.js @@ -1,7 +1,7 @@ -module.exports = function(config) { +module.exports = function (config) { config.set({ - frameworks: ["mocha", "chai"], - files: ["../test-builds/rollup/*.js"], + frameworks: ["mocha"], + files: ["./test-builds/rollup/*.js"], colors: true, logLevel: config.LOG_INFO, browsers: ["ChromeHeadless"], @@ -12,7 +12,7 @@ module.exports = function(config) { concurrency: Infinity, reporters: ["mocha"], client: { - captureConsole: true - } + captureConsole: true, + }, }); }; diff --git a/test/karma.webpack.conf.js b/test/karma.webpack.conf.js index c255114..3e17fc6 100644 --- a/test/karma.webpack.conf.js +++ b/test/karma.webpack.conf.js @@ -1,7 +1,7 @@ -module.exports = function(config) { +module.exports = function (config) { config.set({ - frameworks: ["mocha", "chai"], - files: ["../test-builds/webpack-build.js"], + frameworks: ["mocha"], + files: ["./test-builds/main.js"], colors: true, logLevel: config.LOG_INFO, browsers: ["ChromeHeadless"], @@ -12,7 +12,7 @@ module.exports = function(config) { concurrency: Infinity, reporters: ["mocha"], client: { - captureConsole: true - } + captureConsole: true, + }, }); }; diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index 2403597..0000000 --- a/test/mocha.opts +++ /dev/null @@ -1,2 +0,0 @@ ---require ts-node/register -test/node/*.ts diff --git a/test/node/aes.ts b/test/node/aes.ts deleted file mode 100644 index a1baf8f..0000000 --- a/test/node/aes.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { decrypt, encrypt } from "../../src/aes"; -import { createTests } from "../test-vectors/aes"; - -createTests(encrypt, decrypt); diff --git a/test/node/bip39.ts b/test/node/bip39.ts deleted file mode 100644 index ea4c273..0000000 --- a/test/node/bip39.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as bip39 from "../../src/bip39"; -import { wordlist as englishWordlist } from "../../src/bip39/wordlists/english"; -import { wordlist as spanishWordlist } from "../../src/bip39/wordlists/spanish"; -import { createTests } from "../test-vectors/bip39"; - -createTests( - bip39.generateMnemonic, - bip39.mnemonicToEntropy, - bip39.entropyToMnemonic, - bip39.validateMnemonic, - bip39.mnemonicToSeed, - bip39.mnemonicToSeedSync, - englishWordlist, - spanishWordlist -); diff --git a/test/node/blake2b.ts b/test/node/blake2b.ts deleted file mode 100644 index 64b4483..0000000 --- a/test/node/blake2b.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { blake2b } from "../../src/blake2b"; -import { createTests } from "../test-vectors/blake2b"; - -createTests(blake2b); diff --git a/test/node/hdkey.ts b/test/node/hdkey.ts deleted file mode 100644 index 3999264..0000000 --- a/test/node/hdkey.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { HDKey } from "../../src/hdkey"; -import { createTests } from "../test-vectors/hdkey"; - -createTests(HDKey); diff --git a/test/node/keccak.ts b/test/node/keccak.ts deleted file mode 100644 index 53c1686..0000000 --- a/test/node/keccak.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { keccak224, keccak256, keccak384, keccak512 } from "../../src/keccak"; - -import { - createTestsForVector, - keccak224Vectors, - keccak256Vectors, - keccak384Vectors, - keccak512Vectors -} from "../test-vectors/keccak"; - -describe("keccak", function() { - createTestsForVector(keccak224, keccak224Vectors); - createTestsForVector(keccak256, keccak256Vectors); - createTestsForVector(keccak384, keccak384Vectors); - createTestsForVector(keccak512, keccak512Vectors); -}); diff --git a/test/node/pbkdf2.ts b/test/node/pbkdf2.ts deleted file mode 100644 index b948a7a..0000000 --- a/test/node/pbkdf2.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { pbkdf2, pbkdf2Sync } from "../../src/pbkdf2"; -import { createTests } from "../test-vectors/pbkdf2"; - -createTests(pbkdf2Sync, pbkdf2); diff --git a/test/node/random.ts b/test/node/random.ts deleted file mode 100644 index 52c690c..0000000 --- a/test/node/random.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { getRandomBytes, getRandomBytesSync } from "../../src/random"; -import { createTests } from "../test-vectors/random"; - -createTests(getRandomBytesSync, getRandomBytes); diff --git a/test/node/ripemd160.ts b/test/node/ripemd160.ts deleted file mode 100644 index 6d93ac9..0000000 --- a/test/node/ripemd160.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ripemd160 } from "../../src/ripemd160"; -import { createTests } from "../test-vectors/ripemd160"; - -createTests(ripemd160); diff --git a/test/node/scrypt.ts b/test/node/scrypt.ts deleted file mode 100644 index 4045ab4..0000000 --- a/test/node/scrypt.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { scrypt, scryptSync } from "../../src/scrypt"; -import { createTests } from "../test-vectors/scrypt"; - -createTests(scryptSync, scrypt); diff --git a/test/node/secp256k1.ts b/test/node/secp256k1.ts deleted file mode 100644 index b8a32cb..0000000 --- a/test/node/secp256k1.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { - createPrivateKey, - createPrivateKeySync, - ecdsaRecover, - ecdsaSign, - privateKeyVerify, - publicKeyConvert -} from "../../src/secp256k1"; -import { createTests } from "../test-vectors/secp256k1"; - -createTests( - ecdsaSign, - ecdsaRecover, - publicKeyConvert, - createPrivateKey, - createPrivateKeySync, - privateKeyVerify -); diff --git a/test/node/sha256.ts b/test/node/sha256.ts deleted file mode 100644 index 6b2fb47..0000000 --- a/test/node/sha256.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { sha256 } from "../../src/sha256"; -import { createTests } from "../test-vectors/sha256"; - -createTests(sha256); diff --git a/test/package-lock.json b/test/package-lock.json new file mode 100644 index 0000000..c2710f8 --- /dev/null +++ b/test/package-lock.json @@ -0,0 +1,6665 @@ +{ + "name": "test", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "test", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "ethereum-cryptography": "file:.." + }, + "devDependencies": { + "@parcel/watcher": "2.4.1", + "@rollup/plugin-commonjs": "22.0.1", + "@rollup/plugin-node-resolve": "13.3.0", + "browserify": "17.0.0", + "parcel": "2.12.0", + "rollup": "2.79.1", + "webpack": "5.94.0", + "webpack-cli": "4.10.0" + } + }, + "..": { + "name": "ethereum-cryptography", + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@noble/ciphers": "1.3.0", + "@noble/curves": "1.9.0", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0" + }, + "devDependencies": { + "@types/estree": "1.0.0", + "@types/mocha": "10.0.7", + "@types/node": "22.14.1", + "@typescript-eslint/eslint-plugin": "5.30.6", + "@typescript-eslint/parser": "5.30.6", + "eslint": "8.38.0", + "eslint-plugin-prettier": "4.2.1", + "karma": "6.4.4", + "karma-chrome-launcher": "3.1.1", + "karma-mocha": "2.0.1", + "karma-mocha-reporter": "2.2.5", + "mocha": "10.7.3", + "npm-run-all": "4.1.5", + "prettier": "2.7.1", + "ts-node": "10.9.1", + "typescript": "5.8.3" + }, + "engines": { + "node": "^14.21.3 || >=16", + "npm": ">=9" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@lezer/common": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", + "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==", + "dev": true + }, + "node_modules/@lezer/lr": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", + "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.8.5.tgz", + "integrity": "sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.8.5.tgz", + "integrity": "sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.8.5.tgz", + "integrity": "sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.8.5.tgz", + "integrity": "sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.8.5.tgz", + "integrity": "sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.8.5.tgz", + "integrity": "sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@mischnic/json-sourcemap": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz", + "integrity": "sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==", + "dev": true, + "dependencies": { + "@lezer/common": "^1.0.0", + "@lezer/lr": "^1.0.0", + "json5": "^2.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@parcel/bundler-default": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.12.0.tgz", + "integrity": "sha512-3ybN74oYNMKyjD6V20c9Gerdbh7teeNvVMwIoHIQMzuIFT6IGX53PyOLlOKRLbjxMc0TMimQQxIt2eQqxR5LsA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/graph": "3.2.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/compressor-raw": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.12.0.tgz", + "integrity": "sha512-h41Q3X7ZAQ9wbQ2csP8QGrwepasLZdXiuEdpUryDce6rF9ZiHoJ97MRpdLxOhOPyASTw/xDgE1xyaPQr0Q3f5A==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/config-default": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.12.0.tgz", + "integrity": "sha512-dPNe2n9eEsKRc1soWIY0yToMUPirPIa2QhxcCB3Z5RjpDGIXm0pds+BaiqY6uGLEEzsjhRO0ujd4v2Rmm0vuFg==", + "dev": true, + "dependencies": { + "@parcel/bundler-default": "2.12.0", + "@parcel/compressor-raw": "2.12.0", + "@parcel/namer-default": "2.12.0", + "@parcel/optimizer-css": "2.12.0", + "@parcel/optimizer-htmlnano": "2.12.0", + "@parcel/optimizer-image": "2.12.0", + "@parcel/optimizer-svgo": "2.12.0", + "@parcel/optimizer-swc": "2.12.0", + "@parcel/packager-css": "2.12.0", + "@parcel/packager-html": "2.12.0", + "@parcel/packager-js": "2.12.0", + "@parcel/packager-raw": "2.12.0", + "@parcel/packager-svg": "2.12.0", + "@parcel/packager-wasm": "2.12.0", + "@parcel/reporter-dev-server": "2.12.0", + "@parcel/resolver-default": "2.12.0", + "@parcel/runtime-browser-hmr": "2.12.0", + "@parcel/runtime-js": "2.12.0", + "@parcel/runtime-react-refresh": "2.12.0", + "@parcel/runtime-service-worker": "2.12.0", + "@parcel/transformer-babel": "2.12.0", + "@parcel/transformer-css": "2.12.0", + "@parcel/transformer-html": "2.12.0", + "@parcel/transformer-image": "2.12.0", + "@parcel/transformer-js": "2.12.0", + "@parcel/transformer-json": "2.12.0", + "@parcel/transformer-postcss": "2.12.0", + "@parcel/transformer-posthtml": "2.12.0", + "@parcel/transformer-raw": "2.12.0", + "@parcel/transformer-react-refresh-wrap": "2.12.0", + "@parcel/transformer-svg": "2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/core": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.12.0.tgz", + "integrity": "sha512-s+6pwEj+GfKf7vqGUzN9iSEPueUssCCQrCBUlcAfKrJe0a22hTUCjewpB0I7lNrCIULt8dkndD+sMdOrXsRl6Q==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/graph": "3.2.0", + "@parcel/logger": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "abortcontroller-polyfill": "^1.1.9", + "base-x": "^3.0.8", + "browserslist": "^4.6.6", + "clone": "^2.1.1", + "dotenv": "^7.0.0", + "dotenv-expand": "^5.1.0", + "json5": "^2.2.0", + "msgpackr": "^1.9.9", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/graph": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-3.2.0.tgz", + "integrity": "sha512-xlrmCPqy58D4Fg5umV7bpwDx5Vyt7MlnQPxW68vae5+BA4GSWetfZt+Cs5dtotMG2oCHzZxhIPt7YZ7NRyQzLA==", + "dev": true, + "dependencies": { + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/namer-default": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.12.0.tgz", + "integrity": "sha512-9DNKPDHWgMnMtqqZIMiEj/R9PNWW16lpnlHjwK3ciRlMPgjPJ8+UNc255teZODhX0T17GOzPdGbU/O/xbxVPzA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.12.0.tgz", + "integrity": "sha512-ifbcC97fRzpruTjaa8axIFeX4MjjSIlQfem3EJug3L2AVqQUXnM1XO8L0NaXGNLTW2qnh1ZjIJ7vXT/QhsphsA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-htmlnano": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.12.0.tgz", + "integrity": "sha512-MfPMeCrT8FYiOrpFHVR+NcZQlXAptK2r4nGJjfT+ndPBhEEZp4yyL7n1y7HfX9geg5altc4WTb4Gug7rCoW8VQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "htmlnano": "^2.0.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "svgo": "^2.4.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@parcel/optimizer-image": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.12.0.tgz", + "integrity": "sha512-bo1O7raeAIbRU5nmNVtx8divLW9Xqn0c57GVNGeAK4mygnQoqHqRZ0mR9uboh64pxv6ijXZHPhKvU9HEpjPjBQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/optimizer-svgo": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.12.0.tgz", + "integrity": "sha512-Kyli+ZZXnoonnbeRQdoWwee9Bk2jm/49xvnfb+2OO8NN0d41lblBoRhOyFiScRnJrw7eVl1Xrz7NTkXCIO7XFQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "svgo": "^2.4.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/@parcel/optimizer-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@parcel/optimizer-swc": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-swc/-/optimizer-swc-2.12.0.tgz", + "integrity": "sha512-iBi6LZB3lm6WmbXfzi8J3DCVPmn4FN2lw7DGXxUXu7MouDPVWfTsM6U/5TkSHJRNRogZ2gqy5q9g34NPxHbJcw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "@swc/core": "^1.3.36", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-css": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.12.0.tgz", + "integrity": "sha512-j3a/ODciaNKD19IYdWJT+TP+tnhhn5koBGBWWtrKSu0UxWpnezIGZetit3eE+Y9+NTePalMkvpIlit2eDhvfJA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.12.0.tgz", + "integrity": "sha512-PpvGB9hFFe+19NXGz2ApvPrkA9GwEqaDAninT+3pJD57OVBaxB8U+HN4a5LICKxjUppPPqmrLb6YPbD65IX4RA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.12.0.tgz", + "integrity": "sha512-viMF+FszITRRr8+2iJyk+4ruGiL27Y6AF7hQ3xbJfzqnmbOhGFtLTQwuwhOLqN/mWR2VKdgbLpZSarWaO3yAMg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "globals": "^13.2.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-raw": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.12.0.tgz", + "integrity": "sha512-tJZqFbHqP24aq1F+OojFbQIc09P/u8HAW5xfndCrFnXpW4wTgM3p03P0xfw3gnNq+TtxHJ8c3UFE5LnXNNKhYA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.12.0.tgz", + "integrity": "sha512-ldaGiacGb2lLqcXas97k8JiZRbAnNREmcvoY2W2dvW4loVuDT9B9fU777mbV6zODpcgcHWsLL3lYbJ5Lt3y9cg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "posthtml": "^0.16.4" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-wasm": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-wasm/-/packager-wasm-2.12.0.tgz", + "integrity": "sha512-fYqZzIqO9fGYveeImzF8ll6KRo2LrOXfD+2Y5U3BiX/wp9wv17dz50QLDQm9hmTcKGWxK4yWqKQh+Evp/fae7A==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">=12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.12.0.tgz", + "integrity": "sha512-nc/uRA8DiMoe4neBbzV6kDndh/58a4wQuGKw5oEoIwBCHUvE2W8ZFSu7ollSXUGRzfacTt4NdY8TwS73ScWZ+g==", + "dev": true, + "dependencies": { + "@parcel/types": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.12.0.tgz", + "integrity": "sha512-TqKsH4GVOLPSCanZ6tcTPj+rdVHERnt5y4bwTM82cajM21bCX1Ruwp8xOKU+03091oV2pv5ieB18pJyRF7IpIw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "chalk": "^4.1.0", + "term-size": "^2.2.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.12.0.tgz", + "integrity": "sha512-tIcDqRvAPAttRlTV28dHcbWT5K2r/MBFks7nM4nrEDHWtnrCwimkDmZTc1kD8QOCCjGVwRHcQybpHvxfwol6GA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-tracer/-/reporter-tracer-2.12.0.tgz", + "integrity": "sha512-g8rlu9GxB8Ut/F8WGx4zidIPQ4pcYFjU9bZO+fyRIPrSUFH2bKijCnbZcr4ntqzDGx74hwD6cCG4DBoleq2UlQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "chrome-trace-event": "^1.0.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.12.0.tgz", + "integrity": "sha512-uuhbajTax37TwCxu7V98JtRLiT6hzE4VYSu5B7Qkauy14/WFt2dz6GOUXPgVsED569/hkxebPx3KCMtZW6cHHA==", + "dev": true, + "dependencies": { + "@parcel/node-resolver-core": "3.3.0", + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.12.0.tgz", + "integrity": "sha512-4ZLp2FWyD32r0GlTulO3+jxgsA3oO1P1b5oO2IWuWilfhcJH5LTiazpL5YdusUjtNn9PGN6QLAWfxmzRIfM+Ow==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.12.0.tgz", + "integrity": "sha512-sBerP32Z1crX5PfLNGDSXSdqzlllM++GVnVQVeM7DgMKS8JIFG3VLi28YkX+dYYGtPypm01JoIHCkvwiZEcQJg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.12.0.tgz", + "integrity": "sha512-SCHkcczJIDFTFdLTzrHTkQ0aTrX3xH6jrA4UsCBL6ji61+w+ohy4jEEe9qCgJVXhnJfGLE43HNXek+0MStX+Mw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "react-error-overlay": "6.0.9", + "react-refresh": "^0.9.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.12.0.tgz", + "integrity": "sha512-BXuMBsfiwpIEnssn+jqfC3jkgbS8oxeo3C7xhSQsuSv+AF2FwY3O3AO1c1RBskEW3XrBLNINOJujroNw80VTKA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/source-map": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", + "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": "^12.18.3 || >=14" + } + }, + "node_modules/@parcel/transformer-babel": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.12.0.tgz", + "integrity": "sha512-zQaBfOnf/l8rPxYGnsk/ufh/0EuqvmnxafjBIpKZ//j6rGylw5JCqXSb1QvvAqRYruKeccxGv7+HrxpqKU6V4A==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "browserslist": "^4.6.6", + "json5": "^2.2.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.12.0.tgz", + "integrity": "sha512-vXhOqoAlQGATYyQ433Z1DXKmiKmzOAUmKysbYH3FD+LKEKLMEl/pA14goqp00TW+A/EjtSKKyeMyHlMIIUqj4Q==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.12.0.tgz", + "integrity": "sha512-5jW4dFFBlYBvIQk4nrH62rfA/G/KzVzEDa6S+Nne0xXhglLjkm64Ci9b/d4tKZfuGWUbpm2ASAq8skti/nfpXw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2", + "srcset": "4" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html/node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@parcel/transformer-image": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.12.0.tgz", + "integrity": "sha512-8hXrGm2IRII49R7lZ0RpmNk27EhcsH+uNKsvxuMpXPuEnWgC/ha/IrjaI29xCng1uGur74bJF43NUSQhR4aTdw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-js": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.12.0.tgz", + "integrity": "sha512-OSZpOu+FGDbC/xivu24v092D9w6EGytB3vidwbdiJ2FaPgfV7rxS0WIUjH4I0OcvHAcitArRXL0a3+HrNTdQQw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/helpers": "^0.5.0", + "browserslist": "^4.6.6", + "nullthrows": "^1.1.1", + "regenerator-runtime": "^0.13.7", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-json": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.12.0.tgz", + "integrity": "sha512-Utv64GLRCQILK5r0KFs4o7I41ixMPllwOLOhkdjJKvf1hZmN6WqfOmB1YLbWS/y5Zb/iB52DU2pWZm96vLFQZQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "json5": "^2.2.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.12.0.tgz", + "integrity": "sha512-FZqn+oUtiLfPOn67EZxPpBkfdFiTnF4iwiXPqvst3XI8H+iC+yNgzmtJkunOOuylpYY6NOU5jT8d7saqWSDv2Q==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "clone": "^2.1.1", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.12.0.tgz", + "integrity": "sha512-z6Z7rav/pcaWdeD+2sDUcd0mmNZRUvtHaUGa50Y2mr+poxrKilpsnFMSiWBT+oOqPt7j71jzDvrdnAF4XkCljg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-raw": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.12.0.tgz", + "integrity": "sha512-Ht1fQvXxix0NncdnmnXZsa6hra20RXYh1VqhBYZLsDfkvGGFnXIgO03Jqn4Z8MkKoa0tiNbDhpKIeTjyclbBxQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-react-refresh-wrap": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.12.0.tgz", + "integrity": "sha512-GE8gmP2AZtkpBIV5vSCVhewgOFRhqwdM5Q9jNPOY5PKcM3/Ff0qCqDiTzzGLhk0/VMBrdjssrfZkVx6S/lHdJw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "react-refresh": "^0.9.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-svg": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.12.0.tgz", + "integrity": "sha512-cZJqGRJ4JNdYcb+vj94J7PdOuTnwyy45dM9xqbIMH+HSiiIkfrMsdEwYft0GTyFTdsnf+hdHn3tau7Qa5hhX+A==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.1.tgz", + "integrity": "sha512-dGfEZvdjDHObBiP5IvwTKMVeq/tBZGMBHZFMdIV1ClMM/YoWS34xrHFGfag9SN2ZtMgNZRFruqvxZQEa70O6nQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^2.42.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@swc/core": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.21.tgz", + "integrity": "sha512-7/cN0SZ+y2V6e0hsDD8koGR0QVh7Jl3r756bwaHLLSN+kReoUb/yVcLsA8iTn90JLME3DkQK4CPjxDCQiyMXNg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.12" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.7.21", + "@swc/core-darwin-x64": "1.7.21", + "@swc/core-linux-arm-gnueabihf": "1.7.21", + "@swc/core-linux-arm64-gnu": "1.7.21", + "@swc/core-linux-arm64-musl": "1.7.21", + "@swc/core-linux-x64-gnu": "1.7.21", + "@swc/core-linux-x64-musl": "1.7.21", + "@swc/core-win32-arm64-msvc": "1.7.21", + "@swc/core-win32-ia32-msvc": "1.7.21", + "@swc/core-win32-x64-msvc": "1.7.21" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.21.tgz", + "integrity": "sha512-hh5uOZ7jWF66z2TRMhhXtWMQkssuPCSIZPy9VHf5KvZ46cX+5UeECDthchYklEVZQyy4Qr6oxfh4qff/5spoMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.21.tgz", + "integrity": "sha512-lTsPquqSierQ6jWiWM7NnYXXZGk9zx3NGkPLHjPbcH5BmyiauX0CC/YJYJx7YmS2InRLyALlGmidHkaF4JY28A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.21.tgz", + "integrity": "sha512-AgSd0fnSzAqCvWpzzZCq75z62JVGUkkXEOpfdi99jj/tryPy38KdXJtkVWJmufPXlRHokGTBitalk33WDJwsbA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.21.tgz", + "integrity": "sha512-l+jw6RQ4Y43/8dIst0c73uQE+W3kCWrCFqMqC/xIuE/iqHOnvYK6YbA1ffOct2dImkHzNiKuoehGqtQAc6cNaQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.21.tgz", + "integrity": "sha512-29KKZXrTo/c9F1JFL9WsNvCa6UCdIVhHP5EfuYhlKbn5/YmSsNFkuHdUtZFEd5U4+jiShXDmgGCtLW2d08LIwg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.21.tgz", + "integrity": "sha512-HsP3JwddvQj5HvnjmOr+Bd5plEm6ccpfP5wUlm3hywzvdVkj+yR29bmD7UwpV/1zCQ60Ry35a7mXhKI6HQxFgw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.21.tgz", + "integrity": "sha512-hYKLVeUTHqvFK628DFJEwxoX6p42T3HaQ4QjNtf3oKhiJWFh9iTRUrN/oCB5YI3R9WMkFkKh+99gZ/Dd0T5lsg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.21.tgz", + "integrity": "sha512-qyWAKW10aMBe6iUqeZ7NAJIswjfggVTUpDINpQGUJhz+pR71YZDidXgZXpaDB84YyDB2JAlRqd1YrLkl7CMiIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.21.tgz", + "integrity": "sha512-cy61wS3wgH5mEwBiQ5w6/FnQrchBDAdPsSh0dKSzNmI+4K8hDxS8uzdBycWqJXO0cc+mA77SIlwZC3hP3Kum2g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.7.21", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.21.tgz", + "integrity": "sha512-/rexGItJURNJOdae+a48M+loT74nsEU+PyRRVAkZMKNRtLoYFAr0cpDlS5FodIgGunp/nqM0bst4H2w6Y05IKA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/helpers": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.12.tgz", + "integrity": "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", + "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.1.tgz", + "integrity": "sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base-x": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "dependencies": { + "resolve": "^1.17.0" + } + }, + "node_modules/browserify": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "dev": true, + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.5", + "hash-base": "~3.0", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001653", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", + "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", + "dev": true, + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dev": true, + "dependencies": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", + "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/ethereum-cryptography": { + "resolved": "..", + "link": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/htmlnano": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.1.1.tgz", + "integrity": "sha512-kAERyg/LuNZYmdqgCdYvugyLWNFAm8MWXpQMz1pLpetmCbFwoMxvkSoaAMlFrOC4OKTWI4KlZGT/RsNxg4ghOw==", + "dev": true, + "dependencies": { + "cosmiconfig": "^9.0.0", + "posthtml": "^0.16.5", + "timsort": "^0.3.0" + }, + "peerDependencies": { + "cssnano": "^7.0.0", + "postcss": "^8.3.11", + "purgecss": "^6.0.0", + "relateurl": "^0.2.7", + "srcset": "5.0.1", + "svgo": "^3.0.2", + "terser": "^5.10.0", + "uncss": "^0.17.3" + }, + "peerDependenciesMeta": { + "cssnano": { + "optional": true + }, + "postcss": { + "optional": true + }, + "purgecss": { + "optional": true + }, + "relateurl": { + "optional": true + }, + "srcset": { + "optional": true + }, + "svgo": { + "optional": true + }, + "terser": { + "optional": true + }, + "uncss": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inline-source-map": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.3.tgz", + "integrity": "sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==", + "dev": true, + "dependencies": { + "source-map": "~0.5.3" + } + }, + "node_modules/insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "dev": true, + "dependencies": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "dev": true + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "node_modules/lightningcss": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.26.0.tgz", + "integrity": "sha512-a/XZ5hdgifrofQJUArr5AiJjx26SwMam3SJUSMjgebZbESZ96i+6Qsl8tLi0kaUsdMzBWXh9sN1Oe6hp2/dkQw==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.26.0", + "lightningcss-darwin-x64": "1.26.0", + "lightningcss-freebsd-x64": "1.26.0", + "lightningcss-linux-arm-gnueabihf": "1.26.0", + "lightningcss-linux-arm64-gnu": "1.26.0", + "lightningcss-linux-arm64-musl": "1.26.0", + "lightningcss-linux-x64-gnu": "1.26.0", + "lightningcss-linux-x64-musl": "1.26.0", + "lightningcss-win32-arm64-msvc": "1.26.0", + "lightningcss-win32-x64-msvc": "1.26.0" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.26.0.tgz", + "integrity": "sha512-n4TIvHO1NY1ondKFYpL2ZX0bcC2y6yjXMD6JfyizgR8BCFNEeArINDzEaeqlfX9bXz73Bpz/Ow0nu+1qiDrBKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.26.0.tgz", + "integrity": "sha512-Rf9HuHIDi1R6/zgBkJh25SiJHF+dm9axUZW/0UoYCW1/8HV0gMI0blARhH4z+REmWiU1yYT/KyNF3h7tHyRXUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.26.0.tgz", + "integrity": "sha512-C/io7POAxp6sZxFSVGezjajMlCKQ8KSwISLLGRq8xLQpQMokYrUoqYEwmIX8mLmF6C/CZPk0gFmRSzd8biWM0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.26.0.tgz", + "integrity": "sha512-Aag9kqXqkyPSW+dXMgyWk66C984Nay2pY8Nws+67gHlDzV3cWh7TvFlzuaTaVFMVqdDTzN484LSK3u39zFBnzg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.26.0.tgz", + "integrity": "sha512-iJmZM7fUyVjH+POtdiCtExG+67TtPUTer7K/5A8DIfmPfrmeGvzfRyBltGhQz13Wi15K1lf2cPYoRaRh6vcwNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.26.0.tgz", + "integrity": "sha512-XxoEL++tTkyuvu+wq/QS8bwyTXZv2y5XYCMcWL45b8XwkiS8eEEEej9BkMGSRwxa5J4K+LDeIhLrS23CpQyfig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.26.0.tgz", + "integrity": "sha512-1dkTfZQAYLj8MUSkd6L/+TWTG8V6Kfrzfa0T1fSlXCXQHrt1HC1/UepXHtKHDt/9yFwyoeayivxXAsApVxn6zA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.26.0.tgz", + "integrity": "sha512-yX3Rk9m00JGCUzuUhFEojY+jf/6zHs3XU8S8Vk+FRbnr4St7cjyMXdNjuA2LjiT8e7j8xHRCH8hyZ4H/btRE4A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.26.0.tgz", + "integrity": "sha512-X/597/cFnCogy9VItj/+7Tgu5VLbAtDF7KZDPdSw0MaL6FL940th1y3HiOzFIlziVvAtbo0RB3NAae1Oofr+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.26.0.tgz", + "integrity": "sha512-pYS3EyGP3JRhfqEFYmfFDiZ9/pVNfy8jVIYtrx9TVNusVyDK3gpW1w/rbvroQ4bDJi7grdUtyrYU6V2xkY/bBw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lmdb": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.8.5.tgz", + "integrity": "sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "msgpackr": "^1.9.5", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.1.1", + "ordered-binary": "^1.4.1", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "2.8.5", + "@lmdb/lmdb-darwin-x64": "2.8.5", + "@lmdb/lmdb-linux-arm": "2.8.5", + "@lmdb/lmdb-linux-arm64": "2.8.5", + "@lmdb/lmdb-linux-x64": "2.8.5", + "@lmdb/lmdb-win32-x64": "2.8.5" + } + }, + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "dev": true, + "dependencies": { + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/msgpackr": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", + "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", + "dev": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/msgpackr-extract/node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp-build-optional-packages/node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/ordered-binary": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", + "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", + "dev": true + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parcel": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.12.0.tgz", + "integrity": "sha512-W+gxAq7aQ9dJIg/XLKGcRT0cvnStFAQHPaI0pvD0U2l6IVLueUAm3nwN7lkY62zZNmlvNx6jNtE4wlbS+CyqSg==", + "dev": true, + "dependencies": { + "@parcel/config-default": "2.12.0", + "@parcel/core": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/reporter-cli": "2.12.0", + "@parcel/reporter-dev-server": "2.12.0", + "@parcel/reporter-tracer": "2.12.0", + "@parcel/utils": "2.12.0", + "chalk": "^4.1.0", + "commander": "^7.0.0", + "get-port": "^4.2.0" + }, + "bin": { + "parcel": "lib/bin.js" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", + "dev": true, + "dependencies": { + "path-platform": "~0.11.15" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "dev": true, + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/posthtml": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", + "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.10.2.tgz", + "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", + "dev": true, + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "dev": true, + "dependencies": { + "is-json": "^2.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml/node_modules/posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "dev": true, + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "dev": true + }, + "node_modules/react-refresh": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", + "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dev": true, + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/srcset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-5.0.1.tgz", + "integrity": "sha512-/P1UYbGfJVlxZag7aABNRrulEXAwCSDo7fklafOQrantuPTDmYgijJMks2zusPCVzgW9+4P69mq7w6pYuZpgxw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dev": true, + "dependencies": { + "minimist": "^1.1.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", + "dev": true, + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true, + "bin": { + "umd": "bin/cli.js" + } + }, + "node_modules/undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true + }, + "node_modules/webpack": { + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + } + } +} diff --git a/test/package.json b/test/package.json new file mode 100644 index 0000000..bb7a0bf --- /dev/null +++ b/test/package.json @@ -0,0 +1,30 @@ +{ + "name": "test", + "version": "1.0.0", + "description": "", + "main": "karma.browserify.conf.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "ethereum-cryptography": "file:.." + }, + "devDependencies": { + "@parcel/watcher": "2.4.1", + "@rollup/plugin-commonjs": "22.0.1", + "@rollup/plugin-node-resolve": "13.3.0", + "browserify": "17.0.0", + "parcel": "2.12.0", + "rollup": "2.79.1", + "webpack": "5.94.0", + "webpack-cli": "4.10.0" + }, + "targets": { + "parcel_tests": { + "context": "browser" + } + } +} diff --git a/test/pure/aes.ts b/test/pure/aes.ts deleted file mode 100644 index a1baf8f..0000000 --- a/test/pure/aes.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { decrypt, encrypt } from "../../src/aes"; -import { createTests } from "../test-vectors/aes"; - -createTests(encrypt, decrypt); diff --git a/test/pure/bip39.ts b/test/pure/bip39.ts deleted file mode 100644 index ea4c273..0000000 --- a/test/pure/bip39.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as bip39 from "../../src/bip39"; -import { wordlist as englishWordlist } from "../../src/bip39/wordlists/english"; -import { wordlist as spanishWordlist } from "../../src/bip39/wordlists/spanish"; -import { createTests } from "../test-vectors/bip39"; - -createTests( - bip39.generateMnemonic, - bip39.mnemonicToEntropy, - bip39.entropyToMnemonic, - bip39.validateMnemonic, - bip39.mnemonicToSeed, - bip39.mnemonicToSeedSync, - englishWordlist, - spanishWordlist -); diff --git a/test/pure/blake2b.ts b/test/pure/blake2b.ts deleted file mode 100644 index 64b4483..0000000 --- a/test/pure/blake2b.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { blake2b } from "../../src/blake2b"; -import { createTests } from "../test-vectors/blake2b"; - -createTests(blake2b); diff --git a/test/pure/hdkey.ts b/test/pure/hdkey.ts deleted file mode 100644 index 2af9a3a..0000000 --- a/test/pure/hdkey.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { HDKey } from "../../src/pure/hdkey"; -import { createTests } from "../test-vectors/hdkey"; - -createTests(HDKey); diff --git a/test/pure/keccak.ts b/test/pure/keccak.ts deleted file mode 100644 index 53c1686..0000000 --- a/test/pure/keccak.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { keccak224, keccak256, keccak384, keccak512 } from "../../src/keccak"; - -import { - createTestsForVector, - keccak224Vectors, - keccak256Vectors, - keccak384Vectors, - keccak512Vectors -} from "../test-vectors/keccak"; - -describe("keccak", function() { - createTestsForVector(keccak224, keccak224Vectors); - createTestsForVector(keccak256, keccak256Vectors); - createTestsForVector(keccak384, keccak384Vectors); - createTestsForVector(keccak512, keccak512Vectors); -}); diff --git a/test/pure/pbkdf2.ts b/test/pure/pbkdf2.ts deleted file mode 100644 index b948a7a..0000000 --- a/test/pure/pbkdf2.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { pbkdf2, pbkdf2Sync } from "../../src/pbkdf2"; -import { createTests } from "../test-vectors/pbkdf2"; - -createTests(pbkdf2Sync, pbkdf2); diff --git a/test/pure/random.ts b/test/pure/random.ts deleted file mode 100644 index 52c690c..0000000 --- a/test/pure/random.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { getRandomBytes, getRandomBytesSync } from "../../src/random"; -import { createTests } from "../test-vectors/random"; - -createTests(getRandomBytesSync, getRandomBytes); diff --git a/test/pure/ripemd160.ts b/test/pure/ripemd160.ts deleted file mode 100644 index 412e159..0000000 --- a/test/pure/ripemd160.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ripemd160 } from "../../src/pure/ripemd160"; -import { createTests } from "../test-vectors/ripemd160"; - -createTests(ripemd160); diff --git a/test/pure/scrypt.ts b/test/pure/scrypt.ts deleted file mode 100644 index 4045ab4..0000000 --- a/test/pure/scrypt.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { scrypt, scryptSync } from "../../src/scrypt"; -import { createTests } from "../test-vectors/scrypt"; - -createTests(scryptSync, scrypt); diff --git a/test/pure/secp256k1.ts b/test/pure/secp256k1.ts deleted file mode 100644 index b8a32cb..0000000 --- a/test/pure/secp256k1.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { - createPrivateKey, - createPrivateKeySync, - ecdsaRecover, - ecdsaSign, - privateKeyVerify, - publicKeyConvert -} from "../../src/secp256k1"; -import { createTests } from "../test-vectors/secp256k1"; - -createTests( - ecdsaSign, - ecdsaRecover, - publicKeyConvert, - createPrivateKey, - createPrivateKeySync, - privateKeyVerify -); diff --git a/test/pure/sha256.ts b/test/pure/sha256.ts deleted file mode 100644 index 79b475c..0000000 --- a/test/pure/sha256.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { sha256 } from "../../src/pure/sha256"; -import { createTests } from "../test-vectors/sha256"; - -createTests(sha256); diff --git a/test/rollup.config.js b/test/rollup.config.js index cdd34c4..882c4dc 100644 --- a/test/rollup.config.js +++ b/test/rollup.config.js @@ -1,12 +1,9 @@ import fs from "fs"; import path from "path"; -import commonjs from "rollup-plugin-commonjs"; -import resolve from "rollup-plugin-node-resolve"; -import nodeBuiltin from "rollup-plugin-node-builtins"; -import nodeGlobals from "rollup-plugin-node-globals"; -import json from "rollup-plugin-json"; +import commonjs from "@rollup/plugin-commonjs"; +import resolve from "@rollup/plugin-node-resolve"; -const TESTS_DIR = "./test-builds/tsc/test/pure"; +const TESTS_DIR = "./test-builds/tsc/test/test-vectors"; const testFiles = fs .readdirSync(TESTS_DIR) .filter(name => name.endsWith(".js")) @@ -23,9 +20,6 @@ export default testFiles.map(test => ({ }, plugins: [ commonjs(), - json(), - nodeGlobals(), - nodeBuiltin(), resolve({ browser: true, preferBuiltins: false diff --git a/test/test-imports-1.mjs b/test/test-imports-1.mjs new file mode 100644 index 0000000..a082f7e --- /dev/null +++ b/test/test-imports-1.mjs @@ -0,0 +1,37 @@ +// Hashes +import { sha256 } from "ethereum-cryptography/sha256.js"; +import { keccak256 } from "ethereum-cryptography/keccak.js"; +import { ripemd160 } from "ethereum-cryptography/ripemd160.js"; +import { blake2b } from "ethereum-cryptography/blake2b.js"; + +// KDFs +import { pbkdf2Sync } from "ethereum-cryptography/pbkdf2.js"; +import { scryptSync } from "ethereum-cryptography/scrypt.js"; + +// Random +import { getRandomBytesSync } from "ethereum-cryptography/random.js"; + +// AES encryption +import { encrypt } from "ethereum-cryptography/aes.js"; + +// secp256k1 elliptic curve operations +import { secp256k1 } from "ethereum-cryptography/secp256k1.js"; + +// BIP32 HD Keygen, BIP39 Mnemonic Phrases +import { HDKey } from "ethereum-cryptography/hdkey.js"; +import { generateMnemonic as gm1 } from "ethereum-cryptography/bip39.js"; +import { generateMnemonic as gm2 } from "ethereum-cryptography/bip39/index.js"; +import { wordlist } from "ethereum-cryptography/bip39/wordlists/english.js"; + +// utilities +import { hexToBytes, toHex, utf8ToBytes } from "ethereum-cryptography/utils.js"; + +import * as w1 from 'ethereum-cryptography/bip39/wordlists/czech.js'; +import * as w2 from 'ethereum-cryptography/bip39/wordlists/english.js'; +import * as w3 from 'ethereum-cryptography/bip39/wordlists/french.js'; +import * as w4 from 'ethereum-cryptography/bip39/wordlists/italian.js'; +import * as w5 from 'ethereum-cryptography/bip39/wordlists/japanese.js'; +import * as w6 from 'ethereum-cryptography/bip39/wordlists/korean.js'; +import * as w7 from 'ethereum-cryptography/bip39/wordlists/simplified-chinese.js'; +import * as w8 from 'ethereum-cryptography/bip39/wordlists/spanish.js'; +import * as w9 from 'ethereum-cryptography/bip39/wordlists/traditional-chinese.js'; diff --git a/test/test-imports-2.mjs b/test/test-imports-2.mjs new file mode 100644 index 0000000..bc12b06 --- /dev/null +++ b/test/test-imports-2.mjs @@ -0,0 +1,37 @@ +// Hashes +import { sha256 } from "ethereum-cryptography/sha256"; +import { keccak256 } from "ethereum-cryptography/keccak"; +import { ripemd160 } from "ethereum-cryptography/ripemd160"; +import { blake2b } from "ethereum-cryptography/blake2b"; + +// KDFs +import { pbkdf2Sync } from "ethereum-cryptography/pbkdf2"; +import { scryptSync } from "ethereum-cryptography/scrypt"; + +// Random +import { getRandomBytesSync } from "ethereum-cryptography/random"; + +// AES encryption +import { encrypt } from "ethereum-cryptography/aes"; + +// secp256k1 elliptic curve operations +import { secp256k1 } from "ethereum-cryptography/secp256k1"; + +// BIP32 HD Keygen, BIP39 Mnemonic Phrases +import { HDKey } from "ethereum-cryptography/hdkey"; +import { generateMnemonic as gm1 } from "ethereum-cryptography/bip39"; +import { generateMnemonic as gm2 } from "ethereum-cryptography/bip39/index"; +import { wordlist } from "ethereum-cryptography/bip39/wordlists/english"; + +// utilities +import { hexToBytes, toHex, utf8ToBytes } from "ethereum-cryptography/utils"; + +import * as w1 from 'ethereum-cryptography/bip39/wordlists/czech'; +import * as w2 from 'ethereum-cryptography/bip39/wordlists/english'; +import * as w3 from 'ethereum-cryptography/bip39/wordlists/french'; +import * as w4 from 'ethereum-cryptography/bip39/wordlists/italian'; +import * as w5 from 'ethereum-cryptography/bip39/wordlists/japanese'; +import * as w6 from 'ethereum-cryptography/bip39/wordlists/korean'; +import * as w7 from 'ethereum-cryptography/bip39/wordlists/simplified-chinese'; +import * as w8 from 'ethereum-cryptography/bip39/wordlists/spanish'; +import * as w9 from 'ethereum-cryptography/bip39/wordlists/traditional-chinese'; diff --git a/test/test-vectors/aes.ts b/test/test-vectors/aes.ts index 004e586..555d8a4 100644 --- a/test/test-vectors/aes.ts +++ b/test/test-vectors/aes.ts @@ -1,49 +1,46 @@ -import { assert } from "chai"; - +import { decrypt, encrypt } from "ethereum-cryptography/aes"; +import { hexToBytes, toHex } from "ethereum-cryptography/utils"; +import { deepStrictEqual, throws } from "./assert"; // Test vectors taken from https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf const TEST_VECTORS = [ { mode: "aes-128-ctr", key: "2b7e151628aed2a6abf7158809cf4f3c", iv: "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", - msg: - "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", + msg: "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", cypherText: "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee", - pkcs7PaddingEnabled: false + pkcs7PaddingEnabled: false, }, // CTR uses no padding, so we test that here { mode: "aes-128-ctr", key: "2b7e151628aed2a6abf7158809cf4f3c", iv: "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", - msg: - "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", + msg: "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", cypherText: "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee", - pkcs7PaddingEnabled: true + pkcs7PaddingEnabled: true, }, // Same as the previous one, but with default params { mode: undefined, key: "2b7e151628aed2a6abf7158809cf4f3c", iv: "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", - msg: - "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", + msg: "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", cypherText: "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee", - pkcs7PaddingEnabled: undefined + pkcs7PaddingEnabled: undefined, }, // CBC uses padding, but the NIST test vectors don't { mode: "aes-128-cbc", key: "2b7e151628aed2a6abf7158809cf4f3c", iv: "000102030405060708090a0b0c0d0e0f", - msg: - "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", + msg: "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", cypherText: "7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a7", - pkcs7PaddingEnabled: false + pkcs7PaddingEnabled: false, }, // We test that the padding is in fact PKCS#7 by first entrypting with its // corresponding padding adding manually, and then with automatic padding @@ -51,120 +48,146 @@ const TEST_VECTORS = [ mode: "aes-128-cbc", key: "2b7e151628aed2a6abf7158809cf4f3c", iv: "000102030405060708090a0b0c0d0e0f", - msg: - "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c371010101010101010101010101010101010", + msg: "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c371010101010101010101010101010101010", cypherText: "7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a78cb82807230e1321d3fae00d18cc2012", - pkcs7PaddingEnabled: false + pkcs7PaddingEnabled: false, }, { mode: "aes-128-cbc", key: "2b7e151628aed2a6abf7158809cf4f3c", iv: "000102030405060708090a0b0c0d0e0f", - msg: - "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", + msg: "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", cypherText: "7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a78cb82807230e1321d3fae00d18cc2012", - pkcs7PaddingEnabled: true + pkcs7PaddingEnabled: true, }, // Same applies for aes-256-cbc { mode: "aes-256-cbc", key: "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", iv: "000102030405060708090a0b0c0d0e0f", - msg: - "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", + msg: "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", cypherText: "f58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461b2eb05e2c39be9fcda6c19078c6a9d1b", - pkcs7PaddingEnabled: false + pkcs7PaddingEnabled: false, }, { mode: "aes-256-cbc", key: "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", iv: "000102030405060708090a0b0c0d0e0f", - msg: - "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c371010101010101010101010101010101010", + msg: "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c371010101010101010101010101010101010", cypherText: "f58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461b2eb05e2c39be9fcda6c19078c6a9d1b3f461796d6b0d6b2e0c2a72b4d80e644", - pkcs7PaddingEnabled: false + pkcs7PaddingEnabled: false, }, { mode: "aes-256-cbc", key: "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", iv: "000102030405060708090a0b0c0d0e0f", - msg: - "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", + msg: "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", cypherText: "f58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461b2eb05e2c39be9fcda6c19078c6a9d1b3f461796d6b0d6b2e0c2a72b4d80e644", - pkcs7PaddingEnabled: true - } + pkcs7PaddingEnabled: true, + }, ]; -export function createTests( - encrypt: ( - msg: Buffer, - key: Buffer, - iv: Buffer, - mode?: string, - pkcs7PaddingEnabled?: boolean - ) => Buffer, - decrypt: ( - cypherText: Buffer, - key: Buffer, - iv: Buffer, - mode?: string, - pkcs7PaddingEnabled?: boolean - ) => Buffer -) { - describe("aes", function() { - for (const [i, vector] of TEST_VECTORS.entries()) { - it(`Should encrypt the test ${i} correctly`, async function() { - const encrypted = encrypt( - Buffer.from(vector.msg, "hex"), - Buffer.from(vector.key, "hex"), - Buffer.from(vector.iv, "hex"), - vector.mode, - vector.pkcs7PaddingEnabled - ); - - assert.equal(encrypted.toString("hex"), vector.cypherText); - }); - - it(`Should decrypt the test ${i} correctly`, async function() { - const decrypted = decrypt( - Buffer.from(vector.cypherText, "hex"), - Buffer.from(vector.key, "hex"), - Buffer.from(vector.iv, "hex"), - vector.mode, - vector.pkcs7PaddingEnabled - ); - - assert.equal(decrypted.toString("hex"), vector.msg); - }); - } - - it("Should throw when not padding automatically and the message isn't the right size", function() { - assert.throws(() => - encrypt( - Buffer.from("abcd", "hex"), - Buffer.from("2b7e151628aed2a6abf7158809cf4f3c", "hex"), - Buffer.from("2b7e151628aed2a6abf7158809cf4f3c", "hex"), - "aes-128-cbc", - false - ) +describe("aes", () => { + for (const [i, vector] of TEST_VECTORS.entries()) { + it(`Should encrypt the test ${i} correctly`, () => { + const encrypted = encrypt( + hexToBytes(vector.msg), + hexToBytes(vector.key), + hexToBytes(vector.iv), + vector.mode, + vector.pkcs7PaddingEnabled ); + + deepStrictEqual(toHex(encrypted), vector.cypherText); }); - it("Should throw when trying to use non-aes modes", function() { - assert.throws(() => - encrypt( - Buffer.from("abcd", "hex"), - Buffer.from("2b7e151628aed2a6abf7158809cf4f3c", "hex"), - Buffer.from("2b7e151628aed2a6abf7158809cf4f3c", "hex"), - "asd-128-cbc", - false - ) + it(`Should decrypt the test ${i} correctly`, () => { + const decrypted = decrypt( + hexToBytes(vector.cypherText), + hexToBytes(vector.key), + hexToBytes(vector.iv), + vector.mode, + vector.pkcs7PaddingEnabled ); + + deepStrictEqual(toHex(decrypted), vector.msg); }); + } + + it("Should throw when not padding automatically and the message isn't the right size", () => { + throws(() => + encrypt( + hexToBytes("abcd"), + hexToBytes("2b7e151628aed2a6abf7158809cf4f3c"), + hexToBytes("2b7e151628aed2a6abf7158809cf4f3c"), + "aes-128-cbc", + false + ) + ); + }); + + it("Should throw when trying to use non-aes modes", () => { + throws(() => + encrypt( + hexToBytes("abcd"), + hexToBytes("2b7e151628aed2a6abf7158809cf4f3c"), + hexToBytes("2b7e151628aed2a6abf7158809cf4f3c"), + "asd-128-cbc", + false + ) + ); + }); + + it("aes-ctr bug (browser/node result mismatch)", () => { + // NOTE: full 0xff iv causes difference on counter overflow in CTR mode + const iv = "ffffffffffffffffffffffffffffffff"; + const vectors = [ + { + msg: "efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378", + key: "ccc0b35ea59c51a1e45af00502966237", + iv, + mode: "aes-128-ctr", + result: + "15e356c67d266d3ca85cff4f6d92d11720aae32cdd28d5d9885836dacb1d213b", + }, + { + msg: "efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378", + key: "ccc0b35ea59c51a1e45af00502966237ccc0b35ea59c51a1e45af00502966237", + iv, + mode: "aes-256-ctr", + result: + "010bb6dc10ea201bf2d586de4741309373c07b6ddf30ad8502adf4dd0bda2d23", + }, + { + msg: "efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378", + key: "ccc0b35ea59c51a1e45af00502966237", + iv, + mode: "aes-128-ctr", + result: + "15e356c67d266d3ca85cff4f6d92d11720aae32cdd28d5d9885836dacb1d213b55f347e68f72acf46234d495f579fb45f9dcfc7dc688a9174f566d137ffc626c", + }, + { + msg: "efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378", + key: "ccc0b35ea59c51a1e45af00502966237ccc0b35ea59c51a1e45af00502966237", + iv, + mode: "aes-256-ctr", + result: + "010bb6dc10ea201bf2d586de4741309373c07b6ddf30ad8502adf4dd0bda2d23c436b35e5dfa0a0088dcb6ae7328f1ec66212099222ee1c18983b58513cf5f4c", + }, + ]; + for (const v of vectors) { + const msg = hexToBytes(v.msg); + const key = hexToBytes(v.key); + const iv = hexToBytes(v.iv); + const res = encrypt(msg, key, iv, v.mode); + deepStrictEqual(toHex(res), v.result); + const clearText = decrypt(res, key, iv, v.mode); + deepStrictEqual(clearText, msg); + } }); -} +}); diff --git a/test/test-vectors/assert.ts b/test/test-vectors/assert.ts new file mode 100644 index 0000000..133c098 --- /dev/null +++ b/test/test-vectors/assert.ts @@ -0,0 +1,80 @@ +// Minimal assert version to avoid dependecies on node internals +// Allows to verify that none of brwoserify version of node internals is included in resulting build +function deepStrictEqual(actual: unknown, expected: unknown, message?: string) { + const [actualType, expectedType] = [typeof actual, typeof expected]; + const err = new Error( + `Non-equal values: actual=${actual} (type=${actualType}) expected=${expected} (type=${expectedType})${ + message ? `. Message: ${message}` : "" + }` + ); + if (actualType !== expectedType) { + throw err; + } + // Primitive types + if ( + ["string", "number", "bigint", "undefined", "boolean"].includes(actualType) + ) { + if (actual !== expected) { + throw err; + } + return; + } + if (actual instanceof Uint8Array && expected instanceof Uint8Array) { + if (actual.length !== expected.length) { + throw err; + } + for (let i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) { + throw err; + } + } + return; + } + if (Array.isArray(actual) && Array.isArray(expected)) { + if (actual.length !== expected.length) { + throw err; + } + for (let i = 0; i < actual.length; i++) { + deepStrictEqual(actual[i], expected[i], message); + } + return; + } + if (actual === null && expected === null) { + return; + } + if (actualType === "object") { + const [actualKeys, expectedKeys] = [ + Object.keys(actual as object), + Object.keys(expected as object), + ]; + deepStrictEqual(actualKeys, expectedKeys, message); + for (const key of actualKeys) { + deepStrictEqual((actual as any)[key], (expected as any)[key], message); + } + return; + } + throw err; +} + +function throws(cb: () => any) { + try { + cb(); + } catch (e) { + return; + } + throw new Error("Missing expected exception."); +} + +async function rejects(cb: () => Promise): Promise { + try { + await cb(); + } catch (e) { + return; + } + throw new Error("Missing expected rejection."); +} + +// Run tests with node assert: +// import { deepStrictEqual, throws } from "assert"; + +export { deepStrictEqual, throws, rejects }; diff --git a/test/test-vectors/bip39.ts b/test/test-vectors/bip39.ts index 676964a..c7f7823 100644 --- a/test/test-vectors/bip39.ts +++ b/test/test-vectors/bip39.ts @@ -1,119 +1,483 @@ -import { assert } from "chai"; +import { + entropyToMnemonic, + generateMnemonic, + mnemonicToEntropy, + mnemonicToSeed, + mnemonicToSeedSync, + validateMnemonic +} from "../../src/bip39"; +import { wordlist as englishWordlist } from "../../src/bip39/wordlists/english"; +import { wordlist as japaneseWordlist } from "../../src/bip39/wordlists/japanese"; +import { wordlist as spanishWordlist } from "../../src/bip39/wordlists/spanish"; +import { equalsBytes, hexToBytes, toHex } from "../../src/utils"; +import { deepStrictEqual, throws } from "./assert"; -export function createTests( - generateMnemonic: (wordlist: string[], strength?: number) => string, - mnemonicToEntropy: (mnemonic: string, wordlist: string[]) => Buffer, - entropyToMnemonic: (entropy: Buffer, wordlist: string[]) => string, - validateMnemonic: (mnemonic: string, wordlist: string[]) => boolean, - mnemonicToSeed: (mnemonic: string, passphrase?: string) => Promise, - mnemonicToSeedSync: (mnemonic: string, passphrase?: string) => Buffer, - englishWordlist: string[], - spanishWordlist: string[] -) { - describe("BIP39", function() { - describe("Mnemonic generation", function() { - it("should create a valid menomic", function() { - const mnemonic = generateMnemonic(englishWordlist, 128); - assert.isTrue(validateMnemonic(mnemonic, englishWordlist)); - }); +describe("BIP39", () => { + describe("Mnemonic generation", () => { + it("should create a valid menomic", () => { + const mnemonic = generateMnemonic(englishWordlist, 128); + deepStrictEqual(validateMnemonic(mnemonic, englishWordlist), true); }); + }); - describe("Mnemonic validation", function() { - it("should accept valid menomics", function() { - assert.isTrue( - validateMnemonic( - "jump police vessel depth mutual idea cable soap trophy dust hold wink", - englishWordlist - ) - ); + describe("Mnemonic validation", () => { + it("should accept valid menomics", () => { + deepStrictEqual( + validateMnemonic( + "jump police vessel depth mutual idea cable soap trophy dust hold wink", + englishWordlist + ), + true + ); - assert.isTrue( - validateMnemonic( - "koala óxido urbe crudo momia idioma boina rostro títere dilema himno víspera", - spanishWordlist - ) - ); - }); - - it("should reject invalid menomics", function() { - assert.isFalse(validateMnemonic("asd", englishWordlist)); - assert.isFalse( - validateMnemonic( - generateMnemonic(englishWordlist, 128), - spanishWordlist - ) - ); - }); + deepStrictEqual( + validateMnemonic( + "koala óxido urbe crudo momia idioma boina rostro títere dilema himno víspera", + spanishWordlist + ), + true + ); }); - describe("Entropy-mnemonic convertions", function() { - describe("Should convert from mnemonic to entropy and back", function() { - it("should work with the English wodlist", function() { - const mnemonic = generateMnemonic(englishWordlist, 128); - const entropy = mnemonicToEntropy(mnemonic, englishWordlist); - - assert.equal(entropyToMnemonic(entropy, englishWordlist), mnemonic); - }); + it("should reject invalid menomics", () => { + deepStrictEqual(validateMnemonic("asd", englishWordlist), false); + deepStrictEqual( + validateMnemonic( + generateMnemonic(englishWordlist, 128), + spanishWordlist + ), + false + ); + }); + }); - it("should work with the Spanish wodlist", function() { - const mnemonic = generateMnemonic(spanishWordlist, 128); - const entropy = mnemonicToEntropy(mnemonic, spanishWordlist); + describe("Entropy-mnemonic conversions", () => { + describe("Should convert from mnemonic to entropy and back", () => { + it("should work with the English wodlist", () => { + const mnemonic = generateMnemonic(englishWordlist, 128); + const entropy = mnemonicToEntropy(mnemonic, englishWordlist); + deepStrictEqual(entropyToMnemonic(entropy, englishWordlist), mnemonic); + }); - assert.equal(entropyToMnemonic(entropy, spanishWordlist), mnemonic); - }); + it("should work with the Spanish wodlist", () => { + const mnemonic = generateMnemonic(spanishWordlist, 128); + const entropy = mnemonicToEntropy(mnemonic, spanishWordlist); + deepStrictEqual(entropyToMnemonic(entropy, spanishWordlist), mnemonic); }); }); + }); - describe("Menonic to seed", function() { - describe("Without passphrase", function() { - const MENMONIC = - "koala óxido urbe crudo momia idioma boina rostro títere dilema himno víspera"; + describe("Menonic to seed", () => { + describe("Without passphrase", () => { + const MENMONIC = + "koala óxido urbe crudo momia idioma boina rostro títere dilema himno víspera"; - const SEED = Buffer.from( - "e9dc495a155c2c5b577847874323853efc11e2379cc25fdcd26f3ad2ecca8b05d2a0e995fb6738dbcf65760e571863e0e8f518b5626b7865ac74f2ab814c050f", - "hex" - ); + const SEED = hexToBytes( + "e9dc495a155c2c5b577847874323853efc11e2379cc25fdcd26f3ad2ecca8b05d2a0e995fb6738dbcf65760e571863e0e8f518b5626b7865ac74f2ab814c050f" + ); - describe("Sync", function() { - it("Should recover the right seed", function() { - const recoveredSeed = mnemonicToSeedSync(MENMONIC); - assert.isTrue(SEED.equals(recoveredSeed)); - }); + describe("Sync", () => { + it("Should recover the right seed", () => { + const recoveredSeed = mnemonicToSeedSync(MENMONIC); + deepStrictEqual(equalsBytes(SEED, recoveredSeed), true); }); + }); - describe("Async", function() { - it("Should recover the right seed", async function() { - const recoveredSeed = await mnemonicToSeed(MENMONIC); - assert.isTrue(SEED.equals(recoveredSeed)); - }); + describe("Async", () => { + it("Should recover the right seed", async () => { + const recoveredSeed = await mnemonicToSeed(MENMONIC); + deepStrictEqual(equalsBytes(SEED, recoveredSeed), true); }); }); + }); - describe("With passphrase", function() { - const MENMONIC = - "koala óxido urbe crudo momia idioma boina rostro títere dilema himno víspera"; + describe("With passphrase", () => { + const MENMONIC = + "koala óxido urbe crudo momia idioma boina rostro títere dilema himno víspera"; - const PASSPHRASE = "passphrase"; + const PASSPHRASE = "passphrase"; - const SEED = Buffer.from( - "c54939df37bf94ab65973c6c1b8e5eaf855dc4ab200698961c398685714c99f9d9e5c8518769619ba606bdaf5254d4ef34c0789089a2e4f21e357a1aae906f9d", - "hex" - ); + const SEED = hexToBytes( + "c54939df37bf94ab65973c6c1b8e5eaf855dc4ab200698961c398685714c99f9d9e5c8518769619ba606bdaf5254d4ef34c0789089a2e4f21e357a1aae906f9d" + ); - describe("Sync", function() { - it("Should recover the right seed", function() { - const recoveredSeed = mnemonicToSeedSync(MENMONIC, PASSPHRASE); - assert.isTrue(SEED.equals(recoveredSeed)); - }); + describe("Sync", () => { + it("Should recover the right seed", () => { + const recoveredSeed = mnemonicToSeedSync(MENMONIC, PASSPHRASE); + deepStrictEqual(SEED, recoveredSeed); }); + }); - describe("Async", function() { - it("Should recover the right seed", async function() { - const recoveredSeed = await mnemonicToSeed(MENMONIC, PASSPHRASE); - assert.isTrue(SEED.equals(recoveredSeed)); - }); + describe("Async", () => { + it("Should recover the right seed", async () => { + const recoveredSeed = await mnemonicToSeed(MENMONIC, PASSPHRASE); + deepStrictEqual(SEED, recoveredSeed); }); }); }); }); -} + // Based on https://github.com/bitcoinjs/bip39/blob/cfea218ee2e6c3157baabb1e2ec684d36cce89c5/test/index.js + const VECTORS: Record> = { + english: [ + [ + "00000000000000000000000000000000", + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", + "c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04" + ], + [ + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "legal winner thank year wave sausage worth useful legal winner thank yellow", + "2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607" + ], + [ + "80808080808080808080808080808080", + "letter advice cage absurd amount doctor acoustic avoid letter advice cage above", + "d71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30fa280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8" + ], + [ + "ffffffffffffffffffffffffffffffff", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong", + "ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a13332572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069" + ], + [ + "000000000000000000000000000000000000000000000000", + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent", + "035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa" + ], + [ + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will", + "f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd" + ], + [ + "808080808080808080808080808080808080808080808080", + "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always", + "107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65" + ], + [ + "ffffffffffffffffffffffffffffffffffffffffffffffff", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when", + "0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528" + ], + [ + "0000000000000000000000000000000000000000000000000000000000000000", + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art", + "bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8" + ], + [ + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title", + "bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87" + ], + [ + "8080808080808080808080808080808080808080808080808080808080808080", + "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", + "c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f" + ], + [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote", + "dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad" + ], + [ + "77c2b00716cec7213839159e404db50d", + "jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge", + "b5b6d0127db1a9d2226af0c3346031d77af31e918dba64287a1b44b8ebf63cdd52676f672a290aae502472cf2d602c051f3e6f18055e84e4c43897fc4e51a6ff" + ], + [ + "b63a9c59a6e641f288ebc103017f1da9f8290b3da6bdef7b", + "renew stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap", + "9248d83e06f4cd98debf5b6f010542760df925ce46cf38a1bdb4e4de7d21f5c39366941c69e1bdbf2966e0f6e6dbece898a0e2f0a4c2b3e640953dfe8b7bbdc5" + ], + [ + "3e141609b97933b66a060dcddc71fad1d91677db872031e85f4c015c5e7e8982", + "dignity pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic", + "ff7f3184df8696d8bef94b6c03114dbee0ef89ff938712301d27ed8336ca89ef9635da20af07d4175f2bf5f3de130f39c9d9e8dd0472489c19b1a020a940da67" + ], + [ + "0460ef47585604c5660618db2e6a7e7f", + "afford alter spike radar gate glance object seek swamp infant panel yellow", + "65f93a9f36b6c85cbe634ffc1f99f2b82cbb10b31edc7f087b4f6cb9e976e9faf76ff41f8f27c99afdf38f7a303ba1136ee48a4c1e7fcd3dba7aa876113a36e4" + ], + [ + "72f60ebac5dd8add8d2a25a797102c3ce21bc029c200076f", + "indicate race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left", + "3bbf9daa0dfad8229786ace5ddb4e00fa98a044ae4c4975ffd5e094dba9e0bb289349dbe2091761f30f382d4e35c4a670ee8ab50758d2c55881be69e327117ba" + ], + [ + "2c85efc7f24ee4573d2b81a6ec66cee209b2dcbd09d8eddc51e0215b0b68e416", + "clutch control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste", + "fe908f96f46668b2d5b37d82f558c77ed0d69dd0e7e043a5b0511c48c2f1064694a956f86360c93dd04052a8899497ce9e985ebe0c8c52b955e6ae86d4ff4449" + ], + [ + "eaebabb2383351fd31d703840b32e9e2", + "turtle front uncle idea crush write shrug there lottery flower risk shell", + "bdfb76a0759f301b0b899a1e3985227e53b3f51e67e3f2a65363caedf3e32fde42a66c404f18d7b05818c95ef3ca1e5146646856c461c073169467511680876c" + ], + [ + "7ac45cfe7722ee6c7ba84fbc2d5bd61b45cb2fe5eb65aa78", + "kiss carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment", + "ed56ff6c833c07982eb7119a8f48fd363c4a9b1601cd2de736b01045c5eb8ab4f57b079403485d1c4924f0790dc10a971763337cb9f9c62226f64fff26397c79" + ], + [ + "4fa1a8bc3e6d80ee1316050e862c1812031493212b7ec3f3bb1b08f168cabeef", + "exile ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top", + "095ee6f817b4c2cb30a5a797360a81a40ab0f9a4e25ecd672a3f58a0b5ba0687c096a6b14d2c0deb3bdefce4f61d01ae07417d502429352e27695163f7447a8c" + ], + [ + "18ab19a9f54a9274f03e5209a2ac8a91", + "board flee heavy tunnel powder denial science ski answer betray cargo cat", + "6eff1bb21562918509c73cb990260db07c0ce34ff0e3cc4a8cb3276129fbcb300bddfe005831350efd633909f476c45c88253276d9fd0df6ef48609e8bb7dca8" + ], + [ + "18a2e1d81b8ecfb2a333adcb0c17a5b9eb76cc5d05db91a4", + "board blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief", + "f84521c777a13b61564234bf8f8b62b3afce27fc4062b51bb5e62bdfecb23864ee6ecf07c1d5a97c0834307c5c852d8ceb88e7c97923c0a3b496bedd4e5f88a9" + ], + [ + "15da872c95a13dd738fbf50e427583ad61f18fd99f628c417a61cf8343c90419", + "beyond stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut", + "b15509eaa2d09d3efd3e006ef42151b30367dc6e3aa5e44caba3fe4d3e352e65101fbdb86a96776b91946ff06f8eac594dc6ee1d3e82a42dfe1b40fef6bcc3fd" + ] + ], + japanese: [ + [ + "00000000000000000000000000000000", + "あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あおぞら", + "a262d6fb6122ecf45be09c50492b31f92e9beb7d9a845987a02cefda57a15f9c467a17872029a9e92299b5cbdf306e3a0ee620245cbd508959b6cb7ca637bd55" + ], + [ + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "そつう れきだい ほんやく わかす りくつ ばいか ろせん やちん そつう れきだい ほんやく わかめ", + "aee025cbe6ca256862f889e48110a6a382365142f7d16f2b9545285b3af64e542143a577e9c144e101a6bdca18f8d97ec3366ebf5b088b1c1af9bc31346e60d9" + ], + [ + "80808080808080808080808080808080", + "そとづら あまど おおう あこがれる いくぶん けいけん あたえる いよく そとづら あまど おおう あかちゃん", + "e51736736ebdf77eda23fa17e31475fa1d9509c78f1deb6b4aacfbd760a7e2ad769c714352c95143b5c1241985bcb407df36d64e75dd5a2b78ca5d2ba82a3544" + ], + [ + "ffffffffffffffffffffffffffffffff", + "われる われる われる われる われる われる われる われる われる われる われる ろんぶん", + "4cd2ef49b479af5e1efbbd1e0bdc117f6a29b1010211df4f78e2ed40082865793e57949236c43b9fe591ec70e5bb4298b8b71dc4b267bb96ed4ed282c8f7761c" + ], + [ + "000000000000000000000000000000000000000000000000", + "あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あらいぐま", + "d99e8f1ce2d4288d30b9c815ae981edd923c01aa4ffdc5dee1ab5fe0d4a3e13966023324d119105aff266dac32e5cd11431eeca23bbd7202ff423f30d6776d69" + ], + [ + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "そつう れきだい ほんやく わかす りくつ ばいか ろせん やちん そつう れきだい ほんやく わかす りくつ ばいか ろせん やちん そつう れいぎ", + "eaaf171efa5de4838c758a93d6c86d2677d4ccda4a064a7136344e975f91fe61340ec8a615464b461d67baaf12b62ab5e742f944c7bd4ab6c341fbafba435716" + ], + [ + "808080808080808080808080808080808080808080808080", + "そとづら あまど おおう あこがれる いくぶん けいけん あたえる いよく そとづら あまど おおう あこがれる いくぶん けいけん あたえる いよく そとづら いきなり", + "aec0f8d3167a10683374c222e6e632f2940c0826587ea0a73ac5d0493b6a632590179a6538287641a9fc9df8e6f24e01bf1be548e1f74fd7407ccd72ecebe425" + ], + [ + "ffffffffffffffffffffffffffffffffffffffffffffffff", + "われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる りんご", + "f0f738128a65b8d1854d68de50ed97ac1831fc3a978c569e415bbcb431a6a671d4377e3b56abd518daa861676c4da75a19ccb41e00c37d086941e471a4374b95" + ], + [ + "0000000000000000000000000000000000000000000000000000000000000000", + "あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん いってい", + "23f500eec4a563bf90cfda87b3e590b211b959985c555d17e88f46f7183590cd5793458b094a4dccc8f05807ec7bd2d19ce269e20568936a751f6f1ec7c14ddd" + ], + [ + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "そつう れきだい ほんやく わかす りくつ ばいか ろせん やちん そつう れきだい ほんやく わかす りくつ ばいか ろせん やちん そつう れきだい ほんやく わかす りくつ ばいか ろせん まんきつ", + "cd354a40aa2e241e8f306b3b752781b70dfd1c69190e510bc1297a9c5738e833bcdc179e81707d57263fb7564466f73d30bf979725ff783fb3eb4baa86560b05" + ], + [ + "8080808080808080808080808080808080808080808080808080808080808080", + "そとづら あまど おおう あこがれる いくぶん けいけん あたえる いよく そとづら あまど おおう あこがれる いくぶん けいけん あたえる いよく そとづら あまど おおう あこがれる いくぶん けいけん あたえる うめる", + "6b7cd1b2cdfeeef8615077cadd6a0625f417f287652991c80206dbd82db17bf317d5c50a80bd9edd836b39daa1b6973359944c46d3fcc0129198dc7dc5cd0e68" + ], + [ + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる われる らいう", + "a44ba7054ac2f9226929d56505a51e13acdaa8a9097923ca07ea465c4c7e294c038f3f4e7e4b373726ba0057191aced6e48ac8d183f3a11569c426f0de414623" + ], + [ + "77c2b00716cec7213839159e404db50d", + "せまい うちがわ あずき かろう めずらしい だんち ますく おさめる ていぼう あたる すあな えしゃく", + "344cef9efc37d0cb36d89def03d09144dd51167923487eec42c487f7428908546fa31a3c26b7391a2b3afe7db81b9f8c5007336b58e269ea0bd10749a87e0193" + ], + [ + "b63a9c59a6e641f288ebc103017f1da9f8290b3da6bdef7b", + "ぬすむ ふっかつ うどん こうりつ しつじ りょうり おたがい せもたれ あつめる いちりゅう はんしゃ ごますり そんけい たいちょう らしんばん ぶんせき やすみ ほいく", + "b14e7d35904cb8569af0d6a016cee7066335a21c1c67891b01b83033cadb3e8a034a726e3909139ecd8b2eb9e9b05245684558f329b38480e262c1d6bc20ecc4" + ], + [ + "3e141609b97933b66a060dcddc71fad1d91677db872031e85f4c015c5e7e8982", + "くのう てぬぐい そんかい すろっと ちきゅう ほあん とさか はくしゅ ひびく みえる そざい てんすう たんぴん くしょう すいようび みけん きさらぎ げざん ふくざつ あつかう はやい くろう おやゆび こすう", + "32e78dce2aff5db25aa7a4a32b493b5d10b4089923f3320c8b287a77e512455443298351beb3f7eb2390c4662a2e566eec5217e1a37467af43b46668d515e41b" + ], + [ + "0460ef47585604c5660618db2e6a7e7f", + "あみもの いきおい ふいうち にげる ざんしょ じかん ついか はたん ほあん すんぽう てちがい わかめ", + "0acf902cd391e30f3f5cb0605d72a4c849342f62bd6a360298c7013d714d7e58ddf9c7fdf141d0949f17a2c9c37ced1d8cb2edabab97c4199b142c829850154b" + ], + [ + "72f60ebac5dd8add8d2a25a797102c3ce21bc029c200076f", + "すろっと にくしみ なやむ たとえる へいこう すくう きない けってい とくべつ ねっしん いたみ せんせい おくりがな まかい とくい けあな いきおい そそぐ", + "9869e220bec09b6f0c0011f46e1f9032b269f096344028f5006a6e69ea5b0b8afabbb6944a23e11ebd021f182dd056d96e4e3657df241ca40babda532d364f73" + ], + [ + "2c85efc7f24ee4573d2b81a6ec66cee209b2dcbd09d8eddc51e0215b0b68e416", + "かほご きうい ゆたか みすえる もらう がっこう よそう ずっと ときどき したうけ にんか はっこう つみき すうじつ よけい くげん もくてき まわり せめる げざい にげる にんたい たんそく ほそく", + "713b7e70c9fbc18c831bfd1f03302422822c3727a93a5efb9659bec6ad8d6f2c1b5c8ed8b0b77775feaf606e9d1cc0a84ac416a85514ad59f5541ff5e0382481" + ], + [ + "eaebabb2383351fd31d703840b32e9e2", + "めいえん さのう めだつ すてる きぬごし ろんぱ はんこ まける たいおう さかいし ねんいり はぶらし", + "06e1d5289a97bcc95cb4a6360719131a786aba057d8efd603a547bd254261c2a97fcd3e8a4e766d5416437e956b388336d36c7ad2dba4ee6796f0249b10ee961" + ], + [ + "7ac45cfe7722ee6c7ba84fbc2d5bd61b45cb2fe5eb65aa78", + "せんぱい おしえる ぐんかん もらう きあい きぼう やおや いせえび のいず じゅしん よゆう きみつ さといも ちんもく ちわわ しんせいじ とめる はちみつ", + "1fef28785d08cbf41d7a20a3a6891043395779ed74503a5652760ee8c24dfe60972105ee71d5168071a35ab7b5bd2f8831f75488078a90f0926c8e9171b2bc4a" + ], + [ + "4fa1a8bc3e6d80ee1316050e862c1812031493212b7ec3f3bb1b08f168cabeef", + "こころ いどう きあつ そうがんきょう へいあん せつりつ ごうせい はいち いびき きこく あんい おちつく きこえる けんとう たいこ すすめる はっけん ていど はんおん いんさつ うなぎ しねま れいぼう みつかる", + "43de99b502e152d4c198542624511db3007c8f8f126a30818e856b2d8a20400d29e7a7e3fdd21f909e23be5e3c8d9aee3a739b0b65041ff0b8637276703f65c2" + ], + [ + "18ab19a9f54a9274f03e5209a2ac8a91", + "うりきれ さいせい じゆう むろん とどける ぐうたら はいれつ ひけつ いずれ うちあわせ おさめる おたく", + "3d711f075ee44d8b535bb4561ad76d7d5350ea0b1f5d2eac054e869ff7963cdce9581097a477d697a2a9433a0c6884bea10a2193647677977c9820dd0921cbde" + ], + [ + "18a2e1d81b8ecfb2a333adcb0c17a5b9eb76cc5d05db91a4", + "うりきれ うねる せっさたくま きもち めんきょ へいたく たまご ぜっく びじゅつかん さんそ むせる せいじ ねくたい しはらい せおう ねんど たんまつ がいけん", + "753ec9e333e616e9471482b4b70a18d413241f1e335c65cd7996f32b66cf95546612c51dcf12ead6f805f9ee3d965846b894ae99b24204954be80810d292fcdd" + ], + [ + "15da872c95a13dd738fbf50e427583ad61f18fd99f628c417a61cf8343c90419", + "うちゅう ふそく ひしょ がちょう うけもつ めいそう みかん そざい いばる うけとる さんま さこつ おうさま ぱんつ しひょう めした たはつ いちぶ つうじょう てさぎょう きつね みすえる いりぐち かめれおん", + "346b7321d8c04f6f37b49fdf062a2fddc8e1bf8f1d33171b65074531ec546d1d3469974beccb1a09263440fc92e1042580a557fdce314e27ee4eabb25fa5e5fe" + ] + ] + }; + describe("BIP39-lib vectors", () => { + function testVector( + description: string, + wordlist: string[], + password: string, + v: [string, string, string], + i: number + ) { + const [entropy, mnemonic, seed] = v; + describe(`for ${description} (${i}), ${entropy}`, async () => { + deepStrictEqual( + toHex(mnemonicToEntropy(mnemonic, wordlist)), + entropy, + "mnemonicToEntropy" + ); + deepStrictEqual( + toHex(mnemonicToSeedSync(mnemonic, password)), + seed, + "mnemonicToSeedSync" + ); + const res = await mnemonicToSeed(mnemonic, password); + deepStrictEqual(toHex(res), seed, "mnemonicToSeed"); + deepStrictEqual( + entropyToMnemonic(hexToBytes(entropy), wordlist), + mnemonic, + "entropyToMnemonic" + ); + deepStrictEqual( + validateMnemonic(mnemonic, wordlist), + true, + "validateMnemonic" + ); + }); + } + for (let i = 0; i < VECTORS.english.length; i++) { + testVector("English", englishWordlist, "TREZOR", VECTORS.english[i], i); + } + for (let i = 0; i < VECTORS.japanese.length; i++) { + testVector( + "Japanese", + japaneseWordlist, + "㍍ガバヴァぱばぐゞちぢ十人十色", + VECTORS.japanese[i], + i + ); + } + describe("Invalid entropy", () => { + throws(() => entropyToMnemonic(new Uint8Array([]), englishWordlist)); + throws(() => + entropyToMnemonic(new Uint8Array([0, 0, 0]), englishWordlist) + ); + throws(() => entropyToMnemonic(new Uint8Array(1028), englishWordlist)); + }); + describe("UTF8 passwords", () => { + for (const [_, mnemonic, seed] of VECTORS.japanese) { + const password = "㍍ガバヴァぱばぐゞちぢ十人十色"; + const normalizedPassword = + "メートルガバヴァぱばぐゞちぢ十人十色"; + deepStrictEqual( + toHex(mnemonicToSeedSync(mnemonic, password)), + seed, + "mnemonicToSeedSync normalizes passwords" + ); + deepStrictEqual( + toHex(mnemonicToSeedSync(mnemonic, normalizedPassword)), + seed, + "mnemonicToSeedSync leaves normalizes passwords as-is" + ); + } + }); + describe("generateMnemonic can vary entropy length", () => { + deepStrictEqual( + generateMnemonic(englishWordlist, 160).split(" ").length, + 15, + "can vary generated entropy bit length" + ); + }); + describe("validateMnemonic", () => { + deepStrictEqual( + validateMnemonic("sleep kitten", englishWordlist), + false, + "fails for a mnemonic that is too short" + ); + deepStrictEqual( + validateMnemonic( + "sleep kitten sleep kitten sleep kitten", + englishWordlist + ), + false, + "fails for a mnemonic that is too short" + ); + deepStrictEqual( + validateMnemonic( + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about end grace oxygen maze bright face loan ticket trial leg cruel lizard bread worry reject journey perfect chef section caught neither install industry", + englishWordlist + ), + false, + "fails for a mnemonic that is too long" + ); + deepStrictEqual( + validateMnemonic( + "turtle front uncle idea crush write shrug there lottery flower risky shell", + englishWordlist + ), + false, + "fails if mnemonic words are not in the word list" + ); + deepStrictEqual( + validateMnemonic( + "sleep kitten sleep kitten sleep kitten sleep kitten sleep kitten sleep kitten", + englishWordlist + ), + false, + "fails for invalid checksum" + ); + }); + }); +}); diff --git a/test/test-vectors/blake2b.ts b/test/test-vectors/blake2b.ts index 22ad4da..303ba0d 100644 --- a/test/test-vectors/blake2b.ts +++ b/test/test-vectors/blake2b.ts @@ -1,5 +1,6 @@ -import { assert } from "chai"; - +import { blake2b } from "ethereum-cryptography/blake2b"; +import { hexToBytes, toHex } from "ethereum-cryptography/utils"; +import { deepStrictEqual, throws } from "./assert"; // Vectors extracted from https://github.com/emilbayes/blake2b/blob/f0a7c7b550133eca5f5fc3b751ccfd2335ce736f/test-vectors.json const TEST_VECTORS = [ { @@ -40,25 +41,20 @@ const TEST_VECTORS = [ } ]; -export function createTests( - hash: (input: Buffer, outputLength: number) => Buffer -) { - describe("blake2b", function() { - for (const [i, vector] of TEST_VECTORS.entries()) { - it(`Should return the right hash for the test ${i}`, function() { - const actual = hash(Buffer.from(vector.input, "hex"), vector.outlen); - - assert.equal(actual.toString("hex"), vector.out); - }); - } - - it("throws if the outputLength is <= 0", function() { - assert.throws(() => hash(Buffer.from("", "hex"), 0)); - assert.throws(() => hash(Buffer.from("", "hex"), -1)); +describe("blake2b", function() { + for (const [i, vector] of TEST_VECTORS.entries()) { + it(`Should return the right hash for the test ${i}`, function() { + const actual = blake2b(hexToBytes(vector.input), vector.outlen); + deepStrictEqual(toHex(actual), vector.out); }); + } - it("throws if the outputLength is > 64", function() { - assert.throws(() => hash(Buffer.from("", "hex"), 65)); - }); + it("throws if the outputLength is <= 0", function() { + throws(() => blake2b(hexToBytes(""), 0)); + throws(() => blake2b(hexToBytes(""), -1)); + }); + + it("throws if the outputLength is > 64", function() { + throws(() => blake2b(hexToBytes(""), 65)); }); -} +}); diff --git a/test/test-vectors/bls.ts b/test/test-vectors/bls.ts new file mode 100644 index 0000000..76083a0 --- /dev/null +++ b/test/test-vectors/bls.ts @@ -0,0 +1,51 @@ +import { bls12_381 } from "ethereum-cryptography/bls"; +import { deepStrictEqual } from "./assert"; + +describe("bls12-381", () => { + const PointG1 = bls12_381.G1.ProjectivePoint; + const PointG2 = bls12_381.G2.ProjectivePoint; + const { Fp, Fp12 } = bls12_381.fields; + + it("basic", () => { + const a = PointG1.fromAffine({ + x: Fp.create( + 0x17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bbn + ), + y: Fp.create( + 0x08b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1n + ), + }); + a.assertValidity(); + }); + it("sign", () => { + const [priv, msg] = + "0d1bd9077705325666408124339dca98c0c842b35a90bc3cea8e0c36f2d35583:c43623:94f60dc44a4dbb2505befe346c0c143190fc877ded5e877418f0f890b8ae357a40e8fcc189139aaa509d2b6500f623a5".split( + ":" + ); + const sig = bls12_381.signShortSignature(msg, priv); + const pub = bls12_381.getPublicKeyForShortSignatures(priv); + const res = bls12_381.verifyShortSignature(sig, msg, pub); + deepStrictEqual(res, true, `${priv}-${msg}`); + }); + it("pairing", () => { + const p1 = bls12_381.pairing(PointG1.BASE, PointG2.BASE); + deepStrictEqual( + p1, + // @ts-ignore + Fp12.fromBigTwelve([ + 0x1250ebd871fc0a92a7b2d83168d0d727272d441befa15c503dd8e90ce98db3e7b6d194f60839c508a84305aaca1789b6n, + 0x089a1c5b46e5110b86750ec6a532348868a84045483c92b7af5af689452eafabf1a8943e50439f1d59882a98eaa0170fn, + 0x1368bb445c7c2d209703f239689ce34c0378a68e72a6b3b216da0e22a5031b54ddff57309396b38c881c4c849ec23e87n, + 0x193502b86edb8857c273fa075a50512937e0794e1e65a7617c90d8bd66065b1fffe51d7a579973b1315021ec3c19934fn, + 0x01b2f522473d171391125ba84dc4007cfbf2f8da752f7c74185203fcca589ac719c34dffbbaad8431dad1c1fb597aaa5n, + 0x018107154f25a764bd3c79937a45b84546da634b8f6be14a8061e55cceba478b23f7dacaa35c8ca78beae9624045b4b6n, + 0x19f26337d205fb469cd6bd15c3d5a04dc88784fbb3d0b2dbdea54d43b2b73f2cbb12d58386a8703e0f948226e47ee89dn, + 0x06fba23eb7c5af0d9f80940ca771b6ffd5857baaf222eb95a7d2809d61bfe02e1bfd1b68ff02f0b8102ae1c2d5d5ab1an, + 0x11b8b424cd48bf38fcef68083b0b0ec5c81a93b330ee1a677d0d15ff7b984e8978ef48881e32fac91b93b47333e2ba57n, + 0x03350f55a7aefcd3c31b4fcb6ce5771cc6a0e9786ab5973320c806ad360829107ba810c5a09ffdd9be2291a0c25a99a2n, + 0x04c581234d086a9902249b64728ffd21a189e87935a954051c7cdba7b3872629a4fafc05066245cb9108f0242d0fe3efn, + 0x0f41e58663bf08cf068672cbd01a7ec73baca4d72ca93544deff686bfd6df543d48eaa24afe47e1efde449383b676631n, + ]) + ); + }); +}); diff --git a/test/test-vectors/bn.ts b/test/test-vectors/bn.ts new file mode 100644 index 0000000..80a90a2 --- /dev/null +++ b/test/test-vectors/bn.ts @@ -0,0 +1,63 @@ +import { bn254 } from "ethereum-cryptography/bn"; +import { deepStrictEqual } from "./assert"; + +describe("bls12-381", () => { + const PointG1 = bn254.G1.ProjectivePoint; + const PointG2 = bn254.G2.ProjectivePoint; + const { Fp12 } = bn254.fields; + + it("basic", () => { + const g1 = + PointG1.BASE.multiply( + 18097487326282793650237947474982649264364522469319914492172746413872781676n + ); + g1.assertValidity(); + deepStrictEqual(g1.toAffine(), { + x: 0x16f7535f91f50bb2227f483b54850a63b38206f28e0a1a65c83d0c90762442a9n, + y: 0x0b46dd0c40725b6b4a298576629d77b41a545060adb4358eabec939e80691a05n, + }); + const g2 = + PointG2.BASE.multiply( + 20390255904278144451778773028944684152769293537511418234311120800877067946n + ); + g2.assertValidity(); + deepStrictEqual(g2.toAffine(), { + x: { + c0: 0x1ecfd2dff2aad18798b64bdb0c2b50c9d73e6c05619e04cbf5b448fd98726880n, + c1: 0x0e16c8d96362720af0916592be1b839a26f5e6b710f3ede0d8840d9a70eaf97fn, + }, + y: { + c0: 0x2aa778acda9e7d4925c60ad84c12fb3b4f2b9539d5699934b0e6fdd10cc2c0e1n, + c1: 0x1e8f2c1f441fed039bb46d6bfb91236cf7ba240c75080cedbe40e049c46b26ben, + }, + }); + }); + it("pairing", () => { + const g1 = + PointG1.BASE.multiply( + 18097487326282793650237947474982649264364522469319914492172746413872781676n + ); + const g2 = + PointG2.BASE.multiply( + 20390255904278144451778773028944684152769293537511418234311120800877067946n + ); + deepStrictEqual( + bn254.pairing(g1, g2, true), + // @ts-ignore + Fp12.fromBigTwelve([ + 7520311483001723614143802378045727372643587653754534704390832890681688842501n, + 20265650864814324826731498061022229653175757397078253377158157137251452249882n, + 11942254371042183455193243679791334797733902728447312943687767053513298221130n, + 759657045325139626991751731924144629256296901790485373000297868065176843620n, + 16045761475400271697821392803010234478356356448940805056528536884493606035236n, + 4715626119252431692316067698189337228571577552724976915822652894333558784086n, + 14901948363362882981706797068611719724999331551064314004234728272909570402962n, + 11093203747077241090565767003969726435272313921345853819385060670210834379103n, + 17897835398184801202802503586172351707502775171934235751219763553166796820753n, + 1344517825169318161285758374052722008806261739116142912817807653057880346554n, + 11123896897251094532909582772961906225000817992624500900708432321664085800838n, + 17453370448280081813275586256976217762629631160552329276585874071364454854650n, + ]) + ); + }); +}); diff --git a/test/test-vectors/hdkey.ts b/test/test-vectors/hdkey.ts index 0bef5c2..48391aa 100644 --- a/test/test-vectors/hdkey.ts +++ b/test/test-vectors/hdkey.ts @@ -1,30 +1,589 @@ -import { assert } from "chai"; +import { secp256k1 as secp } from "@noble/curves/secp256k1"; +import { HARDENED_OFFSET, HDKey } from "ethereum-cryptography/hdkey"; +import { hexToBytes, toHex } from "ethereum-cryptography/utils"; +import { deepStrictEqual, throws } from "./assert"; +// https://github.com/cryptocoinjs/hdkey/blob/42637e381bdef0c8f785b14f5b66a80dad969514/test/fixtures/hdkey.json +const fixtures = [ + { + seed: "000102030405060708090a0b0c0d0e0f", + path: "m", + public: + "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + private: + "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + }, + { + seed: "000102030405060708090a0b0c0d0e0f", + path: "m/0'", + public: + "xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw", + private: + "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7", + }, + { + seed: "000102030405060708090a0b0c0d0e0f", + path: "m/0'/1", + public: + "xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ", + private: + "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs", + }, + { + seed: "000102030405060708090a0b0c0d0e0f", + path: "m/0'/1/2'", + public: + "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5", + private: + "xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM", + }, + { + seed: "000102030405060708090a0b0c0d0e0f", + path: "m/0'/1/2'/2", + public: + "xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV", + private: + "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334", + }, + { + seed: "000102030405060708090a0b0c0d0e0f", + path: "m/0'/1/2'/2/1000000000", + public: + "xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy", + private: + "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76", + }, + { + seed: "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + path: "m", + public: + "xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB", + private: + "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U", + }, + { + seed: "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + path: "m/0", + public: + "xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH", + private: + "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt", + }, + { + seed: "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + path: "m/0/2147483647'", + public: + "xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a", + private: + "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9", + }, + { + seed: "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + path: "m/0/2147483647'/1", + public: + "xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon", + private: + "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef", + }, + { + seed: "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + path: "m/0/2147483647'/1/2147483646'", + public: + "xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL", + private: + "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc", + }, + { + seed: "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + path: "m/0/2147483647'/1/2147483646'/2", + public: + "xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt", + private: + "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j", + }, +]; -export function createTests(HDKey: any) { - describe("hdkey", function() { - it("Should derive private key correctly", function() { +describe("hdkey", () => { + it("Should derive private key correctly", () => { + const seed = + "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542"; + const hdkey = HDKey.fromMasterSeed(hexToBytes(seed)); + const childkey = hdkey.derive("m/0/2147483647'/1"); + deepStrictEqual( + childkey.privateExtendedKey, + "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef" + ); + // Should throw on 2**32 childs + throws(() => hdkey.deriveChild(2 ** 32)); + }); + + it("Should derive public key correctly", () => { + const seed = + "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542"; + const hdkey = HDKey.fromMasterSeed(hexToBytes(seed)); + const expected = hdkey.derive("m/0/2147483647'/1"); + const parentkey = hdkey.derive("m/0/2147483647'"); + parentkey.wipePrivateData(); + const childkey = parentkey.derive("m/1"); + deepStrictEqual(childkey.publicExtendedKey, expected.publicExtendedKey); + }); + + // Ported from https://github.com/cryptocoinjs/hdkey/blob/42637e381bdef0c8f785b14f5b66a80dad969514/test/hdkey.test.js + describe("+ fromMasterSeed", () => { + for (const f of fixtures) { + it("should properly derive the chain path: " + f.path, () => { + const hdkey = HDKey.fromMasterSeed(hexToBytes(f.seed)); + const childkey = hdkey.derive(f.path); + deepStrictEqual(childkey.privateExtendedKey, f.private); + deepStrictEqual(childkey.publicExtendedKey, f.public); + }); + + describe("> " + f.path + " toJSON() / fromJSON()", () => { + it("should return an object read for JSON serialization", () => { + const hdkey = HDKey.fromMasterSeed(hexToBytes(f.seed)); + const childkey = hdkey.derive(f.path); + const obj = { + xpriv: f.private, + xpub: f.public, + }; + deepStrictEqual(childkey.toJSON(), obj); + const newKey = HDKey.fromJSON(obj); + deepStrictEqual(newKey.privateExtendedKey, f.private); + deepStrictEqual(newKey.publicExtendedKey, f.public); + }); + }); + } + }); + + describe("- privateKey", () => { + it("should throw an error if incorrect key size", () => { const seed = "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542"; - const hdkey = HDKey.fromMasterSeed(Buffer.from(seed, "hex")); - const childkey = hdkey.derive("m/0/2147483647'/1"); + const hdkey = HDKey.fromMasterSeed(hexToBytes(seed)); + // const hdkey = new HDKey.HDKey(); + throws(() => { + "use strict"; // parcel strips strict-mode by some reasons. + // @ts-ignore + hdkey.privateKey = new Uint8Array([1, 2, 3, 4]); + }); + }); + }); - assert.equal( - childkey.privateExtendedKey, - "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef" - ); + describe("- publicKey", () => { + it("should throw an error if incorrect key size", () => { + throws(() => { + "use strict"; // parcel strips strict-mode by some reasons. + const seed = + "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542"; + const hdkey = HDKey.fromMasterSeed(hexToBytes(seed)); + // @ts-ignore + hdkey.publicKey = new Uint8Array([1, 2, 3, 4]); + }); }); - it("Should derive public key correctly", function() { + it("should not throw if key is 33 bytes (compressed)", () => { + const pub = secp.getPublicKey(secp.utils.randomPrivateKey(), true); + deepStrictEqual(pub.length, 33); const seed = "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542"; - const hdkey = HDKey.fromMasterSeed(Buffer.from(seed, "hex")); - const expected = hdkey.derive("m/0/2147483647'/1"); - const parentkey = hdkey.derive("m/0/2147483647'"); - parentkey.wipePrivateData(); + const hdkey = HDKey.fromMasterSeed(hexToBytes(seed)); + throws(() => { + "use strict"; // parcel strips strict-mode by some reasons. + // @ts-ignore + hdkey.publicKey = pub; + }); + }); + + it("should not throw if key is 65 bytes (not compressed)", () => { + const pub = secp.getPublicKey(secp.utils.randomPrivateKey(), false); + deepStrictEqual(pub.length, 65); + const seed = + "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542"; + const hdkey = HDKey.fromMasterSeed(hexToBytes(seed)); + throws(() => { + "use strict"; // parcel strips strict-mode by some reasons. + // @ts-ignore + hdkey.publicKey = pub; + }); + }); + }); + + describe("+ fromExtendedKey()", () => { + describe("> when private", () => { + it("should parse it", () => { + // m/0/2147483647'/1/2147483646'/2 + const key = + "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j"; + const hdkey = HDKey.fromExtendedKey(key); + deepStrictEqual(hdkey.versions.private, 0x0488ade4); + deepStrictEqual(hdkey.versions.public, 0x0488b21e); + deepStrictEqual(hdkey.depth, 5); + deepStrictEqual(hdkey.parentFingerprint, 0x31a507b8); + deepStrictEqual(hdkey.index, 2); + deepStrictEqual( + toHex(hdkey.chainCode!), + "9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271" + ); + deepStrictEqual( + toHex(hdkey.privateKey!), + "bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23" + ); + deepStrictEqual( + toHex(hdkey.publicKey!), + "024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c" + ); + deepStrictEqual( + toHex(hdkey.identifier!), + "26132fdbe7bf89cbc64cf8dafa3f9f88b8666220" + ); + }); + }); + + describe("> when public", () => { + it("should parse it", () => { + // m/0/2147483647'/1/2147483646'/2 + const key = + "xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt"; + const hdkey = HDKey.fromExtendedKey(key); + deepStrictEqual(hdkey.versions.private, 0x0488ade4); + deepStrictEqual(hdkey.versions.public, 0x0488b21e); + deepStrictEqual(hdkey.depth, 5); + deepStrictEqual(hdkey.parentFingerprint, 0x31a507b8); + deepStrictEqual(hdkey.index, 2); + deepStrictEqual( + toHex(hdkey.chainCode!), + "9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271" + ); + deepStrictEqual(hdkey.privateKey, null); + deepStrictEqual( + toHex(hdkey.publicKey!), + "024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c" + ); + deepStrictEqual( + toHex(hdkey.identifier!), + "26132fdbe7bf89cbc64cf8dafa3f9f88b8666220" + ); + }); + }); + }); + + describe("> when signing", () => { + it("should work", () => { + const key = + "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j"; + const hdkey = HDKey.fromExtendedKey(key); + + const ma = new Uint8Array(32); + const mb = new Uint8Array(32).fill(8); + const a = hdkey.sign(ma); + const b = hdkey.sign(mb); + deepStrictEqual( + toHex(a), + "6ba4e554457ce5c1f1d7dbd10459465e39219eb9084ee23270688cbe0d49b52b7905d5beb28492be439a3250e9359e0390f844321b65f1a88ce07960dd85da06" + ); + deepStrictEqual( + toHex(b), + "dfae85d39b73c9d143403ce472f7c4c8a5032c13d9546030044050e7d39355e47a532e5c0ae2a25392d97f5e55ab1288ef1e08d5c034bad3b0956fbbab73b381" + ); + // TODO: noble-secp256k1 incompat + // assert.equal(hdkey.verify(ma, a), true); + deepStrictEqual(hdkey.verify(mb, b), true); + deepStrictEqual( + hdkey.verify(new Uint8Array(32), new Uint8Array(64)), + false + ); + deepStrictEqual(hdkey.verify(ma, b), false); + deepStrictEqual(hdkey.verify(mb, a), false); + + throws(() => hdkey.verify(new Uint8Array(99), a)); + throws(() => hdkey.verify(ma, new Uint8Array(99))); + }); + }); + + describe("> when deriving public key", () => { + it("should work", () => { + const key = + "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8"; + const hdkey = HDKey.fromExtendedKey(key); + + const path = "m/3353535/2223/0/99424/4/33"; + const derivedHDKey = hdkey.derive(path); + + const expected = + "xpub6JdKdVJtdx6sC3nh87pDvnGhotXuU5Kz6Qy7Piy84vUAwWSYShsUGULE8u6gCivTHgz7cCKJHiXaaMeieB4YnoFVAsNgHHKXJ2mN6jCMbH1"; + deepStrictEqual(derivedHDKey.publicExtendedKey, expected); + }); + }); + + describe("> when private key integer is less than 32 bytes", () => { + it("should work", () => { + const seed = "000102030405060708090a0b0c0d0e0f"; + const masterKey = HDKey.fromMasterSeed(hexToBytes(seed)); + + const newKey = masterKey.derive("m/44'/6'/4'"); + const expected = + "xprv9ymoag6W7cR6KBcJzhCM6qqTrb3rRVVwXKzwNqp1tDWcwierEv3BA9if3ARHMhMPh9u2jNoutcgpUBLMfq3kADDo7LzfoCnhhXMRGX3PXDx"; + deepStrictEqual(newKey.privateExtendedKey, expected); + }); + }); + + describe("HARDENED_OFFSET", () => { + it("should be set", () => { + deepStrictEqual(!!HARDENED_OFFSET, true); + }); + }); + + describe("> when private key has leading zeros", () => { + it("will include leading zeros when hashing to derive child", () => { + const key = + "xprv9s21ZrQH143K3ckY9DgU79uMTJkQRLdbCCVDh81SnxTgPzLLGax6uHeBULTtaEtcAvKjXfT7ZWtHzKjTpujMkUd9dDb8msDeAfnJxrgAYhr"; + const hdkey = HDKey.fromExtendedKey(key); + deepStrictEqual( + toHex(hdkey.privateKey!), + "00000055378cf5fafb56c711c674143f9b0ee82ab0ba2924f19b64f5ae7cdbfd" + ); + const derived = hdkey.derive("m/44'/0'/0'/0/0'"); + deepStrictEqual( + toHex(derived.privateKey!), + "3348069561d2a0fb925e74bf198762acc47dce7db27372257d2d959a9e6f8aeb" + ); + }); + }); + + describe("> when private key is null", () => { + it("privateExtendedKey should return null and not throw", () => { + const seed = "000102030405060708090a0b0c0d0e0f"; + const masterKey = HDKey.fromMasterSeed(hexToBytes(seed)); + + deepStrictEqual(!!masterKey.privateExtendedKey, true, "xpriv is truthy"); + throws(() => { + "use strict"; // parcel strips strict-mode by some reasons. + (masterKey as any).privateKey = undefined; + }); + + // throws(() => masterKey.privateExtendedKey); + }); + }); + + describe(" - when the path given to derive contains only the master extended key", () => { + const hdKeyInstance = HDKey.fromMasterSeed(hexToBytes(fixtures[0].seed)); + + it("should return the same hdkey instance", () => { + deepStrictEqual(hdKeyInstance.derive("m"), hdKeyInstance); + deepStrictEqual(hdKeyInstance.derive("M"), hdKeyInstance); + deepStrictEqual(hdKeyInstance.derive("m'"), hdKeyInstance); + deepStrictEqual(hdKeyInstance.derive("M'"), hdKeyInstance); + }); + }); - const childkey = parentkey.derive("m/1"); + describe(" - when the path given to derive does not begin with master extended key", () => { + it("should throw an error", () => { + throws(() => HDKey.prototype.derive("123")); + }); + }); + + describe("- after wipePrivateData()", () => { + it("should not have private data", () => { + const hdkey = HDKey.fromMasterSeed( + hexToBytes(fixtures[6].seed) + ).wipePrivateData(); + deepStrictEqual(hdkey.privateKey, null); + throws(() => hdkey.privateExtendedKey); + throws(() => hdkey.sign(new Uint8Array(32))); + const childKey = hdkey.derive("m/0"); + deepStrictEqual(childKey.publicExtendedKey, fixtures[7].public); + deepStrictEqual(childKey.privateKey, null); + throws(() => childKey.privateExtendedKey); + }); - assert.equal(childkey.publicExtendedKey, expected.publicExtendedKey); + it("should have correct data", () => { + // m/0/2147483647'/1/2147483646'/2 + const key = + "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j"; + const hdkey = HDKey.fromExtendedKey(key).wipePrivateData(); + deepStrictEqual(hdkey.versions.private, 0x0488ade4); + deepStrictEqual(hdkey.versions.public, 0x0488b21e); + deepStrictEqual(hdkey.depth, 5); + deepStrictEqual(hdkey.parentFingerprint, 0x31a507b8); + deepStrictEqual(hdkey.index, 2); + deepStrictEqual( + toHex(hdkey.chainCode!), + "9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271" + ); + deepStrictEqual( + toHex(hdkey.publicKey!), + "024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c" + ); + deepStrictEqual( + toHex(hdkey.identifier!), + "26132fdbe7bf89cbc64cf8dafa3f9f88b8666220" + ); + }); + + it("should be able to verify signatures", () => { + const fullKey = HDKey.fromMasterSeed(hexToBytes(fixtures[0].seed)); + // using JSON methods to clone before mutating + const wipedKey = HDKey.fromJSON(fullKey.toJSON()).wipePrivateData(); + const hash = new Uint8Array(32).fill(8); + deepStrictEqual(!!wipedKey.verify(hash, fullKey.sign(hash)), true); + }); + + it("should not throw if called on hdkey without private data", () => { + const hdkey = HDKey.fromExtendedKey(fixtures[0].public); + hdkey.wipePrivateData(); + deepStrictEqual(hdkey.publicExtendedKey, fixtures[0].public); + }); + }); + it("should throw on derive of wrong indexes", () => { + const hdkey = HDKey.fromExtendedKey(fixtures[0].public); + const invalid = [ + "m/0/ 1 /2", + "m/0/1.5/2", + "m/0/331e100/2", + "m/0/3e/2", + "m/0/'/2", + ]; + for (const t of invalid) { + throws(() => hdkey.derive(t)); + } + }); + // https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki + describe("Spec test vectors", () => { + it("Test Vector 1", () => { + const master = HDKey.fromMasterSeed( + hexToBytes("000102030405060708090a0b0c0d0e0f") + ); + deepStrictEqual(master.derive("m").toJSON(), { + xpriv: + "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + xpub: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + }); + deepStrictEqual(master.derive("m/0'").toJSON(), { + xpriv: + "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7", + xpub: "xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw", + }); + deepStrictEqual(master.derive("m/0'/1").toJSON(), { + xpriv: + "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs", + xpub: "xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ", + }); + deepStrictEqual(master.derive("m/0'/1/2'").toJSON(), { + xpriv: + "xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM", + xpub: "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5", + }); + deepStrictEqual(master.derive("m/0'/1/2'/2").toJSON(), { + xpriv: + "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334", + xpub: "xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV", + }); + deepStrictEqual(master.derive("m/0'/1/2'/2/1000000000").toJSON(), { + xpriv: + "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76", + xpub: "xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy", + }); + }); + it("Test Vector 2", () => { + const master = HDKey.fromMasterSeed( + hexToBytes( + "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542" + ) + ); + deepStrictEqual(master.derive("m").toJSON(), { + xpriv: + "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U", + xpub: "xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB", + }); + deepStrictEqual(master.derive("m/0").toJSON(), { + xpriv: + "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt", + xpub: "xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH", + }); + deepStrictEqual(master.derive("m/0/2147483647'").toJSON(), { + xpriv: + "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9", + xpub: "xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a", + }); + deepStrictEqual(master.derive("m/0/2147483647'/1").toJSON(), { + xpriv: + "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef", + xpub: "xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon", + }); + deepStrictEqual(master.derive("m/0/2147483647'/1/2147483646'").toJSON(), { + xpriv: + "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc", + xpub: "xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL", + }); + deepStrictEqual( + master.derive("m/0/2147483647'/1/2147483646'/2").toJSON(), + { + xpriv: + "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j", + xpub: "xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt", + } + ); + }); + it("Test Vector 3", () => { + const master = HDKey.fromMasterSeed( + hexToBytes( + "4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be" + ) + ); + deepStrictEqual(master.derive("m").toJSON(), { + xpriv: + "xprv9s21ZrQH143K25QhxbucbDDuQ4naNntJRi4KUfWT7xo4EKsHt2QJDu7KXp1A3u7Bi1j8ph3EGsZ9Xvz9dGuVrtHHs7pXeTzjuxBrCmmhgC6", + xpub: "xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13", + }); + deepStrictEqual(master.derive("m/0'").toJSON(), { + xpriv: + "xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L", + xpub: "xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y", + }); + }); + it("Test Vector 4", () => { + const master = HDKey.fromMasterSeed( + hexToBytes( + "3ddd5602285899a946114506157c7997e5444528f3003f6134712147db19b678" + ) + ); + deepStrictEqual(master.derive("m").toJSON(), { + xpriv: + "xprv9s21ZrQH143K48vGoLGRPxgo2JNkJ3J3fqkirQC2zVdk5Dgd5w14S7fRDyHH4dWNHUgkvsvNDCkvAwcSHNAQwhwgNMgZhLtQC63zxwhQmRv", + xpub: "xpub661MyMwAqRbcGczjuMoRm6dXaLDEhW1u34gKenbeYqAix21mdUKJyuyu5F1rzYGVxyL6tmgBUAEPrEz92mBXjByMRiJdba9wpnN37RLLAXa", + }); + deepStrictEqual(master.derive("m/0'").toJSON(), { + xpriv: + "xprv9vB7xEWwNp9kh1wQRfCCQMnZUEG21LpbR9NPCNN1dwhiZkjjeGRnaALmPXCX7SgjFTiCTT6bXes17boXtjq3xLpcDjzEuGLQBM5ohqkao9G", + xpub: "xpub69AUMk3qDBi3uW1sXgjCmVjJ2G6WQoYSnNHyzkmdCHEhSZ4tBok37xfFEqHd2AddP56Tqp4o56AePAgCjYdvpW2PU2jbUPFKsav5ut6Ch1m", + }); + deepStrictEqual(master.derive("m/0'/1'").toJSON(), { + xpriv: + "xprv9xJocDuwtYCMNAo3Zw76WENQeAS6WGXQ55RCy7tDJ8oALr4FWkuVoHJeHVAcAqiZLE7Je3vZJHxspZdFHfnBEjHqU5hG1Jaj32dVoS6XLT1", + xpub: "xpub6BJA1jSqiukeaesWfxe6sNK9CCGaujFFSJLomWHprUL9DePQ4JDkM5d88n49sMGJxrhpjazuXYWdMf17C9T5XnxkopaeS7jGk1GyyVziaMt", + }); + }); + it("Test Vector 5", () => { + const keys = [ + "xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6LBpB85b3D2yc8sfvZU521AAwdZafEz7mnzBBsz4wKY5fTtTQBm", // (pubkey version / prvkey mismatch) + "xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFGTQQD3dC4H2D5GBj7vWvSQaaBv5cxi9gafk7NF3pnBju6dwKvH", // (prvkey version / pubkey mismatch) + "xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6Txnt3siSujt9RCVYsx4qHZGc62TG4McvMGcAUjeuwZdduYEvFn", // (invalid pubkey prefix 04) + "xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFGpWnsj83BHtEy5Zt8CcDr1UiRXuWCmTQLxEK9vbz5gPstX92JQ", // (invalid prvkey prefix 04) + "xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6N8ZMMXctdiCjxTNq964yKkwrkBJJwpzZS4HS2fxvyYUA4q2Xe4", // (invalid pubkey prefix 01) + "xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFAzHGBP2UuGCqWLTAPLcMtD9y5gkZ6Eq3Rjuahrv17fEQ3Qen6J", // (invalid prvkey prefix 01) + "xprv9s2SPatNQ9Vc6GTbVMFPFo7jsaZySyzk7L8n2uqKXJen3KUmvQNTuLh3fhZMBoG3G4ZW1N2kZuHEPY53qmbZzCHshoQnNf4GvELZfqTUrcv", // (zero depth with non-zero parent fingerprint) + "xpub661no6RGEX3uJkY4bNnPcw4URcQTrSibUZ4NqJEw5eBkv7ovTwgiT91XX27VbEXGENhYRCf7hyEbWrR3FewATdCEebj6znwMfQkhRYHRLpJ", // (zero depth with non-zero parent fingerprint) + "xprv9s21ZrQH4r4TsiLvyLXqM9P7k1K3EYhA1kkD6xuquB5i39AU8KF42acDyL3qsDbU9NmZn6MsGSUYZEsuoePmjzsB3eFKSUEh3Gu1N3cqVUN", // (zero depth with non-zero index) + "xpub661MyMwAuDcm6CRQ5N4qiHKrJ39Xe1R1NyfouMKTTWcguwVcfrZJaNvhpebzGerh7gucBvzEQWRugZDuDXjNDRmXzSZe4c7mnTK97pTvGS8", // (zero depth with non-zero index) + "DMwo58pR1QLEFihHiXPVykYB6fJmsTeHvyTp7hRThAtCX8CvYzgPcn8XnmdfHGMQzT7ayAmfo4z3gY5KfbrZWZ6St24UVf2Qgo6oujFktLHdHY4", // (unknown extended key version) + "DMwo58pR1QLEFihHiXPVykYB6fJmsTeHvyTp7hRThAtCX8CvYzgPcn8XnmdfHPmHJiEDXkTiJTVV9rHEBUem2mwVbbNfvT2MTcAqj3nesx8uBf9", // (unknown extended key version) + "xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzF93Y5wvzdUayhgkkFoicQZcP3y52uPPxFnfoLZB21Teqt1VvEHx", // (private key 0 not in 1..n-1) + "xprv9s21ZrQH143K24Mfq5zL5MhWK9hUhhGbd45hLXo2Pq2oqzMMo63oStZzFAzHGBP2UuGCqWLTAPLcMtD5SDKr24z3aiUvKr9bJpdrcLg1y3G", // (private key n not in 1..n-1) + "xpub661MyMwAqRbcEYS8w7XLSVeEsBXy79zSzH1J8vCdxAZningWLdN3zgtU6Q5JXayek4PRsn35jii4veMimro1xefsM58PgBMrvdYre8QyULY", // (invalid pubkey 020000000000000000000000000000000000000000000000000000000000000007) + "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHL", // (invalid checksum) + ]; + for (const c of keys) { + throws(() => HDKey.fromExtendedKey(c)); + } }); }); -} +}); diff --git a/test/test-vectors/keccak.ts b/test/test-vectors/keccak.ts index 48cca13..16ca619 100644 --- a/test/test-vectors/keccak.ts +++ b/test/test-vectors/keccak.ts @@ -1,61 +1,50 @@ -import { assert } from "chai"; - -export function createTestsForVector( - hash: (msg: Buffer) => Buffer, - vectors: typeof keccak224Vectors -) { - describe(hash.name, function() { - for (const [i, vector] of vectors.entries()) { - it(`Should return the correct hash for test ${i}`, function() { - assert.equal(hash(vector.input).toString("hex"), vector.output); - }); - } - }); -} +import { keccak224, keccak256, keccak384, keccak512 } from "ethereum-cryptography/keccak"; +import { hexToBytes, toHex, utf8ToBytes } from "ethereum-cryptography/utils"; +import { deepStrictEqual } from "./assert"; export const keccak224Vectors = [ { - input: Buffer.from([]), + input: utf8ToBytes(""), output: "f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd" }, { - input: Buffer.from("41", "hex"), + input: hexToBytes("41"), output: "ef40b16ff375c834e91412489889f36538748c5454f4b02ba750b65e" }, { - input: Buffer.from("asd", "ascii"), + input: utf8ToBytes("asd"), output: "c8cc732c0fa9004eb33d5d833ca22fbd27f21f1c53ef5670bc6779ca" } ]; export const keccak256Vectors = [ { - input: Buffer.from([]), + input: utf8ToBytes(""), output: "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, { - input: Buffer.from("41", "hex"), + input: hexToBytes("41"), output: "03783fac2efed8fbc9ad443e592ee30e61d65f471140c10ca155e937b435b760" }, { - input: Buffer.from("asd", "ascii"), + input: utf8ToBytes("asd"), output: "87c2d362de99f75a4f2755cdaaad2d11bf6cc65dc71356593c445535ff28f43d" } ]; export const keccak384Vectors = [ { - input: Buffer.from([]), + input: utf8ToBytes(""), output: "2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff" }, { - input: Buffer.from("41", "hex"), + input: hexToBytes("41"), output: "5c744cf4b4e3fb8967189e9744261a74f0ef31cdd8850554c737803585ac109039b73c22c50ea866c94debf1061f37a4" }, { - input: Buffer.from("asd", "ascii"), + input: utf8ToBytes("asd"), output: "50efbfa7d5aa41e132c3cfba2bc503d0014eb5bf6d214420851bff0f284bc9a5383a49327600e2efc3ad9db3621decaf" } @@ -63,18 +52,37 @@ export const keccak384Vectors = [ export const keccak512Vectors = [ { - input: Buffer.from([]), + input: utf8ToBytes(""), output: "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e" }, { - input: Buffer.from("41", "hex"), + input: hexToBytes("41"), output: "421a35a60054e5f383b6137e43d44e998f496748cc77258240ccfaa8730b51f40cf47c1bc09c728a8cd4f096731298d51463f15af89543fed478053346260c38" }, { - input: Buffer.from("asd", "ascii"), + input: utf8ToBytes("asd"), output: "3fb67c8b512d8ce73324db02dda2d19ebfb9d6a923c48fb503be3e0c7c752eb84e4da0818665133a27638dce8e9e8696a51b64b6b247354764609f22b4e65d35" } ]; + +const VECTORS: Array<[typeof keccak224, typeof keccak224Vectors]> = [ + [keccak224, keccak224Vectors], + [keccak256, keccak256Vectors], + [keccak384, keccak384Vectors], + [keccak512, keccak512Vectors] +]; + +describe("keccak", function() { + for (const [hash, vectors] of VECTORS) { + describe(hash.name, function() { + for (const [i, vector] of vectors.entries()) { + it(`Should return the correct hash for test ${i}`, function() { + deepStrictEqual(toHex(hash(vector.input)), vector.output); + }); + } + }); + } +}); diff --git a/test/test-vectors/math.ts b/test/test-vectors/math.ts new file mode 100644 index 0000000..fbc8999 --- /dev/null +++ b/test/test-vectors/math.ts @@ -0,0 +1,42 @@ +import { modPow, modInvert } from "ethereum-cryptography/math"; +import { deepStrictEqual, throws } from "./assert"; + +describe("math", () => { + it("pow", () => { + deepStrictEqual(modPow(123n, 456n, 789n), 699n); + deepStrictEqual(modPow(123n, 0n, 789n), 1n); + deepStrictEqual(modPow(2n, 5n, 789n), 32n); + deepStrictEqual(modPow(123n, 456n, 1n), 0n); + deepStrictEqual( + modPow( + 0x17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bbn, + 0x08b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1n, + 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaabn + ), + 436876548127983101943682984672944697156319180922804969694242509081341800477678465744409641708610886843942671311740n + ); + throws(() => modPow(123n, 456n, 0n)); + throws(() => modPow(123n, 456n, -1n)); + throws(() => modPow(123n, -1n, 789n)); + }); + it("invert", () => { + // basic + deepStrictEqual(modInvert(3n, 11n), 4n); + deepStrictEqual(modInvert(10n, 17n), 12n); + deepStrictEqual(modInvert(22n, 5n), 3n); // bigger than modulo + deepStrictEqual( + modInvert( + 0x17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bbn, + 0x08b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1n + ), + 291256306712195702191844365537370801710916620404828242975224254728724473918830780018590872057480493707327142420858n + ); // big + // zero + throws(() => modInvert(0n, 5n)); + throws(() => modInvert(5n, 0n)); + deepStrictEqual(modInvert(-1n, 5n), 4n); + throws(() => modInvert(5n, -1n)); + throws(() => modInvert(2n, 4n)); // gcd is not 1 + throws(() => modInvert(7n, 7n)); // number and modulo same + }); +}); diff --git a/test/test-vectors/pbkdf2.ts b/test/test-vectors/pbkdf2.ts index aedc1ee..2a03b65 100644 --- a/test/test-vectors/pbkdf2.ts +++ b/test/test-vectors/pbkdf2.ts @@ -1,17 +1,19 @@ -import { assert } from "chai"; +import { pbkdf2 as pbkdf2Async, pbkdf2Sync } from "ethereum-cryptography/pbkdf2"; +import { toHex, utf8ToBytes } from "ethereum-cryptography/utils"; +import { deepStrictEqual } from "./assert"; const TEST_VECTORS = [ { - password: Buffer.from("password", "ascii"), - salt: Buffer.from("salt", "ascii"), + password: utf8ToBytes("password"), + salt: utf8ToBytes("salt"), iterations: 1, keylen: 32, digest: "sha256", result: "120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b" }, { - password: Buffer.from("passwordPASSWORDpassword", "ascii"), - salt: Buffer.from("saltSALTsaltSALTsaltSALTsaltSALTsalt", "ascii"), + password: utf8ToBytes("passwordPASSWORDpassword"), + salt: utf8ToBytes("saltSALTsaltSALTsaltSALTsaltSALTsalt"), iterations: 4096, keylen: 40, digest: "sha256", @@ -19,8 +21,8 @@ const TEST_VECTORS = [ "348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1c635518c7dac47e9" }, { - password: Buffer.from("password", "ascii"), - salt: Buffer.from("salt", "ascii"), + password: utf8ToBytes("password"), + salt: utf8ToBytes("salt"), iterations: 4096, keylen: 32, digest: "sha256", @@ -28,57 +30,40 @@ const TEST_VECTORS = [ } ]; -export function createTests( - pbkdf2Sync: ( - password: Buffer, - salt: Buffer, - iterations: number, - keylen: number, - digest: string - ) => Buffer, - pbkdf2Async: ( - password: Buffer, - salt: Buffer, - iterations: number, - keylen: number, - digest: string - ) => Promise -) { - describe("pbkdf2", function() { - describe("pbkdf2 sync", function() { - for (let i = 0; i < TEST_VECTORS.length; i++) { - it(`Should process the test ${i} correctly`, function() { - const vector = TEST_VECTORS[i]; +describe("pbkdf2", function() { + describe("pbkdf2 sync", function() { + for (let i = 0; i < TEST_VECTORS.length; i++) { + it(`Should process the test ${i} correctly`, function() { + const vector = TEST_VECTORS[i]; - const derived = pbkdf2Sync( - vector.password, - vector.salt, - vector.iterations, - vector.keylen, - vector.digest - ); + const derived = pbkdf2Sync( + vector.password, + vector.salt, + vector.iterations, + vector.keylen, + vector.digest + ); - assert.equal(derived.toString("hex"), vector.result); - }); - } - }); + deepStrictEqual(toHex(derived), vector.result); + }); + } + }); - describe("pbkdf2 async", function() { - for (let i = 0; i < TEST_VECTORS.length; i++) { - it(`Should process the test ${i} correctly`, async function() { - const vector = TEST_VECTORS[i]; + describe("pbkdf2 async", function() { + for (let i = 0; i < TEST_VECTORS.length; i++) { + it(`Should process the test ${i} correctly`, async function() { + const vector = TEST_VECTORS[i]; - const derived = await pbkdf2Async( - vector.password, - vector.salt, - vector.iterations, - vector.keylen, - vector.digest - ); + const derived = await pbkdf2Async( + vector.password, + vector.salt, + vector.iterations, + vector.keylen, + vector.digest + ); - assert.equal(derived.toString("hex"), vector.result); - }); - } - }); + deepStrictEqual(toHex(derived), vector.result); + }); + } }); -} +}); diff --git a/test/test-vectors/random.ts b/test/test-vectors/random.ts index 171437a..74f698a 100644 --- a/test/test-vectors/random.ts +++ b/test/test-vectors/random.ts @@ -1,23 +1,28 @@ -import { assert } from "chai"; +import { getRandomBytes, getRandomBytesSync } from "ethereum-cryptography/random"; +import { equalsBytes } from "ethereum-cryptography/utils"; +import { deepStrictEqual } from "./assert"; -export function createTests( - syncVersion: (bytes: number) => Buffer, - asyncVersion: (bytes: number) => Promise -) { - describe("Random number generation", function() { - describe("Sync version", function() { - it("Returns a Buffer of the right size", function() { - assert.instanceOf(syncVersion(32), Buffer); - assert.lengthOf(syncVersion(32), 32); - }); +describe("Random number generation", () => { + describe("Sync version", () => { + it("Returns a Uint8Array of the right size", () => { + deepStrictEqual(getRandomBytesSync(32) instanceof Uint8Array, true); + deepStrictEqual(getRandomBytesSync(32).length, 32); + deepStrictEqual( + equalsBytes(getRandomBytesSync(32), new Uint8Array(32)), + false + ); }); + }); - describe("Async version", function() { - it("Returns a Promise of Buffer of the right size", async function() { - assert.instanceOf(asyncVersion(32), Promise); - assert.instanceOf(await asyncVersion(32), Buffer); - assert.lengthOf(await asyncVersion(32), 32); - }); + describe("Async version", () => { + it("Returns a Promise of Uint8Array of the right size", async () => { + deepStrictEqual(getRandomBytes(32) instanceof Promise, true); + deepStrictEqual((await getRandomBytes(32)) instanceof Uint8Array, true); + deepStrictEqual((await getRandomBytes(32)).length, 32); + deepStrictEqual( + equalsBytes(await getRandomBytes(32), new Uint8Array(32)), + false + ); }); }); -} +}); diff --git a/test/test-vectors/ripemd160.ts b/test/test-vectors/ripemd160.ts index 965525c..a4d0c87 100644 --- a/test/test-vectors/ripemd160.ts +++ b/test/test-vectors/ripemd160.ts @@ -1,30 +1,30 @@ -import { assert } from "chai"; +import { ripemd160 } from "ethereum-cryptography/ripemd160"; +import { toHex, utf8ToBytes } from "ethereum-cryptography/utils"; +import { deepStrictEqual } from "./assert"; const TEST_VECTORS = [ { - input: Buffer.from("", "ascii"), + input: utf8ToBytes(""), output: "9c1185a5c5e9fc54612808977ee8f548b2258d31" }, { - input: Buffer.from("a", "ascii"), + input: utf8ToBytes("a"), output: "0bdc9d2d256b3ee9daae347be6f4dc835a467ffe" }, { - input: Buffer.from("abc", "ascii"), + input: utf8ToBytes("abc"), output: "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc" }, { - input: Buffer.from("message digest", "ascii"), + input: utf8ToBytes("message digest"), output: "5d0689ef49d2fae572b881b123a85ffa21595f36" } ]; -export function createTests(hash: (msg: Buffer) => Buffer) { - describe("ripemd160", function() { - for (const [i, vector] of TEST_VECTORS.entries()) { - it(`Should return the right hash for the test ${i}`, async function() { - assert.equal(hash(vector.input).toString("hex"), vector.output); - }); - } - }); -} +describe("ripemd160", function() { + for (const [i, vector] of TEST_VECTORS.entries()) { + it(`Should return the right hash for the test ${i}`, async function() { + deepStrictEqual(toHex(ripemd160(vector.input)), vector.output); + }); + } +}); diff --git a/test/test-vectors/scrypt.ts b/test/test-vectors/scrypt.ts index 3547b03..9a8edee 100644 --- a/test/test-vectors/scrypt.ts +++ b/test/test-vectors/scrypt.ts @@ -1,4 +1,6 @@ -import { assert } from "chai"; +import { scrypt as scryptAsync, scryptSync } from "ethereum-cryptography/scrypt"; +import { hexToBytes, toHex } from "ethereum-cryptography/utils"; +import { deepStrictEqual } from "./assert"; const TEST_VECTORS = [ { @@ -33,65 +35,46 @@ const TEST_VECTORS = [ } ]; -export function createTests( - scryptSync: ( - password: Buffer, - salt: Buffer, - n: number, - p: number, - r: number, - dklen: number - ) => Buffer, - scryptAsync: ( - password: Buffer, - salt: Buffer, - n: number, - p: number, - r: number, - dklen: number - ) => Promise -) { - describe("scrypt", function() { - describe("scrypt sync", function() { - for (let i = 0; i < TEST_VECTORS.length; i++) { - it(`Should process the test ${i} correctly`, function() { - this.enableTimeouts(false); +describe("scrypt", function() { + describe("scrypt sync", function() { + for (let i = 0; i < TEST_VECTORS.length; i++) { + it(`Should process the test ${i} correctly`, function() { + this.timeout(10000) - const vector = TEST_VECTORS[i]; + const vector = TEST_VECTORS[i]; - const derived = scryptSync( - Buffer.from(vector.password, "hex"), - Buffer.from(vector.salt, "hex"), - +vector.N, - +vector.p, - +vector.r, - +vector.dkLen - ); + const derived = scryptSync( + hexToBytes(vector.password), + hexToBytes(vector.salt), + +vector.N, + +vector.p, + +vector.r, + +vector.dkLen + ); - assert.equal(derived.toString("hex"), vector.derivedKey); - }); - } - }); + deepStrictEqual(toHex(derived), vector.derivedKey); + }); + } + }); - describe("scrypt async", function() { - for (let i = 0; i < TEST_VECTORS.length; i++) { - it(`Should process the test ${i} correctly`, async function() { - this.enableTimeouts(false); + describe("scrypt async", function() { + for (let i = 0; i < TEST_VECTORS.length; i++) { + it(`Should process the test ${i} correctly`, async function() { + this.timeout(10000); - const vector = TEST_VECTORS[i]; + const vector = TEST_VECTORS[i]; - const derived = await scryptAsync( - Buffer.from(vector.password, "hex"), - Buffer.from(vector.salt, "hex"), - +vector.N, - +vector.p, - +vector.r, - +vector.dkLen - ); + const derived = await scryptAsync( + hexToBytes(vector.password), + hexToBytes(vector.salt), + +vector.N, + +vector.p, + +vector.r, + +vector.dkLen + ); - assert.equal(derived.toString("hex"), vector.derivedKey); - }); - } - }); + deepStrictEqual(toHex(derived), vector.derivedKey); + }); + } }); -} +}); diff --git a/test/test-vectors/secp256k1-compat.ts b/test/test-vectors/secp256k1-compat.ts new file mode 100644 index 0000000..09b7ed1 --- /dev/null +++ b/test/test-vectors/secp256k1-compat.ts @@ -0,0 +1,235 @@ +import * as secp from "ethereum-cryptography/secp256k1-compat"; +import { sha256 } from "ethereum-cryptography/sha256"; +import { concatBytes, hexToBytes, toHex } from "ethereum-cryptography/utils"; +import { deepStrictEqual, throws } from "./assert"; +import { VECTORS } from "./secp256k1_lib_vectors"; + +describe("secp256k1", function () { + it("should create valid private keys", async function () { + const asyncPk = await secp.createPrivateKey(); + const syncPk = secp.createPrivateKeySync(); + + deepStrictEqual(secp.privateKeyVerify(asyncPk), true); + deepStrictEqual(secp.privateKeyVerify(syncPk), true); + }); + + it("Should sign correctly", function () { + // This test has been adapted from ethereumjs-util + // https://github.com/ethereumjs/ethereumjs-util/blob/3b1085059194b02354177d334f89cd82a5187883/test/index.js#L531 + const msgHash = hexToBytes( + "82ff40c0a986c6a5cfad4ddf4c3aa6996f1a7837f9c398e17e5de5cbd5a12b28" + ); + const privateKey = hexToBytes( + "3c9229289a6125f7fdf1885a77bb12c37a8d3b4962d936f7e3084dece32a3ca1" + ); + const signature = secp.ecdsaSign(msgHash, privateKey); + const sig = { + r: signature.signature.slice(0, 32), + s: signature.signature.slice(32, 64), + v: signature.recid, + }; + deepStrictEqual( + secp.signatureImport(secp.signatureExport(signature.signature)), + signature.signature + ); + deepStrictEqual( + sig.r, + hexToBytes( + "99e71a99cb2270b8cac5254f9e99b6210c6c10224a1579cf389ef88b20a1abe9" + ) + ); + deepStrictEqual( + sig.s, + hexToBytes( + "129ff05af364204442bdb53ab6f18a99ab48acc9326fa689f228040429e3ca66" + ) + ); + deepStrictEqual(sig.v, 0); + }); + + it("Should recover signatures correctly", function () { + const echash = hexToBytes( + "82ff40c0a986c6a5cfad4ddf4c3aa6996f1a7837f9c398e17e5de5cbd5a12b28" + ); + const recid = 0; + const r = hexToBytes( + "99e71a99cb2270b8cac5254f9e99b6210c6c10224a1579cf389ef88b20a1abe9" + ); + const s = hexToBytes( + "129ff05af364204442bdb53ab6f18a99ab48acc9326fa689f228040429e3ca66" + ); + const expected = hexToBytes( + "b4ac68eff3a82d86db5f0489d66f91707e99943bf796ae6a2dcb2205c9522fa7915428b5ac3d3b9291e62142e7246d85ad54504fabbdb2bae5795161f8ddf259" + ); + const signature = concatBytes(r, s); + const senderPubKey = secp.ecdsaRecover(signature, recid, echash); + const recovered = secp.publicKeyConvert(senderPubKey, false).slice(1); + deepStrictEqual(recovered, expected); + deepStrictEqual( + secp.signatureImport(secp.signatureExport(signature)), + signature + ); + }); + it("ecdh with hashfn", () => { + /* GENERATED BY: + const secp256k1 = require('secp256k1'); + const crypto = require('crypto'); + const privateKey = hexToBytes('3c9229289a6125f7fdf1885a77bb12c37a8d3b4962d936f7e3084dece32a3ca1'); + const publicKey = hexToBytes( + '04b4ac68eff3a82d86db5f0489d66f91707e99943bf796ae6a2dcb2205c9522fa7915428b5ac3d3b9291e62142e7246d85ad54504fabbdb2bae5795161f8ddf259' + ); + const output = new Uint8Array(32); + const output2 = new Uint8Array(33); + const xbuf = new Uint8Array(32); + const ybuf = new Uint8Array(32); + const hashfn = (x, y, data) => + crypto.createHash('sha256').update(x).update(y).update(data).digest(); + + const hashfn2 = (x, y, data) => new Uint8Array(33); + const data = new Uint8Array([1, 2, 3, 4, 5]); + // 9461b13c2191424a2adafc45f8043504454dc37199b73a999bd12463b6904eeb + console.log('1', toHex(secp256k1.ecdh(publicKey, privateKey, {}))); + // 9461b13c2191424a2adafc45f8043504454dc37199b73a999bd12463b6904eeb + console.log('2', toHex(secp256k1.ecdh(publicKey, privateKey, { data }))); + // Error: Expected output to be an Uint8Array + // console.log('3', toHex(secp256k1.ecdh(publicKey, privateKey, { data, hashfn }))); + // Error: Scalar was invalid (zero or overflow) + // console.log('4', toHex(secp256k1.ecdh(publicKey, privateKey, { data, hashfn }, output2))); + // 6945269332a7e162866138faaffc09636e78ca742edbb555a2c274f7446cf6fb + console.log('4', toHex(secp256k1.ecdh(publicKey, privateKey, { data, hashfn }, output))); + // 6945269332a7e162866138faaffc09636e78ca742edbb555a2c274f7446cf6fb + console.log('4.1', toHex(output)); + // 6945269332a7e162866138faaffc09636e78ca742edbb555a2c274f7446cf6fb + console.log( + '5', + toHex(secp256k1.ecdh(publicKey, privateKey, { data, hashfn, xbuf, ybuf }, output)) + ); + // 6945269332a7e162866138faaffc09636e78ca742edbb555a2c274f7446cf6fb + console.log('5.1', toHex(output)); + // 8b2983e19282e35890fa04abc0ca4a1981723c50413db91a1387c43caae4888f + console.log('5.2', toHex(xbuf)); + // 6a4ee6fcc9e1403ab90236594278dfe158cd79608f4434f27506c5dd39776f97 + console.log('5.3', toHex(ybuf)); + // Error: Scalar was invalid (zero or overflow) + // console.log( + // '6', + // toHex(secp256k1.ecdh(publicKey, privateKey, { data, hashfn: hashfn2, xbuf, ybuf }, output)) + // ); + */ + const privateKey = hexToBytes( + "3c9229289a6125f7fdf1885a77bb12c37a8d3b4962d936f7e3084dece32a3ca1" + ); + const publicKey = hexToBytes( + "04b4ac68eff3a82d86db5f0489d66f91707e99943bf796ae6a2dcb2205c9522fa7915428b5ac3d3b9291e62142e7246d85ad54504fabbdb2bae5795161f8ddf259" + ); + const output = new Uint8Array(32); + const output2 = new Uint8Array(33); + const xbuf = new Uint8Array(32); + const ybuf = new Uint8Array(32); + const hashfn = (x: Uint8Array, y: Uint8Array, data: Uint8Array) => + sha256(concatBytes(x, y, data)); + const hashfn2 = (x: Uint8Array, y: Uint8Array, data: Uint8Array) => + new Uint8Array(33); + const d = new Uint8Array([1, 2, 3, 4, 5]); + + const exp1 = + "9461b13c2191424a2adafc45f8043504454dc37199b73a999bd12463b6904eeb"; + const exp2 = + "6945269332a7e162866138faaffc09636e78ca742edbb555a2c274f7446cf6fb"; + deepStrictEqual(toHex(secp.ecdh(publicKey, privateKey, {})), exp1); + deepStrictEqual(toHex(secp.ecdh(publicKey, privateKey, { data: d })), exp1); + throws(() => secp.ecdh(publicKey, privateKey, { data: d, hashfn })); + throws(() => + secp.ecdh(publicKey, privateKey, { data: d, hashfn }, output2) + ); + deepStrictEqual( + toHex(secp.ecdh(publicKey, privateKey, { data: d, hashfn }, output)), + exp2 + ); + deepStrictEqual(toHex(output), exp2); + deepStrictEqual( + toHex( + secp.ecdh( + publicKey, + privateKey, + { data: d, hashfn, xbuf, ybuf }, + output + ) + ), + exp2 + ); + deepStrictEqual(toHex(output), exp2); + deepStrictEqual( + toHex(xbuf), + "8b2983e19282e35890fa04abc0ca4a1981723c50413db91a1387c43caae4888f" + ); + deepStrictEqual( + toHex(ybuf), + "6a4ee6fcc9e1403ab90236594278dfe158cd79608f4434f27506c5dd39776f97" + ); + throws(() => + secp.ecdh( + publicKey, + privateKey, + { data: d, hashfn: hashfn2, xbuf, ybuf }, + output + ) + ); + }); + + describe("Test vectors against library", () => { + const unserialize = (obj: any): any => { + if (Array.isArray(obj)) { + return obj.map((i) => unserialize(i)); + } + if (typeof obj === "object" && obj !== null) { + if (obj.__BigInt__) { + return BigInt(`0x${obj.__BigInt__}`); + } else if (obj.__Buffer__) { + return hexToBytes(obj.__Buffer__); + } else if (obj.__Bytes__) { + return hexToBytes(obj.__Bytes__); + } + const res: Record = {}; + for (const key of Object.keys(obj)) { + res[key] = unserialize(obj[key]); + } + return res; + } + return obj; + }; + const genTest = (vectors: any, name: string, fn: any) => { + for (let i = 0; i < vectors[name].length; i++) { + const vector = vectors[name][i]; + it(`${name} (${i})${vector.err ? ` ERR: ${vector.err}` : ""}`, () => { + if (vector.err) { + throws(() => fn(...vector.args)); + } else { + deepStrictEqual(fn(...vector.args), vector.res); + } + deepStrictEqual(vector.args, vector.argsAfter); + }); + } + }; + const genTests = ( + vectors: Record, + library: Record + ) => { + for (const k of Object.keys(vectors)) { + const path = k.split("."); + let cur = library; + for (const i of path) { + if (!cur || typeof cur !== "object") { + throw new Error(`genTests: not object: ${k}, ${i}, ${typeof cur}`); + } + cur = cur[i]; + } + if (typeof cur !== "function") { + throw new Error(`genTests: not function ${k}`); + } + genTest(vectors, k, cur); + } + }; + genTests(unserialize(VECTORS), { secp256k1: secp }); + }); +}); diff --git a/test/test-vectors/secp256k1.ts b/test/test-vectors/secp256k1.ts index 329488e..bf980f9 100644 --- a/test/test-vectors/secp256k1.ts +++ b/test/test-vectors/secp256k1.ts @@ -1,97 +1,16 @@ -import { assert } from "chai"; - -export function createTests( - sign: ( - message: Uint8Array, - privateKey: Uint8Array - ) => { signature: Uint8Array; recid: number }, - recover: ( - message: Uint8Array, - recid: number, - signature: Uint8Array, - compressed?: boolean - ) => Uint8Array, - publicKeyConvert: (publicKey: Uint8Array, compressed?: boolean) => Uint8Array, - createPrivakeKey: () => Promise, - createPrivakeKeySync: () => Uint8Array, - privateKeyVerify: (pk: Uint8Array) => boolean -) { - describe("secp256k1", function() { - it("should create valid private keys", async function() { - const asyncPk = await createPrivakeKey(); - const syncPk = createPrivakeKeySync(); - - assert.isTrue(privateKeyVerify(asyncPk)); - assert.isTrue(privateKeyVerify(syncPk)); - }); - - it("Should sign correctly", function() { - // This test has been adapted from ethereumjs-util - // https://github.com/ethereumjs/ethereumjs-util/blob/3b1085059194b02354177d334f89cd82a5187883/test/index.js#L531 - const msgHash = Buffer.from( - "82ff40c0a986c6a5cfad4ddf4c3aa6996f1a7837f9c398e17e5de5cbd5a12b28", - "hex" - ); - const privateKey = Buffer.from( - "3c9229289a6125f7fdf1885a77bb12c37a8d3b4962d936f7e3084dece32a3ca1", - "hex" - ); - - const signature = sign(msgHash, privateKey); - - const sig = { - r: signature.signature.slice(0, 32), - s: signature.signature.slice(32, 64), - v: signature.recid - }; - - assert.deepEqual( - sig.r, - Buffer.from( - "99e71a99cb2270b8cac5254f9e99b6210c6c10224a1579cf389ef88b20a1abe9", - "hex" - ) - ); - assert.deepEqual( - sig.s, - Buffer.from( - "129ff05af364204442bdb53ab6f18a99ab48acc9326fa689f228040429e3ca66", - "hex" - ) - ); - - assert.equal(sig.v, 0); - }); - - it("Should recover signatures correctly", function() { - const echash = Buffer.from( - "82ff40c0a986c6a5cfad4ddf4c3aa6996f1a7837f9c398e17e5de5cbd5a12b28", - "hex" - ); - - const recid = 0; - - const r = Buffer.from( - "99e71a99cb2270b8cac5254f9e99b6210c6c10224a1579cf389ef88b20a1abe9", - "hex" - ); - - const s = Buffer.from( - "129ff05af364204442bdb53ab6f18a99ab48acc9326fa689f228040429e3ca66", - "hex" - ); - - const expected = Buffer.from( - "b4ac68eff3a82d86db5f0489d66f91707e99943bf796ae6a2dcb2205c9522fa7915428b5ac3d3b9291e62142e7246d85ad54504fabbdb2bae5795161f8ddf259", - "hex" - ); - - const signature = Buffer.concat([r, s]); - - const senderPubKey = recover(signature, recid, echash); - const recovered = publicKeyConvert(senderPubKey, false).slice(1); - - assert.deepEqual(recovered, expected); - }); +import { secp256k1 } from "ethereum-cryptography/secp256k1"; +import { deepStrictEqual } from "./assert"; + +describe("secp256k1", () => { + it("should verify msg bb5a...", async () => { + const msg = + "bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023"; + const x = 3252872872578928810725465493269682203671229454553002637820453004368632726370n; + const y = 17482644437196207387910659778872952193236850502325156318830589868678978890912n; + const r = 432420386565659656852420866390673177323n; + const s = 115792089237316195423570985008687907852837564279074904382605163141518161494334n; + const pub = new secp256k1.ProjectivePoint(x, y, 1n); + const sig = new secp256k1.Signature(r, s); + deepStrictEqual(secp256k1.verify(sig, msg, pub.toRawBytes(), { lowS: false }), true); }); -} +}); diff --git a/test/test-vectors/secp256k1_lib_vectors.ts b/test/test-vectors/secp256k1_lib_vectors.ts new file mode 100644 index 0000000..5f53e7e --- /dev/null +++ b/test/test-vectors/secp256k1_lib_vectors.ts @@ -0,0 +1,3323 @@ +export const VECTORS = { + "secp256k1.contextRandomize": [ + { + args: [], + argsAfter: [], + err: "Expected seed to be an Uint8Array or null" + }, + { + args: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected seed to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "0c8376c22e2654225856ee9aaa17a727ad2c18d353a40bd7913fc454d3dc140f" + } + ], + argsAfter: [ + { + __Buffer__: + "0c8376c22e2654225856ee9aaa17a727ad2c18d353a40bd7913fc454d3dc140f" + } + ] + }, + { args: [null], argsAfter: [null] } + ], + "secp256k1.privateKeyVerify": [ + { + args: [null], + argsAfter: [null], + err: "Expected private key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "61d9721bd1df4b5abf82d3657036c6216bedbd7a4e3b83f03e8fa81906a12c" + } + ], + argsAfter: [ + { + __Buffer__: + "61d9721bd1df4b5abf82d3657036c6216bedbd7a4e3b83f03e8fa81906a12c" + } + ], + err: "Expected private key to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + res: false + }, + { + args: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + argsAfter: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + res: false + }, + { + args: [ + { + __Buffer__: + "cfa1e8f4d84e31612b9b0c6982fa2448ea5cd1b9b3edbfb0c9823a9df04da034" + } + ], + argsAfter: [ + { + __Buffer__: + "cfa1e8f4d84e31612b9b0c6982fa2448ea5cd1b9b3edbfb0c9823a9df04da034" + } + ], + res: true + } + ], + "secp256k1.privateKeyNegate": [ + { + args: [null], + argsAfter: [null], + err: "Expected private key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "7f7dd5d30bb9f01c0555ea4fb6c908549e42036299e6030e40e4a0fbd3c1df" + } + ], + argsAfter: [ + { + __Buffer__: + "7f7dd5d30bb9f01c0555ea4fb6c908549e42036299e6030e40e4a0fbd3c1df" + } + ], + err: "Expected private key to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + res: { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + args: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + argsAfter: [ + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + res: { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + args: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414b" + } + ], + argsAfter: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364137" + } + ], + res: { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364137" + } + }, + { + args: [ + { + __Buffer__: + "bb712604b7f757c0bdb24508460efcc904653ee9edd25eeacad5ed65e6365ce8" + } + ], + argsAfter: [ + { + __Buffer__: + "448ed9fb4808a83f424dbaf7b9f10335b6499dfcc1764150f4fc7126e9ffe459" + } + ], + res: { + __Buffer__: + "448ed9fb4808a83f424dbaf7b9f10335b6499dfcc1764150f4fc7126e9ffe459" + } + } + ], + "secp256k1.privateKeyTweakAdd": [ + { + args: [ + null, + { + __Buffer__: + "9b0117349c339d021c21346fa51bd99c1ecfc3701c5067efc978f5c42a74d0eb" + } + ], + argsAfter: [ + null, + { + __Buffer__: + "9b0117349c339d021c21346fa51bd99c1ecfc3701c5067efc978f5c42a74d0eb" + } + ], + err: "Expected private key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "65d79b06ac114e3fa112d05109e2f0b1be4f052e6904c4ea83e9dc77a5f8d7" + }, + { + __Buffer__: + "629775f4a09cf1f8af0a2580c764713c52c1cd46c895f1d563bc6ab3cbd0e4ab" + } + ], + argsAfter: [ + { + __Buffer__: + "65d79b06ac114e3fa112d05109e2f0b1be4f052e6904c4ea83e9dc77a5f8d7" + }, + { + __Buffer__: + "629775f4a09cf1f8af0a2580c764713c52c1cd46c895f1d563bc6ab3cbd0e4ab" + } + ], + err: "Expected private key to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "bb2de6f7ed7f1d207e6dbadf3fab085947452fd5d95061ae38b89a11010ef0c2" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "bb2de6f7ed7f1d207e6dbadf3fab085947452fd5d95061ae38b89a11010ef0c2" + }, + null + ], + err: "Expected tweak to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "f4a6c0be3ce65a54a46d6874fc32e33a10e5088788f3c31e51059b06679f66a1" + }, + { + __Buffer__: + "0e8b901cbf50549747ede18b69c8a3b32b04e67331ea8709278ea876aa8f89" + } + ], + argsAfter: [ + { + __Buffer__: + "f4a6c0be3ce65a54a46d6874fc32e33a10e5088788f3c31e51059b06679f66a1" + }, + { + __Buffer__: + "0e8b901cbf50549747ede18b69c8a3b32b04e67331ea8709278ea876aa8f89" + } + ], + err: "Expected tweak to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "7c64fe71f25b364bae739c1bcbe1df999635a62fc3f7e602d96f796c4aa6f68d" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + argsAfter: [ + { + __Buffer__: + "7c64fe71f25b364bae739c1bcbe1df999635a62fc3f7e602d96f796c4aa6f68d" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + err: "The tweak was out of range or the resulted private key is invalid" + }, + { + args: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140" + }, + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000001" + } + ], + argsAfter: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140" + }, + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000001" + } + ], + err: "The tweak was out of range or the resulted private key is invalid" + }, + { + args: [ + { + __Buffer__: + "5a9817f063bec86b4f03094a5e0d857edc40a94b045b2700278cbadb7f87bd9c" + }, + { + __Buffer__: + "ead3f28c6f2d45c853e8e3e0620e97c5aaeba73deeb0a08348d19a8409ce9baf" + } + ], + argsAfter: [ + { + __Buffer__: + "456c0a7cd2ec0e33a2ebed2ac01c1d45cc7d73a243c32747b08bf6d2b920180a" + }, + { + __Buffer__: + "ead3f28c6f2d45c853e8e3e0620e97c5aaeba73deeb0a08348d19a8409ce9baf" + } + ], + res: { + __Buffer__: + "456c0a7cd2ec0e33a2ebed2ac01c1d45cc7d73a243c32747b08bf6d2b920180a" + } + } + ], + "secp256k1.privateKeyTweakMul": [ + { + args: [ + null, + { + __Buffer__: + "feeda811f65332b578336e182e09ae8f804022d6de2e71fbfc75faa53d60168c" + } + ], + argsAfter: [ + null, + { + __Buffer__: + "feeda811f65332b578336e182e09ae8f804022d6de2e71fbfc75faa53d60168c" + } + ], + err: "Expected private key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "cdc6ed30508ff8fc00f54e0e346ec2be9a67e03b0179b51da03044deb388c8" + }, + { + __Buffer__: + "17e70f2b422fee2ae8101c4114bae51d3a676c53b01ab216b10db5f49b969957" + } + ], + argsAfter: [ + { + __Buffer__: + "cdc6ed30508ff8fc00f54e0e346ec2be9a67e03b0179b51da03044deb388c8" + }, + { + __Buffer__: + "17e70f2b422fee2ae8101c4114bae51d3a676c53b01ab216b10db5f49b969957" + } + ], + err: "Expected private key to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "2f276762c10c0762f3167ad7faf3b4f8f48f7cb82576c0776d7a472bcbfd4cbb" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "2f276762c10c0762f3167ad7faf3b4f8f48f7cb82576c0776d7a472bcbfd4cbb" + }, + null + ], + err: "Expected tweak to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "1cdd7e6afcb0125d1539345ac8a323e80dd90a0d8bb501f52b8388ab1688f366" + }, + { + __Buffer__: + "de2fe4821096760a1e4a0c838608556b01010fd9884c2456a2f01a884aac60" + } + ], + argsAfter: [ + { + __Buffer__: + "1cdd7e6afcb0125d1539345ac8a323e80dd90a0d8bb501f52b8388ab1688f366" + }, + { + __Buffer__: + "de2fe4821096760a1e4a0c838608556b01010fd9884c2456a2f01a884aac60" + } + ], + err: "Expected tweak to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "ffec99ced46f63c47f140b19eda9ef7695a52c9deb46fc9f65982e84f1297ed9" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + argsAfter: [ + { + __Buffer__: + "ffec99ced46f63c47f140b19eda9ef7695a52c9deb46fc9f65982e84f1297ed9" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + err: "The tweak was out of range or equal to zero" + }, + { + args: [ + { + __Buffer__: + "40ecd28a1ea4d52518e22299b213f5ab24e603a08bf9a5c578aef50a2c7d3c5b" + }, + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "40ecd28a1ea4d52518e22299b213f5ab24e603a08bf9a5c578aef50a2c7d3c5b" + }, + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "The tweak was out of range or equal to zero" + }, + { + args: [ + { + __Buffer__: + "230f56d6ea39486e3576163b003e974c3ddde00bffb036eae5e7b7ae5fa911e3" + }, + { + __Buffer__: + "73cd83b42d6b770427666b833dfdb1d5898400f7f276c8eaa39689bd710c3596" + } + ], + argsAfter: [ + { + __Buffer__: + "19f30a3451db82b7abe5091853a4d2edbd8a370a20c2cb74a85d07650130b05a" + }, + { + __Buffer__: + "73cd83b42d6b770427666b833dfdb1d5898400f7f276c8eaa39689bd710c3596" + } + ], + res: { + __Buffer__: + "19f30a3451db82b7abe5091853a4d2edbd8a370a20c2cb74a85d07650130b05a" + } + } + ], + "secp256k1.publicKeyVerify": [ + { + args: [null], + argsAfter: [null], + err: "Expected public key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "caceeb341dba8847b0dc6c72e0d8a261fcc23c8646d505a7d976b9423fbf0a93" + } + ], + argsAfter: [ + { + __Buffer__: + "caceeb341dba8847b0dc6c72e0d8a261fcc23c8646d505a7d976b9423fbf0a93" + } + ], + err: "Expected public key to be an Uint8Array with length [33, 65]" + }, + { + args: [ + { + __Buffer__: + "00cbfb40bdd183601359323a48b0bd960290feab3c5de7859bb8cff31ccc89e83e" + } + ], + argsAfter: [ + { + __Buffer__: + "00cbfb40bdd183601359323a48b0bd960290feab3c5de7859bb8cff31ccc89e83e" + } + ], + res: false + }, + { + args: [ + { + __Buffer__: + "04cbfb40bdd183601359323a48b0bd960290feab3c5de7859bb8cff31ccc89e83ef622862bf2734064c836ca053c063f4449406a68507dbb75ecc2bcb7ca2f176e" + } + ], + argsAfter: [ + { + __Buffer__: + "04cbfb40bdd183601359323a48b0bd960290feab3c5de7859bb8cff31ccc89e83ef622862bf2734064c836ca053c063f4449406a68507dbb75ecc2bcb7ca2f176e" + } + ], + res: false + }, + { + args: [ + { + __Buffer__: + "03cbfb40bdd183601359323a48b0bd960290feab3c5de7859bb8cff31ccc89e83ef622862bf2734064c836ca053c063f4449406a68507dbb75ecc2bcb7ca2f176f" + } + ], + argsAfter: [ + { + __Buffer__: + "03cbfb40bdd183601359323a48b0bd960290feab3c5de7859bb8cff31ccc89e83ef622862bf2734064c836ca053c063f4449406a68507dbb75ecc2bcb7ca2f176f" + } + ], + res: false + }, + { + args: [ + { + __Buffer__: + "03fc398c0626f1ed496a0306ad7970ec8b01151610aeeade539366636205ea4240" + } + ], + argsAfter: [ + { + __Buffer__: + "03fc398c0626f1ed496a0306ad7970ec8b01151610aeeade539366636205ea4240" + } + ], + res: true + }, + { + args: [ + { + __Buffer__: + "04fc398c0626f1ed496a0306ad7970ec8b01151610aeeade539366636205ea4240ad1ad70d2b2737c4a759f53cd46111e2613c10d5e41c3dd06c6d5b0cca9d7411" + } + ], + argsAfter: [ + { + __Buffer__: + "04fc398c0626f1ed496a0306ad7970ec8b01151610aeeade539366636205ea4240ad1ad70d2b2737c4a759f53cd46111e2613c10d5e41c3dd06c6d5b0cca9d7411" + } + ], + res: true + } + ], + "secp256k1.publicKeyCreate": [ + { + args: [null], + argsAfter: [null], + err: "Expected private key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "5196c9cd75897743f200098167f360450924a677ee1c2e0e6a74fd15f01086" + } + ], + argsAfter: [ + { + __Buffer__: + "5196c9cd75897743f200098167f360450924a677ee1c2e0e6a74fd15f01086" + } + ], + err: "Expected private key to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + argsAfter: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + err: "Private Key is invalid" + }, + { + args: [ + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Private Key is invalid" + }, + { + args: [ + { + __Buffer__: + "919d29169d70edf601a9648450444a2fed4f9f2b8592bfa629be3a644d51a47d" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "919d29169d70edf601a9648450444a2fed4f9f2b8592bfa629be3a644d51a47d" + }, + null + ], + err: "Expected compressed to be a Boolean" + }, + { + args: [ + { + __Buffer__: + "b62c3992417a3b860a178fe38d6bb8f17ecbcf3da90e3f867ede082c43c97fd7" + }, + true, + null + ], + argsAfter: [ + { + __Buffer__: + "b62c3992417a3b860a178fe38d6bb8f17ecbcf3da90e3f867ede082c43c97fd7" + }, + true, + null + ], + err: "Expected output to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "b62c3992417a3b860a178fe38d6bb8f17ecbcf3da90e3f867ede082c43c97fd7" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "b62c3992417a3b860a178fe38d6bb8f17ecbcf3da90e3f867ede082c43c97fd7" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 33" + }, + { + args: [ + { + __Buffer__: + "b62c3992417a3b860a178fe38d6bb8f17ecbcf3da90e3f867ede082c43c97fd7" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "b62c3992417a3b860a178fe38d6bb8f17ecbcf3da90e3f867ede082c43c97fd7" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 65" + } + ], + "secp256k1.publicKeyConvert": [ + { + args: [null], + argsAfter: [null], + err: "Expected public key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "05f782f164d377565473b05e797be5e7e9b0d23c29d2d748d6dc0e336e284199" + } + ], + argsAfter: [ + { + __Buffer__: + "05f782f164d377565473b05e797be5e7e9b0d23c29d2d748d6dc0e336e284199" + } + ], + err: "Expected public key to be an Uint8Array with length [33, 65]" + }, + { + args: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Public Key could not be parsed" + }, + { + args: [ + { + __Buffer__: + "037166e770efaa66024abee302d8d35705c7d33f19b593731fe8bd27536872d348" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "037166e770efaa66024abee302d8d35705c7d33f19b593731fe8bd27536872d348" + }, + null + ], + err: "Expected compressed to be a Boolean" + }, + { + args: [ + { + __Buffer__: + "03aaf688e0ca2c68ebcbc73b388cafa7a1c58291278d8ed4551151c697e0d65f5d" + }, + true, + null + ], + argsAfter: [ + { + __Buffer__: + "03aaf688e0ca2c68ebcbc73b388cafa7a1c58291278d8ed4551151c697e0d65f5d" + }, + true, + null + ], + err: "Expected output to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "03aaf688e0ca2c68ebcbc73b388cafa7a1c58291278d8ed4551151c697e0d65f5d" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "03aaf688e0ca2c68ebcbc73b388cafa7a1c58291278d8ed4551151c697e0d65f5d" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 33" + }, + { + args: [ + { + __Buffer__: + "03aaf688e0ca2c68ebcbc73b388cafa7a1c58291278d8ed4551151c697e0d65f5d" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "03aaf688e0ca2c68ebcbc73b388cafa7a1c58291278d8ed4551151c697e0d65f5d" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 65" + }, + { + args: [ + { + __Buffer__: + "02fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f" + } + ], + argsAfter: [ + { + __Buffer__: + "02fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f" + } + ], + err: "Public Key could not be parsed" + }, + { + args: [ + { + __Buffer__: + "04fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0000000000000000000000000000000000000000000000000000000000000001" + } + ], + argsAfter: [ + { + __Buffer__: + "04fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0000000000000000000000000000000000000000000000000000000000000001" + } + ], + err: "Public Key could not be parsed" + }, + { + args: [ + { + __Buffer__: + "040000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f" + } + ], + argsAfter: [ + { + __Buffer__: + "040000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f" + } + ], + err: "Public Key could not be parsed" + }, + { + args: [ + { + __Buffer__: + "065f6ae29aecb75fd4f2537c42063bc80def4aed5583d8146e5c7972e75918c198ceeb00c98387593b298c281651af850f3b4c0419e62819df2e10cc7a5d4ba305" + } + ], + argsAfter: [ + { + __Buffer__: + "065f6ae29aecb75fd4f2537c42063bc80def4aed5583d8146e5c7972e75918c198ceeb00c98387593b298c281651af850f3b4c0419e62819df2e10cc7a5d4ba305" + } + ], + err: "Public Key could not be parsed" + } + ], + "secp256k1.publicKeyNegate": [ + { + args: [null], + argsAfter: [null], + err: "Expected public key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "eb679c07a5fa8c0cd999d41887e949c3105b47aae5782ba9b87d3bfe917b2986" + } + ], + argsAfter: [ + { + __Buffer__: + "eb679c07a5fa8c0cd999d41887e949c3105b47aae5782ba9b87d3bfe917b2986" + } + ], + err: "Expected public key to be an Uint8Array with length [33, 65]" + }, + { + args: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Public Key could not be parsed" + }, + { + args: [ + { + __Buffer__: + "021a88ab60a67a3dd1d96bd6f5cfbaccb0e32aefcbfb04a34a8fccc1137b0cb281" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "021a88ab60a67a3dd1d96bd6f5cfbaccb0e32aefcbfb04a34a8fccc1137b0cb281" + }, + null + ], + err: "Expected compressed to be a Boolean" + }, + { + args: [ + { + __Buffer__: + "0379f8f1ff466f8580708af7a8f6b73adaaf56c28887acf3f400bec3886e43da80" + }, + true, + null + ], + argsAfter: [ + { + __Buffer__: + "0379f8f1ff466f8580708af7a8f6b73adaaf56c28887acf3f400bec3886e43da80" + }, + true, + null + ], + err: "Expected output to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "0379f8f1ff466f8580708af7a8f6b73adaaf56c28887acf3f400bec3886e43da80" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "0379f8f1ff466f8580708af7a8f6b73adaaf56c28887acf3f400bec3886e43da80" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 33" + }, + { + args: [ + { + __Buffer__: + "0379f8f1ff466f8580708af7a8f6b73adaaf56c28887acf3f400bec3886e43da80" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "0379f8f1ff466f8580708af7a8f6b73adaaf56c28887acf3f400bec3886e43da80" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 65" + } + ], + "secp256k1.publicKeyCombine": [ + { + args: [null], + argsAfter: [null], + err: "Expected public keys to be an Array" + }, + { + args: [[]], + argsAfter: [[]], + err: "Expected public keys array will have more than zero items" + }, + { + args: [[null]], + argsAfter: [[null]], + err: "Expected public key to be an Uint8Array" + }, + { + args: [ + [ + { + __Buffer__: + "5d57e8e08450cf345195361d5bdb549f76af20336af77db07b2e58e2fa531fb5" + } + ] + ], + argsAfter: [ + [ + { + __Buffer__: + "5d57e8e08450cf345195361d5bdb549f76af20336af77db07b2e58e2fa531fb5" + } + ] + ], + err: "Expected public key to be an Uint8Array with length [33, 65]" + }, + { + args: [ + [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000" + } + ] + ], + argsAfter: [ + [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000" + } + ] + ], + err: "Public Key could not be parsed" + }, + { + args: [ + [ + { + __Buffer__: + "038830fc3fc7dfa09eb41ec65a63f6c665d0a41eadb0fceca2666bf88cc93253cb" + }, + { + __Buffer__: + "028830fc3fc7dfa09eb41ec65a63f6c665d0a41eadb0fceca2666bf88cc93253cb" + } + ], + true + ], + argsAfter: [ + [ + { + __Buffer__: + "038830fc3fc7dfa09eb41ec65a63f6c665d0a41eadb0fceca2666bf88cc93253cb" + }, + { + __Buffer__: + "028830fc3fc7dfa09eb41ec65a63f6c665d0a41eadb0fceca2666bf88cc93253cb" + } + ], + true + ], + err: "The sum of the public keys is not valid" + }, + { + args: [ + [ + { + __Buffer__: + "03bf1cec19db2d3a2c864b04d2fa4ea6608335cec33b1db06c9531af5615368221" + } + ], + null + ], + argsAfter: [ + [ + { + __Buffer__: + "03bf1cec19db2d3a2c864b04d2fa4ea6608335cec33b1db06c9531af5615368221" + } + ], + null + ], + err: "Expected compressed to be a Boolean" + }, + { + args: [ + [ + { + __Buffer__: + "0312cb20e2d7a2dde3774d17acb329fbb5bca5f3824f908394a4698848232a6e2e" + } + ], + true, + null + ], + argsAfter: [ + [ + { + __Buffer__: + "0312cb20e2d7a2dde3774d17acb329fbb5bca5f3824f908394a4698848232a6e2e" + } + ], + true, + null + ], + err: "Expected output to be an Uint8Array" + }, + { + args: [ + [ + { + __Buffer__: + "0312cb20e2d7a2dde3774d17acb329fbb5bca5f3824f908394a4698848232a6e2e" + } + ], + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + [ + { + __Buffer__: + "0312cb20e2d7a2dde3774d17acb329fbb5bca5f3824f908394a4698848232a6e2e" + } + ], + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 33" + }, + { + args: [ + [ + { + __Buffer__: + "0312cb20e2d7a2dde3774d17acb329fbb5bca5f3824f908394a4698848232a6e2e" + } + ], + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + [ + { + __Buffer__: + "0312cb20e2d7a2dde3774d17acb329fbb5bca5f3824f908394a4698848232a6e2e" + } + ], + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 65" + } + ], + "secp256k1.publicKeyTweakAdd": [ + { + args: [ + null, + { + __Buffer__: + "960955b825f128884fcb7d2d17bfaa767db53907c4e366449b856b02558af9b3" + } + ], + argsAfter: [ + null, + { + __Buffer__: + "960955b825f128884fcb7d2d17bfaa767db53907c4e366449b856b02558af9b3" + } + ], + err: "Expected public key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "67d9890aded5839dea2cb6577f766b542116981e3137d93feb0f456baf769d1e" + }, + { + __Buffer__: + "9af2a39b8eaf43668087036c6d1ab66917db5fd24ab152c9bda3b39e81cbf318" + } + ], + argsAfter: [ + { + __Buffer__: + "67d9890aded5839dea2cb6577f766b542116981e3137d93feb0f456baf769d1e" + }, + { + __Buffer__: + "9af2a39b8eaf43668087036c6d1ab66917db5fd24ab152c9bda3b39e81cbf318" + } + ], + err: "Expected public key to be an Uint8Array with length [33, 65]" + }, + { + args: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000" + }, + { + __Buffer__: + "cee62dcf2cea28232885ded0836bafa465160dbaa4c6fc15d4523d650f79265d" + } + ], + argsAfter: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000" + }, + { + __Buffer__: + "cee62dcf2cea28232885ded0836bafa465160dbaa4c6fc15d4523d650f79265d" + } + ], + err: "Public Key could not be parsed" + }, + { + args: [ + { + __Buffer__: + "02fc27bfb6791c07adc33e3c5c154603cfe1bf5842cfceb0a0969cda604e137265" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "02fc27bfb6791c07adc33e3c5c154603cfe1bf5842cfceb0a0969cda604e137265" + }, + null + ], + err: "Expected tweak to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "0339b6b6e0947071ff39cd21d06cab00ce9c4b540099933f30daaa1736157dd831" + }, + { + __Buffer__: + "88fb2d59e3412b28bf2f06d0a8fc9e2f0b2706e3f09b3282d36d936942d071" + } + ], + argsAfter: [ + { + __Buffer__: + "0339b6b6e0947071ff39cd21d06cab00ce9c4b540099933f30daaa1736157dd831" + }, + { + __Buffer__: + "88fb2d59e3412b28bf2f06d0a8fc9e2f0b2706e3f09b3282d36d936942d071" + } + ], + err: "Expected tweak to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "022e3e4075b97aed8c7b94fdc2f28eaf416648b2a39d488502aa74722b3247bdb4" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + argsAfter: [ + { + __Buffer__: + "022e3e4075b97aed8c7b94fdc2f28eaf416648b2a39d488502aa74722b3247bdb4" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + err: "The tweak was out of range or the resulted private key is invalid" + }, + { + args: [ + { + __Buffer__: + "0379be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" + }, + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000001" + }, + true + ], + argsAfter: [ + { + __Buffer__: + "0379be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" + }, + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000001" + }, + true + ], + err: "The tweak was out of range or the resulted private key is invalid" + }, + { + args: [ + { + __Buffer__: + "022d1db7c23d8e3428531c9ceaa4f8301ff44e64eae302e18f48d42ee5d837cd95" + }, + { + __Buffer__: + "d836246be122cae79b3f752b62236d81f9178e46068738f5b80726c28851687d" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "022d1db7c23d8e3428531c9ceaa4f8301ff44e64eae302e18f48d42ee5d837cd95" + }, + { + __Buffer__: + "d836246be122cae79b3f752b62236d81f9178e46068738f5b80726c28851687d" + }, + null + ], + err: "Expected compressed to be a Boolean" + }, + { + args: [ + { + __Buffer__: + "02058060562d09620c4ab8d0d4612510faba9a68ab0d2af9a213d3c3d9cb5a64a7" + }, + { + __Buffer__: + "9bfebeb70384b48a42bba56c82285afdc23e63953ec3a40b35c5e7da44ebacf2" + }, + true, + null + ], + argsAfter: [ + { + __Buffer__: + "02058060562d09620c4ab8d0d4612510faba9a68ab0d2af9a213d3c3d9cb5a64a7" + }, + { + __Buffer__: + "9bfebeb70384b48a42bba56c82285afdc23e63953ec3a40b35c5e7da44ebacf2" + }, + true, + null + ], + err: "Expected output to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "02058060562d09620c4ab8d0d4612510faba9a68ab0d2af9a213d3c3d9cb5a64a7" + }, + { + __Buffer__: + "9bfebeb70384b48a42bba56c82285afdc23e63953ec3a40b35c5e7da44ebacf2" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "02058060562d09620c4ab8d0d4612510faba9a68ab0d2af9a213d3c3d9cb5a64a7" + }, + { + __Buffer__: + "9bfebeb70384b48a42bba56c82285afdc23e63953ec3a40b35c5e7da44ebacf2" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 33" + }, + { + args: [ + { + __Buffer__: + "02058060562d09620c4ab8d0d4612510faba9a68ab0d2af9a213d3c3d9cb5a64a7" + }, + { + __Buffer__: + "9bfebeb70384b48a42bba56c82285afdc23e63953ec3a40b35c5e7da44ebacf2" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "02058060562d09620c4ab8d0d4612510faba9a68ab0d2af9a213d3c3d9cb5a64a7" + }, + { + __Buffer__: + "9bfebeb70384b48a42bba56c82285afdc23e63953ec3a40b35c5e7da44ebacf2" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 65" + } + ], + "secp256k1.publicKeyTweakMul": [ + { + args: [ + null, + { + __Buffer__: + "63207d1f4c34549dc8452ea772e6b181d5823eaf6ef640cb5992e6724444c344" + } + ], + argsAfter: [ + null, + { + __Buffer__: + "63207d1f4c34549dc8452ea772e6b181d5823eaf6ef640cb5992e6724444c344" + } + ], + err: "Expected public key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "d2b5367530e2adc7cf4a462650dc6303100ff87e96f8256f7eda7f1d4110ca7d" + }, + { + __Buffer__: + "ec46fc26623bfb67d991a1fdb8ec129ff879b867a8ad5ece200b48c902cbb6c3" + } + ], + argsAfter: [ + { + __Buffer__: + "d2b5367530e2adc7cf4a462650dc6303100ff87e96f8256f7eda7f1d4110ca7d" + }, + { + __Buffer__: + "ec46fc26623bfb67d991a1fdb8ec129ff879b867a8ad5ece200b48c902cbb6c3" + } + ], + err: "Expected public key to be an Uint8Array with length [33, 65]" + }, + { + args: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000" + }, + { + __Buffer__: + "73a5cda21f7fcdb4081924ec24fe6009c3a2fb28f49350db519d2a3378cd4fbe" + } + ], + argsAfter: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000" + }, + { + __Buffer__: + "73a5cda21f7fcdb4081924ec24fe6009c3a2fb28f49350db519d2a3378cd4fbe" + } + ], + err: "Public Key could not be parsed" + }, + { + args: [ + { + __Buffer__: + "03d4fd172a271e63651b81556a3a328662dfd7b45a7aa6b5355811e7786fadccbd" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "03d4fd172a271e63651b81556a3a328662dfd7b45a7aa6b5355811e7786fadccbd" + }, + null + ], + err: "Expected tweak to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "03fb596bdfaf604a211525c693c7f47d7a200d1174b5b6fff0e6bc41eb17ff6651" + }, + { + __Buffer__: + "744b0907643f2ebb1352195855fd582602e1ae1bdbf77e8e9d18be826eb1b6" + } + ], + argsAfter: [ + { + __Buffer__: + "03fb596bdfaf604a211525c693c7f47d7a200d1174b5b6fff0e6bc41eb17ff6651" + }, + { + __Buffer__: + "744b0907643f2ebb1352195855fd582602e1ae1bdbf77e8e9d18be826eb1b6" + } + ], + err: "Expected tweak to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "033a85d361e5faef2fd196f571d5ecab18afe5dab9918f35259e9ddf7761a4ca6a" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + argsAfter: [ + { + __Buffer__: + "033a85d361e5faef2fd196f571d5ecab18afe5dab9918f35259e9ddf7761a4ca6a" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + err: "The tweak was out of range or equal to zero" + }, + { + args: [ + { + __Buffer__: + "02597c2597af205cf24d1e3c61f24a89e8eea6bc1784c8b6c1f5c495b7bb377852" + }, + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "02597c2597af205cf24d1e3c61f24a89e8eea6bc1784c8b6c1f5c495b7bb377852" + }, + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "The tweak was out of range or equal to zero" + }, + { + args: [ + { + __Buffer__: + "022ef1392b3c9dd8aaae837b0177f46ad5b971898afbff87e630735473640c0d9f" + }, + { + __Buffer__: + "8d844898e482f7079da66fdd7d914b9e43b445c1449b15e48ec764ded5c7217e" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "022ef1392b3c9dd8aaae837b0177f46ad5b971898afbff87e630735473640c0d9f" + }, + { + __Buffer__: + "8d844898e482f7079da66fdd7d914b9e43b445c1449b15e48ec764ded5c7217e" + }, + null + ], + err: "Expected compressed to be a Boolean" + }, + { + args: [ + { + __Buffer__: + "02cf1b392f6bb4aadf494ab48be2e6c7acd404149efd8e860dcd66470d7fae3162" + }, + { + __Buffer__: + "2a715b7a126969d9eb3279e5d8e74cbdd92a1ce3815348dde0db1b7795ab0ef4" + }, + true, + null + ], + argsAfter: [ + { + __Buffer__: + "02cf1b392f6bb4aadf494ab48be2e6c7acd404149efd8e860dcd66470d7fae3162" + }, + { + __Buffer__: + "2a715b7a126969d9eb3279e5d8e74cbdd92a1ce3815348dde0db1b7795ab0ef4" + }, + true, + null + ], + err: "Expected output to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "02cf1b392f6bb4aadf494ab48be2e6c7acd404149efd8e860dcd66470d7fae3162" + }, + { + __Buffer__: + "2a715b7a126969d9eb3279e5d8e74cbdd92a1ce3815348dde0db1b7795ab0ef4" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "02cf1b392f6bb4aadf494ab48be2e6c7acd404149efd8e860dcd66470d7fae3162" + }, + { + __Buffer__: + "2a715b7a126969d9eb3279e5d8e74cbdd92a1ce3815348dde0db1b7795ab0ef4" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 33" + }, + { + args: [ + { + __Buffer__: + "02cf1b392f6bb4aadf494ab48be2e6c7acd404149efd8e860dcd66470d7fae3162" + }, + { + __Buffer__: + "2a715b7a126969d9eb3279e5d8e74cbdd92a1ce3815348dde0db1b7795ab0ef4" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "02cf1b392f6bb4aadf494ab48be2e6c7acd404149efd8e860dcd66470d7fae3162" + }, + { + __Buffer__: + "2a715b7a126969d9eb3279e5d8e74cbdd92a1ce3815348dde0db1b7795ab0ef4" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 65" + } + ], + "secp256k1.signatureNormalize": [ + { + args: [null], + argsAfter: [null], + err: "Expected signature to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "f727256ba6af5b18376a5cb62b919d051a20a4b52cdeddb5310c84f650818c65b370bdff12aba36c7274352cfb6fd128b8a362cbcfc7466a84394880d1703c" + } + ], + argsAfter: [ + { + __Buffer__: + "f727256ba6af5b18376a5cb62b919d051a20a4b52cdeddb5310c84f650818c65b370bdff12aba36c7274352cfb6fd128b8a362cbcfc7466a84394880d1703c" + } + ], + err: "Expected signature to be an Uint8Array with length 64" + }, + { + args: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410000000000000000000000000000000000000000000000000000000000000001" + } + ], + argsAfter: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410000000000000000000000000000000000000000000000000000000000000001" + } + ], + err: "Signature could not be parsed" + }, + { + args: [ + { + __Buffer__: + "00000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0" + } + ], + argsAfter: [ + { + __Buffer__: + "00000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0" + } + ], + res: { + __Buffer__: + "00000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0" + } + }, + { + args: [ + { + __Buffer__: + "00000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1" + } + ], + argsAfter: [ + { + __Buffer__: + "00000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0" + } + ], + res: { + __Buffer__: + "00000000000000000000000000000000000000000000000000000000000000017fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0" + } + } + ], + "secp256k1.signatureExport": [ + { + args: [null], + argsAfter: [null], + err: "Expected signature to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "1848bf5436b2cca647068e64301feb012799b6e68362dc2d8f03b2a9fe45ad38178119562e7d015c10a8570a0697672fab926c6465f38f95d2c12613593e3d" + } + ], + argsAfter: [ + { + __Buffer__: + "1848bf5436b2cca647068e64301feb012799b6e68362dc2d8f03b2a9fe45ad38178119562e7d015c10a8570a0697672fab926c6465f38f95d2c12613593e3d" + } + ], + err: "Expected signature to be an Uint8Array with length 64" + }, + { + args: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410000000000000000000000000000000000000000000000000000000000000001" + } + ], + argsAfter: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410000000000000000000000000000000000000000000000000000000000000001" + } + ], + err: "Signature could not be parsed" + }, + { + args: [ + { + __Buffer__: + "6e3ff20960c72ba1a5cb83a0054ae20e496c3713f1a0db693e925d906d64fa647bb308435a3d4fbd40a8ea376fbcee25da32266abbbe1f9072983892afaf7485" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "6e3ff20960c72ba1a5cb83a0054ae20e496c3713f1a0db693e925d906d64fa647bb308435a3d4fbd40a8ea376fbcee25da32266abbbe1f9072983892afaf7485" + }, + null + ], + err: "Expected output to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "6e3ff20960c72ba1a5cb83a0054ae20e496c3713f1a0db693e925d906d64fa647bb308435a3d4fbd40a8ea376fbcee25da32266abbbe1f9072983892afaf7485" + }, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "6e3ff20960c72ba1a5cb83a0054ae20e496c3713f1a0db693e925d906d64fa647bb308435a3d4fbd40a8ea376fbcee25da32266abbbe1f9072983892afaf7485" + }, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 72" + }, + { + args: [ + { + __Buffer__: + "ad1cbb8504417c5935b52f09b00169b55ca99715b334a3249c2aaf7332d8a3833170d726b69dd4743c8aef4bd853bed5f773509f23724ed5591c4169bd6aedf1" + } + ], + argsAfter: [ + { + __Buffer__: + "ad1cbb8504417c5935b52f09b00169b55ca99715b334a3249c2aaf7332d8a3833170d726b69dd4743c8aef4bd853bed5f773509f23724ed5591c4169bd6aedf1" + } + ], + res: { + __Bytes__: + "3045022100ad1cbb8504417c5935b52f09b00169b55ca99715b334a3249c2aaf7332d8a38302203170d726b69dd4743c8aef4bd853bed5f773509f23724ed5591c4169bd6aedf1" + } + } + ], + "secp256k1.signatureImport": [ + { + args: [null], + argsAfter: [null], + err: "Expected signature to be an Uint8Array" + }, + { + args: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Signature could not be parsed" + }, + { + args: [{ __Buffer__: "3006020101020101" }, null], + argsAfter: [{ __Buffer__: "3006020101020101" }, null], + err: "Expected output to be an Uint8Array" + }, + { + args: [ + { __Buffer__: "3006020101020101" }, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { __Buffer__: "3006020101020101" }, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 64" + } + ], + "secp256k1.ecdsaSign": [ + { + args: [null], + argsAfter: [null], + err: "Expected message to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "828880b1595b6f26be83bffcccffd7c9df16fc7c6af59f431fee3712007f7a" + } + ], + argsAfter: [ + { + __Buffer__: + "828880b1595b6f26be83bffcccffd7c9df16fc7c6af59f431fee3712007f7a" + } + ], + err: "Expected message to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "f702d296765245bb985bb5f6a56135df167587144990c5017aecb3fd6c217eb2" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "f702d296765245bb985bb5f6a56135df167587144990c5017aecb3fd6c217eb2" + }, + null + ], + err: "Expected private key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "ee822aa16108dd3f81dbdf462fcebd3042aa15e9ea166eef17d643e6869faa88" + }, + { + __Buffer__: + "924c57ca2adb7f5f63d04854f87ae4b2b47fe851cdec5176fd15aa94ae9524" + } + ], + argsAfter: [ + { + __Buffer__: + "ee822aa16108dd3f81dbdf462fcebd3042aa15e9ea166eef17d643e6869faa88" + }, + { + __Buffer__: + "924c57ca2adb7f5f63d04854f87ae4b2b47fe851cdec5176fd15aa94ae9524" + } + ], + err: "Expected private key to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "b03754e195e1ac3f44a04bed0a29e710a59db9ad779b00ea357840ea6a8f7de7" + }, + { + __Bytes__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "b03754e195e1ac3f44a04bed0a29e710a59db9ad779b00ea357840ea6a8f7de7" + }, + { + __Bytes__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: + "The nonce generation function failed, or the private key was invalid" + }, + { + args: [ + { + __Buffer__: + "6426557330ca297e8bf74f1b5127578b7de757a99b9ccbec7c168452d8d1419c" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + argsAfter: [ + { + __Buffer__: + "6426557330ca297e8bf74f1b5127578b7de757a99b9ccbec7c168452d8d1419c" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + err: + "The nonce generation function failed, or the private key was invalid" + }, + { + args: [ + { + __Buffer__: + "12f08e363a977031d385e0ac7296a09c6b88418c5c7e2acb4ad933db7a820af4" + }, + { + __Buffer__: + "b01553881e751f758482e4be15e3575e1840267bce371dc3f4b205b527443e8c" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "12f08e363a977031d385e0ac7296a09c6b88418c5c7e2acb4ad933db7a820af4" + }, + { + __Buffer__: + "b01553881e751f758482e4be15e3575e1840267bce371dc3f4b205b527443e8c" + }, + null + ], + err: "Expected options to be an Object" + }, + { + args: [ + { + __Buffer__: + "12f08e363a977031d385e0ac7296a09c6b88418c5c7e2acb4ad933db7a820af4" + }, + { + __Buffer__: + "b01553881e751f758482e4be15e3575e1840267bce371dc3f4b205b527443e8c" + }, + 42 + ], + argsAfter: [ + { + __Buffer__: + "12f08e363a977031d385e0ac7296a09c6b88418c5c7e2acb4ad933db7a820af4" + }, + { + __Buffer__: + "b01553881e751f758482e4be15e3575e1840267bce371dc3f4b205b527443e8c" + }, + 42 + ], + err: "Expected options to be an Object" + }, + { + args: [ + { + __Buffer__: + "12f08e363a977031d385e0ac7296a09c6b88418c5c7e2acb4ad933db7a820af4" + }, + { + __Buffer__: + "b01553881e751f758482e4be15e3575e1840267bce371dc3f4b205b527443e8c" + }, + { data: null } + ], + argsAfter: [ + { + __Buffer__: + "12f08e363a977031d385e0ac7296a09c6b88418c5c7e2acb4ad933db7a820af4" + }, + { + __Buffer__: + "b01553881e751f758482e4be15e3575e1840267bce371dc3f4b205b527443e8c" + }, + { data: null } + ], + err: "Expected options.data to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "12f08e363a977031d385e0ac7296a09c6b88418c5c7e2acb4ad933db7a820af4" + }, + { + __Buffer__: + "b01553881e751f758482e4be15e3575e1840267bce371dc3f4b205b527443e8c" + }, + { noncefn: null } + ], + argsAfter: [ + { + __Buffer__: + "12f08e363a977031d385e0ac7296a09c6b88418c5c7e2acb4ad933db7a820af4" + }, + { + __Buffer__: + "b01553881e751f758482e4be15e3575e1840267bce371dc3f4b205b527443e8c" + }, + { noncefn: null } + ], + err: "Expected options.noncefn to be a Function" + }, + { + args: [ + { + __Buffer__: + "a57ee5b9a84b4fde74e68c9de11b6de7bcc3a4982c0a51581aebe32ebbc043ec" + }, + { + __Buffer__: + "96872b21294b1f547cf37c51065609a857b1009bd520b7b70338e18549b072a8" + }, + {}, + null + ], + argsAfter: [ + { + __Buffer__: + "a57ee5b9a84b4fde74e68c9de11b6de7bcc3a4982c0a51581aebe32ebbc043ec" + }, + { + __Buffer__: + "96872b21294b1f547cf37c51065609a857b1009bd520b7b70338e18549b072a8" + }, + {}, + null + ], + err: "Expected output to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "a57ee5b9a84b4fde74e68c9de11b6de7bcc3a4982c0a51581aebe32ebbc043ec" + }, + { + __Buffer__: + "96872b21294b1f547cf37c51065609a857b1009bd520b7b70338e18549b072a8" + }, + {}, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "a57ee5b9a84b4fde74e68c9de11b6de7bcc3a4982c0a51581aebe32ebbc043ec" + }, + { + __Buffer__: + "96872b21294b1f547cf37c51065609a857b1009bd520b7b70338e18549b072a8" + }, + {}, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 64" + } + ], + "secp256k1.ecdsaVerify": [ + { + args: [null], + argsAfter: [null], + err: "Expected signature to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "3ca525c74a8f7a90cd9cae0d22e3ffea40aa9a50098a256eb5aae34c9ba57a229d4d1804009e6c53c1a26f198433bbe0555d2477f71237f8303d1a4856ba8f" + } + ], + argsAfter: [ + { + __Buffer__: + "3ca525c74a8f7a90cd9cae0d22e3ffea40aa9a50098a256eb5aae34c9ba57a229d4d1804009e6c53c1a26f198433bbe0555d2477f71237f8303d1a4856ba8f" + } + ], + err: "Expected signature to be an Uint8Array with length 64" + }, + { + args: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414158e8c8d8eb2df6b9238be32f0c9739da371d2bacb31a1899ac370c923ce9fd83" + }, + { + __Buffer__: + "dab989701782cb6850c28b62e76ade183e14386e6f5623a79ec55750c8f0444f" + }, + { + __Buffer__: + "0352a2bc282b9bfe236580b1ec3c82d9e029ac6fa57fbe0d7e3e097e8d6d7901b9" + } + ], + argsAfter: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414158e8c8d8eb2df6b9238be32f0c9739da371d2bacb31a1899ac370c923ce9fd83" + }, + { + __Buffer__: + "dab989701782cb6850c28b62e76ade183e14386e6f5623a79ec55750c8f0444f" + }, + { + __Buffer__: + "0352a2bc282b9bfe236580b1ec3c82d9e029ac6fa57fbe0d7e3e097e8d6d7901b9" + } + ], + err: "Signature could not be parsed" + }, + { + args: [ + { + __Buffer__: + "e70f70a2c59b763d2268b9d3ae6f548b1ee119f2520779d4b3240c21f450253d1a1a34791144c83696c9cf4c2561fc55d19dfac85efa1ce877b18c0b1fea1b51" + }, + null, + { + __Buffer__: + "039733c818f3aa880db189c9ea8184eaed10f32bffb2204b67f743c393585393a2" + } + ], + argsAfter: [ + { + __Buffer__: + "e70f70a2c59b763d2268b9d3ae6f548b1ee119f2520779d4b3240c21f450253d1a1a34791144c83696c9cf4c2561fc55d19dfac85efa1ce877b18c0b1fea1b51" + }, + null, + { + __Buffer__: + "039733c818f3aa880db189c9ea8184eaed10f32bffb2204b67f743c393585393a2" + } + ], + err: "Expected message to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "aaf5c44eefb0f913990a3fd2829e36b494fe4b2c5de49f164ebbaf3b6ad62e7d182e22f04cd2e57ef869caa617d08e99bf0b8fa23adb7162b236365ad4e4ace0" + }, + { + __Buffer__: + "484f5ab0862d117fa11cb97dcee15f12fe40125e5dfd29309e0c30da743761" + }, + { + __Buffer__: + "032a5b3c7471164132b9ab718df77751bf209c0e52b588637e92fbe7cb65a12e87" + } + ], + argsAfter: [ + { + __Buffer__: + "aaf5c44eefb0f913990a3fd2829e36b494fe4b2c5de49f164ebbaf3b6ad62e7d182e22f04cd2e57ef869caa617d08e99bf0b8fa23adb7162b236365ad4e4ace0" + }, + { + __Buffer__: + "484f5ab0862d117fa11cb97dcee15f12fe40125e5dfd29309e0c30da743761" + }, + { + __Buffer__: + "032a5b3c7471164132b9ab718df77751bf209c0e52b588637e92fbe7cb65a12e87" + } + ], + err: "Expected message to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "65277746a1cd1f301c7eacbf50cdea1663ad1c4fbbe9d94716d2cebb65b21cf55748b3ab0c521011c6e341dd9024a4d2c3e3251efbe38c86f53c13baaa08d325" + }, + { + __Buffer__: + "32f0c051d3b5b5322ba33ce85a7ce920bf99a78acc43eba61f4579bbe59a52d6" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "65277746a1cd1f301c7eacbf50cdea1663ad1c4fbbe9d94716d2cebb65b21cf55748b3ab0c521011c6e341dd9024a4d2c3e3251efbe38c86f53c13baaa08d325" + }, + { + __Buffer__: + "32f0c051d3b5b5322ba33ce85a7ce920bf99a78acc43eba61f4579bbe59a52d6" + }, + null + ], + err: "Expected public key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "b60f0d27e1a5260a59cc0a84bf8507128473a0f92935423814b645e5ee965a9435fb7a1aea8970707eccb591d029e60fc0203420c5d9dfd77718446e10bf1723" + }, + { + __Buffer__: + "1b2d76070b1e09bbd5d669e1742885d5c628bd2d4a81d1f280085c91d8f6c0cf" + }, + { + __Buffer__: + "42e5c6b28983eef2e334ec66b17868de47b3b152ea9d187f704229f8d2e858f7" + } + ], + argsAfter: [ + { + __Buffer__: + "b60f0d27e1a5260a59cc0a84bf8507128473a0f92935423814b645e5ee965a9435fb7a1aea8970707eccb591d029e60fc0203420c5d9dfd77718446e10bf1723" + }, + { + __Buffer__: + "1b2d76070b1e09bbd5d669e1742885d5c628bd2d4a81d1f280085c91d8f6c0cf" + }, + { + __Buffer__: + "42e5c6b28983eef2e334ec66b17868de47b3b152ea9d187f704229f8d2e858f7" + } + ], + err: "Expected public key to be an Uint8Array with length [33, 65]" + }, + { + args: [ + { + __Buffer__: + "3b06d28205f71cea64dc9ddd461827b762417d9598aab7e963e7ac34a4967cf93f54e3e5d860759305a13825e055b15347f0ce1fb25dd9cec93f25cb04c05612" + }, + { + __Buffer__: + "238aca388260d30eec6f45c3518fe47ca5a128921a9826fe973ae00d34574bbd" + }, + { + __Buffer__: + "013f1c2710951aa6b4294881e74e8be175992bcac0c7dfbefc90396aaa01731dc0" + } + ], + argsAfter: [ + { + __Buffer__: + "3b06d28205f71cea64dc9ddd461827b762417d9598aab7e963e7ac34a4967cf93f54e3e5d860759305a13825e055b15347f0ce1fb25dd9cec93f25cb04c05612" + }, + { + __Buffer__: + "238aca388260d30eec6f45c3518fe47ca5a128921a9826fe973ae00d34574bbd" + }, + { + __Buffer__: + "013f1c2710951aa6b4294881e74e8be175992bcac0c7dfbefc90396aaa01731dc0" + } + ], + err: "Public Key could not be parsed" + }, + { + args: [ + { + __Buffer__: + "11a052cfc1234be184ea494c08b7ae2289d04f39ffd453db1652fb596606a81f7ede980239a1e8ee73413853bf587191ca0e5bd71b68c7abbe5e0a0f0f7475ce" + }, + { + __Buffer__: + "ba8459d0fe37784029de0d84f00c58aed69ead04a3d71a6c6a088fa8283e8f47" + }, + { + __Buffer__: + "0399c61b8f54b812fd6d5dab3d9480aef80d9c0879db1dc68d656685ce8d79bacb" + } + ], + argsAfter: [ + { + __Buffer__: + "11a052cfc1234be184ea494c08b7ae2289d04f39ffd453db1652fb596606a81f7ede980239a1e8ee73413853bf587191ca0e5bd71b68c7abbe5e0a0f0f7475ce" + }, + { + __Buffer__: + "ba8459d0fe37784029de0d84f00c58aed69ead04a3d71a6c6a088fa8283e8f47" + }, + { + __Buffer__: + "0399c61b8f54b812fd6d5dab3d9480aef80d9c0879db1dc68d656685ce8d79bacb" + } + ], + res: true + }, + { + args: [ + { + __Buffer__: + "11a052cfc1234be184ea494c08b7ae2289d04f39ffd453db1652fb596606a81f7ede980239a1e8ee73413853bf587191ca0e5bd71b68c7abbe5e0a0f0f7475ce" + }, + { + __Buffer__: + "bb8459d0fe37784029de0d84f00c58aed69ead04a3d71a6c6a088fa8283e8f47" + }, + { + __Buffer__: + "0399c61b8f54b812fd6d5dab3d9480aef80d9c0879db1dc68d656685ce8d79bacb" + } + ], + argsAfter: [ + { + __Buffer__: + "11a052cfc1234be184ea494c08b7ae2289d04f39ffd453db1652fb596606a81f7ede980239a1e8ee73413853bf587191ca0e5bd71b68c7abbe5e0a0f0f7475ce" + }, + { + __Buffer__: + "bb8459d0fe37784029de0d84f00c58aed69ead04a3d71a6c6a088fa8283e8f47" + }, + { + __Buffer__: + "0399c61b8f54b812fd6d5dab3d9480aef80d9c0879db1dc68d656685ce8d79bacb" + } + ], + res: false + }, + { + args: [ + { + __Buffer__: + "00000000000000000000000000000000000000000000000000000000000000007ede980239a1e8ee73413853bf587191ca0e5bd71b68c7abbe5e0a0f0f7475ce" + }, + { + __Buffer__: + "ba8459d0fe37784029de0d84f00c58aed69ead04a3d71a6c6a088fa8283e8f47" + }, + { + __Buffer__: + "0399c61b8f54b812fd6d5dab3d9480aef80d9c0879db1dc68d656685ce8d79bacb" + } + ], + argsAfter: [ + { + __Buffer__: + "00000000000000000000000000000000000000000000000000000000000000007ede980239a1e8ee73413853bf587191ca0e5bd71b68c7abbe5e0a0f0f7475ce" + }, + { + __Buffer__: + "ba8459d0fe37784029de0d84f00c58aed69ead04a3d71a6c6a088fa8283e8f47" + }, + { + __Buffer__: + "0399c61b8f54b812fd6d5dab3d9480aef80d9c0879db1dc68d656685ce8d79bacb" + } + ], + res: false + }, + { + args: [ + { + __Buffer__: + "11a052cfc1234be184ea494c08b7ae2289d04f39ffd453db1652fb596606a81f0000000000000000000000000000000000000000000000000000000000000000" + }, + { + __Buffer__: + "ba8459d0fe37784029de0d84f00c58aed69ead04a3d71a6c6a088fa8283e8f47" + }, + { + __Buffer__: + "0399c61b8f54b812fd6d5dab3d9480aef80d9c0879db1dc68d656685ce8d79bacb" + } + ], + argsAfter: [ + { + __Buffer__: + "11a052cfc1234be184ea494c08b7ae2289d04f39ffd453db1652fb596606a81f0000000000000000000000000000000000000000000000000000000000000000" + }, + { + __Buffer__: + "ba8459d0fe37784029de0d84f00c58aed69ead04a3d71a6c6a088fa8283e8f47" + }, + { + __Buffer__: + "0399c61b8f54b812fd6d5dab3d9480aef80d9c0879db1dc68d656685ce8d79bacb" + } + ], + res: false + }, + { + args: [ + { + __Buffer__: + "bb4124ce65ef1e1f32c796020fa00c6e35aa8b1384cfc05f105483febe9dcf107178ce0420ddf61e75b48b348751db4b5197efe5e1e194134ae833d798075437" + }, + { + __Buffer__: + "ce98a7f3a2fa3ba90ef3b693089964165a886b6ea87bc6fb950d906a209ff6ac" + }, + { + __Buffer__: + "0287c4aceff79d0f81862be527fda9dbcbf1318206fd1a9eab4e304445f74712e3" + } + ], + argsAfter: [ + { + __Buffer__: + "bb4124ce65ef1e1f32c796020fa00c6e35aa8b1384cfc05f105483febe9dcf107178ce0420ddf61e75b48b348751db4b5197efe5e1e194134ae833d798075437" + }, + { + __Buffer__: + "ce98a7f3a2fa3ba90ef3b693089964165a886b6ea87bc6fb950d906a209ff6ac" + }, + { + __Buffer__: + "0287c4aceff79d0f81862be527fda9dbcbf1318206fd1a9eab4e304445f74712e3" + } + ], + res: true + } + ], + "secp256k1.ecdsaRecover": [ + { + args: [null], + argsAfter: [null], + err: "Expected signature to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "7ccef1cad0d4e73fe79ab4d306e767d44e5615bb38b30d65df2f0664143ec422d1d9b8e51e6ce0782a68ad1867c6241a4e65e4184767db4de78675f3ee3268" + }, + 0, + { + __Buffer__: + "11c4323193e4ada65b9f9d97d5d22809e215415e668abc6a72dcc33aaf029618" + } + ], + argsAfter: [ + { + __Buffer__: + "7ccef1cad0d4e73fe79ab4d306e767d44e5615bb38b30d65df2f0664143ec422d1d9b8e51e6ce0782a68ad1867c6241a4e65e4184767db4de78675f3ee3268" + }, + 0, + { + __Buffer__: + "11c4323193e4ada65b9f9d97d5d22809e215415e668abc6a72dcc33aaf029618" + } + ], + err: "Expected signature to be an Uint8Array with length 64" + }, + { + args: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414110ff78e4b7e67edc82592e22d2a60f2301fd70c9251d0ade720fcda5c5e4871e" + }, + 0, + { + __Buffer__: + "bbcc0fc65544ca76a337d748ae6acf598cd255c21ae77fde7d231feb09194f50" + } + ], + argsAfter: [ + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414110ff78e4b7e67edc82592e22d2a60f2301fd70c9251d0ade720fcda5c5e4871e" + }, + 0, + { + __Buffer__: + "bbcc0fc65544ca76a337d748ae6acf598cd255c21ae77fde7d231feb09194f50" + } + ], + err: "Signature could not be parsed" + }, + { + args: [ + { + __Buffer__: + "8987cd2d162a01e18cd8135866f9c4545a01beeb8c40411b24c0504c6ab201ed8ba989ef676a1ebf135299e4b566214a7ac8f1ff73631b8fcc6967052855e297" + }, + null, + { + __Buffer__: + "4f7f5d2ca719813eb08a34eecc8b9282eba0821f32ed10f2b670a7014981b710" + } + ], + argsAfter: [ + { + __Buffer__: + "8987cd2d162a01e18cd8135866f9c4545a01beeb8c40411b24c0504c6ab201ed8ba989ef676a1ebf135299e4b566214a7ac8f1ff73631b8fcc6967052855e297" + }, + null, + { + __Buffer__: + "4f7f5d2ca719813eb08a34eecc8b9282eba0821f32ed10f2b670a7014981b710" + } + ], + err: "Expected recovery id to be a Number within interval [0, 3]" + }, + { + args: [ + { + __Buffer__: + "8987cd2d162a01e18cd8135866f9c4545a01beeb8c40411b24c0504c6ab201ed8ba989ef676a1ebf135299e4b566214a7ac8f1ff73631b8fcc6967052855e297" + }, + 4, + { + __Buffer__: + "4f7f5d2ca719813eb08a34eecc8b9282eba0821f32ed10f2b670a7014981b710" + } + ], + argsAfter: [ + { + __Buffer__: + "8987cd2d162a01e18cd8135866f9c4545a01beeb8c40411b24c0504c6ab201ed8ba989ef676a1ebf135299e4b566214a7ac8f1ff73631b8fcc6967052855e297" + }, + 4, + { + __Buffer__: + "4f7f5d2ca719813eb08a34eecc8b9282eba0821f32ed10f2b670a7014981b710" + } + ], + err: "Expected recovery id to be a Number within interval [0, 3]" + }, + { + args: [ + { + __Buffer__: + "d63eff8a39cd34de02d1273cfa744e40a6932421e8f2ec599e63f0d1ac07e76c65a3b54b76de1d95c28517ba7ec1dbf1f62701927eecca55cfbd77795ccf6f02" + }, + 0, + null + ], + argsAfter: [ + { + __Buffer__: + "d63eff8a39cd34de02d1273cfa744e40a6932421e8f2ec599e63f0d1ac07e76c65a3b54b76de1d95c28517ba7ec1dbf1f62701927eecca55cfbd77795ccf6f02" + }, + 0, + null + ], + err: "Expected message to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "b47ef41e71989f22bbc461b2cd52a9ea5df339da6a29adf8bea14cdc49a87cc8396759fb6f00d62842211b5a895238ddfabce7b478b7d663164b121c6358b5d5" + }, + 0, + { + __Buffer__: + "bbf04a4b9646981205d8fc40086a6108f01a714e70d3b076c9dccced3bd35b" + } + ], + argsAfter: [ + { + __Buffer__: + "b47ef41e71989f22bbc461b2cd52a9ea5df339da6a29adf8bea14cdc49a87cc8396759fb6f00d62842211b5a895238ddfabce7b478b7d663164b121c6358b5d5" + }, + 0, + { + __Buffer__: + "bbf04a4b9646981205d8fc40086a6108f01a714e70d3b076c9dccced3bd35b" + } + ], + err: "Expected message to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "1af87ae2721d3bdcaec96a9a21eba549a2aee7846532886704e87487e4a4d38d33f921aa5430bb0c6a1ac3f8959fe443d6554c10e5664536f78536329d518e74" + }, + 0, + { + __Buffer__: + "28a34fd7dd2c895b1c5f0ee38ba10c87ffc93ed6c08e7887712035c1af1b0a6b" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "1af87ae2721d3bdcaec96a9a21eba549a2aee7846532886704e87487e4a4d38d33f921aa5430bb0c6a1ac3f8959fe443d6554c10e5664536f78536329d518e74" + }, + 0, + { + __Buffer__: + "28a34fd7dd2c895b1c5f0ee38ba10c87ffc93ed6c08e7887712035c1af1b0a6b" + }, + null + ], + err: "Expected compressed to be a Boolean" + }, + { + args: [ + { + __Buffer__: + "328b6dc618ddc8a9c64f2fba8961f44ee6661e25e816906624920a58c3c319f67fa31cce745592102f204e5ccce9de2d4477b0ae2d4abe2054c17f64fb0be511" + }, + 0, + { + __Buffer__: + "e2b785eefd015cd4522e874d02617d2556f58092648d1fbfac48a99c6f03c4f0" + }, + true, + null + ], + argsAfter: [ + { + __Buffer__: + "328b6dc618ddc8a9c64f2fba8961f44ee6661e25e816906624920a58c3c319f67fa31cce745592102f204e5ccce9de2d4477b0ae2d4abe2054c17f64fb0be511" + }, + 0, + { + __Buffer__: + "e2b785eefd015cd4522e874d02617d2556f58092648d1fbfac48a99c6f03c4f0" + }, + true, + null + ], + err: "Expected output to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "328b6dc618ddc8a9c64f2fba8961f44ee6661e25e816906624920a58c3c319f67fa31cce745592102f204e5ccce9de2d4477b0ae2d4abe2054c17f64fb0be511" + }, + 0, + { + __Buffer__: + "e2b785eefd015cd4522e874d02617d2556f58092648d1fbfac48a99c6f03c4f0" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "328b6dc618ddc8a9c64f2fba8961f44ee6661e25e816906624920a58c3c319f67fa31cce745592102f204e5ccce9de2d4477b0ae2d4abe2054c17f64fb0be511" + }, + 0, + { + __Buffer__: + "e2b785eefd015cd4522e874d02617d2556f58092648d1fbfac48a99c6f03c4f0" + }, + true, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 33" + }, + { + args: [ + { + __Buffer__: + "328b6dc618ddc8a9c64f2fba8961f44ee6661e25e816906624920a58c3c319f67fa31cce745592102f204e5ccce9de2d4477b0ae2d4abe2054c17f64fb0be511" + }, + 0, + { + __Buffer__: + "e2b785eefd015cd4522e874d02617d2556f58092648d1fbfac48a99c6f03c4f0" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "328b6dc618ddc8a9c64f2fba8961f44ee6661e25e816906624920a58c3c319f67fa31cce745592102f204e5ccce9de2d4477b0ae2d4abe2054c17f64fb0be511" + }, + 0, + { + __Buffer__: + "e2b785eefd015cd4522e874d02617d2556f58092648d1fbfac48a99c6f03c4f0" + }, + false, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 65" + }, + { + args: [ + { + __Buffer__: + "000000000000000000000000000000000000000000000000000000000000000002fa1ef60abcf7526c04e40622751220fe1ac5a73e7d7003e89cd32dec1826da" + }, + 0, + { + __Buffer__: + "0c25c29a20e27d0aa9f4aa20871272c7e8e3572f9b9ec3e44f3266dedb95aacf" + } + ], + argsAfter: [ + { + __Buffer__: + "000000000000000000000000000000000000000000000000000000000000000002fa1ef60abcf7526c04e40622751220fe1ac5a73e7d7003e89cd32dec1826da" + }, + 0, + { + __Buffer__: + "0c25c29a20e27d0aa9f4aa20871272c7e8e3572f9b9ec3e44f3266dedb95aacf" + } + ], + err: "Public key could not be recover" + }, + { + args: [ + { + __Buffer__: + "a95566939af2256529d485455695b1c4928134119bd0af1ad7bef76f434948be0000000000000000000000000000000000000000000000000000000000000000" + }, + 0, + { + __Buffer__: + "0c25c29a20e27d0aa9f4aa20871272c7e8e3572f9b9ec3e44f3266dedb95aacf" + } + ], + argsAfter: [ + { + __Buffer__: + "a95566939af2256529d485455695b1c4928134119bd0af1ad7bef76f434948be0000000000000000000000000000000000000000000000000000000000000000" + }, + 0, + { + __Buffer__: + "0c25c29a20e27d0aa9f4aa20871272c7e8e3572f9b9ec3e44f3266dedb95aacf" + } + ], + err: "Public key could not be recover" + }, + { + args: [ + { + __Buffer__: + "a95566939af2256529d485455695b1c4928134119bd0af1ad7bef76f434948be02fa1ef60abcf7526c04e40622751220fe1ac5a73e7d7003e89cd32dec1826da" + }, + 2, + { + __Buffer__: + "0c25c29a20e27d0aa9f4aa20871272c7e8e3572f9b9ec3e44f3266dedb95aacf" + } + ], + argsAfter: [ + { + __Buffer__: + "a95566939af2256529d485455695b1c4928134119bd0af1ad7bef76f434948be02fa1ef60abcf7526c04e40622751220fe1ac5a73e7d7003e89cd32dec1826da" + }, + 2, + { + __Buffer__: + "0c25c29a20e27d0aa9f4aa20871272c7e8e3572f9b9ec3e44f3266dedb95aacf" + } + ], + err: "Public key could not be recover" + } + ], + "secp256k1.ecdh": [ + { + args: [ + null, + { + __Buffer__: + "410bc90bf69785b2cf5c8bdcb40e090c08cc338c10341fb52bad9343e0a5fbf4" + } + ], + argsAfter: [ + null, + { + __Buffer__: + "410bc90bf69785b2cf5c8bdcb40e090c08cc338c10341fb52bad9343e0a5fbf4" + } + ], + err: "Expected public key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "4f22baa61b26a069a3c0d89250609d429f8c1b25474cde8ef5fd6621206e5553" + }, + { + __Buffer__: + "a8e988bda37c86e9db4be12ceab3a745137906ca657cb8eb90c3a8b2acdb298d" + } + ], + argsAfter: [ + { + __Buffer__: + "4f22baa61b26a069a3c0d89250609d429f8c1b25474cde8ef5fd6621206e5553" + }, + { + __Buffer__: + "a8e988bda37c86e9db4be12ceab3a745137906ca657cb8eb90c3a8b2acdb298d" + } + ], + err: "Expected public key to be an Uint8Array with length [33, 65]" + }, + { + args: [ + { + __Buffer__: + "011f757495457eaab6502cde46af2206fe6268c3421fabde49e89f80ba6cdf6783" + }, + { + __Buffer__: + "168d45231ac44d6fff58055b37422cf6567e7358fe759629f87fe2b114b3631e" + } + ], + argsAfter: [ + { + __Buffer__: + "011f757495457eaab6502cde46af2206fe6268c3421fabde49e89f80ba6cdf6783" + }, + { + __Buffer__: + "168d45231ac44d6fff58055b37422cf6567e7358fe759629f87fe2b114b3631e" + } + ], + err: "Public Key could not be parsed" + }, + { + args: [ + { + __Buffer__: + "02445bfe6e12511703ff6550a5e227da8cf04a2601ba287da35870d3191c58d828" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "02445bfe6e12511703ff6550a5e227da8cf04a2601ba287da35870d3191c58d828" + }, + null + ], + err: "Expected private key to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "0242eed9610510cd2f23478184e473b92ae11f4f2c5fdb6939d4a62d8c1daa41fa" + }, + { + __Buffer__: + "efebbc998490f22b887e8063ab9d31344acfa26ee06e7f480cb15ba98eae41" + } + ], + argsAfter: [ + { + __Buffer__: + "0242eed9610510cd2f23478184e473b92ae11f4f2c5fdb6939d4a62d8c1daa41fa" + }, + { + __Buffer__: + "efebbc998490f22b887e8063ab9d31344acfa26ee06e7f480cb15ba98eae41" + } + ], + err: "Expected private key to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "03b80dde5bbca37a93a8e3ad49b3ad8eedf73e11083cedfbbcbceb7e9139b3f845" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + argsAfter: [ + { + __Buffer__: + "03b80dde5bbca37a93a8e3ad49b3ad8eedf73e11083cedfbbcbceb7e9139b3f845" + }, + { + __Buffer__: + "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + ], + err: "Scalar was invalid (zero or overflow)" + }, + { + args: [ + { + __Buffer__: + "02a43f7de2291ad47927a1ac333e384503a0bd0a00716454b4527e028089b982c6" + }, + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "02a43f7de2291ad47927a1ac333e384503a0bd0a00716454b4527e028089b982c6" + }, + { + __Buffer__: + "0000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Scalar was invalid (zero or overflow)" + }, + { + args: [ + { + __Buffer__: + "02a2acb97f34863f398de47381e423cc032f2970bab355fcab15f4988fe50972e4" + }, + { + __Buffer__: + "ecabc098a4956e30ac97ac6faf4adc408b7db217976cafcfb61194dc937e0299" + }, + null + ], + argsAfter: [ + { + __Buffer__: + "02a2acb97f34863f398de47381e423cc032f2970bab355fcab15f4988fe50972e4" + }, + { + __Buffer__: + "ecabc098a4956e30ac97ac6faf4adc408b7db217976cafcfb61194dc937e0299" + }, + null + ], + err: "Expected options to be an Object" + }, + { + args: [ + { + __Buffer__: + "02a2acb97f34863f398de47381e423cc032f2970bab355fcab15f4988fe50972e4" + }, + { + __Buffer__: + "ecabc098a4956e30ac97ac6faf4adc408b7db217976cafcfb61194dc937e0299" + }, + 42 + ], + argsAfter: [ + { + __Buffer__: + "02a2acb97f34863f398de47381e423cc032f2970bab355fcab15f4988fe50972e4" + }, + { + __Buffer__: + "ecabc098a4956e30ac97ac6faf4adc408b7db217976cafcfb61194dc937e0299" + }, + 42 + ], + err: "Expected options to be an Object" + }, + { + args: [ + { + __Buffer__: + "02a2acb97f34863f398de47381e423cc032f2970bab355fcab15f4988fe50972e4" + }, + { + __Buffer__: + "ecabc098a4956e30ac97ac6faf4adc408b7db217976cafcfb61194dc937e0299" + }, + { data: null } + ], + argsAfter: [ + { + __Buffer__: + "02a2acb97f34863f398de47381e423cc032f2970bab355fcab15f4988fe50972e4" + }, + { + __Buffer__: + "ecabc098a4956e30ac97ac6faf4adc408b7db217976cafcfb61194dc937e0299" + }, + { data: null } + ], + err: "Expected options.data to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "02a2acb97f34863f398de47381e423cc032f2970bab355fcab15f4988fe50972e4" + }, + { + __Buffer__: + "ecabc098a4956e30ac97ac6faf4adc408b7db217976cafcfb61194dc937e0299" + }, + { hashfn: null } + ], + argsAfter: [ + { + __Buffer__: + "02a2acb97f34863f398de47381e423cc032f2970bab355fcab15f4988fe50972e4" + }, + { + __Buffer__: + "ecabc098a4956e30ac97ac6faf4adc408b7db217976cafcfb61194dc937e0299" + }, + { hashfn: null } + ], + err: "Expected options.hashfn to be a Function" + }, + { + args: [ + { + __Buffer__: + "039fb399291f00d8671d861bbc458d0ce60dc8f7b2c7a16d669c265ce8d2d6c0fc" + }, + { + __Buffer__: + "3e6b6559a96dc2909a036223d9d185fee6c49faf468fc33e26d410df7725de85" + }, + {}, + null + ], + argsAfter: [ + { + __Buffer__: + "039fb399291f00d8671d861bbc458d0ce60dc8f7b2c7a16d669c265ce8d2d6c0fc" + }, + { + __Buffer__: + "3e6b6559a96dc2909a036223d9d185fee6c49faf468fc33e26d410df7725de85" + }, + {}, + null + ], + err: "Expected output to be an Uint8Array" + }, + { + args: [ + { + __Buffer__: + "039fb399291f00d8671d861bbc458d0ce60dc8f7b2c7a16d669c265ce8d2d6c0fc" + }, + { + __Buffer__: + "3e6b6559a96dc2909a036223d9d185fee6c49faf468fc33e26d410df7725de85" + }, + {}, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + argsAfter: [ + { + __Buffer__: + "039fb399291f00d8671d861bbc458d0ce60dc8f7b2c7a16d669c265ce8d2d6c0fc" + }, + { + __Buffer__: + "3e6b6559a96dc2909a036223d9d185fee6c49faf468fc33e26d410df7725de85" + }, + {}, + { + __Bytes__: + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ], + err: "Expected output to be an Uint8Array with length 32" + }, + { + args: [ + { + __Buffer__: + "02601dde92f4bbeac34692a042719439573b9a411f96717274819fcff417ad4d75" + }, + { + __Buffer__: + "4da23f448c132e31b7343eb3a5840799c533bffc806a8593e82cd2c64bfe5aec" + } + ], + argsAfter: [ + { + __Buffer__: + "02601dde92f4bbeac34692a042719439573b9a411f96717274819fcff417ad4d75" + }, + { + __Buffer__: + "4da23f448c132e31b7343eb3a5840799c533bffc806a8593e82cd2c64bfe5aec" + } + ], + res: { + __Bytes__: + "950d2d36b0e2226822370d54990aba72a2a09831a14426e218262a5d8d741338" + } + }, + { + args: [ + { + __Buffer__: + "032321eebb4cfd3b1e8006345b51a83b9885a9bd4194119f3730ffd73e0c589faf" + }, + { + __Buffer__: + "9ff0664c75c5be1f47a55acc0353a99e71eff4c2abce116de0489533b510e150" + } + ], + argsAfter: [ + { + __Buffer__: + "032321eebb4cfd3b1e8006345b51a83b9885a9bd4194119f3730ffd73e0c589faf" + }, + { + __Buffer__: + "9ff0664c75c5be1f47a55acc0353a99e71eff4c2abce116de0489533b510e150" + } + ], + res: { + __Bytes__: + "950d2d36b0e2226822370d54990aba72a2a09831a14426e218262a5d8d741338" + } + } + ] +}; diff --git a/test/test-vectors/sha256.ts b/test/test-vectors/sha256.ts index ec03362..79ba1f4 100644 --- a/test/test-vectors/sha256.ts +++ b/test/test-vectors/sha256.ts @@ -1,36 +1,34 @@ -import { assert } from "chai"; +import { sha256 } from "ethereum-cryptography/sha256"; +import { toHex, utf8ToBytes } from "ethereum-cryptography/utils"; +import { deepStrictEqual } from "./assert"; const TEST_VECTORS = [ { - input: Buffer.from("", "ascii"), + input: utf8ToBytes(""), output: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, { - input: Buffer.from("abc", "ascii"), + input: utf8ToBytes("abc"), output: "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" }, { - input: Buffer.from( - "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", - "ascii" + input: utf8ToBytes( + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ), output: "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1" }, { - input: Buffer.from( - "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", - "ascii" + input: utf8ToBytes( + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ), output: "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1" } ]; -export function createTests(hash: (msg: Buffer) => Buffer) { - describe("sha256", function() { - for (const [i, vector] of TEST_VECTORS.entries()) { - it(`Should return the right hash for the test ${i}`, async function() { - assert.equal(hash(vector.input).toString("hex"), vector.output); - }); - } - }); -} +describe("sha256", function() { + for (const [i, vector] of TEST_VECTORS.entries()) { + it(`Should return the right hash for the test ${i}`, async function() { + deepStrictEqual(toHex(sha256(vector.input)), vector.output); + }); + } +}); diff --git a/test/test-vectors/sha512.ts b/test/test-vectors/sha512.ts new file mode 100644 index 0000000..d3835c1 --- /dev/null +++ b/test/test-vectors/sha512.ts @@ -0,0 +1,41 @@ +import { sha512 } from "ethereum-cryptography/sha512"; +import { toHex, utf8ToBytes } from "ethereum-cryptography/utils"; +import { deepStrictEqual } from "./assert"; + +const TEST_VECTORS = [ + { + input: utf8ToBytes(""), + output: + "cf83e1357eefb8bd f1542850d66d8007 d620e4050b5715dc 83f4a921d36ce9ce 47d0d13c5d85f2b0 ff8318d2877eec2f 63b931bd47417a81 a538327af927da3e" + }, + { + input: utf8ToBytes("abc"), + output: + "ddaf35a193617aba cc417349ae204131 12e6fa4e89a97ea2 0a9eeee64b55d39a 2192992a274fc1a8 36ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f" + }, + { + input: utf8ToBytes( + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + ), + output: + "204a8fc6dda82f0a 0ced7beb8e08a416 57c16ef468b228a8 279be331a703c335 96fd15c13b1b07f9 aa1d3bea57789ca0 31ad85c7a71dd703 54ec631238ca3445" + }, + { + input: utf8ToBytes( + "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" + ), + output: + "8e959b75dae313da 8cf4f72814fc143f 8f7779c6eb9f7fa1 7299aeadb6889018 501d289e4900f7e4 331b99dec4b5433a c7d329eeb6dd2654 5e96e55b874be909" + } +]; + +describe("sha512", function() { + for (const [i, vector] of TEST_VECTORS.entries()) { + it(`Should return the right hash for the test ${i}`, async function() { + deepStrictEqual( + toHex(sha512(vector.input)), + vector.output.replace(/ /g, "") + ); + }); + } +}); diff --git a/test/tsconfig.json b/test/tsconfig.json new file mode 100644 index 0000000..2fc85b7 --- /dev/null +++ b/test/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "strict": true, + "downlevelIteration": true, + "rootDirs": [ + "./" + ], + "outDir": "./test-builds/tsc", + "noUnusedLocals": true, + "declaration": true + }, + "include": [ + "./**/*.ts", + ] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index d9da0c9..7fae157 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,19 @@ { "compilerOptions": { - "target": "es5", + "target": "es2020", "module": "commonjs", "strict": true, - "esModuleInterop": true, "downlevelIteration": true, - "rootDirs": ["./src", "./test"], + "rootDirs": [ + "./src", + "./test" + ], "outDir": "./test-builds/tsc", - "sourceMap": true, - "declaration": true, - "declarationMap": true + "noUnusedLocals": true, + "declaration": true }, - "include": ["src/**/*.ts", "test/**/*.ts"] -} + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ] +} \ No newline at end of file diff --git a/tsconfig.prod.esm.json b/tsconfig.prod.esm.json new file mode 100644 index 0000000..57d92b9 --- /dev/null +++ b/tsconfig.prod.esm.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "es2020", + "lib": ["es2020", "dom"], + "module": "es6", + "moduleResolution": "node", + "strict": true, + "declaration": true, + "rootDir": "src", + "outDir": "esm" + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [] +} \ No newline at end of file diff --git a/tsconfig.prod.json b/tsconfig.prod.json index 2f6fc3a..6cdf600 100644 --- a/tsconfig.prod.json +++ b/tsconfig.prod.json @@ -1,15 +1,15 @@ { "compilerOptions": { - "target": "es5", + "target": "es2020", "module": "commonjs", "strict": true, "esModuleInterop": true, "rootDir": "src", "outDir": ".", - "sourceMap": true, - "declaration": true, - "declarationMap": true + "declaration": true }, - "include": ["src/**/*.ts"], + "include": [ + "src/**/*.ts" + ], "exclude": [] -} +} \ No newline at end of file diff --git a/tslint.json b/tslint.json index 1437349..852db4a 100644 --- a/tslint.json +++ b/tslint.json @@ -8,9 +8,15 @@ "prettier": true, "no-submodule-imports": false, "only-arrow-functions": false, - "no-implicit-dependencies": [true, ["chai"]], + "no-implicit-dependencies": [ + true, + [ + "chai" + ] + ], "no-var-requires": false, "object-literal-sort-keys": false, - "interface-name": false + "interface-name": false, + "no-bitwise": false } -} +} \ No newline at end of file